[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