aboutsummaryrefslogtreecommitdiff
path: root/Carpet
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@cct.lsu.edu>2010-08-25 10:15:16 -0400
committerBarry Wardell <barry.wardell@gmail.com>2011-12-14 18:21:18 +0000
commita989c94165585c16724f02dc638c887e75a88cdc (patch)
tree15bd0f7e127be5f942f02461f1736de2f3d35af7 /Carpet
parenteac0f67696b808ae567f14a6ba7c229762d29426 (diff)
CarpetLib: Generalise "expand" function. Implement "shift" function.
Allow expanding bboxset by multiples of a fraction of the stride. Allow shifting bboxsets.
Diffstat (limited to 'Carpet')
-rw-r--r--Carpet/CarpetLib/src/bboxset.cc25
-rw-r--r--Carpet/CarpetLib/src/bboxset.hh17
2 files changed, 40 insertions, 2 deletions
diff --git a/Carpet/CarpetLib/src/bboxset.cc b/Carpet/CarpetLib/src/bboxset.cc
index 7ffd61699..a830c0b73 100644
--- a/Carpet/CarpetLib/src/bboxset.cc
+++ b/Carpet/CarpetLib/src/bboxset.cc
@@ -464,7 +464,9 @@ bboxset<T,D> bboxset<T,D>::pseudo_inverse (const int n) const {
}
template<typename T, int D>
-bboxset<T,D> bboxset<T,D>::expand (const vect<T,D>& lo, const vect<T,D>& hi) const {
+bboxset<T,D> bboxset<T,D>::expand (const vect<T,D>& lo, const vect<T,D>& hi)
+ const
+{
// We don't know (yet?) how to shrink a set
assert (all (lo>=0 and hi>=0));
bboxset res;
@@ -475,6 +477,27 @@ bboxset<T,D> bboxset<T,D>::expand (const vect<T,D>& lo, const vect<T,D>& hi) con
}
template<typename T, int D>
+bboxset<T,D> bboxset<T,D>::expand (const vect<T,D>& lo, const vect<T,D>& hi,
+ const vect<T,D>& denom) const
+{
+ assert (all(denom > vect<T,D>(0)));
+ bboxset res;
+ if (all (lo == -hi)) {
+ // Special case for shifting, since this is faster
+ for (const_iterator bi=begin(); bi!=end(); ++bi) {
+ res += (*bi).expand(lo,hi,denom);
+ }
+ } else {
+ // We don't know (yet?) how to shrink a set
+ assert (all ((lo>=0 and hi>=0) or (lo == hi)));
+ for (const_iterator bi=begin(); bi!=end(); ++bi) {
+ res |= (*bi).expand(lo,hi,denom);
+ }
+ }
+ return res;
+}
+
+template<typename T, int D>
bboxset<T,D> bboxset<T,D>::expanded_for (const box& b) const {
bboxset res;
for (const_iterator bi=begin(); bi!=end(); ++bi) {
diff --git a/Carpet/CarpetLib/src/bboxset.hh b/Carpet/CarpetLib/src/bboxset.hh
index 5624ef4b1..23b2dc18c 100644
--- a/Carpet/CarpetLib/src/bboxset.hh
+++ b/Carpet/CarpetLib/src/bboxset.hh
@@ -142,11 +142,26 @@ public:
/** Find the pseudo-inverse. */
bboxset pseudo_inverse (const int n) const;
- /** Expand (enlarge) the bbox by multiples of the stride. */
+ /** Expand (enlarge) the bboxset by multiples of the stride. */
bboxset expand (const vect<T,D>& lo, const vect<T,D>& hi) const;
bboxset expand (const vect<vect<T,D>,2>& lohi) const
{ return expand (lohi[0], lohi[1]); }
+ /** Shift the bboxset by multiples of the stride. */
+ bboxset shift (const vect<T,D>& v) const
+ { return expand (-v, v); }
+
+ /** Expand (enlarge) the bboxset by multiples of a fraction of the
+ stride. */
+ bboxset expand (const vect<T,D>& lo, const vect<T,D>& hi,
+ const vect<T,D>& denom) const;
+ bboxset expand (const vect<vect<T,D>,2>& lohi, const vect<T,D>& denom) const
+ { return expand (lohi[0], lohi[1], denom); }
+
+ /** Shift the bboxset by multiples of a fraction of the stride. */
+ bboxset shift (const vect<T,D>& v, const vect<T,D>& denom) const
+ { return expand (-v, v, denom); }
+
/** Find the smallest b-compatible box around this bbox.
("compatible" means having the same stride.) */
bboxset expanded_for (const box& b) const;