[Yt-svn] yt-commit r806 - trunk/yt/lagos

mturk at wrangler.dreamhost.com mturk at wrangler.dreamhost.com
Sun Sep 28 21:14:58 PDT 2008


Author: mturk
Date: Sun Sep 28 21:14:58 2008
New Revision: 806
URL: http://yt.spacepope.org/changeset/806

Log:

Some fixes for in-memory hierarchies.  Additionally, some fixes for
parallelism.



Modified:
   trunk/yt/lagos/HierarchyType.py
   trunk/yt/lagos/ParallelTools.py

Modified: trunk/yt/lagos/HierarchyType.py
==============================================================================
--- trunk/yt/lagos/HierarchyType.py	(original)
+++ trunk/yt/lagos/HierarchyType.py	Sun Sep 28 21:14:58 2008
@@ -833,13 +833,8 @@
         if field_list == None:
             mylog.info("Gathering a field list (this may take a moment.)")
             field_list = sets.Set()
-            if self.num_grids > 40:
-                starter = na.random.randint(0, 20)
-                random_sample = na.mgrid[starter:len(self.grids)-1:20j].astype("int32")
-                mylog.debug("Checking grids: %s", random_sample.tolist())
-            else:
-                random_sample = na.mgrid[0:max(len(self.grids)-1,1)].astype("int32")
-            for grid in self.grids[(random_sample,)]:
+            random_sample = self._generate_random_grids()
+            for grid in random_sample:
                 gf = grid.getFields()
                 mylog.debug("Grid %s has: %s", grid.id, gf)
                 field_list = field_list.union(sets.Set(gf))
@@ -864,13 +859,22 @@
             if field not in self.derived_field_list:
                 self.derived_field_list.append(field)
 
+    def _generate_random_grids(self):
+        if self.num_grids > 40:
+            starter = na.random.randint(0, 20)
+            random_sample = na.mgrid[starter:len(self.grids)-1:20j].astype("int32")
+            mylog.debug("Checking grids: %s", random_sample.tolist())
+        else:
+            random_sample = na.mgrid[0:max(len(self.grids)-1,1)].astype("int32")
+        return self.grids[(random_sample,)]
+
 class EnzoHierarchyInMemory(EnzoHierarchy):
     def __init__(self, pf, data_style = 8):
         import enzo
         self.float_type = 'float64'
         self.data_style = data_style # Mandated
         self.directory = os.getcwd()
-        self.num_grids = na.max(enzo.grid_data.keys())
+        self.num_grids = enzo.hierarchy_information["GridDimensions"].shape[0]
         self.queue = DataQueueInMemory()
         AMRHierarchy.__init__(self, pf)
 
@@ -884,7 +888,7 @@
         self.gridReverseTree = enzo.hierarchy_information["GridParentIDs"].ravel().tolist()
         # Initial setup:
         mylog.debug("Reconstructing parent-child relationships")
-        self.gridTree = [ [] for i in range(self.num_grids) ]
+        #self.gridTree = [ [] for i in range(self.num_grids) ]
         for id,pid in enumerate(self.gridReverseTree):
             if pid > 0:
                 self.gridTree[pid-1].append(
@@ -897,6 +901,7 @@
         for i, grid in enumerate(self.grids):
             if (i%1e4) == 0: mylog.debug("Prepared % 7i / % 7i grids", i, self.num_grids)
             grid._prepare_grid()
+            grid.proc_num = self.gridProcs[i,0]
         self._setup_grid_dxs()
         mylog.debug("Prepared")
         self._setup_field_lists()
@@ -921,8 +926,20 @@
         self.gridRightEdge[:] = enzo.hierarchy_information["GridRightEdge"][:]
         self.gridLevels[:] = enzo.hierarchy_information["GridLevels"][:]
         self.gridTimes[:] = enzo.hierarchy_information["GridTimes"][:]
+        self.gridProcs = enzo.hierarchy_information["GridProcs"].copy()
         self.gridNumberOfParticles[:] = enzo.hierarchy_information["GridNumberOfParticles"][:]
 
+    def _generate_random_grids(self):
+        my_proc = ytcfg.getint("yt","__parallel_rank")
+        gg = self.grids[self.gridProcs[:,0] == my_proc]
+        if len(gg) > 40:
+            starter = na.random.randint(0, 20)
+            random_sample = na.mgrid[starter:len(gg)-1:20j].astype("int32")
+            mylog.debug("Checking grids: %s", random_sample.tolist())
+        else:
+            random_sample = na.mgrid[0:max(len(gg)-1,1)].astype("int32")
+        return gg[(random_sample,)]
+
 scanf_regex = {}
 scanf_regex['e'] = r"[-+]?\d+\.?\d*?|\.\d+[eE][-+]?\d+?"
 scanf_regex['g'] = scanf_regex['e']

Modified: trunk/yt/lagos/ParallelTools.py
==============================================================================
--- trunk/yt/lagos/ParallelTools.py	(original)
+++ trunk/yt/lagos/ParallelTools.py	Sun Sep 28 21:14:58 2008
@@ -53,7 +53,14 @@
             gs = pobj._grids
         else:
             gs = pobj._data_source._grids
-        self._grids = sorted(gs, key = lambda g: g.filename)
+        if hasattr(gs[0], 'proc_num'):
+            # This one sort of knows about MPI, but not quite
+            self._grids = [g for g in gs if g.proc_num ==
+                            ytcfg.getint('yt','__parallel_rank')]
+            self._use_all = True
+        else:
+            self._grids = sorted(gs, key = lambda g: g.filename)
+            self._use_all = False
         self.ng = len(self._grids)
         self.just_list = just_list
 
@@ -80,8 +87,11 @@
         self._skip = MPI.COMM_WORLD.size
         # Note that we're doing this in advance, and with a simple means
         # of choosing them; more advanced methods will be explored later.
-        upper, lower = na.mgrid[0:self.ng:(self._skip+1)*1j][self._offset:self._offset+2]
-        self.my_grid_ids = na.mgrid[upper:lower-1].astype("int64")
+        if self._use_all:
+            self.my_grid_ids = range(len(self._grids))
+        else:
+            upper, lower = na.mgrid[0:self.ng:(self._skip+1)*1j][self._offset:self._offset+2]
+            self.my_grid_ids = na.mgrid[upper:lower-1].astype("int64")
         
     def __iter__(self):
         self.pos = 0



More information about the yt-svn mailing list