[Yt-svn] yt: 2 new changesets

hg at spacepope.org hg at spacepope.org
Wed Sep 1 23:34:47 PDT 2010


hg Repository: yt
details:   yt/rev/ae6149ab12f9
changeset: 3367:ae6149ab12f9
user:      Matthew Turk <matthewturk at gmail.com>
date:
Wed Sep 01 23:23:09 2010 -0700
description:
Assuming sorted particles, the particle IO is now substantially faster in FLASH
datasets.

hg Repository: yt
details:   yt/rev/e2b55f386569
changeset: 3368:e2b55f386569
user:      Matthew Turk <matthewturk at gmail.com>
date:
Wed Sep 01 23:34:38 2010 -0700
description:
Adding additional particle handling for FLASH

diffstat:

 yt/data_objects/object_finding_mixin.py |   8 ++++----
 yt/frontends/flash/data_structures.py   |  16 +---------------
 yt/frontends/flash/fields.py            |  11 +++++++++--
 yt/frontends/flash/io.py                |   6 +++++-
 4 files changed, 19 insertions(+), 22 deletions(-)

diffs (95 lines):

diff -r 48274493af4e -r e2b55f386569 yt/data_objects/object_finding_mixin.py
--- a/yt/data_objects/object_finding_mixin.py	Wed Sep 01 23:13:35 2010 -0700
+++ b/yt/data_objects/object_finding_mixin.py	Wed Sep 01 23:34:38 2010 -0700
@@ -131,8 +131,8 @@
         centers = (self.grid_right_edge + self.grid_left_edge)/2.0
         long_axis = na.maximum.reduce(self.grid_right_edge - self.grid_left_edge, 1)
         t = na.abs(centers - center)
-        DW = self.parameter_file["DomainRightEdge"] \
-           - self.parameter_file["DomainLeftEdge"]
+        DW = self.parameter_file.domain_right_edge \
+           - self.parameter_file.domain_left_edge
         na.minimum(t, na.abs(DW-t), t)
         dist = na.sqrt(na.sum((t**2.0), axis=1))
         gridI = na.where(dist < (radius + long_axis))
@@ -150,8 +150,8 @@
         left_edge = na.array(left_edge)
         right_edge = na.array(right_edge)
         mask = na.zeros(self.grids.shape, dtype='bool')
-        dl = self.parameters["DomainLeftEdge"]
-        dr = self.parameters["DomainRightEdge"]
+        dl = self.parameter_file.domain_left_edge
+        dr = self.parameter_file.domain_right_edge
         db = right_edge - left_edge
         for off_x in [-1, 0, 1]:
             nle = left_edge.copy()
diff -r 48274493af4e -r e2b55f386569 yt/frontends/flash/data_structures.py
--- a/yt/frontends/flash/data_structures.py	Wed Sep 01 23:13:35 2010 -0700
+++ b/yt/frontends/flash/data_structures.py	Wed Sep 01 23:34:38 2010 -0700
@@ -114,21 +114,7 @@
             nxb, nyb, nzb = [int(f["/simulation parameters"]['n%sb' % ax])
                               for ax in 'xyz']
         self.grid_dimensions[:] *= (nxb, nyb, nzb)
-        # particle_count is harder.  We stride over the particle file and count
-        # up per grid.
-        npart = f["/tracer particles"].shape[0]
-        blki = [s[0].strip() for s in f["/particle names"][:]].index("blk")
-        start = 0
-        stride = 1e6
-        while start < npart:
-            end = min(start + stride - 1, npart)
-            blks = f["/tracer particles"][start:end,blki].astype("int64")
-            ta = na.bincount(blks)
-            old_size = ta.size
-            ta = na.resize(ta, self.num_grids)
-            ta[old_size:] = 0
-            self.grid_particle_count += ta[:,None]
-            start = end
+        self.grid_particle_count[:] = f["/localnp"][:][:,None]
         # This will become redundant, as _prepare_grid will reset it to its
         # current value.  Note that FLASH uses 1-based indexing for refinement
         # levels, but we do not, so we reduce the level by 1.
diff -r 48274493af4e -r e2b55f386569 yt/frontends/flash/fields.py
--- a/yt/frontends/flash/fields.py	Wed Sep 01 23:13:35 2010 -0700
+++ b/yt/frontends/flash/fields.py	Wed Sep 01 23:34:38 2010 -0700
@@ -64,15 +64,22 @@
                     "Total_Energy": "ener",
                     "Gas_Energy": "eint",
                     "Temperature": "temp",
+                    "particle_position_x" : "particle_posx",
+                    "particle_position_y" : "particle_posy",
+                    "particle_position_z" : "particle_posz",
                    }
 
 def _generate_translation(mine, theirs):
-    add_field(theirs, function=lambda a, b: b[mine], take_log=True)
+    pfield = theirs.startswith("particle")
+    add_field(theirs, function=lambda a, b: b[mine], take_log=True,
+              particle_type = pfield)
 
 for f,v in translation_dict.items():
     if v not in FLASHFieldInfo:
+        pfield = v.startswith("particle")
         add_field(v, function=lambda a,b: None, take_log=False,
-                  validators = [ValidateDataField(v)])
+                  validators = [ValidateDataField(v)],
+                  particle_type = pfield)
     #print "Setting up translator from %s to %s" % (v, f)
     _generate_translation(v, f)
 
diff -r 48274493af4e -r e2b55f386569 yt/frontends/flash/io.py
--- a/yt/frontends/flash/io.py	Wed Sep 01 23:13:35 2010 -0700
+++ b/yt/frontends/flash/io.py	Wed Sep 01 23:34:38 2010 -0700
@@ -68,7 +68,11 @@
     def _read_data_set(self, grid, field):
         f = self._handle
         if field in self._particle_fields:
-            tr = self._select_particles(grid, field)
+            if grid.NumberOfParticles == 0: return na.array([], dtype='float64')
+            start = na.sum(self.pf.h.grid_particle_count[:grid.id-grid._id_offset])
+            end = start + grid.NumberOfParticles
+            fi = self._particle_fields[field]
+            tr = f["/tracer particles"][start:end, fi]
         else:
             tr = f["/%s" % field][grid.id - grid._id_offset,:,:,:].transpose()
         return tr.astype("float64")



More information about the yt-svn mailing list