[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