[yt-svn] commit/yt: MatthewTurk: Merged in ngoldbaum/yt (pull request #1300)

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Fri Nov 21 18:15:59 PST 2014


1 new commit in yt:

https://bitbucket.org/yt_analysis/yt/commits/b07a33287102/
Changeset:   b07a33287102
Branch:      yt
User:        MatthewTurk
Date:        2014-11-22 02:15:51+00:00
Summary:     Merged in ngoldbaum/yt (pull request #1300)

Fix issues with dimensionless results of multiplication or division. Closes #933
Affected #:  4 files

diff -r 5bd8229b55cfe72386fdfd1eb8e00c80f9e6f3b3 -r b07a3328710256a1d765284337b45d710a8ca715 yt/units/tests/test_units.py
--- a/yt/units/tests/test_units.py
+++ b/yt/units/tests/test_units.py
@@ -204,14 +204,14 @@
     yield assert_true, u1.cgs_value == 42
     yield assert_true,  u1.dimensions == length**2*mass
 
-    yield assert_raises, UnitParseError, Unit, 'abc', \
-        {'cgs_value':42, 'dimensions':length**length}
-    yield assert_raises, UnitParseError, Unit, 'abc', \
-        {'cgs_value':42, 'dimensions':length**(length*length)}
-    yield assert_raises, UnitParseError, Unit, 'abc', \
-        {'cgs_value':42, 'dimensions':length-mass}
-    yield assert_raises, UnitParseError, Unit, 'abc', \
-        {'cgs_value':42, 'dimensions':length+mass}
+    assert_raises(UnitParseError, Unit, 'abc', cgs_value=42,
+                  dimensions=length**length)
+    assert_raises(UnitParseError, Unit, 'abc', cgs_value=42,
+                  dimensions=length**(length*length))
+    assert_raises(UnitParseError, Unit, 'abc', cgs_value=42,
+                  dimensions=length-mass)
+    assert_raises(UnitParseError, Unit, 'abc', cgs_value=42,
+                  dimensions=length+mass)
 
 def test_create_fail_on_unknown_symbol():
     """

diff -r 5bd8229b55cfe72386fdfd1eb8e00c80f9e6f3b3 -r b07a3328710256a1d765284337b45d710a8ca715 yt/units/tests/test_ytarray.py
--- a/yt/units/tests/test_ytarray.py
+++ b/yt/units/tests/test_ytarray.py
@@ -42,6 +42,8 @@
 from yt.funcs import fix_length
 from yt.units.unit_symbols import \
     cm, m, g
+from yt.utilities.physical_ratios import \
+    metallicity_sun
 
 def operate_and_compare(a, b, op, answer):
     # Test generator for YTArrays tests
@@ -695,7 +697,12 @@
         assert_true(not isinstance(ret, YTArray) and
                     isinstance(ret, np.ndarray))
     assert_array_equal(ret, out)
-    assert_array_equal(ret, ufunc(np.array(a), np.array(b)))
+    if (ufunc in (np.divide, np.true_divide, np.arctan2) and
+        (a.units.dimensions == b.units.dimensions)):
+        assert_array_almost_equal(
+            np.array(ret), ufunc(np.array(a.in_cgs()), np.array(b.in_cgs())))
+    else:
+        assert_array_almost_equal(np.array(ret), ufunc(np.array(a), np.array(b)))
 
 
 def test_ufuncs():
@@ -985,3 +992,26 @@
 
     yield assert_array_equal, YTArray(union_answer, 'cm'), uunion1d(a1, a2)
     yield assert_array_equal, union_answer, np.union1d(a1, a2)
+
+def test_dimensionless_conversion():
+    a = YTQuantity(1, 'Zsun')
+    b = a.in_units('Zsun')
+    a.convert_to_units('Zsun')
+    yield assert_true, a.units.cgs_value == metallicity_sun
+    yield assert_true, b.units.cgs_value == metallicity_sun
+
+def test_modified_unit_division():
+    ds1 = fake_random_ds(64)
+    ds2 = fake_random_ds(64)
+
+    # this mocks comoving coordinates without going through the trouble
+    # of setting up a fake cosmological dataset
+    ds1.unit_registry.modify('m', 50)
+
+    a = ds1.quan(3, 'm')
+    b = ds2.quan(3, 'm')
+
+    ret = a/b
+    yield assert_true, ret == 0.5
+    yield assert_true, ret.units.is_dimensionless
+    yield assert_true, ret.units.cgs_value == 1.0

diff -r 5bd8229b55cfe72386fdfd1eb8e00c80f9e6f3b3 -r b07a3328710256a1d765284337b45d710a8ca715 yt/units/unit_object.py
--- a/yt/units/unit_object.py
+++ b/yt/units/unit_object.py
@@ -22,7 +22,8 @@
     parse_expr, auto_number, rationalize
 from keyword import iskeyword
 from yt.units.dimensions import \
-    base_dimensions, temperature
+    base_dimensions, temperature, \
+    dimensionless
 from yt.units.unit_lookup_table import \
     latex_symbol_lut, unit_prefixes, \
     prefixable_units, cgs_base_units, \
@@ -164,6 +165,9 @@
                                  "sympy Expr. %s has type %s." \
                                  % (unit_expr, type(unit_expr)))
 
+        if unit_expr == sympy_one and dimensions is None:
+            dimensions = dimensionless
+
         if registry is None:
             # Caller did not set the registry, so use the default.
             registry = default_unit_registry
@@ -179,7 +183,7 @@
         # check cgs_value and dimensions
         #
 
-        if cgs_value is not None and dimensions is not None:
+        if cgs_value is not None:
             # check that cgs_value is a float or can be converted to one
             try:
                 cgs_value = float(cgs_value)
@@ -189,7 +193,8 @@
                                      % (cgs_value, type(cgs_value)) )
 
             # check that dimensions is valid
-            validate_dimensions(dimensions)
+            if dimensions is not None:
+                validate_dimensions(dimensions)
         else:
             # lookup the unit symbols
             unit_data = _get_unit_data_from_expr(unit_expr, registry.lut)
@@ -215,9 +220,8 @@
             conversions = []
             for atom in check_atoms:
                 conversions.append((atom,symbols(cgs_conversions[str(atom)])))
-            conversion = unit_expr.subs(conversions)
-            conversion = Unit(unit_expr=conversion, cgs_value=1.0,
-                               dimensions=None, registry=registry)
+            conversion = Unit(unit_expr=unit_expr.subs(conversions),
+                              registry=registry)
             is_mks = True
         else:
             conversion = None

diff -r 5bd8229b55cfe72386fdfd1eb8e00c80f9e6f3b3 -r b07a3328710256a1d765284337b45d710a8ca715 yt/units/yt_array.py
--- a/yt/units/yt_array.py
+++ b/yt/units/yt_array.py
@@ -368,7 +368,7 @@
         """
         # let Unit() handle units arg if it's not already a Unit obj.
         if not isinstance(units, Unit):
-            units = Unit(units, registry = self.units.registry)
+            units = Unit(units, registry=self.units.registry)
 
         if not self.units.same_dimensions_as(units):
             raise YTUnitConversionError(
@@ -1022,14 +1022,21 @@
                         else:
                             raise YTUnitOperationError(context[0], unit1, unit2)
                     unit2 = 1.0
-            if self._ufunc_registry[context[0]] in \
-               (preserve_units, comparison_unit, arctan2_unit):
+            unit_operator = self._ufunc_registry[context[0]]
+            if unit_operator in (preserve_units, comparison_unit, arctan2_unit):
                 if unit1 != unit2:
                     if not unit1.same_dimensions_as(unit2):
                         raise YTUnitOperationError(context[0], unit1, unit2)
                     else:
                         raise YTUfuncUnitError(context[0], unit1, unit2)
             unit = self._ufunc_registry[context[0]](unit1, unit2)
+            if unit_operator in (multiply_units, divide_units):
+                if unit.is_dimensionless and unit.cgs_value != 1.0:
+                    if not unit1.is_dimensionless:
+                        if unit1.dimensions == unit2.dimensions:
+                            np.multiply(out_arr.view(np.ndarray),
+                                        unit.cgs_value, out=out_arr)
+                            unit = Unit(registry=unit.registry)
         else:
             raise RuntimeError("Operation is not defined.")
         if unit is None:

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list