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

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Thu Oct 27 19:01:38 PDT 2016


1 new commit in yt:

https://bitbucket.org/yt_analysis/yt/commits/6b0692dca947/
Changeset:   6b0692dca947
Branch:      yt
User:        xarthisius
Date:        2016-10-28 02:01:12+00:00
Summary:     Merged in ngoldbaum/yt (pull request #2420)

[enh] speed up test_fields by avoiding repeatedly running field detection
Affected #:  4 files

diff -r aff20fbf4037f400504edd7d33c88aff92858dbb -r 6b0692dca9476c8f08c1d2abffb2412961d5b269 yt/fields/field_detector.py
--- a/yt/fields/field_detector.py
+++ b/yt/fields/field_detector.py
@@ -193,6 +193,7 @@
 
     fp_units = {
         'bulk_velocity' : 'cm/s',
+        'bulk_magnetic_field': 'G',
         'center' : 'cm',
         'normal' : '',
         'cp_x_vec': '',
@@ -207,8 +208,9 @@
         if self.field_parameters and param in self.field_parameters:
             return self.field_parameters[param]
         self.requested_parameters.append(param)
-        if param in ['bulk_velocity', 'center', 'normal']:
-            return self.ds.arr(np.random.random(3) * 1e-2, self.fp_units[param])
+        if param in ['center', 'normal'] or param.startswith('bulk'):
+            return self.ds.arr(
+                np.random.random(3) * 1e-2, self.fp_units[param])
         elif param in ['surface_height']:
             return self.ds.quan(0.0, 'code_length')
         elif param in ['axis']:

diff -r aff20fbf4037f400504edd7d33c88aff92858dbb -r 6b0692dca9476c8f08c1d2abffb2412961d5b269 yt/fields/field_info_container.py
--- a/yt/fields/field_info_container.py
+++ b/yt/fields/field_info_container.py
@@ -364,6 +364,10 @@
                 if field in self._show_field_errors:
                     raise
                 if type(e) != YTFieldNotFound:
+                    # if we're doing field tests, raise an error
+                    # see yt.fields.tests.test_fields
+                    if hasattr(self.ds, '_field_test_dataset'):
+                        raise
                     mylog.debug("Raises %s during field %s detection.",
                                 str(type(e)), field)
                 self.pop(field)

diff -r aff20fbf4037f400504edd7d33c88aff92858dbb -r 6b0692dca9476c8f08c1d2abffb2412961d5b269 yt/fields/tests/test_fields.py
--- a/yt/fields/tests/test_fields.py
+++ b/yt/fields/tests/test_fields.py
@@ -24,27 +24,6 @@
     YTFieldUnitParseError, \
     YTDimensionalityError
 
-base_ds = None
-
-
-def setup():
-    global base_ds
-    # Make this super teeny tiny
-    fields, units = [], []
-
-    for fname, (code_units, aliases, dn) in StreamFieldInfo.known_other_fields:
-        fields.append(("gas", fname))
-        units.append(code_units)
-
-    base_ds = fake_random_ds(4, fields=fields, units=units, particles=20)
-
-    base_ds.index
-    base_ds.cosmological_simulation = 1
-    base_ds.cosmology = Cosmology()
-    from yt.config import ytcfg
-    ytcfg["yt","__withintesting"] = "True"
-    np.seterr(all = 'ignore')
-
 def get_params(ds):
     return dict(
         axis = 0,
@@ -52,6 +31,8 @@
             registry = ds.unit_registry),
         bulk_velocity = YTArray((0.0, 0.0, 0.0),
             "cm/s", registry = ds.unit_registry),
+        bulk_magnetic_field = YTArray((0.0, 0.0, 0.0),
+            "G", registry = ds.unit_registry),        
         normal = YTArray((0.0, 0.0, 1.0),
             "", registry = ds.unit_registry),
         cp_x_vec = YTArray((1.0, 0.0, 0.0),
@@ -71,18 +52,79 @@
                 ("gas", "velocity_y"),
                 ("gas", "velocity_z"))
 
-def realistic_ds(fields, particle_fields, nprocs):
-    np.random.seed(int(0x4d3d3d3))
-    global base_ds
-    units = [base_ds._get_field_info(*f).units for f in fields]
-    punits = [base_ds._get_field_info('io', f).units for f in particle_fields]
-    fields = [_strip_ftype(f) for f in fields]
+def _strip_ftype(field):
+    if not isinstance(field, tuple):
+        return field
+    elif field[0] in ("all", "io"):
+        return field
+    return field[1]
 
-    ds = fake_random_ds(16, fields=fields, units=units, nprocs=nprocs,
-                        particle_fields=particle_fields,
-                        particle_field_units=punits,
-                        particles=base_ds.stream_handler.particle_count[0][0])
 
+class TestFieldAccess(object):
+    description = None
+
+    def __init__(self, field_name, ds, nprocs):
+        # Note this should be a field name
+        self.field_name = field_name
+        self.description = "Accessing_%s_%s" % (field_name, nprocs)
+        self.nprocs = nprocs
+        self.ds = ds
+
+    def __call__(self):
+        field = self.ds._get_field_info(*self.field_name)
+        skip_grids = False
+        needs_spatial = False
+        for v in field.validators:
+            if getattr(v, "ghost_zones", 0) > 0:
+                skip_grids = True
+            if hasattr(v, "ghost_zones"):
+                needs_spatial = True
+
+        ds = self.ds
+
+        # This gives unequal sized grids as well as subgrids
+        dd1 = ds.all_data()
+        dd2 = ds.all_data()
+        sp = get_params(ds)
+        dd1.field_parameters.update(sp)
+        dd2.field_parameters.update(sp)
+        with np.errstate(all='ignore'):
+            v1 = dd1[self.field_name]
+            # No more conversion checking
+            assert_equal(v1, dd1[self.field_name])
+            if not needs_spatial:
+                with field.unit_registry(dd2):
+                    res = field._function(field, dd2)
+                    res = dd2.apply_units(res, field.units)
+                assert_array_almost_equal_nulp(v1, res, 4)
+            if not skip_grids:
+                for g in ds.index.grids:
+                    g.field_parameters.update(sp)
+                    v1 = g[self.field_name]
+                    g.clear_data()
+                    g.field_parameters.update(sp)
+                    r1 = field._function(field, g)
+                    if field.particle_type:
+                        assert_equal(v1.shape[0], g.NumberOfParticles)
+                    else:
+                        assert_array_equal(r1.shape, v1.shape)
+                        for ax in 'xyz':
+                            assert_array_equal(g[ax].shape, v1.shape)
+                    with field.unit_registry(g):
+                        res = field._function(field, g)
+                        assert_array_equal(v1.shape, res.shape)
+                        res = g.apply_units(res, field.units)
+                    assert_array_almost_equal_nulp(v1, res, 4)
+
+def get_base_ds(nprocs):
+    fields, units = [], []
+
+    for fname, (code_units, aliases, dn) in StreamFieldInfo.known_other_fields:
+        fields.append(("gas", fname))
+        units.append(code_units)
+
+    ds = fake_random_ds(
+        4, fields=fields, units=units, particles=20, nprocs=nprocs)
     ds.parameters["HydroMethod"] = "streaming"
     ds.parameters["EOSType"] = 1.0
     ds.parameters["EOSSoundSpeed"] = 1.0
@@ -98,108 +140,37 @@
                              omega_matter=ds.omega_matter,
                              omega_lambda=ds.omega_lambda,
                              unit_registry=ds.unit_registry)
+    # ensures field errors are raised during testing
+    # see FieldInfoContainer.check_derived_fields
+    ds._field_test_dataset = True
+    ds.index
     return ds
+    
+def test_all_fields():
+    datasets = {}
+        
+    for nprocs in [1, 4, 8]:
+        ds = get_base_ds(nprocs)
+        datasets[nprocs] = ds
 
-def _strip_ftype(field):
-    if not isinstance(field, tuple):
-        return field
-    elif field[0] in ("all", "io"):
-        return field
-    return field[1]
-
-
-class TestFieldAccess(object):
-    description = None
-
-    def __init__(self, field_name, nproc):
-        # Note this should be a field name
-        self.field_name = field_name
-        self.description = "Accessing_%s_%s" % (field_name, nproc)
-        self.nproc = nproc
-
-    def __call__(self):
-        global base_ds
-        field = base_ds._get_field_info(*self.field_name)
-        deps = field.get_dependencies(ds = base_ds)
-        requested = deps.requested
-        particle_fields = \
-            ['particle_position_x', 'particle_position_y', 'particle_position_z',
-             'particle_velocity_x', 'particle_velocity_y', 'particle_velocity_z',
-             'particle_mass']
-        fields = list(_base_fields)
-
-        for rf in requested:
-            if rf[0] == 'io' or rf[0] == 'all':
-                if rf not in particle_fields or rf[1] not in particle_fields:
-                    particle_fields.append(rf[1])
-            else:
-                fields.append(rf)
-
-        skip_grids = False
-        needs_spatial = False
-        for v in field.validators:
-            f = getattr(v, "fields", None)
-            if f: fields += f
-            if getattr(v, "ghost_zones", 0) > 0:
-                skip_grids = True
-            if hasattr(v, "ghost_zones"):
-                needs_spatial = True
-
-        ds = realistic_ds(fields, particle_fields, self.nproc)
-
-        # This gives unequal sized grids as well as subgrids
-        dd1 = ds.all_data()
-        dd2 = ds.all_data()
-        sp = get_params(ds)
-        dd1.field_parameters.update(sp)
-        dd2.field_parameters.update(sp)
-        v1 = dd1[self.field_name]
-        # No more conversion checking
-        assert_equal(v1, dd1[self.field_name])
-        if not needs_spatial:
-            with field.unit_registry(dd2):
-                res = field._function(field, dd2)
-                res = dd2.apply_units(res, field.units)
-            assert_array_almost_equal_nulp(v1, res, 4)
-        if not skip_grids:
-            for g in ds.index.grids:
-                g.field_parameters.update(sp)
-                v1 = g[self.field_name]
-                g.clear_data()
-                g.field_parameters.update(sp)
-                r1 = field._function(field, g)
-                if field.particle_type:
-                    assert_equal(v1.shape[0], g.NumberOfParticles)
-                else:
-                    assert_array_equal(r1.shape, v1.shape)
-                    for ax in 'xyz':
-                        assert_array_equal(g[ax].shape, v1.shape)
-                with field.unit_registry(g):
-                    res = field._function(field, g)
-                    assert_array_equal(v1.shape, res.shape)
-                    res = g.apply_units(res, field.units)
-                assert_array_almost_equal_nulp(v1, res, 4)
-
-def test_all_fields():
-    global base_ds
-    for field in sorted(base_ds.field_info):
+    for field in sorted(ds.field_info):
         if field[1].find("beta_p") > -1:
             continue
         if field[1].find("vertex") > -1:
             # don't test the vertex fields for now
             continue
-        if field in base_ds.field_list:
+        if field in ds.field_list:
             # Don't know how to test this.  We need some way of having fields
             # that are fallbacks be tested, but we don't have that now.
             continue
 
-        for nproc in [1, 4, 8]:
-            test_all_fields.__name__ = "%s_%s" % (field, nproc)
-            yield TestFieldAccess(field, nproc)
+        for nprocs in [1, 4, 8]:
+            test_all_fields.__name__ = "%s_%s" % (field, nprocs)
+            yield TestFieldAccess(field, datasets[nprocs], nprocs)
 
 def test_add_deposited_particle_field():
     # NOT tested: "std", "mesh_id", "nearest" and "simple_smooth"
-    global base_ds
+    base_ds = get_base_ds(1)
     ad = base_ds.all_data()
 
     # Test "count", "sum" and "cic" method
@@ -231,9 +202,9 @@
     assert_almost_equal(ret.sum(), 3824750.912653606)
 
 def test_add_gradient_fields():
-    global base_ds
-    gfields = base_ds.add_gradient_fields(("gas","density"))
-    gfields += base_ds.add_gradient_fields(("index", "ones"))
+    ds = get_base_ds(1)
+    gfields = ds.add_gradient_fields(("gas","density"))
+    gfields += ds.add_gradient_fields(("index", "ones"))
     field_list = [('gas', 'density_gradient_x'),
                   ('gas', 'density_gradient_y'),
                   ('gas', 'density_gradient_z'),
@@ -243,7 +214,7 @@
                   ('index', 'ones_gradient_z'),
                   ('index', 'ones_gradient_magnitude')]
     assert_equal(gfields, field_list)
-    ad = base_ds.all_data()
+    ad = ds.all_data()
     for field in field_list:
         ret = ad[field]
         if field[0] == 'gas':
@@ -346,12 +317,3 @@
     a1 = np.argsort(mi)
     a2 = np.argsort(mi2)
     assert_array_equal(a1, a2)
-
-if __name__ == "__main__":
-    setup()
-    for t in test_all_fields():
-        t()
-    test_add_deposited_particle_field()
-    test_add_field_unit_semantics()
-    test_array_like_field()
-    test_add_field_string()

diff -r aff20fbf4037f400504edd7d33c88aff92858dbb -r 6b0692dca9476c8f08c1d2abffb2412961d5b269 yt/utilities/lib/misc_utilities.pyx
--- a/yt/utilities/lib/misc_utilities.pyx
+++ b/yt/utilities/lib/misc_utilities.pyx
@@ -764,7 +764,8 @@
         if bulk_vector is None:
             bv[0] = bv[1] = bv[2] = 0.0
         else:
-            bulk_vector = bulk_vector.in_units(vxg.units)
+            if hasattr(bulk_vector, 'in_units'):
+                bulk_vector = bulk_vector.in_units(vxg.units)
             bv[0] = bulk_vector[0]
             bv[1] = bulk_vector[1]
             bv[2] = bulk_vector[2]

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