[yt-svn] commit/yt: MatthewTurk: Experimental improvements to speeding up generating ghost zones. This involves

Bitbucket commits-noreply at bitbucket.org
Tue Jan 17 14:37:09 PST 2012


1 new commit in yt:


https://bitbucket.org/yt_analysis/yt/changeset/e699c92663c2/
changeset:   e699c92663c2
branch:      yt
user:        MatthewTurk
date:        2012-01-10 04:25:59
summary:     Experimental improvements to speeding up generating ghost zones.  This involves
some trickery with creating empty covering grids.  Also add in min_level for
FLASH datasets.
affected #:  6 files

diff -r 2f6200e6144f4b22aac110e61f1ed82e77e7882a -r e699c92663c219f23ea6ec6b5234fd3f4473d79b yt/data_objects/data_containers.py
--- a/yt/data_objects/data_containers.py
+++ b/yt/data_objects/data_containers.py
@@ -3351,11 +3351,13 @@
            na.any(self.right_edge + buffer > self.pf.domain_right_edge):
             grids,ind = self.pf.hierarchy.get_periodic_box_grids_below_level(
                             self.left_edge - buffer,
-                            self.right_edge + buffer, self.level)
+                            self.right_edge + buffer, self.level,
+                            min(self.level, self.pf.min_level))
         else:
             grids,ind = self.pf.hierarchy.get_box_grids_below_level(
                 self.left_edge - buffer,
-                self.right_edge + buffer, self.level)
+                self.right_edge + buffer, self.level,
+                min(self.level, self.pf.min_level))
         sort_ind = na.argsort(self.pf.h.grid_levels.ravel()[ind])
         self._grids = self.pf.hierarchy.grids[ind][(sort_ind,)][::-1]
 
@@ -3490,11 +3492,27 @@
 
     def _get_list_of_grids(self):
         if self._grids is not None: return
-        buffer = ((self.pf.domain_right_edge - self.pf.domain_left_edge)
-                 / self.pf.domain_dimensions).max()
-        AMRCoveringGridBase._get_list_of_grids(self, buffer)
+        cg = self.pf.h.covering_grid(self.level,
+            self.left_edge, self.ActiveDimensions)
+        cg._use_pbar = False
+        count = cg.ActiveDimensions.prod()
+        for g in cg._grids:
+            count -= cg._get_data_from_grid(g, [])
+            if count <= 0:
+                min_level = g.Level
+                break
         # We reverse the order to ensure that coarse grids are first
-        self._grids = self._grids[::-1]
+        if na.any(self.left_edge < self.pf.domain_left_edge) or \
+           na.any(self.right_edge > self.pf.domain_right_edge):
+            grids,ind = self.pf.hierarchy.get_periodic_box_grids_below_level(
+                            self.left_edge, self.right_edge, self.level,
+                            min_level)
+        else:
+            grids,ind = self.pf.hierarchy.get_box_grids_below_level(
+                self.left_edge, self.right_edge, self.level,
+                min(self.level, min_level))
+        sort_ind = na.argsort(self.pf.h.grid_levels.ravel()[ind])
+        self._grids = self.pf.hierarchy.grids[ind][(sort_ind,)]
 
     def get_data(self, field=None):
         self._get_list_of_grids()
@@ -3518,9 +3536,10 @@
         for gi, grid in enumerate(self._grids):
             if self._use_pbar: pbar.update(gi)
             if grid.Level > last_level and grid.Level <= self.level:
-                self._update_level_state(last_level + 1)
-                self._refine(1, fields_to_get)
-                last_level = grid.Level
+                while grid.Level > last_level:
+                    self._update_level_state(last_level + 1)
+                    self._refine(1, fields_to_get)
+                    last_level += 1
             self._get_data_from_grid(grid, fields_to_get)
         if self.level > 0:
             for field in fields_to_get:


diff -r 2f6200e6144f4b22aac110e61f1ed82e77e7882a -r e699c92663c219f23ea6ec6b5234fd3f4473d79b yt/data_objects/object_finding_mixin.py
--- a/yt/data_objects/object_finding_mixin.py
+++ b/yt/data_objects/object_finding_mixin.py
@@ -205,17 +205,19 @@
                     mask[gi] = True
         return self.grids[mask], na.where(mask)
 
-    def get_box_grids_below_level(self, left_edge, right_edge, level):
+    def get_box_grids_below_level(self, left_edge, right_edge, level,
+                                  min_level = 0):
         # We discard grids if they are ABOVE the level
         mask = na.empty(self.grids.size, dtype='int32')
         get_box_grids_below_level(left_edge, right_edge,
                             level,
                             self.grid_left_edge, self.grid_right_edge,
-                            self.grid_levels, mask)
+                            self.grid_levels, mask, min_level)
         mask = mask.astype("bool")
         return self.grids[mask], na.where(mask)
 
-    def get_periodic_box_grids_below_level(self, left_edge, right_edge, level):
+    def get_periodic_box_grids_below_level(self, left_edge, right_edge, level,
+                                           min_level = 0):
         mask = na.zeros(self.grids.shape, dtype='bool')
         dl = self.parameter_file.domain_left_edge
         dr = self.parameter_file.domain_right_edge
@@ -232,7 +234,8 @@
                 for off_z in [-1, 0, 1]:
                     nle[2] = (dw[2]*off_z + dl[2]) + left_dist[2]
                     nre = nle + db
-                    g, gi = self.get_box_grids_below_level(nle, nre, level)
+                    g, gi = self.get_box_grids_below_level(nle, nre,
+                                            level, min_level)
                     mask[gi] = True
         return self.grids[mask], na.where(mask)
 


diff -r 2f6200e6144f4b22aac110e61f1ed82e77e7882a -r e699c92663c219f23ea6ec6b5234fd3f4473d79b yt/data_objects/static_output.py
--- a/yt/data_objects/static_output.py
+++ b/yt/data_objects/static_output.py
@@ -87,6 +87,8 @@
         # to get the timing right, do this before the heavy lifting
         self._instantiated = time.time()
 
+        self.min_level = 0
+
         self._parse_parameter_file()
         self._set_units()
 


diff -r 2f6200e6144f4b22aac110e61f1ed82e77e7882a -r e699c92663c219f23ea6ec6b5234fd3f4473d79b yt/frontends/flash/data_structures.py
--- a/yt/frontends/flash/data_structures.py
+++ b/yt/frontends/flash/data_structures.py
@@ -286,6 +286,8 @@
             [self._find_parameter("real", "%smin" % ax) for ax in 'xyz'])
         self.domain_right_edge = na.array(
             [self._find_parameter("real", "%smax" % ax) for ax in 'xyz'])
+        self.min_level = self._find_parameter(
+            "integer", "lrefine_min", scalar = False) - 1
 
         # Determine domain dimensions
         try:


diff -r 2f6200e6144f4b22aac110e61f1ed82e77e7882a -r e699c92663c219f23ea6ec6b5234fd3f4473d79b yt/utilities/_amr_utils/misc_utilities.pyx
--- a/yt/utilities/_amr_utils/misc_utilities.pyx
+++ b/yt/utilities/_amr_utils/misc_utilities.pyx
@@ -96,13 +96,14 @@
                         np.ndarray[np.float64_t, ndim=2] left_edges,
                         np.ndarray[np.float64_t, ndim=2] right_edges,
                         np.ndarray[np.int32_t, ndim=2] levels,
-                        np.ndarray[np.int32_t, ndim=1] mask):
+                        np.ndarray[np.int32_t, ndim=1] mask,
+                        int min_level = 0):
     cdef int i, n
     cdef int nx = left_edges.shape[0]
     cdef int inside 
     for i in range(nx):
         mask[i] = 0
-        if levels[i,0] <= level:
+        if levels[i,0] <= level and levels[i,0] >= min_level:
             inside = 1
             for n in range(3):
                 if left_edge[n] >= right_edges[i,n] or \


diff -r 2f6200e6144f4b22aac110e61f1ed82e77e7882a -r e699c92663c219f23ea6ec6b5234fd3f4473d79b yt/utilities/data_point_utilities.c
--- a/yt/utilities/data_point_utilities.c
+++ b/yt/utilities/data_point_utilities.c
@@ -1059,9 +1059,9 @@
 
     int n_fields = PyList_Size(oc_data);
     if(n_fields == 0) {
-      PyErr_Format(_dataCubeError,
+      /*PyErr_Format(_dataCubeError,
           "CombineGrids: Length zero for c_data is invalid.");
-      goto _fail;
+      goto _fail;*/
     }
     if (!PyList_Check(og_data) || (PyList_Size(og_data) != n_fields)){
       PyErr_Format(_dataCubeError,

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