diff --git a/slicing.py b/slicing.py index 6af0ab6859e71f3e3eb9a3a7542504c413d64a6d..beedcc1f707e7afed1aeab1847df2036d728416b 100644 --- a/slicing.py +++ b/slicing.py @@ -53,7 +53,24 @@ def normalizeSlice(slices, sizes): def shiftSlice(slices, offset): - return [slice(k.start+offset, k.stop + offset, k.step) for k in slices] + def shiftSliceComponent(sliceComp, shiftOffset): + if sliceComp is None: + return None + elif isinstance(sliceComp, int): + return sliceComp + shiftOffset + elif isinstance(sliceComp, float): + return sliceComp # relative entries are not shifted + elif isinstance(sliceComp, slice): + return slice(shiftSliceComponent(sliceComp.start, shiftOffset), + shiftSliceComponent(sliceComp.stop, shiftOffset), + sliceComp.step) + else: + raise ValueError() + + if hasattr(offset, '__len__'): + return [shiftSliceComponent(k, off) for k, off in zip(slices, offset)] + else: + return [shiftSliceComponent(k, offset) for k in slices] def sliceFromDirection(directionName, dim, normalOffset=0, tangentialOffset=0): @@ -198,3 +215,22 @@ def getPeriodicBoundaryFunctor(stencil, ghostLayers=1, thickness=None): return functor +def sliceIntersection(slice1, slice2): + slice1 = [s if not isinstance(s, int) else slice(s, s + 1, None) for s in slice1] + slice2 = [s if not isinstance(s, int) else slice(s, s + 1, None) for s in slice2] + + newMin = [max(s1.start, s2.start) for s1, s2 in zip(slice1, slice2)] + newMax = [min(s1.stop, s2.stop) for s1, s2 in zip(slice1, slice2)] + if any(maxP - minP < 0 for minP, maxP in zip(newMin, newMax)): + return None + + return [slice(minP, maxP, None) for minP, maxP in zip(newMin, newMax)] + + + #min_.x() = std::max(xMin(), other.xMin()); + #min_.y() = std::max(yMin(), other.yMin()); + #min_.z() = std::max(zMin(), other.zMin()); + + #max_.x() = std::min(xMax(), other.xMax()); + #max_.y() = std::min(yMax(), other.yMax()); + #max_.z() = std::min(zMax(), other.zMax());