# HG changeset patch # User Matthew Turk # Date 1283556826 25200 # Branch yt # Node ID 0eae5b1c68d584aa9c483132c74eee3bc86b87b3 # Parent a16fa728b1fc49ca9315b6936f5407aa91472183 Adding in particle mass function, fixing some issues with left/right edges and IO for Gadget diff -r a16fa728b1fc49ca9315b6936f5407aa91472183 -r 0eae5b1c68d584aa9c483132c74eee3bc86b87b3 yt/frontends/gadget/data_structures.py --- a/yt/frontends/gadget/data_structures.py Fri Sep 03 15:30:24 2010 -0700 +++ b/yt/frontends/gadget/data_structures.py Fri Sep 03 16:33:46 2010 -0700 @@ -41,13 +41,13 @@ class GadgetGrid(AMRGridPatch): _id_offset = 0 - def __init__(self, hierarchy, id,dimensions,left_index, + def __init__(self, hierarchy, id, dimensions, left_index, level, parent_id, particle_count): AMRGridPatch.__init__(self, id, filename = hierarchy.filename, hierarchy = hierarchy) self.id = id self.ActiveDimensions = dimensions - self.start_index = left_index + self.start_index = left_index.astype("int64") self.Level = level self._parent_id = parent_id self.Parent = None # Only one parent per grid @@ -101,24 +101,29 @@ def _parse_hierarchy(self): f = self._handle # shortcut npa = na.array + DLE = self.parameter_file.domain_left_edge + DRE = self.parameter_file.domain_right_edge + DW = (DRE - DLE) self.grid_levels.flat[:] = f['/grid_level'][:].astype("int32") - self.grid_left_edge[:] = f['/grid_left_index'][:] + LI = f['/grid_left_index'][:] + print LI self.grid_dimensions[:] = f['/grid_dimensions'][:] - self.grid_right_edge[:] = self.grid_left_edge + self.grid_dimensions + self.grid_left_edge[:] = (LI * DW + DLE) + dxs = 1.0/(2**(self.grid_levels+1)) * DW + self.grid_right_edge[:] = self.grid_left_edge \ + + dxs *(1 + self.grid_dimensions) self.grid_particle_count.flat[:] = f['/grid_particle_count'][:].astype("int32") grid_parent_id = f['/grid_parent_id'][:] self.max_level = na.max(self.grid_levels) - args = izip(xrange(self.num_grids), self.grid_levels, - grid_parent_id, self.grid_left_edge, - self.grid_dimensions, self.grid_particle_count) + args = izip(xrange(self.num_grids), self.grid_levels.flat, + grid_parent_id, LI, + self.grid_dimensions, self.grid_particle_count.flat) self.grids = na.array([self.grid(self,j,d,le,lvl,p,n) for j,lvl,p, le, d, n in args], dtype='object') - - def _populate_grid_objects(self): for g in self.grids: if g._parent_id >= 0: @@ -183,9 +188,12 @@ format = 'Gadget Infrastructure' add1 = 'griddded_data_format' add2 = 'data_software' - fileh = h5py.File(args[0],'r') - if add1 in fileh['/'].items(): - if add2 in fileh['/'+add1].attrs.keys(): - if fileh['/'+add1].attrs[add2] == format: - return True + try: + fileh = h5py.File(args[0],'r') + if add1 in fileh['/'].items(): + if add2 in fileh['/'+add1].attrs.keys(): + if fileh['/'+add1].attrs[add2] == format: + return True + except h5py.h5e.LowLevelIOError: + pass return False diff -r a16fa728b1fc49ca9315b6936f5407aa91472183 -r 0eae5b1c68d584aa9c483132c74eee3bc86b87b3 yt/frontends/gadget/fields.py --- a/yt/frontends/gadget/fields.py Fri Sep 03 15:30:24 2010 -0700 +++ b/yt/frontends/gadget/fields.py Fri Sep 03 16:33:46 2010 -0700 @@ -23,6 +23,9 @@ along with this program. If not, see . """ +import numpy as na + +from yt.funcs import * from yt.data_objects.field_info_container import \ CodeFieldInfoContainer, \ ValidateParameter, \ @@ -90,13 +93,21 @@ validators = [ValidateDataField("VEL")], units=r"") -add_field("ID", function=lambda a,b: None, take_log=True, +add_field("id", function=lambda a,b: None, take_log=True, validators = [ValidateDataField("ID")], units=r"") -add_field("MASS", function=lambda a,b: None, take_log=True, - validators = [ValidateDataField("MASS")], +add_field("mass", function=lambda a,b: None, take_log=True, + validators = [ValidateDataField("mass")], units=r"\rm{g}") +def _particle_mass(field, data): + return data["mass"]/just_one(data["CellVolume"]) +def _convert_particle_mass(data): + return 1.0 +add_field("particle_mass", function=_particle_mass, take_log=True, + convert_function=_convert_particle_mass, + validators = [ValidateSpatial(0)], + units=r"\mathrm{g}\/\mathrm{cm}^{-3}") add_field("U", function=lambda a,b: None, take_log=True, validators = [ValidateDataField("U")], diff -r a16fa728b1fc49ca9315b6936f5407aa91472183 -r 0eae5b1c68d584aa9c483132c74eee3bc86b87b3 yt/frontends/gadget/io.py --- a/yt/frontends/gadget/io.py Fri Sep 03 15:30:24 2010 -0700 +++ b/yt/frontends/gadget/io.py Fri Sep 03 16:33:46 2010 -0700 @@ -38,7 +38,7 @@ address = '/data/grid_%010i/particles/%s/%s' % (grid.id, ptype, field) data.append(fh[address][:]) if len(data) > 0: - data = na.vstack(data) + data = na.concatenate(data) fh.close() return na.array(data) def _read_field_names(self,grid):