[yt-svn] commit/yt: 3 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Mon Mar 24 10:44:22 PDT 2014


3 new commits in yt:

https://bitbucket.org/yt_analysis/yt/commits/3c13b3386e79/
Changeset:   3c13b3386e79
Branch:      yt-3.0
User:        MatthewTurk
Date:        2014-03-23 23:13:11
Summary:     Starting to update Chombo for the units.
Affected #:  6 files

diff -r 4646247054fb995eb10d56ea41af868479098bdb -r 3c13b3386e797ff86e42d054992ad31d1bba8118 yt/frontends/boxlib/fields.py
--- a/yt/frontends/boxlib/fields.py
+++ b/yt/frontends/boxlib/fields.py
@@ -24,8 +24,6 @@
 mom_units = "code_mass * code_length / code_time"
 eden_units = "code_mass / (code_time**2 * code_length)" # erg / cm^3
 
-
-
 def _thermal_energy_density(field, data):
     ke = 0.5 * ( data["momentum_x"]**2
                + data["momentum_y"]**2

diff -r 4646247054fb995eb10d56ea41af868479098bdb -r 3c13b3386e797ff86e42d054992ad31d1bba8118 yt/frontends/chombo/api.py
--- a/yt/frontends/chombo/api.py
+++ b/yt/frontends/chombo/api.py
@@ -19,8 +19,8 @@
       ChomboDataset
 
 from .fields import \
-      ChomboFieldInfo, \
-      add_chombo_field
+      ChomboFieldInfo
+add_chombo_field = ChomboFieldInfo.add_field
 
 from .io import \
       IOHandlerChomboHDF5

diff -r 4646247054fb995eb10d56ea41af868479098bdb -r 3c13b3386e797ff86e42d054992ad31d1bba8118 yt/frontends/chombo/data_structures.py
--- a/yt/frontends/chombo/data_structures.py
+++ b/yt/frontends/chombo/data_structures.py
@@ -43,12 +43,15 @@
      mpc_conversion, sec_conversion
 from yt.utilities.parallel_tools.parallel_analysis_interface import \
      parallel_root_only
+from yt.units.yt_array import \
+    YTArray, \
+    YTQuantity
+from yt.utilities.lib.misc_utilities import \
+    get_box_grids_level
 from yt.utilities.io_handler import \
     io_registry
 
-from yt.fields.field_info_container import \
-    FieldInfoContainer, NullFunc
-from .fields import ChomboFieldInfo, KnownChomboFields
+from .fields import ChomboFieldInfo
 
 class ChomboGrid(AMRGridPatch):
     _id_offset = 0
@@ -104,7 +107,7 @@
         self._levels = self._handle.keys()[1:]
         GridIndex.__init__(self,pf,dataset_type)
         self._read_particles()
-        self._fhandle.close()
+        self._handle.close()
 
     def _read_particles(self):
         self.particle_filename = self.index_filename[:-4] + 'sink'
@@ -136,7 +139,7 @@
 
     def _detect_output_fields(self):
         ncomp = int(self._handle['/'].attrs['num_components'])
-        self.field_list = [c[1] for c in self._handle['/'].attrs.items()[-ncomp:]]
+        self.field_list = [("chombo", c[1]) for c in self._handle['/'].attrs.items()[-ncomp:]]
           
     def _count_grids(self):
         self.num_grids = 0
@@ -174,32 +177,38 @@
 #        self.grids = np.array(self.grids, dtype='object')
 
     def _populate_grid_objects(self):
+        self._reconstruct_parent_child()
         for g in self.grids:
             g._prepare_grid()
             g._setup_dx()
-
-        for g in self.grids:
-            g.Children = self._get_grid_children(g)
-            for g1 in g.Children:
-                g1.Parent.append(g)
         self.max_level = self.grid_levels.max()
 
     def _setup_derived_fields(self):
         self.derived_field_list = []
 
-    def _get_grid_children(self, grid):
-        mask = np.zeros(self.num_grids, dtype='bool')
-        grids, grid_ind = self.get_box_grids(grid.LeftEdge, grid.RightEdge)
-        mask[grid_ind] = True
-        return [g for g in self.grids[mask] if g.Level == grid.Level + 1]
+    def _reconstruct_parent_child(self):
+        mask = np.empty(len(self.grids), dtype='int32')
+        mylog.debug("First pass; identifying child grids")
+        for i, grid in enumerate(self.grids):
+            get_box_grids_level(self.grid_left_edge[i,:],
+                                self.grid_right_edge[i,:],
+                                self.grid_levels[i] + 1,
+                                self.grid_left_edge, self.grid_right_edge,
+                                self.grid_levels, mask)
+            ids = np.where(mask.astype("bool")) # where is a tuple
+            grid._children_ids = ids[0] + grid._id_offset 
+        mylog.debug("Second pass; identifying parents")
+        for i, grid in enumerate(self.grids): # Second pass
+            for child in grid.Children:
+                child._parent_id.append(i + grid._id_offset)
 
 class ChomboDataset(Dataset):
     _index_class = ChomboHierarchy
-    _fieldinfo_fallback = ChomboFieldInfo
-    _fieldinfo_known = KnownChomboFields
+    _field_info_class = ChomboFieldInfo
 
     def __init__(self, filename, dataset_type='chombo_hdf5',
                  storage_filename = None, ini_filename = None):
+        self.fluid_types += ("chombo",)
         self._handle = h5py.File(filename,'r')
         self.current_time = self._handle.attrs['time']
         self.ini_filename = ini_filename
@@ -216,34 +225,11 @@
     def __del__(self):
         self._handle.close()
 
-    def _set_units(self):
-        """
-        Generates the conversion to various physical _units based on the parameter file
-        """
-        self.units = {}
-        self.time_units = {}
-        if len(self.parameters) == 0:
-            self._parse_parameter_file()
-        self._setup_nounits_units()
-        self.conversion_factors = defaultdict(lambda: 1.0)
-        self.time_units['1'] = 1
-        self.units['1'] = 1.0
-        self.units['unitary'] = 1.0 / (self.domain_right_edge - self.domain_left_edge).max()
-        seconds = 1 #self["Time"]
-        for unit in sec_conversion.keys():
-            self.time_units[unit] = seconds / sec_conversion[unit]
-        for key in yt2chomboFieldsDict:
-            self.conversion_factors[key] = 1.0
-
-    def _setup_nounits_units(self):
-        z = 0
-        mylog.warning("Setting 1.0 in code units to be 1.0 cm")
-        if not self.has_key("TimeUnits"):
-            mylog.warning("No time units.  Setting 1.0 = 1 second.")
-            self.conversion_factors["Time"] = 1.0
-        for unit in mpc_conversion.keys():
-            self.units[unit] = mpc_conversion[unit] / mpc_conversion["cm"]
-
+    def _set_code_unit_attributes(self):
+        self.length_unit = YTQuantity(1.0, "cm")
+        self.mass_unit = YTQuantity(1.0, "g")
+        self.time_unit = YTQuantity(1.0, "s")
+        self.velocity_unit = YTQuantity(1.0, "cm/s")
 
     def _localize(self, f, default):
         if f is None:

diff -r 4646247054fb995eb10d56ea41af868479098bdb -r 3c13b3386e797ff86e42d054992ad31d1bba8118 yt/frontends/chombo/fields.py
--- a/yt/frontends/chombo/fields.py
+++ b/yt/frontends/chombo/fields.py
@@ -13,159 +13,71 @@
 # The full license is in the file COPYING.txt, distributed with this software.
 #-----------------------------------------------------------------------------
 
+import numpy as np
 from yt.fields.field_info_container import \
-    FieldInfoContainer, \
-    FieldInfo, \
-    NullFunc, \
-    ValidateParameter, \
-    ValidateDataField, \
-    ValidateProperty, \
-    ValidateSpatial, \
-    ValidateGridType
-import numpy as np
+    FieldInfoContainer
+from yt.frontends.boxlib.fields import \
+    rho_units, \
+    mom_units, \
+    eden_units, \
+    _thermal_energy_density, \
+    _thermal_energy, \
+    _temperature
 
-KnownChomboFields = FieldInfoContainer()
-add_chombo_field = KnownChomboFields.add_field
+rho_units = "code_mass / code_length**3"
+mom_units = "code_mass * code_length / code_time"
+eden_units = "code_mass / (code_time**2 * code_length)" # erg / cm^3
 
-ChomboFieldInfo = FieldInfoContainer.create_with_fallback(FieldInfo)
-add_field = ChomboFieldInfo.add_field
+# We duplicate everything here from Boxlib, because we want to be able to
+# subclass it and that can be somewhat tricky.
+class ChomboFieldInfo(FieldInfoContainer):
+    known_other_fields = (
+        ("density", (rho_units, ["density"], None)),
+        ("energy-density", (eden_units, ["energy_density"], None)),
+        ("radiation-energy-density", (eden_units, ["radiation_energy_density"], None)),
+        ("X-momentum", (mom_units, ["momentum_x"], None)),
+        ("Y-momentum", (mom_units, ["momentum_y"], None)),
+        ("Z-momentum", (mom_units, ["momentum_z"], None)),
+        ("temperature", ("K", ["temperature"], None)),
+        ("X-magnfield", ("gauss", ["magnetic_field_x"], None)),
+        ("Y-magnfield", ("gauss", ["magnetic_field_y"], None)),
+        ("Z-magnfield", ("gauss", ["magnetic_field_z"], None)),
+    )
 
-add_chombo_field("density", function=NullFunc, take_log=True,
-                 validators = [ValidateDataField("density")],
-                 units="g/cm**3")
+    known_particle_fields = (
+        ("particle_mass", ("code_mass", [], None)),
+        ("particle_position_x", ("code_length", [], None)),
+        ("particle_position_y", ("code_length", [], None)),
+        ("particle_position_z", ("code_length", [], None)),
+        ("particle_momentum_x", (mom_units, [], None)),
+        ("particle_momentum_y", (mom_units, [], None)),
+        ("particle_momentum_z", (mom_units, [], None)),
+        # Note that these are *internal* agmomen
+        ("particle_angmomen_x", ("code_length**2/code_time", [], None)),
+        ("particle_angmomen_y", ("code_length**2/code_time", [], None)),
+        ("particle_angmomen_z", ("code_length**2/code_time", [], None)),
+        ("particle_mlast", ("code_mass", [], None)),
+        ("particle_r", ("code_length", [], None)),
+        ("particle_mdeut", ("code_mass", [], None)),
+        ("particle_n", ("", [], None)),
+        ("particle_mdot", ("code_mass/code_time", [], None)),
+        ("particle_burnstate", ("", [], None)),
+        ("particle_luminosity", ("", [], None)),
+        ("particle_id", ("", ["particle_index"], None)),
+    )
 
-add_chombo_field("X-momentum", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("X-Momentum")],
-                 units="g/cm**2/s",display_name=r"M_x")
-
-add_chombo_field("Y-momentum", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("Y-Momentum")],
-                 units="g/cm**2/s",display_name=r"M_y")
-
-add_chombo_field("Z-momentum", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("Z-Momentum")],
-                 units="g/cm**2/s",display_name=r"M_z")
-
-add_chombo_field("X-magnfield", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("X-Magnfield")],
-                 units="gauss",display_name=r"B_x")
-
-add_chombo_field("Y-magnfield", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("Y-Magnfield")],
-                 units="gauss",display_name=r"B_y")
-
-add_chombo_field("Z-magnfield", function=NullFunc, take_log=False,
-                  validators = [ValidateDataField("Z-Magnfield")],
-                  units="gauss",display_name=r"B_z")
-
-add_chombo_field("energy-density", function=NullFunc, take_log=True,
-                 validators = [ValidateDataField("energy-density")],
-                 units="erg/cm**3")
-
-add_chombo_field("radiation-energy-density", function=NullFunc, take_log=True,
-                 validators = [ValidateDataField("radiation-energy-density")],
-                 units="erg/cm**3")
-
-def _Density(field,data):
-    """A duplicate of the density field. This is needed because when you try 
-    to instantiate a PlotCollection without passing in a center, the code
-    will try to generate one for you using the "Density" field, which gives an error 
-    if it isn't defined.
-
-    """
-    return data["density"]
-add_field("Density",function=_Density, take_log=True,
-          units='g/cm**3')
-
-def _Bx(field,data):
-    return data["X-magnfield"]
-add_field("Bx", function=_Bx, take_log=False,
-          units="gauss", display_name=r"B_x")
-
-def _By(field,data):
-    return data["Y-magnfield"]
-add_field("By", function=_By, take_log=False,
-          units="gauss", display_name=r"B_y")
-
-def _Bz(field,data):
-    return data["Z-magnfield"]
-add_field("Bz", function=_Bz, take_log=False,
-          units="gauss", display_name=r"B_z")
-
-def _MagneticEnergy(field,data):
-    return (data["X-magnfield"]**2 +
-            data["Y-magnfield"]**2 +
-            data["Z-magnfield"]**2)/2.
-add_field("MagneticEnergy", function=_MagneticEnergy, take_log=True,
-          units=r"erg/cm**3", display_name=r"B^2 / 8 \pi")
-
-def _xVelocity(field, data):
-    """ Generate x-velocity from x-momentum and density. """
-    return data["X-momentum"]/data["density"]
-add_field("x-velocity",function=_xVelocity, take_log=False,
-          units='cm/s')
-
-def _yVelocity(field,data):
-    """ Generate y-velocity from y-momentum and density. """
-    #try:
-    #    return data["xvel"]
-    #except KeyError:
-    return data["Y-momentum"]/data["density"]
-add_field("y-velocity",function=_yVelocity, take_log=False,
-          units='cm/s')
-
-def _zVelocity(field,data):
-    """ Generate z-velocity from z-momentum and density. """
-    return data["Z-momentum"]/data["density"]
-add_field("z-velocity",function=_zVelocity, take_log=False,
-          units='cm/s')
-
-def particle_func(p_field, dtype='float64'):
-    def _Particles(field, data):
-        io = data.index.io
-        if not data.NumberOfParticles > 0:
-            return np.array([], dtype=dtype)
-        else:
-            return io._read_particles(data, p_field).astype(dtype)
-        
-    return _Particles
-
-_particle_field_list = ["mass",
-                        "position_x",
-                        "position_y",
-                        "position_z",
-                        "momentum_x",
-                        "momentum_y",
-                        "momentum_z",
-                        "angmomen_x",
-                        "angmomen_y",
-                        "angmomen_z",
-                        "mlast",
-                        "r",
-                        "mdeut",
-                        "n",
-                        "mdot",
-                        "burnstate",
-                        "luminosity",
-                        "id"]
-
-for pf in _particle_field_list:
-    pfunc = particle_func("particle_%s" % (pf))
-    add_field("particle_%s" % pf, function=pfunc,
-              validators = [ValidateSpatial(0)],
-              particle_type=True)
-
-def _ParticleMass(field, data):
-    particles = data["particle_mass"].astype('float64')
-    return particles
-
-def _ParticleMassMsun(field, data):
-    particles = data["particle_mass"].astype('float64')
-    return particles/1.989e33
-
-add_field("ParticleMass",
-          function=_ParticleMass, validators=[ValidateSpatial(0)],
-          particle_type=True)
-add_field("ParticleMassMsun",
-          function=_ParticleMassMsun, validators=[ValidateSpatial(0)],
-          particle_type=True)
+    def setup_fluid_fields(self):
+        def _get_vel(axis):
+            def velocity(field, data):
+                return data["%smom" % ax]/data["density"]
+        for ax in 'xyz':
+            self.add_field("velocity_%s" % ax, function = _get_vel(ax),
+                           units = "cm/s")
+        self.add_field("thermal_energy",
+                       function = _thermal_energy,
+                       units = "erg/g")
+        self.add_field("thermal_energy_density",
+                       function = _thermal_energy_density,
+                       units = "erg/cm**3")
+        self.add_field("temperature", function=_temperature,
+                       units="K")

diff -r 4646247054fb995eb10d56ea41af868479098bdb -r 3c13b3386e797ff86e42d054992ad31d1bba8118 yt/frontends/chombo/io.py
--- a/yt/frontends/chombo/io.py
+++ b/yt/frontends/chombo/io.py
@@ -26,8 +26,7 @@
     _data_string = 'data:datatype=0'
 
     def __init__(self, pf, *args, **kwargs):
-        BaseIOHandler.__init__(self, *args, **kwargs)
-        self.pf = pf
+        BaseIOHandler.__init__(self, pf)
         self._handle = pf._handle
 
     _field_dict = None

diff -r 4646247054fb995eb10d56ea41af868479098bdb -r 3c13b3386e797ff86e42d054992ad31d1bba8118 yt/mods.py
--- a/yt/mods.py
+++ b/yt/mods.py
@@ -102,8 +102,8 @@
     HaloCatalogDataset, HaloCatalogFieldInfo, \
     RockstarDataset, RockstarFieldInfo
 
-#from yt.frontends.chombo.api import \
-#    ChomboDataset, ChomboFieldInfo, add_chombo_field
+from yt.frontends.chombo.api import \
+    ChomboDataset, ChomboFieldInfo, add_chombo_field
 
 from yt.frontends.gdf.api import \
     GDFDataset, GDFFieldInfo, add_gdf_field


https://bitbucket.org/yt_analysis/yt/commits/f42b95e68bec/
Changeset:   f42b95e68bec
Branch:      yt-3.0
User:        MatthewTurk
Date:        2014-03-24 04:38:10
Summary:     This implements _read_fluid_selection for Chombo.
Affected #:  2 files

diff -r 3c13b3386e797ff86e42d054992ad31d1bba8118 -r f42b95e68becc29a343c84ba7451ee8e73fd2c7d yt/frontends/chombo/data_structures.py
--- a/yt/frontends/chombo/data_structures.py
+++ b/yt/frontends/chombo/data_structures.py
@@ -107,7 +107,6 @@
         self._levels = self._handle.keys()[1:]
         GridIndex.__init__(self,pf,dataset_type)
         self._read_particles()
-        self._handle.close()
 
     def _read_particles(self):
         self.particle_filename = self.index_filename[:-4] + 'sink'

diff -r 3c13b3386e797ff86e42d054992ad31d1bba8118 -r f42b95e68becc29a343c84ba7451ee8e73fd2c7d yt/frontends/chombo/io.py
--- a/yt/frontends/chombo/io.py
+++ b/yt/frontends/chombo/io.py
@@ -16,6 +16,7 @@
 import os
 import re
 import numpy as np
+from yt.utilities.logger import ytLogger as mylog
 
 from yt.utilities.io_handler import \
            BaseIOHandler
@@ -60,6 +61,52 @@
         
         return data.reshape(dims, order='F')
 
+    def _read_fluid_selection(self, chunks, selector, fields, size):
+        rv = {}
+        chunks = list(chunks)
+        fields.sort(key=lambda a: self.field_dict[a[1]])
+        if selector.__class__.__name__ == "GridSelector":
+            if not (len(chunks) == len(chunks[0].objs) == 1):
+                raise RuntimeError
+            grid = chunks[0].objs[0]
+            lstring = 'level_%i' % grid.Level
+            lev = self._handle[lstring]
+            grid_offset = lev[self._offset_string][grid._level_id]
+            boxsize = grid.ActiveDimensions.prod()
+            for ftype, fname in fields:
+                start = grid_offset+self.field_dict[fname]*boxsize
+                stop = start + boxsize
+                data = lev[self._data_string][start:stop]
+                rv[ftype, fname] = data.reshape(grid.ActiveDimensions,
+                                        order='F')
+            return rv
+        if size is None:
+            size = sum((g.count(selector) for chunk in chunks
+                        for g in chunk.objs))
+        for field in fields:
+            ftype, fname = field
+            fsize = size
+            rv[field] = np.empty(fsize, dtype="float64")
+        ng = sum(len(c.objs) for c in chunks)
+        mylog.debug("Reading %s cells of %s fields in %s grids",
+                   size, [f2 for f1, f2 in fields], ng)
+        ind = 0
+        for chunk in chunks:
+            for g in chunk.objs:
+                lstring = 'level_%i' % g.Level
+                lev = self._handle[lstring]
+                grid_offset = lev[self._offset_string][g._level_id]
+                boxsize = g.ActiveDimensions.prod()
+                nd = 0
+                for field in fields:
+                    start = grid_offset+self.field_dict[fname]*boxsize
+                    stop = start + boxsize
+                    data = lev[self._data_string][start:stop]
+                    data = data.reshape(g.ActiveDimensions, order='F')
+                    nd = g.select(selector, data, rv[field], ind) # caches
+                ind += nd
+        return rv
+
     def _read_particles(self, grid, field):
         """
         parses the Orion Star Particle text files


https://bitbucket.org/yt_analysis/yt/commits/b97321eeeced/
Changeset:   b97321eeeced
Branch:      yt-3.0
User:        ngoldbaum
Date:        2014-03-24 18:44:16
Summary:     Merged in MatthewTurk/yt/yt-3.0 (pull request #748)

Chombo with unitrefactor
Affected #:  6 files

diff -r 8998ed2194500cd405198102eb90239d20e73b75 -r b97321eeeceda3ecdbb907d1eaea71e072139e7a yt/frontends/boxlib/fields.py
--- a/yt/frontends/boxlib/fields.py
+++ b/yt/frontends/boxlib/fields.py
@@ -24,8 +24,6 @@
 mom_units = "code_mass * code_length / code_time"
 eden_units = "code_mass / (code_time**2 * code_length)" # erg / cm^3
 
-
-
 def _thermal_energy_density(field, data):
     ke = 0.5 * ( data["momentum_x"]**2
                + data["momentum_y"]**2

diff -r 8998ed2194500cd405198102eb90239d20e73b75 -r b97321eeeceda3ecdbb907d1eaea71e072139e7a yt/frontends/chombo/api.py
--- a/yt/frontends/chombo/api.py
+++ b/yt/frontends/chombo/api.py
@@ -19,8 +19,8 @@
       ChomboDataset
 
 from .fields import \
-      ChomboFieldInfo, \
-      add_chombo_field
+      ChomboFieldInfo
+add_chombo_field = ChomboFieldInfo.add_field
 
 from .io import \
       IOHandlerChomboHDF5

diff -r 8998ed2194500cd405198102eb90239d20e73b75 -r b97321eeeceda3ecdbb907d1eaea71e072139e7a yt/frontends/chombo/data_structures.py
--- a/yt/frontends/chombo/data_structures.py
+++ b/yt/frontends/chombo/data_structures.py
@@ -43,12 +43,15 @@
      mpc_conversion, sec_conversion
 from yt.utilities.parallel_tools.parallel_analysis_interface import \
      parallel_root_only
+from yt.units.yt_array import \
+    YTArray, \
+    YTQuantity
+from yt.utilities.lib.misc_utilities import \
+    get_box_grids_level
 from yt.utilities.io_handler import \
     io_registry
 
-from yt.fields.field_info_container import \
-    FieldInfoContainer, NullFunc
-from .fields import ChomboFieldInfo, KnownChomboFields
+from .fields import ChomboFieldInfo
 
 class ChomboGrid(AMRGridPatch):
     _id_offset = 0
@@ -104,7 +107,6 @@
         self._levels = self._handle.keys()[1:]
         GridIndex.__init__(self,pf,dataset_type)
         self._read_particles()
-        self._fhandle.close()
 
     def _read_particles(self):
         self.particle_filename = self.index_filename[:-4] + 'sink'
@@ -136,7 +138,7 @@
 
     def _detect_output_fields(self):
         ncomp = int(self._handle['/'].attrs['num_components'])
-        self.field_list = [c[1] for c in self._handle['/'].attrs.items()[-ncomp:]]
+        self.field_list = [("chombo", c[1]) for c in self._handle['/'].attrs.items()[-ncomp:]]
           
     def _count_grids(self):
         self.num_grids = 0
@@ -174,32 +176,38 @@
 #        self.grids = np.array(self.grids, dtype='object')
 
     def _populate_grid_objects(self):
+        self._reconstruct_parent_child()
         for g in self.grids:
             g._prepare_grid()
             g._setup_dx()
-
-        for g in self.grids:
-            g.Children = self._get_grid_children(g)
-            for g1 in g.Children:
-                g1.Parent.append(g)
         self.max_level = self.grid_levels.max()
 
     def _setup_derived_fields(self):
         self.derived_field_list = []
 
-    def _get_grid_children(self, grid):
-        mask = np.zeros(self.num_grids, dtype='bool')
-        grids, grid_ind = self.get_box_grids(grid.LeftEdge, grid.RightEdge)
-        mask[grid_ind] = True
-        return [g for g in self.grids[mask] if g.Level == grid.Level + 1]
+    def _reconstruct_parent_child(self):
+        mask = np.empty(len(self.grids), dtype='int32')
+        mylog.debug("First pass; identifying child grids")
+        for i, grid in enumerate(self.grids):
+            get_box_grids_level(self.grid_left_edge[i,:],
+                                self.grid_right_edge[i,:],
+                                self.grid_levels[i] + 1,
+                                self.grid_left_edge, self.grid_right_edge,
+                                self.grid_levels, mask)
+            ids = np.where(mask.astype("bool")) # where is a tuple
+            grid._children_ids = ids[0] + grid._id_offset 
+        mylog.debug("Second pass; identifying parents")
+        for i, grid in enumerate(self.grids): # Second pass
+            for child in grid.Children:
+                child._parent_id.append(i + grid._id_offset)
 
 class ChomboDataset(Dataset):
     _index_class = ChomboHierarchy
-    _fieldinfo_fallback = ChomboFieldInfo
-    _fieldinfo_known = KnownChomboFields
+    _field_info_class = ChomboFieldInfo
 
     def __init__(self, filename, dataset_type='chombo_hdf5',
                  storage_filename = None, ini_filename = None):
+        self.fluid_types += ("chombo",)
         self._handle = h5py.File(filename,'r')
         self.current_time = self._handle.attrs['time']
         self.ini_filename = ini_filename
@@ -216,34 +224,11 @@
     def __del__(self):
         self._handle.close()
 
-    def _set_units(self):
-        """
-        Generates the conversion to various physical _units based on the parameter file
-        """
-        self.units = {}
-        self.time_units = {}
-        if len(self.parameters) == 0:
-            self._parse_parameter_file()
-        self._setup_nounits_units()
-        self.conversion_factors = defaultdict(lambda: 1.0)
-        self.time_units['1'] = 1
-        self.units['1'] = 1.0
-        self.units['unitary'] = 1.0 / (self.domain_right_edge - self.domain_left_edge).max()
-        seconds = 1 #self["Time"]
-        for unit in sec_conversion.keys():
-            self.time_units[unit] = seconds / sec_conversion[unit]
-        for key in yt2chomboFieldsDict:
-            self.conversion_factors[key] = 1.0
-
-    def _setup_nounits_units(self):
-        z = 0
-        mylog.warning("Setting 1.0 in code units to be 1.0 cm")
-        if not self.has_key("TimeUnits"):
-            mylog.warning("No time units.  Setting 1.0 = 1 second.")
-            self.conversion_factors["Time"] = 1.0
-        for unit in mpc_conversion.keys():
-            self.units[unit] = mpc_conversion[unit] / mpc_conversion["cm"]
-
+    def _set_code_unit_attributes(self):
+        self.length_unit = YTQuantity(1.0, "cm")
+        self.mass_unit = YTQuantity(1.0, "g")
+        self.time_unit = YTQuantity(1.0, "s")
+        self.velocity_unit = YTQuantity(1.0, "cm/s")
 
     def _localize(self, f, default):
         if f is None:

diff -r 8998ed2194500cd405198102eb90239d20e73b75 -r b97321eeeceda3ecdbb907d1eaea71e072139e7a yt/frontends/chombo/fields.py
--- a/yt/frontends/chombo/fields.py
+++ b/yt/frontends/chombo/fields.py
@@ -13,159 +13,71 @@
 # The full license is in the file COPYING.txt, distributed with this software.
 #-----------------------------------------------------------------------------
 
+import numpy as np
 from yt.fields.field_info_container import \
-    FieldInfoContainer, \
-    FieldInfo, \
-    NullFunc, \
-    ValidateParameter, \
-    ValidateDataField, \
-    ValidateProperty, \
-    ValidateSpatial, \
-    ValidateGridType
-import numpy as np
+    FieldInfoContainer
+from yt.frontends.boxlib.fields import \
+    rho_units, \
+    mom_units, \
+    eden_units, \
+    _thermal_energy_density, \
+    _thermal_energy, \
+    _temperature
 
-KnownChomboFields = FieldInfoContainer()
-add_chombo_field = KnownChomboFields.add_field
+rho_units = "code_mass / code_length**3"
+mom_units = "code_mass * code_length / code_time"
+eden_units = "code_mass / (code_time**2 * code_length)" # erg / cm^3
 
-ChomboFieldInfo = FieldInfoContainer.create_with_fallback(FieldInfo)
-add_field = ChomboFieldInfo.add_field
+# We duplicate everything here from Boxlib, because we want to be able to
+# subclass it and that can be somewhat tricky.
+class ChomboFieldInfo(FieldInfoContainer):
+    known_other_fields = (
+        ("density", (rho_units, ["density"], None)),
+        ("energy-density", (eden_units, ["energy_density"], None)),
+        ("radiation-energy-density", (eden_units, ["radiation_energy_density"], None)),
+        ("X-momentum", (mom_units, ["momentum_x"], None)),
+        ("Y-momentum", (mom_units, ["momentum_y"], None)),
+        ("Z-momentum", (mom_units, ["momentum_z"], None)),
+        ("temperature", ("K", ["temperature"], None)),
+        ("X-magnfield", ("gauss", ["magnetic_field_x"], None)),
+        ("Y-magnfield", ("gauss", ["magnetic_field_y"], None)),
+        ("Z-magnfield", ("gauss", ["magnetic_field_z"], None)),
+    )
 
-add_chombo_field("density", function=NullFunc, take_log=True,
-                 validators = [ValidateDataField("density")],
-                 units="g/cm**3")
+    known_particle_fields = (
+        ("particle_mass", ("code_mass", [], None)),
+        ("particle_position_x", ("code_length", [], None)),
+        ("particle_position_y", ("code_length", [], None)),
+        ("particle_position_z", ("code_length", [], None)),
+        ("particle_momentum_x", (mom_units, [], None)),
+        ("particle_momentum_y", (mom_units, [], None)),
+        ("particle_momentum_z", (mom_units, [], None)),
+        # Note that these are *internal* agmomen
+        ("particle_angmomen_x", ("code_length**2/code_time", [], None)),
+        ("particle_angmomen_y", ("code_length**2/code_time", [], None)),
+        ("particle_angmomen_z", ("code_length**2/code_time", [], None)),
+        ("particle_mlast", ("code_mass", [], None)),
+        ("particle_r", ("code_length", [], None)),
+        ("particle_mdeut", ("code_mass", [], None)),
+        ("particle_n", ("", [], None)),
+        ("particle_mdot", ("code_mass/code_time", [], None)),
+        ("particle_burnstate", ("", [], None)),
+        ("particle_luminosity", ("", [], None)),
+        ("particle_id", ("", ["particle_index"], None)),
+    )
 
-add_chombo_field("X-momentum", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("X-Momentum")],
-                 units="g/cm**2/s",display_name=r"M_x")
-
-add_chombo_field("Y-momentum", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("Y-Momentum")],
-                 units="g/cm**2/s",display_name=r"M_y")
-
-add_chombo_field("Z-momentum", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("Z-Momentum")],
-                 units="g/cm**2/s",display_name=r"M_z")
-
-add_chombo_field("X-magnfield", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("X-Magnfield")],
-                 units="gauss",display_name=r"B_x")
-
-add_chombo_field("Y-magnfield", function=NullFunc, take_log=False,
-                 validators = [ValidateDataField("Y-Magnfield")],
-                 units="gauss",display_name=r"B_y")
-
-add_chombo_field("Z-magnfield", function=NullFunc, take_log=False,
-                  validators = [ValidateDataField("Z-Magnfield")],
-                  units="gauss",display_name=r"B_z")
-
-add_chombo_field("energy-density", function=NullFunc, take_log=True,
-                 validators = [ValidateDataField("energy-density")],
-                 units="erg/cm**3")
-
-add_chombo_field("radiation-energy-density", function=NullFunc, take_log=True,
-                 validators = [ValidateDataField("radiation-energy-density")],
-                 units="erg/cm**3")
-
-def _Density(field,data):
-    """A duplicate of the density field. This is needed because when you try 
-    to instantiate a PlotCollection without passing in a center, the code
-    will try to generate one for you using the "Density" field, which gives an error 
-    if it isn't defined.
-
-    """
-    return data["density"]
-add_field("Density",function=_Density, take_log=True,
-          units='g/cm**3')
-
-def _Bx(field,data):
-    return data["X-magnfield"]
-add_field("Bx", function=_Bx, take_log=False,
-          units="gauss", display_name=r"B_x")
-
-def _By(field,data):
-    return data["Y-magnfield"]
-add_field("By", function=_By, take_log=False,
-          units="gauss", display_name=r"B_y")
-
-def _Bz(field,data):
-    return data["Z-magnfield"]
-add_field("Bz", function=_Bz, take_log=False,
-          units="gauss", display_name=r"B_z")
-
-def _MagneticEnergy(field,data):
-    return (data["X-magnfield"]**2 +
-            data["Y-magnfield"]**2 +
-            data["Z-magnfield"]**2)/2.
-add_field("MagneticEnergy", function=_MagneticEnergy, take_log=True,
-          units=r"erg/cm**3", display_name=r"B^2 / 8 \pi")
-
-def _xVelocity(field, data):
-    """ Generate x-velocity from x-momentum and density. """
-    return data["X-momentum"]/data["density"]
-add_field("x-velocity",function=_xVelocity, take_log=False,
-          units='cm/s')
-
-def _yVelocity(field,data):
-    """ Generate y-velocity from y-momentum and density. """
-    #try:
-    #    return data["xvel"]
-    #except KeyError:
-    return data["Y-momentum"]/data["density"]
-add_field("y-velocity",function=_yVelocity, take_log=False,
-          units='cm/s')
-
-def _zVelocity(field,data):
-    """ Generate z-velocity from z-momentum and density. """
-    return data["Z-momentum"]/data["density"]
-add_field("z-velocity",function=_zVelocity, take_log=False,
-          units='cm/s')
-
-def particle_func(p_field, dtype='float64'):
-    def _Particles(field, data):
-        io = data.index.io
-        if not data.NumberOfParticles > 0:
-            return np.array([], dtype=dtype)
-        else:
-            return io._read_particles(data, p_field).astype(dtype)
-        
-    return _Particles
-
-_particle_field_list = ["mass",
-                        "position_x",
-                        "position_y",
-                        "position_z",
-                        "momentum_x",
-                        "momentum_y",
-                        "momentum_z",
-                        "angmomen_x",
-                        "angmomen_y",
-                        "angmomen_z",
-                        "mlast",
-                        "r",
-                        "mdeut",
-                        "n",
-                        "mdot",
-                        "burnstate",
-                        "luminosity",
-                        "id"]
-
-for pf in _particle_field_list:
-    pfunc = particle_func("particle_%s" % (pf))
-    add_field("particle_%s" % pf, function=pfunc,
-              validators = [ValidateSpatial(0)],
-              particle_type=True)
-
-def _ParticleMass(field, data):
-    particles = data["particle_mass"].astype('float64')
-    return particles
-
-def _ParticleMassMsun(field, data):
-    particles = data["particle_mass"].astype('float64')
-    return particles/1.989e33
-
-add_field("ParticleMass",
-          function=_ParticleMass, validators=[ValidateSpatial(0)],
-          particle_type=True)
-add_field("ParticleMassMsun",
-          function=_ParticleMassMsun, validators=[ValidateSpatial(0)],
-          particle_type=True)
+    def setup_fluid_fields(self):
+        def _get_vel(axis):
+            def velocity(field, data):
+                return data["%smom" % ax]/data["density"]
+        for ax in 'xyz':
+            self.add_field("velocity_%s" % ax, function = _get_vel(ax),
+                           units = "cm/s")
+        self.add_field("thermal_energy",
+                       function = _thermal_energy,
+                       units = "erg/g")
+        self.add_field("thermal_energy_density",
+                       function = _thermal_energy_density,
+                       units = "erg/cm**3")
+        self.add_field("temperature", function=_temperature,
+                       units="K")

diff -r 8998ed2194500cd405198102eb90239d20e73b75 -r b97321eeeceda3ecdbb907d1eaea71e072139e7a yt/frontends/chombo/io.py
--- a/yt/frontends/chombo/io.py
+++ b/yt/frontends/chombo/io.py
@@ -16,6 +16,7 @@
 import os
 import re
 import numpy as np
+from yt.utilities.logger import ytLogger as mylog
 
 from yt.utilities.io_handler import \
            BaseIOHandler
@@ -26,8 +27,7 @@
     _data_string = 'data:datatype=0'
 
     def __init__(self, pf, *args, **kwargs):
-        BaseIOHandler.__init__(self, *args, **kwargs)
-        self.pf = pf
+        BaseIOHandler.__init__(self, pf)
         self._handle = pf._handle
 
     _field_dict = None
@@ -61,6 +61,52 @@
         
         return data.reshape(dims, order='F')
 
+    def _read_fluid_selection(self, chunks, selector, fields, size):
+        rv = {}
+        chunks = list(chunks)
+        fields.sort(key=lambda a: self.field_dict[a[1]])
+        if selector.__class__.__name__ == "GridSelector":
+            if not (len(chunks) == len(chunks[0].objs) == 1):
+                raise RuntimeError
+            grid = chunks[0].objs[0]
+            lstring = 'level_%i' % grid.Level
+            lev = self._handle[lstring]
+            grid_offset = lev[self._offset_string][grid._level_id]
+            boxsize = grid.ActiveDimensions.prod()
+            for ftype, fname in fields:
+                start = grid_offset+self.field_dict[fname]*boxsize
+                stop = start + boxsize
+                data = lev[self._data_string][start:stop]
+                rv[ftype, fname] = data.reshape(grid.ActiveDimensions,
+                                        order='F')
+            return rv
+        if size is None:
+            size = sum((g.count(selector) for chunk in chunks
+                        for g in chunk.objs))
+        for field in fields:
+            ftype, fname = field
+            fsize = size
+            rv[field] = np.empty(fsize, dtype="float64")
+        ng = sum(len(c.objs) for c in chunks)
+        mylog.debug("Reading %s cells of %s fields in %s grids",
+                   size, [f2 for f1, f2 in fields], ng)
+        ind = 0
+        for chunk in chunks:
+            for g in chunk.objs:
+                lstring = 'level_%i' % g.Level
+                lev = self._handle[lstring]
+                grid_offset = lev[self._offset_string][g._level_id]
+                boxsize = g.ActiveDimensions.prod()
+                nd = 0
+                for field in fields:
+                    start = grid_offset+self.field_dict[fname]*boxsize
+                    stop = start + boxsize
+                    data = lev[self._data_string][start:stop]
+                    data = data.reshape(g.ActiveDimensions, order='F')
+                    nd = g.select(selector, data, rv[field], ind) # caches
+                ind += nd
+        return rv
+
     def _read_particles(self, grid, field):
         """
         parses the Orion Star Particle text files

diff -r 8998ed2194500cd405198102eb90239d20e73b75 -r b97321eeeceda3ecdbb907d1eaea71e072139e7a yt/mods.py
--- a/yt/mods.py
+++ b/yt/mods.py
@@ -102,8 +102,8 @@
     HaloCatalogDataset, HaloCatalogFieldInfo, \
     RockstarDataset, RockstarFieldInfo
 
-#from yt.frontends.chombo.api import \
-#    ChomboDataset, ChomboFieldInfo, add_chombo_field
+from yt.frontends.chombo.api import \
+    ChomboDataset, ChomboFieldInfo, add_chombo_field
 
 from yt.frontends.gdf.api import \
     GDFDataset, GDFFieldInfo, add_gdf_field

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