[yt-svn] commit/yt: xarthisius: Merged in MatthewTurk/yt (pull request #1322)
commits-noreply at bitbucket.org
commits-noreply at bitbucket.org
Tue Dec 2 12:57:26 PST 2014
1 new commit in yt:
https://bitbucket.org/yt_analysis/yt/commits/ccf290984c00/
Changeset: ccf290984c00
Branch: yt
User: xarthisius
Date: 2014-12-02 20:57:16+00:00
Summary: Merged in MatthewTurk/yt (pull request #1322)
First attempt at speeding up ghost zone fields
Affected #: 2 files
diff -r 46d4d84d797dae33eca0e966c3cc1fbb1a20443c -r ccf290984c0005a576303fc850737b629b307fe3 yt/data_objects/construction_data_containers.py
--- a/yt/data_objects/construction_data_containers.py
+++ b/yt/data_objects/construction_data_containers.py
@@ -720,6 +720,16 @@
fields = None
data_source = None
+ # These are all cached here as numpy arrays, without units, in
+ # code_lengths.
+ domain_width = None
+ domain_left_edge = None
+ domain_right_edge = None
+ left_edge = None
+ right_edge = None
+ base_dx = None
+ dds = None
+
class YTSmoothedCoveringGridBase(YTCoveringGridBase):
"""A 3D region with all data extracted and interpolated to a
single, specified resolution. (Identical to covering_grid,
@@ -763,14 +773,14 @@
# interpolation but are not directly inside our bounds
level_state.data_source = self.ds.region(
self.center,
- self.left_edge - level_state.current_dx,
- self.right_edge + level_state.current_dx)
+ level_state.left_edge - level_state.current_dx,
+ level_state.right_edge + level_state.current_dx)
level_state.data_source.min_level = level_state.current_level
level_state.data_source.max_level = level_state.current_level
self._pdata_source = self.ds.region(
self.center,
- self.left_edge - level_state.current_dx,
- self.right_edge + level_state.current_dx)
+ level_state.left_edge - level_state.current_dx,
+ level_state.right_edge + level_state.current_dx)
self._pdata_source.min_level = level_state.current_level
self._pdata_source.max_level = level_state.current_level
@@ -796,7 +806,17 @@
def _initialize_level_state(self, fields):
ls = LevelState()
- ls.current_dx = self._base_dx
+ ls.domain_width = self.ds.domain_width
+ ls.domain_left_edge = self.ds.domain_left_edge
+ ls.domain_right_edge = self.ds.domain_right_edge
+ ls.left_edge = self.left_edge
+ ls.right_edge = self.right_edge
+ ls.base_dx = self._base_dx
+ ls.dds = self.dds
+ for att in ("domain_width", "domain_left_edge", "domain_right_edge",
+ "left_edge", "right_edge", "base_dx", "dds"):
+ setattr(ls, att, getattr(ls, att).in_units("code_length").d)
+ ls.current_dx = ls.base_dx
ls.current_level = 0
LL = self.left_edge - self.ds.domain_left_edge
ls.global_startindex = np.rint(LL / ls.current_dx).astype('int64') - 1
@@ -820,15 +840,15 @@
rf = float(self.ds.relative_refinement(
ls.current_level, ls.current_level + 1))
ls.current_level += 1
- ls.current_dx = self._base_dx / \
+ ls.current_dx = ls.base_dx / \
self.ds.relative_refinement(0, ls.current_level)
self._setup_data_source(ls)
- LL = self.left_edge - self.ds.domain_left_edge
+ LL = ls.left_edge - ls.domain_left_edge
ls.old_global_startindex = ls.global_startindex
ls.global_startindex = np.rint(LL / ls.current_dx).astype('int64') - 1
- ls.domain_iwidth = np.rint(self.ds.domain_width/ls.current_dx).astype('int64')
+ ls.domain_iwidth = np.rint(ls.domain_width/ls.current_dx).astype('int64')
input_left = (level_state.old_global_startindex + 0.5) * rf
- width = (self.ActiveDimensions*self.dds)
+ width = (self.ActiveDimensions*ls.dds)
output_dims = np.rint(width/level_state.current_dx+0.5).astype("int32") + 2
level_state.current_dims = output_dims
new_fields = []
diff -r 46d4d84d797dae33eca0e966c3cc1fbb1a20443c -r ccf290984c0005a576303fc850737b629b307fe3 yt/geometry/selection_routines.pyx
--- a/yt/geometry/selection_routines.pyx
+++ b/yt/geometry/selection_routines.pyx
@@ -53,7 +53,9 @@
# sometimes also accepting level and mask information.
def _ensure_code(arr):
- if hasattr(arr, "convert_to_units"):
+ if hasattr(arr, "units"):
+ if "code_length" == str(arr.units):
+ return arr
arr.convert_to_units("code_length")
return arr
@@ -417,14 +419,16 @@
_ensure_code(gobj.dds)
_ensure_code(gobj.LeftEdge)
_ensure_code(gobj.RightEdge)
- cdef np.ndarray[np.float64_t, ndim=1] odds = gobj.dds
- cdef np.ndarray[np.float64_t, ndim=1] left_edge = gobj.LeftEdge
- cdef np.ndarray[np.float64_t, ndim=1] right_edge = gobj.RightEdge
+ cdef np.ndarray[np.float64_t, ndim=1] odds = gobj.dds.d
+ cdef np.ndarray[np.float64_t, ndim=1] oleft_edge = gobj.LeftEdge.d
+ cdef np.ndarray[np.float64_t, ndim=1] oright_edge = gobj.RightEdge.d
cdef int i, j, k
- cdef np.float64_t dds[3], pos[3]
+ cdef np.float64_t dds[3], pos[3], left_edge[3], right_edge[3]
for i in range(3):
dds[i] = odds[i]
dim[i] = gobj.ActiveDimensions[i]
+ left_edge[i] = oleft_edge[i]
+ right_edge[i] = oright_edge[i]
mask = np.zeros(gobj.ActiveDimensions, dtype='uint8')
cdef int total = 0
cdef int temp
@@ -698,34 +702,41 @@
cdef np.float64_t right_edge[3]
cdef np.float64_t right_edge_shift[3]
+ @cython.boundscheck(False)
+ @cython.wraparound(False)
def __init__(self, dobj):
cdef int i
# We are modifying dobj.left_edge and dobj.right_edge , so here we will
# do an in-place conversion of those arrays.
- _ensure_code(dobj.right_edge)
- _ensure_code(dobj.left_edge)
- DW = _ensure_code(dobj.ds.domain_width.copy())
+ cdef np.ndarray[np.float64_t, ndim=1] RE = _ensure_code(dobj.right_edge)
+ cdef np.ndarray[np.float64_t, ndim=1] LE = _ensure_code(dobj.left_edge)
+ cdef np.ndarray[np.float64_t, ndim=1] DW = _ensure_code(dobj.ds.domain_width)
+ cdef np.ndarray[np.float64_t, ndim=1] DLE = _ensure_code(dobj.ds.domain_left_edge)
+ cdef np.ndarray[np.float64_t, ndim=1] DRE = _ensure_code(dobj.ds.domain_right_edge)
+ cdef np.float64_t region_width[3]
+ cdef bint p[3]
for i in range(3):
- region_width = dobj.right_edge[i] - dobj.left_edge[i]
- domain_width = DW[i]
+ region_width[i] = RE[i] - LE[i]
+ p[i] = dobj.ds.periodicity[i]
+ DW[i] = DW[i]
+ if region_width[i] <= 0:
+ raise RuntimeError(
+ "Region right edge[%s] < left edge: width = %s" % (
+ i, region_width[i]))
- if region_width <= 0:
- raise RuntimeError(
- "Region right edge < left edge: width = %s" % region_width
- )
+ for i in range(3):
- if dobj.ds.periodicity[i]:
+ if p[i]:
# shift so left_edge guaranteed in domain
- if dobj.left_edge[i] < dobj.ds.domain_left_edge[i]:
- dobj.left_edge[i] += domain_width
- dobj.right_edge[i] += domain_width
- elif dobj.left_edge[i] > dobj.ds.domain_right_edge[i]:
- dobj.left_edge[i] += domain_width
- dobj.right_edge[i] += domain_width
+ if LE[i] < DLE[i]:
+ LE[i] += DW[i]
+ RE[i] += DW[i]
+ elif LE[i] > DRE[i]:
+ LE[i] -= DW[i]
+ RE[i] -= DW[i]
else:
- if dobj.left_edge[i] < dobj.ds.domain_left_edge[i] or \
- dobj.right_edge[i] > dobj.ds.domain_right_edge[i]:
+ if LE[i] < DLE[i] or RE[i] > DRE[i]:
raise RuntimeError(
"Error: yt attempted to read outside the boundaries of "
"a non-periodic domain along dimension %s.\n"
@@ -739,10 +750,9 @@
dobj.ds.domain_left_edge[i], dobj.ds.domain_right_edge[i])
)
# Already ensured in code
- self.left_edge[i] = dobj.left_edge[i]
- self.right_edge[i] = dobj.right_edge[i]
- self.right_edge_shift[i] = \
- (dobj.right_edge).to_ndarray()[i] - domain_width.to_ndarray()
+ self.left_edge[i] = LE[i]
+ self.right_edge[i] = RE[i]
+ self.right_edge_shift[i] = RE[i] - DW[i]
if not self.periodicity[i]:
self.right_edge_shift[i] = -np.inf
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