[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