From a805cc0ba1e0e1ee035146a05605b4948ee8c556 Mon Sep 17 00:00:00 2001 From: Steven Rieder Date: Wed, 1 Oct 2025 11:24:48 +0200 Subject: [PATCH 1/2] Make arctan2 work with ScalarQuantities Ensures that x and y use the same unit, which is otherwise ignored (it is divided out). --- src/amuse/units/trigo.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/amuse/units/trigo.py b/src/amuse/units/trigo.py index fbb67eebfc..11309cc592 100644 --- a/src/amuse/units/trigo.py +++ b/src/amuse/units/trigo.py @@ -9,7 +9,10 @@ arcsin = lambda x: numpy.arcsin(x) | rad arccos = lambda x: numpy.arccos(x) | rad arctan = lambda x: numpy.arctan(x) | rad -arctan2 = lambda x, y: numpy.arctan2(x, y) | rad +arctan2 = lambda x, y: numpy.arctan2( + x.value_in(x.unit), + y.value_in(x.unit), +) | rad def to_rad(angle): From 8880b04cdb19ba10a4c6a31774ff017f0f5a954f Mon Sep 17 00:00:00 2001 From: Steven Rieder Date: Wed, 1 Oct 2025 13:46:21 +0200 Subject: [PATCH 2/2] Update for case with regular Float inputs, add tests --- src/amuse/units/trigo.py | 4 +-- src/tests/ticket_tests/test_issue1180.py | 36 ++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 src/tests/ticket_tests/test_issue1180.py diff --git a/src/amuse/units/trigo.py b/src/amuse/units/trigo.py index 11309cc592..1d104958fd 100644 --- a/src/amuse/units/trigo.py +++ b/src/amuse/units/trigo.py @@ -10,8 +10,8 @@ arccos = lambda x: numpy.arccos(x) | rad arctan = lambda x: numpy.arctan(x) | rad arctan2 = lambda x, y: numpy.arctan2( - x.value_in(x.unit), - y.value_in(x.unit), + x.value_in(x.unit) if isinstance(x, quantities.Quantity) else x, + y.value_in(x.unit) if isinstance(x, quantities.Quantity) else y, ) | rad diff --git a/src/tests/ticket_tests/test_issue1180.py b/src/tests/ticket_tests/test_issue1180.py new file mode 100644 index 0000000000..dfefd8c99b --- /dev/null +++ b/src/tests/ticket_tests/test_issue1180.py @@ -0,0 +1,36 @@ +import pytest +from amuse.support.testing import amusetest + +from amuse.units import units +from amuse.units.trigo import arctan2 + + +class TestsForIssue1180(amusetest.TestCase): + + def test_arctan2_without_units(self): + "Test when input has no units" + x = 1.0 + y = 2.0 + result = arctan2(x, y).value_in(units.rad) + assert result == pytest.approx(0.4636476, 1e-7) + + def test_arctan2_with_units(self): + "Test when input has units" + x = 1.0 | units.m + y = 2.0 | units.m + result = arctan2(x, y).value_in(units.rad) + assert result == pytest.approx(0.4636476, 1e-7) + + def test_arctan2_with_units_and_no_units(self): + "Test when input has units and no units (should fail)" + x = 1.0 | units.m + y = 2.0 + with pytest.raises(AttributeError): + result = arctan2(x, y).value_in(units.rad) + + def test_arctan2_with_different_units(self): + "Test when input has different units" + x = 1.0 | units.m + y = 2.0e-3 | units.km + result = arctan2(x, y).value_in(units.rad) + assert result == pytest.approx(0.4636476, 1e-7)