[yt-svn] commit/yt: 6 new changesets
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Fri Nov 21 18:15:58 PST 2014
6 new commits in yt:
https://bitbucket.org/yt_analysis/yt/commits/b1fb58bdaacf/
Changeset: b1fb58bdaacf
Branch: yt
User: ngoldbaum
Date: 2014-11-10 06:43:10+00:00
Summary: Don't yield functions that need keyword arguments in the tests for the unit object.
Affected #: 1 file
diff -r 9153a5a32dce19164cc66f8073a26d460aa74cbe -r b1fb58bdaacfa07dd57e62f61f623fbf257ded26 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():
"""
https://bitbucket.org/yt_analysis/yt/commits/5731da203ba4/
Changeset: 5731da203ba4
Branch: yt
User: ngoldbaum
Date: 2014-11-10 06:44:45+00:00
Summary: Add a test to ensure no-op in-place conversions of dimensionless quantities is really a no-op.
This came up as a failure in the fields tests, so I've added a test to the unit module to aid future refactoring.
Affected #: 1 file
diff -r b1fb58bdaacfa07dd57e62f61f623fbf257ded26 -r 5731da203ba47a561e03c7af3ad18429dd14aa41 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
@@ -985,3 +987,10 @@
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
https://bitbucket.org/yt_analysis/yt/commits/4b395f8c71e8/
Changeset: 4b395f8c71e8
Branch: yt
User: ngoldbaum
Date: 2014-11-10 06:57:35+00:00
Summary: Ensure dimensionless results of multiplication or division are dimensionless. Closes #933
This prevents inconsistencies when comparing quantities created by two different
cosmological datasets. In this case, comoving units like 'cmcm' will have
identical unit expressions, but different cgs_values.
Previously, we would create a dimensionless unit symbol with a non-unit cgs_value.
This led to confusing results (see Issue #933).
As a side benefit, this makes it so dimensionless results are always simplified:
In [1]: from yt import YTQuantity as q
In [2]: q(3, 'm')/q(3, 'cm')
Out[2]: 100.0 dimensionless
Before, this would return "1 m/cm".
Affected #: 3 files
diff -r 5731da203ba47a561e03c7af3ad18429dd14aa41 -r 4b395f8c71e86638d4bc001647e4055fe24612ba yt/units/tests/test_ytarray.py
--- a/yt/units/tests/test_ytarray.py
+++ b/yt/units/tests/test_ytarray.py
@@ -697,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():
@@ -994,3 +999,19 @@
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 5731da203ba47a561e03c7af3ad18429dd14aa41 -r 4b395f8c71e86638d4bc001647e4055fe24612ba 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,7 @@
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))
is_mks = True
else:
conversion = None
diff -r 5731da203ba47a561e03c7af3ad18429dd14aa41 -r 4b395f8c71e86638d4bc001647e4055fe24612ba 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:
https://bitbucket.org/yt_analysis/yt/commits/6b075ca6ca3b/
Changeset: 6b075ca6ca3b
Branch: yt
User: ngoldbaum
Date: 2014-11-12 23:17:38+00:00
Summary: Ensure unit objects used for MKS/CGS conversions have a proper unit registry.
Affected #: 1 file
diff -r 4b395f8c71e86638d4bc001647e4055fe24612ba -r 6b075ca6ca3bd8de661eb92ffe44dd3c3eb291b4 yt/units/unit_object.py
--- a/yt/units/unit_object.py
+++ b/yt/units/unit_object.py
@@ -220,7 +220,8 @@
conversions = []
for atom in check_atoms:
conversions.append((atom,symbols(cgs_conversions[str(atom)])))
- conversion = Unit(unit_expr=unit_expr.subs(conversions))
+ conversion = Unit(unit_expr=unit_expr.subs(conversions),
+ registry=registry)
is_mks = True
else:
conversion = None
https://bitbucket.org/yt_analysis/yt/commits/d131c8977529/
Changeset: d131c8977529
Branch: yt
User: ngoldbaum
Date: 2014-11-12 23:18:15+00:00
Summary: Merging with mainline tip.
Affected #: 4 files
diff -r 6b075ca6ca3bd8de661eb92ffe44dd3c3eb291b4 -r d131c89775292b49c29fef623d17a95f0777cfbf yt/frontends/chombo/data_structures.py
--- a/yt/frontends/chombo/data_structures.py
+++ b/yt/frontends/chombo/data_structures.py
@@ -630,12 +630,30 @@
# read the file line by line, storing important parameters
for lineI, line in enumerate(lines):
try:
- param, sep, vals = [v.rstrip() for v in line.partition(' ')]
- #param, sep, vals = map(rstrip,line.partition(' '))
+ param, sep, vals = line.partition('=')
+ if not sep:
+ # No = sign present, so split by space instead
+ param, sep, vals = line.partition(' ')
+ param = param.strip()
+ vals = vals.strip()
+ if not param: # skip blank lines
+ continue
+ if param[0] == '#': # skip comment lines
+ continue
+ if param[0] == '[': # skip stanza headers
+ continue
+ vals = vals.partition("#")[0] # strip trailing comments
+ try:
+ self.parameters[param] = np.int64(vals)
+ except ValueError:
+ try:
+ self.parameters[param] = np.float64(vals)
+ except ValueError:
+ self.parameters[param] = vals
except ValueError:
mylog.error("ValueError: '%s'", line)
if param == "GAMMA":
- self.gamma = vals
+ self.gamma = np.float64(vals)
@classmethod
def _is_valid(self, *args, **kwargs):
diff -r 6b075ca6ca3bd8de661eb92ffe44dd3c3eb291b4 -r d131c89775292b49c29fef623d17a95f0777cfbf yt/frontends/chombo/fields.py
--- a/yt/frontends/chombo/fields.py
+++ b/yt/frontends/chombo/fields.py
@@ -24,10 +24,9 @@
from yt.frontends.boxlib.fields import \
rho_units, \
mom_units, \
- eden_units, \
- _thermal_energy_density, \
- _thermal_energy, \
- _temperature
+ eden_units
+
+from yt.utilities.exceptions import YTFieldNotFound
rho_units = "code_mass / code_length**3"
mom_units = "code_mass / (code_time * code_length**2)"
@@ -82,20 +81,70 @@
)
def setup_fluid_fields(self):
+ def _thermal_energy_density(field, data):
+ try:
+ return data['energy-density'] - data['kinetic_energy_density'] - \
+ data["magnetic_energy_density"]
+ except YTFieldNotFound:
+ return data['energy-density'] - data['kinetic_energy_density']
+
+ def _thermal_energy(field, data):
+ return data['thermal_energy_density']/data['density']
+
+ def _magnetic_energy_density(field, data):
+ ret = data["X-magnfield"]**2
+ if data.ds.dimensionality > 1:
+ ret = ret + data["Y-magnfield"]**2
+ if data.ds.dimensionality > 2:
+ ret = ret + data["Z-magnfield"]**2
+ return ret/2.0
+
+ def _magnetic_energy(field, data):
+ return data['magnetic_energy_density']/data['density']
+
+ def _kinetic_energy_density(field, data):
+ p2 = data['X-momentum']**2
+ if data.ds.dimensionality > 1:
+ p2 = p2 + data["Y-momentum"]**2
+ if data.ds.dimensionality > 2:
+ p2 = p2 + data["Z-momentum"]**2
+ return 0.5 * p2/data['density']
+
+ def _kinetic_energy(field, data):
+ return data['kinetic_energy_density']/data['density']
+
+ def _temperature(field, data):
+ c_v = data.ds.quan(data.ds.parameters['radiation.const_cv'],
+ 'erg/g/K')
+ return (data["thermal_energy"]/c_v)
+
def _get_vel(axis):
def velocity(field, data):
return data["momentum_%s" % ax]/data["density"]
return velocity
+
for ax in 'xyz':
- self.add_field("velocity_%s" % ax, function = _get_vel(ax),
+ self.add_field(("gas", "velocity_%s" % ax), function = _get_vel(ax),
units = "cm/s")
- self.add_field("thermal_energy",
+ self.add_field(("gas", "thermal_energy"),
function = _thermal_energy,
units = "erg/g")
- self.add_field("thermal_energy_density",
+ self.add_field(("gas", "thermal_energy_density"),
function = _thermal_energy_density,
units = "erg/cm**3")
- self.add_field("temperature", function=_temperature,
+ self.add_field(("gas", "kinetic_energy"),
+ function = _kinetic_energy,
+ units = "erg/g")
+ self.add_field(("gas", "kinetic_energy_density"),
+ function = _kinetic_energy_density,
+ units = "erg/cm**3")
+ self.add_field(("gas", "magnetic_energy"),
+ function = _magnetic_energy,
+ units = "erg/g")
+ self.add_field(("gas", "magnetic_energy_density"),
+ function = _magnetic_energy_density,
+ units = "erg/cm**3")
+ self.add_field(("gas", "temperature"), function=_temperature,
units="K")
diff -r 6b075ca6ca3bd8de661eb92ffe44dd3c3eb291b4 -r d131c89775292b49c29fef623d17a95f0777cfbf yt/frontends/enzo/io.py
--- a/yt/frontends/enzo/io.py
+++ b/yt/frontends/enzo/io.py
@@ -83,6 +83,9 @@
r"particle_position_%s")
x, y, z = (np.asarray(pds.get(pn % ax).value, dtype="=f8")
for ax in 'xyz')
+ for field in field_list:
+ if np.asarray(pds[field]).ndim > 1:
+ self._array_fields[field] = pds[field].shape
yield ptype, (x, y, z)
if f: f.close()
diff -r 6b075ca6ca3bd8de661eb92ffe44dd3c3eb291b4 -r d131c89775292b49c29fef623d17a95f0777cfbf yt/utilities/io_handler.py
--- a/yt/utilities/io_handler.py
+++ b/yt/utilities/io_handler.py
@@ -43,6 +43,7 @@
self.ds = ds
self._last_selector_id = None
self._last_selector_counts = None
+ self._array_fields = {}
# We need a function for reading a list of sets
# and a function for *popping* from a queue all the appropriate sets
@@ -160,6 +161,8 @@
for field in fields:
if field[1] in self._vector_fields:
shape = (fsize[field], 3)
+ elif field[1] in self._array_fields:
+ shape = (fsize[field],)+self._array_fields[field[1]]
else:
shape = (fsize[field], )
rv[field] = np.empty(shape, dtype="float64")
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