diff --git a/unyt/array.py b/unyt/array.py index 9b2c94e3..281d31be 100644 --- a/unyt/array.py +++ b/unyt/array.py @@ -123,6 +123,7 @@ UnitOperationError, UnitConversionError, UnitsNotReducible, + SymbolNotFoundError, ) from unyt.equivalencies import equivalence_registry from unyt._on_demand_imports import _astropy, _pint @@ -160,7 +161,13 @@ def _sqrt_unit(unit): @lru_cache(maxsize=128, typed=False) def _multiply_units(unit1, unit2): - ret = (unit1 * unit2).simplify() + try: + ret = (unit1 * unit2).simplify() + except SymbolNotFoundError: + # Some operators are not natively commutative when operands are + # defined within different unit registries, and conversion + # is defined one way but not the other. + ret = (unit2 * unit1).simplify() return ret.as_coeff_unit() @@ -195,7 +202,10 @@ def _square_unit(unit): @lru_cache(maxsize=128, typed=False) def _divide_units(unit1, unit2): - ret = (unit1 / unit2).simplify() + try: + ret = (unit1 / unit2).simplify() + except SymbolNotFoundError: + ret = (1 / (unit2 / unit1).simplify()).units return ret.as_coeff_unit() diff --git a/unyt/tests/test_units.py b/unyt/tests/test_units.py index 461f2f69..cc509fd6 100644 --- a/unyt/tests/test_units.py +++ b/unyt/tests/test_units.py @@ -28,6 +28,7 @@ import pytest from sympy import Symbol +from unyt.array import unyt_quantity from unyt.testing import assert_allclose_units from unyt.unit_registry import UnitRegistry from unyt.dimensions import ( @@ -874,3 +875,17 @@ def test_degF(): def test_delta_degF(): a = 1 * Unit("delta_degF") assert str(a) == "1 Δ°F" + + +def test_mixed_registry_operations(): + + reg = UnitRegistry(unit_system="cgs") + reg.add("fake_length", 0.001, length) + a = unyt_quantity(1, units="fake_length", registry=reg) + b = unyt_quantity(1, "cm") + + assert_almost_equal(a + b, b + a) + assert_almost_equal(a - b, -(b - a)) + assert_almost_equal(a * b, b * a) + assert_almost_equal(b / a, b / a.in_units("km")) + assert_almost_equal(a / b, a / b.in_units("km"))