diff --git a/LICENSE b/LICENSE index 860f5859..0add1578 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 - 2025 ANSYS, Inc. and/or its affiliates. +Copyright (c) 2024 ANSYS, Inc. and/or its affiliates. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/src/ansys/units/unit.py b/src/ansys/units/unit.py index 069528d0..72ca01a3 100644 --- a/src/ansys/units/unit.py +++ b/src/ansys/units/unit.py @@ -22,6 +22,7 @@ from __future__ import annotations +import os from typing import Optional, Union from ansys.units import ( @@ -99,10 +100,12 @@ def __init__( self._dimensions = Dimensions(_dimensions) if dimensions and self._dimensions != dimensions: raise InconsistentDimensions() + self._dimensions = self._remove_angle_as_dim(self._dimensions) elif dimensions: self._dimensions = dimensions self._name = _dim_to_units(dimensions=dimensions, system=system) + self._dimensions = self._remove_angle_as_dim(self._dimensions) else: self._name = "" self._dimensions = Dimensions() @@ -117,6 +120,14 @@ def __init__( units=self.name ) + def _remove_angle_as_dim(self, dimensions): + if not os.getenv("PYANSYS_UNITS_ANGLE_AS_DIMENSION", None): + if BaseDimensions.ANGLE in dimensions._dimensions: + del dimensions._dimensions[BaseDimensions.ANGLE] + if BaseDimensions.SOLID_ANGLE in dimensions._dimensions: + del dimensions._dimensions[BaseDimensions.SOLID_ANGLE] + return dimensions + def _to_string(self): """ Creates a string representation of the unit. diff --git a/tests/lib_compare/test_angle_units.py b/tests/lib_compare/test_angle_units.py index b2adad67..32eb8eab 100644 --- a/tests/lib_compare/test_angle_units.py +++ b/tests/lib_compare/test_angle_units.py @@ -45,7 +45,8 @@ def test_pint_angles_are_dimensionless(): assert str(angle_in_radians_dimensions) == "dimensionless" -def test_pyunits_angles_have_angle_dimensions(): +def test_pyunits_angles_have_angle_dimensions(monkeypatch): + monkeypatch.setenv("PYANSYS_UNITS_ANGLE_AS_DIMENSION", "1") from ansys.units import BaseDimensions, Dimensions from ansys.units.quantity import Quantity @@ -79,7 +80,8 @@ def test_pint_angle_and_dimensionless_are_convertible(): assert num_deg_rom_rad == util.one_degree_in_radians -def test_pyunits_angle_and_dimensionless_are_not_convertible(): +def test_pyunits_angle_and_dimensionless_are_not_convertible(monkeypatch): + monkeypatch.setenv("PYANSYS_UNITS_ANGLE_AS_DIMENSION", "1") from ansys.units.quantity import IncompatibleDimensions, Quantity no_dim = Quantity(1.0, "") @@ -169,7 +171,8 @@ def test_pint_conversion_between_Hz_and_rps_and_radians_per_second(): # mean is "This is the inevitable outcome of the way we do things." -def test_ansunits_frequency_and_angular_frequency_are_not_convertible(): +def test_ansunits_frequency_and_angular_frequency_are_not_convertible(monkeypatch): + monkeypatch.setenv("PYANSYS_UNITS_ANGLE_AS_DIMENSION", "1") from ansys.units.quantity import IncompatibleDimensions, Quantity # ansunits avoids the pint complications by simply not allowing @@ -180,3 +183,100 @@ def test_ansunits_frequency_and_angular_frequency_are_not_convertible(): rad_per_s = Quantity(1.0, "radian s^-1") with pytest.raises(IncompatibleDimensions): rad_per_s.to("Hz") + + +def test_degree_addition(): + import ansys.units as pyunits + + degree = pyunits.Quantity(1.0, "degree") + assert not degree.dimensions + assert degree.is_dimensionless + assert degree + 1 == pyunits.Quantity(58.29577951308232, "degree") + + +def test_degree_subtraction(): + import ansys.units as pyunits + + degree = pyunits.Quantity(120, "degree") + assert not degree.dimensions + assert degree.is_dimensionless + assert degree - 1 == pyunits.Quantity(62.70422048691768, "degree") + + +def test_degree_division(): + import ansys.units as pyunits + + degree = pyunits.Quantity(120, "degree") + assert not degree.dimensions + assert degree.is_dimensionless + assert degree / 2 == pyunits.Quantity(60, "degree") + + +def test_degree_multiplication(): + import ansys.units as pyunits + + degree = pyunits.Quantity(10, "degree") + assert not degree.dimensions + assert degree.is_dimensionless + assert degree * 2 == pyunits.Quantity(20.0, "degree") + + +def test_degree_power(): + import ansys.units as pyunits + + degree = pyunits.Quantity(10, "degree") + assert not degree.dimensions + assert degree.is_dimensionless + assert degree**2 == pyunits.Quantity(100, "degree^2") + + +def test_radian_addition(): + import ansys.units as pyunits + + radian = pyunits.Quantity(1.0, "radian") + assert not radian.dimensions + assert radian.is_dimensionless + assert radian + 1 == pyunits.Quantity(2.0, "radian") + assert (radian + 1).to("degree") == pyunits.Quantity(114.59155902616465, "degree") + + +def test_radian_subtraction(): + import ansys.units as pyunits + + radian = pyunits.Quantity(2.0, "radian") + assert not radian.dimensions + assert radian.is_dimensionless + assert radian - 1 == pyunits.Quantity(1.0, "radian") + assert (radian - 1).to("degree") == pyunits.Quantity(57.29577951308232, "degree") + + +def test_radian_division(): + import ansys.units as pyunits + + radian = pyunits.Quantity(2.0, "radian") + assert not radian.dimensions + assert radian.is_dimensionless + assert radian / 2 == pyunits.Quantity(1.0, "radian") + assert (radian / 2).to("degree") == pyunits.Quantity(57.29577951308232, "degree") + + +def test_radian_multiplication(): + import ansys.units as pyunits + + radian = pyunits.Quantity(2.0, "radian") + assert not radian.dimensions + assert radian.is_dimensionless + assert radian * 2 == pyunits.Quantity(4.0, "radian") + assert (radian * 2).to("degree") == pyunits.Quantity(229.1831180523293, "degree") + + +def test_radian_power(): + import ansys.units as pyunits + + radian = pyunits.Quantity(2.0, "radian") + assert not radian.dimensions + assert radian.is_dimensionless + assert radian**2 == pyunits.Quantity(4.0, "radian^2") + assert (radian**2).to("degree^2") == pyunits.Quantity( + 13131.225400046977, "degree^2" + ) diff --git a/tests/test_quantity.py b/tests/test_quantity.py index a7b1c5b2..ecae8fde 100644 --- a/tests/test_quantity.py +++ b/tests/test_quantity.py @@ -593,7 +593,8 @@ def test_quantity_table(): assert api_test.units == Unit("kg m^-1.5 s^-2.5 A^3 cd W^2 K^-2") -def testing_units_to_dimensions(): +def testing_units_to_dimensions(monkeypatch): + monkeypatch.setenv("PYANSYS_UNITS_ANGLE_AS_DIMENSION", "1") print(f"{'*' * 25} {testing_units_to_dimensions.__name__} {'*' * 25}") dims = BaseDimensions