13 #ifndef OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED 14 #define OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED 34 template<
typename DerivedType,
typename Gr
idT,
bool IsSafe>
50 mValues[0] = mAcc.getValue(ijk);
51 static_cast<DerivedType&
>(*this).init(mCenter);
59 inline void moveTo(
const Coord& ijk,
const ValueType& centerValue)
62 mValues[0] = centerValue;
63 static_cast<DerivedType&
>(*this).init(mCenter);
71 template<
typename IterType>
72 inline void moveTo(
const IterType& iter)
74 mCenter = iter.getCoord();
76 static_cast<DerivedType&
>(*this).init(mCenter);
85 template<
typename RealType>
88 Coord ijk = Coord::floor(xyz);
89 if (ijk != mCenter) this->moveTo(ijk);
97 inline const ValueType&
getValue(
unsigned int pos = 0)
const 99 assert(pos < mValues.size());
104 template<
int i,
int j,
int k>
107 return mValues[
static_cast<const DerivedType&
>(*this).template pos<i,j,k>()];
111 template<
int i,
int j,
int k>
114 mValues[
static_cast<const DerivedType&
>(*this).template pos<i,j,k>()] = value;
118 inline int size() {
return mValues.size(); }
123 BufferType tmp(mValues);
124 assert(!tmp.empty());
125 size_t midpoint = (tmp.size() - 1) >> 1;
127 #if !defined(_MSC_VER) || _MSC_VER < 1924 128 std::nth_element(tmp.begin(), tmp.begin() + midpoint, tmp.end());
131 std::nth_element(tmp.begin(), tmp.begin() + midpoint, tmp.end(),
132 std::less<ValueType>());
134 return tmp[midpoint];
141 for (
int n = 0, s =
int(mValues.size()); n < s; ++n) sum += mValues[n];
142 return sum / ValueType(mValues.size());
146 inline ValueType
min()
const 148 const auto iter = std::min_element(mValues.begin(), mValues.end());
153 inline ValueType
max()
const 155 const auto iter = std::max_element(mValues.begin(), mValues.end());
167 inline bool intersects(
const ValueType &isoValue = zeroVal<ValueType>())
const 169 const bool less = this->getValue< 0, 0, 0>() < isoValue;
170 return (less ^ (this->getValue<-1, 0, 0>() < isoValue)) ||
171 (less ^ (this->getValue< 1, 0, 0>() < isoValue)) ||
172 (less ^ (this->getValue< 0,-1, 0>() < isoValue)) ||
173 (less ^ (this->getValue< 0, 1, 0>() < isoValue)) ||
174 (less ^ (this->getValue< 0, 0,-1>() < isoValue)) ||
175 (less ^ (this->getValue< 0, 0, 1>() < isoValue)) ;
188 inline std::bitset<6>
intersectionMask(
const ValueType &isoValue = zeroVal<ValueType>())
const 191 const bool less = this->getValue< 0, 0, 0>() < isoValue;
192 mask[0] = less ^ (this->getValue<-1, 0, 0>() < isoValue);
193 mask[1] = less ^ (this->getValue< 1, 0, 0>() < isoValue);
194 mask[2] = less ^ (this->getValue< 0,-1, 0>() < isoValue);
195 mask[3] = less ^ (this->getValue< 0, 1, 0>() < isoValue);
196 mask[4] = less ^ (this->getValue< 0, 0,-1>() < isoValue);
197 mask[5] = less ^ (this->getValue< 0, 0, 1>() < isoValue);
203 inline const GridType&
grid()
const {
return *mGrid; }
207 inline const AccessorType&
accessor()
const {
return mAcc; }
233 template<
int i,
int j,
int k>
struct SevenPt {};
234 template<>
struct SevenPt< 0, 0, 0> {
enum { idx = 0 }; };
235 template<>
struct SevenPt< 1, 0, 0> {
enum { idx = 1 }; };
236 template<>
struct SevenPt< 0, 1, 0> {
enum { idx = 2 }; };
237 template<>
struct SevenPt< 0, 0, 1> {
enum { idx = 3 }; };
238 template<>
struct SevenPt<-1, 0, 0> {
enum { idx = 4 }; };
239 template<>
struct SevenPt< 0,-1, 0> {
enum { idx = 5 }; };
240 template<>
struct SevenPt< 0, 0,-1> {
enum { idx = 6 }; };
245 template<
typename Gr
idT,
bool IsSafe = true>
255 static const int SIZE = 7;
260 template<
int i,
int j,
int k>
261 unsigned int pos()
const {
return SevenPt<i,j,k>::idx; }
264 inline void init(
const Coord& ijk)
266 BaseType::template setValue<-1, 0, 0>(mAcc.getValue(ijk.
offsetBy(-1, 0, 0)));
267 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
269 BaseType::template setValue< 0,-1, 0>(mAcc.getValue(ijk.
offsetBy( 0,-1, 0)));
270 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
272 BaseType::template setValue< 0, 0,-1>(mAcc.getValue(ijk.
offsetBy( 0, 0,-1)));
273 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
277 using BaseType::mAcc;
278 using BaseType::mValues;
288 template<
int i,
int j,
int k>
struct BoxPt {};
289 template<>
struct BoxPt< 0, 0, 0> {
enum { idx = 0 }; };
290 template<>
struct BoxPt< 0, 0, 1> {
enum { idx = 1 }; };
291 template<>
struct BoxPt< 0, 1, 1> {
enum { idx = 2 }; };
292 template<>
struct BoxPt< 0, 1, 0> {
enum { idx = 3 }; };
293 template<>
struct BoxPt< 1, 0, 0> {
enum { idx = 4 }; };
294 template<>
struct BoxPt< 1, 0, 1> {
enum { idx = 5 }; };
295 template<>
struct BoxPt< 1, 1, 1> {
enum { idx = 6 }; };
296 template<>
struct BoxPt< 1, 1, 0> {
enum { idx = 7 }; };
299 template<
typename Gr
idT,
bool IsSafe = true>
309 static const int SIZE = 8;
314 template<
int i,
int j,
int k>
315 unsigned int pos()
const {
return BoxPt<i,j,k>::idx; }
319 inline bool intersects(
const ValueType &isoValue = zeroVal<ValueType>())
const 321 const bool less = mValues[0] < isoValue;
322 return (less ^ (mValues[1] < isoValue)) ||
323 (less ^ (mValues[2] < isoValue)) ||
324 (less ^ (mValues[3] < isoValue)) ||
325 (less ^ (mValues[4] < isoValue)) ||
326 (less ^ (mValues[5] < isoValue)) ||
327 (less ^ (mValues[6] < isoValue)) ||
328 (less ^ (mValues[7] < isoValue)) ;
341 const ValueType u = xyz[0] - BaseType::mCenter[0];
342 const ValueType v = xyz[1] - BaseType::mCenter[1];
343 const ValueType w = xyz[2] - BaseType::mCenter[2];
346 assert(u>=0 && u<=1);
347 assert(v>=0 && v<=1);
348 assert(w>=0 && w<=1);
350 ValueType V = BaseType::template getValue<0,0,0>();
351 ValueType A =
static_cast<ValueType
>(V + (BaseType::template getValue<0,0,1>() - V) * w);
352 V = BaseType::template getValue< 0, 1, 0>();
353 ValueType B =
static_cast<ValueType
>(V + (BaseType::template getValue<0,1,1>() - V) * w);
354 ValueType C =
static_cast<ValueType
>(A + (B - A) * v);
356 V = BaseType::template getValue<1,0,0>();
357 A =
static_cast<ValueType
>(V + (BaseType::template getValue<1,0,1>() - V) * w);
358 V = BaseType::template getValue<1,1,0>();
359 B =
static_cast<ValueType
>(V + (BaseType::template getValue<1,1,1>() - V) * w);
360 ValueType D =
static_cast<ValueType
>(A + (B - A) * v);
362 return static_cast<ValueType
>(C + (D - C) * u);
375 const ValueType u = xyz[0] - BaseType::mCenter[0];
376 const ValueType v = xyz[1] - BaseType::mCenter[1];
377 const ValueType w = xyz[2] - BaseType::mCenter[2];
380 assert(u>=0 && u<=1);
381 assert(v>=0 && v<=1);
382 assert(w>=0 && w<=1);
384 ValueType D[4]={BaseType::template getValue<0,0,1>()-BaseType::template getValue<0,0,0>(),
385 BaseType::template getValue<0,1,1>()-BaseType::template getValue<0,1,0>(),
386 BaseType::template getValue<1,0,1>()-BaseType::template getValue<1,0,0>(),
387 BaseType::template getValue<1,1,1>()-BaseType::template getValue<1,1,0>()};
390 ValueType A =
static_cast<ValueType
>(D[0] + (D[1]- D[0]) * v);
391 ValueType B =
static_cast<ValueType
>(D[2] + (D[3]- D[2]) * v);
393 zeroVal<ValueType>(),
394 static_cast<ValueType>(A + (B - A) * u));
396 D[0] =
static_cast<ValueType
>(BaseType::template getValue<0,0,0>() + D[0] * w);
397 D[1] =
static_cast<ValueType
>(BaseType::template getValue<0,1,0>() + D[1] * w);
398 D[2] =
static_cast<ValueType
>(BaseType::template getValue<1,0,0>() + D[2] * w);
399 D[3] =
static_cast<ValueType
>(BaseType::template getValue<1,1,0>() + D[3] * w);
402 A =
static_cast<ValueType
>(D[0] + (D[1] - D[0]) * v);
403 B =
static_cast<ValueType
>(D[2] + (D[3] - D[2]) * v);
411 grad[1] =
static_cast<ValueType
>(A + (B - A) * u);
413 return BaseType::mGrid->transform().baseMap()->applyIJT(grad, xyz);
417 inline void init(
const Coord& ijk)
419 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
420 BaseType::template setValue< 0, 1, 1>(mAcc.getValue(ijk.
offsetBy( 0, 1, 1)));
421 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
422 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
423 BaseType::template setValue< 1, 0, 1>(mAcc.getValue(ijk.
offsetBy( 1, 0, 1)));
424 BaseType::template setValue< 1, 1, 1>(mAcc.getValue(ijk.
offsetBy( 1, 1, 1)));
425 BaseType::template setValue< 1, 1, 0>(mAcc.getValue(ijk.
offsetBy( 1, 1, 0)));
429 using BaseType::mAcc;
430 using BaseType::mValues;
440 template<
int i,
int j,
int k>
struct DensePt {};
441 template<>
struct DensePt< 0, 0, 0> {
enum { idx = 0 }; };
443 template<>
struct DensePt< 1, 0, 0> {
enum { idx = 1 }; };
444 template<>
struct DensePt< 0, 1, 0> {
enum { idx = 2 }; };
445 template<>
struct DensePt< 0, 0, 1> {
enum { idx = 3 }; };
447 template<>
struct DensePt<-1, 0, 0> {
enum { idx = 4 }; };
448 template<>
struct DensePt< 0,-1, 0> {
enum { idx = 5 }; };
449 template<>
struct DensePt< 0, 0,-1> {
enum { idx = 6 }; };
451 template<>
struct DensePt<-1,-1, 0> {
enum { idx = 7 }; };
452 template<>
struct DensePt< 0,-1,-1> {
enum { idx = 8 }; };
453 template<>
struct DensePt<-1, 0,-1> {
enum { idx = 9 }; };
455 template<>
struct DensePt< 1,-1, 0> {
enum { idx = 10 }; };
456 template<>
struct DensePt< 0, 1,-1> {
enum { idx = 11 }; };
457 template<>
struct DensePt<-1, 0, 1> {
enum { idx = 12 }; };
459 template<>
struct DensePt<-1, 1, 0> {
enum { idx = 13 }; };
460 template<>
struct DensePt< 0,-1, 1> {
enum { idx = 14 }; };
461 template<>
struct DensePt< 1, 0,-1> {
enum { idx = 15 }; };
463 template<>
struct DensePt< 1, 1, 0> {
enum { idx = 16 }; };
464 template<>
struct DensePt< 0, 1, 1> {
enum { idx = 17 }; };
465 template<>
struct DensePt< 1, 0, 1> {
enum { idx = 18 }; };
469 template<
typename Gr
idT,
bool IsSafe = true>
471 :
public BaseStencil<SecondOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe >
480 static const int SIZE = 19;
485 template<
int i,
int j,
int k>
486 unsigned int pos()
const {
return DensePt<i,j,k>::idx; }
489 inline void init(
const Coord& ijk)
491 mValues[DensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
492 mValues[DensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
493 mValues[DensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
495 mValues[DensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
496 mValues[DensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
497 mValues[DensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
499 mValues[DensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, -1, 0));
500 mValues[DensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, -1, 0));
501 mValues[DensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
502 mValues[DensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
504 mValues[DensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, -1));
505 mValues[DensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, -1));
506 mValues[DensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
507 mValues[DensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
509 mValues[DensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, -1));
510 mValues[DensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, -1));
511 mValues[DensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 1));
512 mValues[DensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
516 using BaseType::mAcc;
517 using BaseType::mValues;
527 template<
int i,
int j,
int k>
struct ThirteenPt {};
528 template<>
struct ThirteenPt< 0, 0, 0> {
enum { idx = 0 }; };
530 template<>
struct ThirteenPt< 1, 0, 0> {
enum { idx = 1 }; };
531 template<>
struct ThirteenPt< 0, 1, 0> {
enum { idx = 2 }; };
532 template<>
struct ThirteenPt< 0, 0, 1> {
enum { idx = 3 }; };
534 template<>
struct ThirteenPt<-1, 0, 0> {
enum { idx = 4 }; };
535 template<>
struct ThirteenPt< 0,-1, 0> {
enum { idx = 5 }; };
536 template<>
struct ThirteenPt< 0, 0,-1> {
enum { idx = 6 }; };
538 template<>
struct ThirteenPt< 2, 0, 0> {
enum { idx = 7 }; };
539 template<>
struct ThirteenPt< 0, 2, 0> {
enum { idx = 8 }; };
540 template<>
struct ThirteenPt< 0, 0, 2> {
enum { idx = 9 }; };
542 template<>
struct ThirteenPt<-2, 0, 0> {
enum { idx = 10 }; };
543 template<>
struct ThirteenPt< 0,-2, 0> {
enum { idx = 11 }; };
544 template<>
struct ThirteenPt< 0, 0,-2> {
enum { idx = 12 }; };
549 template<
typename Gr
idT,
bool IsSafe = true>
551 :
public BaseStencil<ThirteenPointStencil<GridT, IsSafe>, GridT, IsSafe>
560 static const int SIZE = 13;
565 template<
int i,
int j,
int k>
566 unsigned int pos()
const {
return ThirteenPt<i,j,k>::idx; }
569 inline void init(
const Coord& ijk)
571 mValues[ThirteenPt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
572 mValues[ThirteenPt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
573 mValues[ThirteenPt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
574 mValues[ThirteenPt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
576 mValues[ThirteenPt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
577 mValues[ThirteenPt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
578 mValues[ThirteenPt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
579 mValues[ThirteenPt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
581 mValues[ThirteenPt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
582 mValues[ThirteenPt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
583 mValues[ThirteenPt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
584 mValues[ThirteenPt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
588 using BaseType::mAcc;
589 using BaseType::mValues;
599 template<
int i,
int j,
int k>
struct FourthDensePt {};
600 template<>
struct FourthDensePt< 0, 0, 0> {
enum { idx = 0 }; };
602 template<>
struct FourthDensePt<-2, 2, 0> {
enum { idx = 1 }; };
603 template<>
struct FourthDensePt<-1, 2, 0> {
enum { idx = 2 }; };
604 template<>
struct FourthDensePt< 0, 2, 0> {
enum { idx = 3 }; };
605 template<>
struct FourthDensePt< 1, 2, 0> {
enum { idx = 4 }; };
606 template<>
struct FourthDensePt< 2, 2, 0> {
enum { idx = 5 }; };
608 template<>
struct FourthDensePt<-2, 1, 0> {
enum { idx = 6 }; };
609 template<>
struct FourthDensePt<-1, 1, 0> {
enum { idx = 7 }; };
610 template<>
struct FourthDensePt< 0, 1, 0> {
enum { idx = 8 }; };
611 template<>
struct FourthDensePt< 1, 1, 0> {
enum { idx = 9 }; };
612 template<>
struct FourthDensePt< 2, 1, 0> {
enum { idx = 10 }; };
614 template<>
struct FourthDensePt<-2, 0, 0> {
enum { idx = 11 }; };
615 template<>
struct FourthDensePt<-1, 0, 0> {
enum { idx = 12 }; };
616 template<>
struct FourthDensePt< 1, 0, 0> {
enum { idx = 13 }; };
617 template<>
struct FourthDensePt< 2, 0, 0> {
enum { idx = 14 }; };
619 template<>
struct FourthDensePt<-2,-1, 0> {
enum { idx = 15 }; };
620 template<>
struct FourthDensePt<-1,-1, 0> {
enum { idx = 16 }; };
621 template<>
struct FourthDensePt< 0,-1, 0> {
enum { idx = 17 }; };
622 template<>
struct FourthDensePt< 1,-1, 0> {
enum { idx = 18 }; };
623 template<>
struct FourthDensePt< 2,-1, 0> {
enum { idx = 19 }; };
625 template<>
struct FourthDensePt<-2,-2, 0> {
enum { idx = 20 }; };
626 template<>
struct FourthDensePt<-1,-2, 0> {
enum { idx = 21 }; };
627 template<>
struct FourthDensePt< 0,-2, 0> {
enum { idx = 22 }; };
628 template<>
struct FourthDensePt< 1,-2, 0> {
enum { idx = 23 }; };
629 template<>
struct FourthDensePt< 2,-2, 0> {
enum { idx = 24 }; };
632 template<>
struct FourthDensePt<-2, 0, 2> {
enum { idx = 25 }; };
633 template<>
struct FourthDensePt<-1, 0, 2> {
enum { idx = 26 }; };
634 template<>
struct FourthDensePt< 0, 0, 2> {
enum { idx = 27 }; };
635 template<>
struct FourthDensePt< 1, 0, 2> {
enum { idx = 28 }; };
636 template<>
struct FourthDensePt< 2, 0, 2> {
enum { idx = 29 }; };
638 template<>
struct FourthDensePt<-2, 0, 1> {
enum { idx = 30 }; };
639 template<>
struct FourthDensePt<-1, 0, 1> {
enum { idx = 31 }; };
640 template<>
struct FourthDensePt< 0, 0, 1> {
enum { idx = 32 }; };
641 template<>
struct FourthDensePt< 1, 0, 1> {
enum { idx = 33 }; };
642 template<>
struct FourthDensePt< 2, 0, 1> {
enum { idx = 34 }; };
644 template<>
struct FourthDensePt<-2, 0,-1> {
enum { idx = 35 }; };
645 template<>
struct FourthDensePt<-1, 0,-1> {
enum { idx = 36 }; };
646 template<>
struct FourthDensePt< 0, 0,-1> {
enum { idx = 37 }; };
647 template<>
struct FourthDensePt< 1, 0,-1> {
enum { idx = 38 }; };
648 template<>
struct FourthDensePt< 2, 0,-1> {
enum { idx = 39 }; };
650 template<>
struct FourthDensePt<-2, 0,-2> {
enum { idx = 40 }; };
651 template<>
struct FourthDensePt<-1, 0,-2> {
enum { idx = 41 }; };
652 template<>
struct FourthDensePt< 0, 0,-2> {
enum { idx = 42 }; };
653 template<>
struct FourthDensePt< 1, 0,-2> {
enum { idx = 43 }; };
654 template<>
struct FourthDensePt< 2, 0,-2> {
enum { idx = 44 }; };
657 template<>
struct FourthDensePt< 0,-2, 2> {
enum { idx = 45 }; };
658 template<>
struct FourthDensePt< 0,-1, 2> {
enum { idx = 46 }; };
659 template<>
struct FourthDensePt< 0, 1, 2> {
enum { idx = 47 }; };
660 template<>
struct FourthDensePt< 0, 2, 2> {
enum { idx = 48 }; };
662 template<>
struct FourthDensePt< 0,-2, 1> {
enum { idx = 49 }; };
663 template<>
struct FourthDensePt< 0,-1, 1> {
enum { idx = 50 }; };
664 template<>
struct FourthDensePt< 0, 1, 1> {
enum { idx = 51 }; };
665 template<>
struct FourthDensePt< 0, 2, 1> {
enum { idx = 52 }; };
667 template<>
struct FourthDensePt< 0,-2,-1> {
enum { idx = 53 }; };
668 template<>
struct FourthDensePt< 0,-1,-1> {
enum { idx = 54 }; };
669 template<>
struct FourthDensePt< 0, 1,-1> {
enum { idx = 55 }; };
670 template<>
struct FourthDensePt< 0, 2,-1> {
enum { idx = 56 }; };
672 template<>
struct FourthDensePt< 0,-2,-2> {
enum { idx = 57 }; };
673 template<>
struct FourthDensePt< 0,-1,-2> {
enum { idx = 58 }; };
674 template<>
struct FourthDensePt< 0, 1,-2> {
enum { idx = 59 }; };
675 template<>
struct FourthDensePt< 0, 2,-2> {
enum { idx = 60 }; };
680 template<
typename Gr
idT,
bool IsSafe = true>
682 :
public BaseStencil<FourthOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe>
691 static const int SIZE = 61;
696 template<
int i,
int j,
int k>
697 unsigned int pos()
const {
return FourthDensePt<i,j,k>::idx; }
700 inline void init(
const Coord& ijk)
702 mValues[FourthDensePt<-2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 2, 0));
703 mValues[FourthDensePt<-1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 2, 0));
704 mValues[FourthDensePt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
705 mValues[FourthDensePt< 1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 2, 0));
706 mValues[FourthDensePt< 2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 2, 0));
708 mValues[FourthDensePt<-2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 1, 0));
709 mValues[FourthDensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
710 mValues[FourthDensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
711 mValues[FourthDensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
712 mValues[FourthDensePt< 2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 1, 0));
714 mValues[FourthDensePt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
715 mValues[FourthDensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
716 mValues[FourthDensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
717 mValues[FourthDensePt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
719 mValues[FourthDensePt<-2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-1, 0));
720 mValues[FourthDensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-1, 0));
721 mValues[FourthDensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 0));
722 mValues[FourthDensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-1, 0));
723 mValues[FourthDensePt< 2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-1, 0));
725 mValues[FourthDensePt<-2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-2, 0));
726 mValues[FourthDensePt<-1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-2, 0));
727 mValues[FourthDensePt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 0));
728 mValues[FourthDensePt< 1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-2, 0));
729 mValues[FourthDensePt< 2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-2, 0));
731 mValues[FourthDensePt<-2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 2));
732 mValues[FourthDensePt<-1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 2));
733 mValues[FourthDensePt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
734 mValues[FourthDensePt< 1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 2));
735 mValues[FourthDensePt< 2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 2));
737 mValues[FourthDensePt<-2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 1));
738 mValues[FourthDensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
739 mValues[FourthDensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
740 mValues[FourthDensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
741 mValues[FourthDensePt< 2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 1));
743 mValues[FourthDensePt<-2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-1));
744 mValues[FourthDensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-1));
745 mValues[FourthDensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-1));
746 mValues[FourthDensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-1));
747 mValues[FourthDensePt< 2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-1));
749 mValues[FourthDensePt<-2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-2));
750 mValues[FourthDensePt<-1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-2));
751 mValues[FourthDensePt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-2));
752 mValues[FourthDensePt< 1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-2));
753 mValues[FourthDensePt< 2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-2));
756 mValues[FourthDensePt< 0,-2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 2));
757 mValues[FourthDensePt< 0,-1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 2));
758 mValues[FourthDensePt< 0, 1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 2));
759 mValues[FourthDensePt< 0, 2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 2));
761 mValues[FourthDensePt< 0,-2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 1));
762 mValues[FourthDensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 1));
763 mValues[FourthDensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
764 mValues[FourthDensePt< 0, 2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 1));
766 mValues[FourthDensePt< 0,-2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-1));
767 mValues[FourthDensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-1));
768 mValues[FourthDensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-1));
769 mValues[FourthDensePt< 0, 2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-1));
771 mValues[FourthDensePt< 0,-2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-2));
772 mValues[FourthDensePt< 0,-1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-2));
773 mValues[FourthDensePt< 0, 1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-2));
774 mValues[FourthDensePt< 0, 2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-2));
778 using BaseType::mAcc;
779 using BaseType::mValues;
789 template<
int i,
int j,
int k>
struct NineteenPt {};
790 template<>
struct NineteenPt< 0, 0, 0> {
enum { idx = 0 }; };
792 template<>
struct NineteenPt< 1, 0, 0> {
enum { idx = 1 }; };
793 template<>
struct NineteenPt< 0, 1, 0> {
enum { idx = 2 }; };
794 template<>
struct NineteenPt< 0, 0, 1> {
enum { idx = 3 }; };
796 template<>
struct NineteenPt<-1, 0, 0> {
enum { idx = 4 }; };
797 template<>
struct NineteenPt< 0,-1, 0> {
enum { idx = 5 }; };
798 template<>
struct NineteenPt< 0, 0,-1> {
enum { idx = 6 }; };
800 template<>
struct NineteenPt< 2, 0, 0> {
enum { idx = 7 }; };
801 template<>
struct NineteenPt< 0, 2, 0> {
enum { idx = 8 }; };
802 template<>
struct NineteenPt< 0, 0, 2> {
enum { idx = 9 }; };
804 template<>
struct NineteenPt<-2, 0, 0> {
enum { idx = 10 }; };
805 template<>
struct NineteenPt< 0,-2, 0> {
enum { idx = 11 }; };
806 template<>
struct NineteenPt< 0, 0,-2> {
enum { idx = 12 }; };
808 template<>
struct NineteenPt< 3, 0, 0> {
enum { idx = 13 }; };
809 template<>
struct NineteenPt< 0, 3, 0> {
enum { idx = 14 }; };
810 template<>
struct NineteenPt< 0, 0, 3> {
enum { idx = 15 }; };
812 template<>
struct NineteenPt<-3, 0, 0> {
enum { idx = 16 }; };
813 template<>
struct NineteenPt< 0,-3, 0> {
enum { idx = 17 }; };
814 template<>
struct NineteenPt< 0, 0,-3> {
enum { idx = 18 }; };
819 template<
typename Gr
idT,
bool IsSafe = true>
821 :
public BaseStencil<NineteenPointStencil<GridT, IsSafe>, GridT, IsSafe>
830 static const int SIZE = 19;
835 template<
int i,
int j,
int k>
836 unsigned int pos()
const {
return NineteenPt<i,j,k>::idx; }
839 inline void init(
const Coord& ijk)
841 mValues[NineteenPt< 3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
842 mValues[NineteenPt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
843 mValues[NineteenPt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
844 mValues[NineteenPt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
845 mValues[NineteenPt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
846 mValues[NineteenPt<-3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
848 mValues[NineteenPt< 0, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
849 mValues[NineteenPt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
850 mValues[NineteenPt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
851 mValues[NineteenPt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
852 mValues[NineteenPt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
853 mValues[NineteenPt< 0,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -3, 0));
855 mValues[NineteenPt< 0, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
856 mValues[NineteenPt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
857 mValues[NineteenPt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
858 mValues[NineteenPt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
859 mValues[NineteenPt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
860 mValues[NineteenPt< 0, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -3));
864 using BaseType::mAcc;
865 using BaseType::mValues;
875 template<
int i,
int j,
int k>
struct SixthDensePt { };
876 template<>
struct SixthDensePt< 0, 0, 0> {
enum { idx = 0 }; };
878 template<>
struct SixthDensePt<-3, 3, 0> {
enum { idx = 1 }; };
879 template<>
struct SixthDensePt<-2, 3, 0> {
enum { idx = 2 }; };
880 template<>
struct SixthDensePt<-1, 3, 0> {
enum { idx = 3 }; };
881 template<>
struct SixthDensePt< 0, 3, 0> {
enum { idx = 4 }; };
882 template<>
struct SixthDensePt< 1, 3, 0> {
enum { idx = 5 }; };
883 template<>
struct SixthDensePt< 2, 3, 0> {
enum { idx = 6 }; };
884 template<>
struct SixthDensePt< 3, 3, 0> {
enum { idx = 7 }; };
886 template<>
struct SixthDensePt<-3, 2, 0> {
enum { idx = 8 }; };
887 template<>
struct SixthDensePt<-2, 2, 0> {
enum { idx = 9 }; };
888 template<>
struct SixthDensePt<-1, 2, 0> {
enum { idx = 10 }; };
889 template<>
struct SixthDensePt< 0, 2, 0> {
enum { idx = 11 }; };
890 template<>
struct SixthDensePt< 1, 2, 0> {
enum { idx = 12 }; };
891 template<>
struct SixthDensePt< 2, 2, 0> {
enum { idx = 13 }; };
892 template<>
struct SixthDensePt< 3, 2, 0> {
enum { idx = 14 }; };
894 template<>
struct SixthDensePt<-3, 1, 0> {
enum { idx = 15 }; };
895 template<>
struct SixthDensePt<-2, 1, 0> {
enum { idx = 16 }; };
896 template<>
struct SixthDensePt<-1, 1, 0> {
enum { idx = 17 }; };
897 template<>
struct SixthDensePt< 0, 1, 0> {
enum { idx = 18 }; };
898 template<>
struct SixthDensePt< 1, 1, 0> {
enum { idx = 19 }; };
899 template<>
struct SixthDensePt< 2, 1, 0> {
enum { idx = 20 }; };
900 template<>
struct SixthDensePt< 3, 1, 0> {
enum { idx = 21 }; };
902 template<>
struct SixthDensePt<-3, 0, 0> {
enum { idx = 22 }; };
903 template<>
struct SixthDensePt<-2, 0, 0> {
enum { idx = 23 }; };
904 template<>
struct SixthDensePt<-1, 0, 0> {
enum { idx = 24 }; };
905 template<>
struct SixthDensePt< 1, 0, 0> {
enum { idx = 25 }; };
906 template<>
struct SixthDensePt< 2, 0, 0> {
enum { idx = 26 }; };
907 template<>
struct SixthDensePt< 3, 0, 0> {
enum { idx = 27 }; };
910 template<>
struct SixthDensePt<-3,-1, 0> {
enum { idx = 28 }; };
911 template<>
struct SixthDensePt<-2,-1, 0> {
enum { idx = 29 }; };
912 template<>
struct SixthDensePt<-1,-1, 0> {
enum { idx = 30 }; };
913 template<>
struct SixthDensePt< 0,-1, 0> {
enum { idx = 31 }; };
914 template<>
struct SixthDensePt< 1,-1, 0> {
enum { idx = 32 }; };
915 template<>
struct SixthDensePt< 2,-1, 0> {
enum { idx = 33 }; };
916 template<>
struct SixthDensePt< 3,-1, 0> {
enum { idx = 34 }; };
919 template<>
struct SixthDensePt<-3,-2, 0> {
enum { idx = 35 }; };
920 template<>
struct SixthDensePt<-2,-2, 0> {
enum { idx = 36 }; };
921 template<>
struct SixthDensePt<-1,-2, 0> {
enum { idx = 37 }; };
922 template<>
struct SixthDensePt< 0,-2, 0> {
enum { idx = 38 }; };
923 template<>
struct SixthDensePt< 1,-2, 0> {
enum { idx = 39 }; };
924 template<>
struct SixthDensePt< 2,-2, 0> {
enum { idx = 40 }; };
925 template<>
struct SixthDensePt< 3,-2, 0> {
enum { idx = 41 }; };
928 template<>
struct SixthDensePt<-3,-3, 0> {
enum { idx = 42 }; };
929 template<>
struct SixthDensePt<-2,-3, 0> {
enum { idx = 43 }; };
930 template<>
struct SixthDensePt<-1,-3, 0> {
enum { idx = 44 }; };
931 template<>
struct SixthDensePt< 0,-3, 0> {
enum { idx = 45 }; };
932 template<>
struct SixthDensePt< 1,-3, 0> {
enum { idx = 46 }; };
933 template<>
struct SixthDensePt< 2,-3, 0> {
enum { idx = 47 }; };
934 template<>
struct SixthDensePt< 3,-3, 0> {
enum { idx = 48 }; };
937 template<>
struct SixthDensePt<-3, 0, 3> {
enum { idx = 49 }; };
938 template<>
struct SixthDensePt<-2, 0, 3> {
enum { idx = 50 }; };
939 template<>
struct SixthDensePt<-1, 0, 3> {
enum { idx = 51 }; };
940 template<>
struct SixthDensePt< 0, 0, 3> {
enum { idx = 52 }; };
941 template<>
struct SixthDensePt< 1, 0, 3> {
enum { idx = 53 }; };
942 template<>
struct SixthDensePt< 2, 0, 3> {
enum { idx = 54 }; };
943 template<>
struct SixthDensePt< 3, 0, 3> {
enum { idx = 55 }; };
946 template<>
struct SixthDensePt<-3, 0, 2> {
enum { idx = 56 }; };
947 template<>
struct SixthDensePt<-2, 0, 2> {
enum { idx = 57 }; };
948 template<>
struct SixthDensePt<-1, 0, 2> {
enum { idx = 58 }; };
949 template<>
struct SixthDensePt< 0, 0, 2> {
enum { idx = 59 }; };
950 template<>
struct SixthDensePt< 1, 0, 2> {
enum { idx = 60 }; };
951 template<>
struct SixthDensePt< 2, 0, 2> {
enum { idx = 61 }; };
952 template<>
struct SixthDensePt< 3, 0, 2> {
enum { idx = 62 }; };
954 template<>
struct SixthDensePt<-3, 0, 1> {
enum { idx = 63 }; };
955 template<>
struct SixthDensePt<-2, 0, 1> {
enum { idx = 64 }; };
956 template<>
struct SixthDensePt<-1, 0, 1> {
enum { idx = 65 }; };
957 template<>
struct SixthDensePt< 0, 0, 1> {
enum { idx = 66 }; };
958 template<>
struct SixthDensePt< 1, 0, 1> {
enum { idx = 67 }; };
959 template<>
struct SixthDensePt< 2, 0, 1> {
enum { idx = 68 }; };
960 template<>
struct SixthDensePt< 3, 0, 1> {
enum { idx = 69 }; };
963 template<>
struct SixthDensePt<-3, 0,-1> {
enum { idx = 70 }; };
964 template<>
struct SixthDensePt<-2, 0,-1> {
enum { idx = 71 }; };
965 template<>
struct SixthDensePt<-1, 0,-1> {
enum { idx = 72 }; };
966 template<>
struct SixthDensePt< 0, 0,-1> {
enum { idx = 73 }; };
967 template<>
struct SixthDensePt< 1, 0,-1> {
enum { idx = 74 }; };
968 template<>
struct SixthDensePt< 2, 0,-1> {
enum { idx = 75 }; };
969 template<>
struct SixthDensePt< 3, 0,-1> {
enum { idx = 76 }; };
972 template<>
struct SixthDensePt<-3, 0,-2> {
enum { idx = 77 }; };
973 template<>
struct SixthDensePt<-2, 0,-2> {
enum { idx = 78 }; };
974 template<>
struct SixthDensePt<-1, 0,-2> {
enum { idx = 79 }; };
975 template<>
struct SixthDensePt< 0, 0,-2> {
enum { idx = 80 }; };
976 template<>
struct SixthDensePt< 1, 0,-2> {
enum { idx = 81 }; };
977 template<>
struct SixthDensePt< 2, 0,-2> {
enum { idx = 82 }; };
978 template<>
struct SixthDensePt< 3, 0,-2> {
enum { idx = 83 }; };
981 template<>
struct SixthDensePt<-3, 0,-3> {
enum { idx = 84 }; };
982 template<>
struct SixthDensePt<-2, 0,-3> {
enum { idx = 85 }; };
983 template<>
struct SixthDensePt<-1, 0,-3> {
enum { idx = 86 }; };
984 template<>
struct SixthDensePt< 0, 0,-3> {
enum { idx = 87 }; };
985 template<>
struct SixthDensePt< 1, 0,-3> {
enum { idx = 88 }; };
986 template<>
struct SixthDensePt< 2, 0,-3> {
enum { idx = 89 }; };
987 template<>
struct SixthDensePt< 3, 0,-3> {
enum { idx = 90 }; };
990 template<>
struct SixthDensePt< 0,-3, 3> {
enum { idx = 91 }; };
991 template<>
struct SixthDensePt< 0,-2, 3> {
enum { idx = 92 }; };
992 template<>
struct SixthDensePt< 0,-1, 3> {
enum { idx = 93 }; };
993 template<>
struct SixthDensePt< 0, 1, 3> {
enum { idx = 94 }; };
994 template<>
struct SixthDensePt< 0, 2, 3> {
enum { idx = 95 }; };
995 template<>
struct SixthDensePt< 0, 3, 3> {
enum { idx = 96 }; };
997 template<>
struct SixthDensePt< 0,-3, 2> {
enum { idx = 97 }; };
998 template<>
struct SixthDensePt< 0,-2, 2> {
enum { idx = 98 }; };
999 template<>
struct SixthDensePt< 0,-1, 2> {
enum { idx = 99 }; };
1000 template<>
struct SixthDensePt< 0, 1, 2> {
enum { idx = 100 }; };
1001 template<>
struct SixthDensePt< 0, 2, 2> {
enum { idx = 101 }; };
1002 template<>
struct SixthDensePt< 0, 3, 2> {
enum { idx = 102 }; };
1004 template<>
struct SixthDensePt< 0,-3, 1> {
enum { idx = 103 }; };
1005 template<>
struct SixthDensePt< 0,-2, 1> {
enum { idx = 104 }; };
1006 template<>
struct SixthDensePt< 0,-1, 1> {
enum { idx = 105 }; };
1007 template<>
struct SixthDensePt< 0, 1, 1> {
enum { idx = 106 }; };
1008 template<>
struct SixthDensePt< 0, 2, 1> {
enum { idx = 107 }; };
1009 template<>
struct SixthDensePt< 0, 3, 1> {
enum { idx = 108 }; };
1011 template<>
struct SixthDensePt< 0,-3,-1> {
enum { idx = 109 }; };
1012 template<>
struct SixthDensePt< 0,-2,-1> {
enum { idx = 110 }; };
1013 template<>
struct SixthDensePt< 0,-1,-1> {
enum { idx = 111 }; };
1014 template<>
struct SixthDensePt< 0, 1,-1> {
enum { idx = 112 }; };
1015 template<>
struct SixthDensePt< 0, 2,-1> {
enum { idx = 113 }; };
1016 template<>
struct SixthDensePt< 0, 3,-1> {
enum { idx = 114 }; };
1018 template<>
struct SixthDensePt< 0,-3,-2> {
enum { idx = 115 }; };
1019 template<>
struct SixthDensePt< 0,-2,-2> {
enum { idx = 116 }; };
1020 template<>
struct SixthDensePt< 0,-1,-2> {
enum { idx = 117 }; };
1021 template<>
struct SixthDensePt< 0, 1,-2> {
enum { idx = 118 }; };
1022 template<>
struct SixthDensePt< 0, 2,-2> {
enum { idx = 119 }; };
1023 template<>
struct SixthDensePt< 0, 3,-2> {
enum { idx = 120 }; };
1025 template<>
struct SixthDensePt< 0,-3,-3> {
enum { idx = 121 }; };
1026 template<>
struct SixthDensePt< 0,-2,-3> {
enum { idx = 122 }; };
1027 template<>
struct SixthDensePt< 0,-1,-3> {
enum { idx = 123 }; };
1028 template<>
struct SixthDensePt< 0, 1,-3> {
enum { idx = 124 }; };
1029 template<>
struct SixthDensePt< 0, 2,-3> {
enum { idx = 125 }; };
1030 template<>
struct SixthDensePt< 0, 3,-3> {
enum { idx = 126 }; };
1035 template<
typename Gr
idT,
bool IsSafe = true>
1037 :
public BaseStencil<SixthOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe>
1046 static const int SIZE = 127;
1051 template<
int i,
int j,
int k>
1052 unsigned int pos()
const {
return SixthDensePt<i,j,k>::idx; }
1055 inline void init(
const Coord& ijk)
1057 mValues[SixthDensePt<-3, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 3, 0));
1058 mValues[SixthDensePt<-2, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 3, 0));
1059 mValues[SixthDensePt<-1, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 3, 0));
1060 mValues[SixthDensePt< 0, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
1061 mValues[SixthDensePt< 1, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 3, 0));
1062 mValues[SixthDensePt< 2, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 3, 0));
1063 mValues[SixthDensePt< 3, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 3, 0));
1065 mValues[SixthDensePt<-3, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 2, 0));
1066 mValues[SixthDensePt<-2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 2, 0));
1067 mValues[SixthDensePt<-1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 2, 0));
1068 mValues[SixthDensePt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
1069 mValues[SixthDensePt< 1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 2, 0));
1070 mValues[SixthDensePt< 2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 2, 0));
1071 mValues[SixthDensePt< 3, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 2, 0));
1073 mValues[SixthDensePt<-3, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 1, 0));
1074 mValues[SixthDensePt<-2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 1, 0));
1075 mValues[SixthDensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
1076 mValues[SixthDensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1077 mValues[SixthDensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
1078 mValues[SixthDensePt< 2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 1, 0));
1079 mValues[SixthDensePt< 3, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 1, 0));
1081 mValues[SixthDensePt<-3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
1082 mValues[SixthDensePt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
1083 mValues[SixthDensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1084 mValues[SixthDensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1085 mValues[SixthDensePt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
1086 mValues[SixthDensePt< 3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
1088 mValues[SixthDensePt<-3,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-1, 0));
1089 mValues[SixthDensePt<-2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-1, 0));
1090 mValues[SixthDensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-1, 0));
1091 mValues[SixthDensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 0));
1092 mValues[SixthDensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-1, 0));
1093 mValues[SixthDensePt< 2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-1, 0));
1094 mValues[SixthDensePt< 3,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-1, 0));
1096 mValues[SixthDensePt<-3,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-2, 0));
1097 mValues[SixthDensePt<-2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-2, 0));
1098 mValues[SixthDensePt<-1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-2, 0));
1099 mValues[SixthDensePt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 0));
1100 mValues[SixthDensePt< 1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-2, 0));
1101 mValues[SixthDensePt< 2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-2, 0));
1102 mValues[SixthDensePt< 3,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-2, 0));
1104 mValues[SixthDensePt<-3,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-3, 0));
1105 mValues[SixthDensePt<-2,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-3, 0));
1106 mValues[SixthDensePt<-1,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-3, 0));
1107 mValues[SixthDensePt< 0,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 0));
1108 mValues[SixthDensePt< 1,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-3, 0));
1109 mValues[SixthDensePt< 2,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-3, 0));
1110 mValues[SixthDensePt< 3,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-3, 0));
1112 mValues[SixthDensePt<-3, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 3));
1113 mValues[SixthDensePt<-2, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 3));
1114 mValues[SixthDensePt<-1, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 3));
1115 mValues[SixthDensePt< 0, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
1116 mValues[SixthDensePt< 1, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 3));
1117 mValues[SixthDensePt< 2, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 3));
1118 mValues[SixthDensePt< 3, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 3));
1120 mValues[SixthDensePt<-3, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 2));
1121 mValues[SixthDensePt<-2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 2));
1122 mValues[SixthDensePt<-1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 2));
1123 mValues[SixthDensePt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
1124 mValues[SixthDensePt< 1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 2));
1125 mValues[SixthDensePt< 2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 2));
1126 mValues[SixthDensePt< 3, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 2));
1128 mValues[SixthDensePt<-3, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 1));
1129 mValues[SixthDensePt<-2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 1));
1130 mValues[SixthDensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
1131 mValues[SixthDensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1132 mValues[SixthDensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
1133 mValues[SixthDensePt< 2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 1));
1134 mValues[SixthDensePt< 3, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 1));
1136 mValues[SixthDensePt<-3, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-1));
1137 mValues[SixthDensePt<-2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-1));
1138 mValues[SixthDensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-1));
1139 mValues[SixthDensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-1));
1140 mValues[SixthDensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-1));
1141 mValues[SixthDensePt< 2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-1));
1142 mValues[SixthDensePt< 3, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-1));
1144 mValues[SixthDensePt<-3, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-2));
1145 mValues[SixthDensePt<-2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-2));
1146 mValues[SixthDensePt<-1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-2));
1147 mValues[SixthDensePt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-2));
1148 mValues[SixthDensePt< 1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-2));
1149 mValues[SixthDensePt< 2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-2));
1150 mValues[SixthDensePt< 3, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-2));
1152 mValues[SixthDensePt<-3, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-3));
1153 mValues[SixthDensePt<-2, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-3));
1154 mValues[SixthDensePt<-1, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-3));
1155 mValues[SixthDensePt< 0, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-3));
1156 mValues[SixthDensePt< 1, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-3));
1157 mValues[SixthDensePt< 2, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-3));
1158 mValues[SixthDensePt< 3, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-3));
1160 mValues[SixthDensePt< 0,-3, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 3));
1161 mValues[SixthDensePt< 0,-2, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 3));
1162 mValues[SixthDensePt< 0,-1, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 3));
1163 mValues[SixthDensePt< 0, 1, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 3));
1164 mValues[SixthDensePt< 0, 2, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 3));
1165 mValues[SixthDensePt< 0, 3, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 3));
1167 mValues[SixthDensePt< 0,-3, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 2));
1168 mValues[SixthDensePt< 0,-2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 2));
1169 mValues[SixthDensePt< 0,-1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 2));
1170 mValues[SixthDensePt< 0, 1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 2));
1171 mValues[SixthDensePt< 0, 2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 2));
1172 mValues[SixthDensePt< 0, 3, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 2));
1174 mValues[SixthDensePt< 0,-3, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 1));
1175 mValues[SixthDensePt< 0,-2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 1));
1176 mValues[SixthDensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 1));
1177 mValues[SixthDensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
1178 mValues[SixthDensePt< 0, 2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 1));
1179 mValues[SixthDensePt< 0, 3, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 1));
1181 mValues[SixthDensePt< 0,-3,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-1));
1182 mValues[SixthDensePt< 0,-2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-1));
1183 mValues[SixthDensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-1));
1184 mValues[SixthDensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-1));
1185 mValues[SixthDensePt< 0, 2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-1));
1186 mValues[SixthDensePt< 0, 3,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-1));
1188 mValues[SixthDensePt< 0,-3,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-2));
1189 mValues[SixthDensePt< 0,-2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-2));
1190 mValues[SixthDensePt< 0,-1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-2));
1191 mValues[SixthDensePt< 0, 1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-2));
1192 mValues[SixthDensePt< 0, 2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-2));
1193 mValues[SixthDensePt< 0, 3,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-2));
1195 mValues[SixthDensePt< 0,-3,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-3));
1196 mValues[SixthDensePt< 0,-2,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-3));
1197 mValues[SixthDensePt< 0,-1,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-3));
1198 mValues[SixthDensePt< 0, 1,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-3));
1199 mValues[SixthDensePt< 0, 2,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-3));
1200 mValues[SixthDensePt< 0, 3,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-3));
1204 using BaseType::mAcc;
1205 using BaseType::mValues;
1214 template<
int i,
int j,
int k>
struct GradPt {};
1215 template<>
struct GradPt< 0, 0, 0> {
enum { idx = 0 }; };
1216 template<>
struct GradPt< 1, 0, 0> {
enum { idx = 2 }; };
1217 template<>
struct GradPt< 0, 1, 0> {
enum { idx = 4 }; };
1218 template<>
struct GradPt< 0, 0, 1> {
enum { idx = 6 }; };
1219 template<>
struct GradPt<-1, 0, 0> {
enum { idx = 1 }; };
1220 template<>
struct GradPt< 0,-1, 0> {
enum { idx = 3 }; };
1221 template<>
struct GradPt< 0, 0,-1> {
enum { idx = 5 }; };
1230 template<
typename Gr
idT,
bool IsSafe = true>
1240 static const int SIZE = 7;
1243 : BaseType(grid, SIZE)
1244 , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0]))
1245 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1250 : BaseType(grid, SIZE)
1251 , mInv2Dx(ValueType(0.5 / dx))
1252 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1264 mValues[0] - mValues[1],
1265 mValues[2] - mValues[0],
1266 mValues[0] - mValues[3],
1267 mValues[4] - mValues[0],
1268 mValues[0] - mValues[5],
1269 mValues[6] - mValues[0]);
1280 mValues[4] - mValues[3],
1281 mValues[6] - mValues[5])*mInv2Dx;
1290 V[0]>0 ? mValues[0] - mValues[1] : mValues[2] - mValues[0],
1291 V[1]>0 ? mValues[0] - mValues[3] : mValues[4] - mValues[0],
1292 V[2]>0 ? mValues[0] - mValues[5] : mValues[6] - mValues[0])*2*mInv2Dx;
1299 return mInvDx2 * (mValues[1] + mValues[2] +
1300 mValues[3] + mValues[4] +
1301 mValues[5] + mValues[6] - 6*mValues[0]);
1309 return (v[0]>0 ? (v[1]<0 || v[2]<0 || v[3]<0 || v[4]<0 || v[5]<0 || v[6]<0)
1310 : (v[1]>0 || v[2]>0 || v[3]>0 || v[4]>0 || v[5]>0 || v[6]>0));
1322 const Coord& ijk = BaseType::getCenterCoord();
1323 const ValueType d = ValueType(mValues[0] * 0.5 * mInvDx2);
1326 ijk[1] - d*(mValues[4] - mValues[3]),
1327 ijk[2] - d*(mValues[6] - mValues[5]));
1333 template<
int i,
int j,
int k>
1334 unsigned int pos()
const {
return GradPt<i,j,k>::idx; }
1338 inline void init(
const Coord& ijk)
1340 BaseType::template setValue<-1, 0, 0>(mAcc.getValue(ijk.
offsetBy(-1, 0, 0)));
1341 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
1343 BaseType::template setValue< 0,-1, 0>(mAcc.getValue(ijk.
offsetBy( 0,-1, 0)));
1344 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
1346 BaseType::template setValue< 0, 0,-1>(mAcc.getValue(ijk.
offsetBy( 0, 0,-1)));
1347 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
1351 using BaseType::mAcc;
1352 using BaseType::mValues;
1353 const ValueType mInv2Dx, mInvDx2;
1364 template<
typename Gr
idT,
bool IsSafe = true>
1374 static const int SIZE = 19;
1377 : BaseType(grid, SIZE)
1378 , _mDx2(ValueType(math::
Pow2(grid.voxelSize()[0])))
1379 , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0]))
1380 , mInvDx2(ValueType(1.0 / _mDx2))
1381 , mDx2(static_cast<float>(_mDx2))
1386 : BaseType(grid, SIZE)
1387 , _mDx2(ValueType(dx * dx))
1388 , mInv2Dx(ValueType(0.5 / dx))
1389 , mInvDx2(ValueType(1.0 / _mDx2))
1390 , mDx2(static_cast<float>(_mDx2))
1399 inline ValueType
normSqGrad(
const ValueType &isoValue = zeroVal<ValueType>())
const 1405 v1(v[2]-v[1], v[ 8]-v[ 7], v[14]-v[13], 0),
1406 v2(v[3]-v[2], v[ 9]-v[ 8], v[15]-v[14], 0),
1407 v3(v[0]-v[3], v[ 0]-v[ 9], v[ 0]-v[15], 0),
1408 v4(v[4]-v[0], v[10]-v[ 0], v[16]-v[ 0], 0),
1409 v5(v[5]-v[4], v[11]-v[10], v[17]-v[16], 0),
1410 v6(v[6]-v[5], v[12]-v[11], v[18]-v[17], 0),
1417 dP_xm =
math::WENO5(v[ 2]-v[ 1],v[ 3]-v[ 2],v[ 0]-v[ 3],v[ 4]-v[ 0],v[ 5]-v[ 4],mDx2),
1418 dP_xp =
math::WENO5(v[ 6]-v[ 5],v[ 5]-v[ 4],v[ 4]-v[ 0],v[ 0]-v[ 3],v[ 3]-v[ 2],mDx2),
1419 dP_ym =
math::WENO5(v[ 8]-v[ 7],v[ 9]-v[ 8],v[ 0]-v[ 9],v[10]-v[ 0],v[11]-v[10],mDx2),
1420 dP_yp =
math::WENO5(v[12]-v[11],v[11]-v[10],v[10]-v[ 0],v[ 0]-v[ 9],v[ 9]-v[ 8],mDx2),
1421 dP_zm =
math::WENO5(v[14]-v[13],v[15]-v[14],v[ 0]-v[15],v[16]-v[ 0],v[17]-v[16],mDx2),
1422 dP_zp =
math::WENO5(v[18]-v[17],v[17]-v[16],v[16]-v[ 0],v[ 0]-v[15],v[15]-v[14],mDx2);
1423 return static_cast<ValueType
>(
1437 V[0]>0 ?
math::WENO5(v[ 2]-v[ 1],v[ 3]-v[ 2],v[ 0]-v[ 3], v[ 4]-v[ 0],v[ 5]-v[ 4],mDx2)
1438 :
math::WENO5(v[ 6]-v[ 5],v[ 5]-v[ 4],v[ 4]-v[ 0], v[ 0]-v[ 3],v[ 3]-v[ 2],mDx2),
1439 V[1]>0 ?
math::WENO5(v[ 8]-v[ 7],v[ 9]-v[ 8],v[ 0]-v[ 9], v[10]-v[ 0],v[11]-v[10],mDx2)
1440 :
math::WENO5(v[12]-v[11],v[11]-v[10],v[10]-v[ 0], v[ 0]-v[ 9],v[ 9]-v[ 8],mDx2),
1441 V[2]>0 ?
math::WENO5(v[14]-v[13],v[15]-v[14],v[ 0]-v[15], v[16]-v[ 0],v[17]-v[16],mDx2)
1442 :
math::WENO5(v[18]-v[17],v[17]-v[16],v[16]-v[ 0], v[ 0]-v[15],v[15]-v[14],mDx2));
1452 mValues[10] - mValues[ 9],
1453 mValues[16] - mValues[15]);
1464 mValues[ 3] + mValues[ 4] +
1465 mValues[ 9] + mValues[10] +
1466 mValues[15] + mValues[16] - 6*mValues[0]);
1474 return (v[ 0]>0 ? (v[ 3]<0 || v[ 4]<0 || v[ 9]<0 || v[10]<0 || v[15]<0 || v[16]<0)
1475 : (v[ 3]>0 || v[ 4]>0 || v[ 9]>0 || v[10]>0 || v[15]>0 || v[16]>0));
1479 inline void init(
const Coord& ijk)
1481 mValues[ 1] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
1482 mValues[ 2] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
1483 mValues[ 3] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1484 mValues[ 4] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1485 mValues[ 5] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
1486 mValues[ 6] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
1488 mValues[ 7] = mAcc.getValue(ijk.
offsetBy( 0, -3, 0));
1489 mValues[ 8] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
1490 mValues[ 9] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
1491 mValues[10] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1492 mValues[11] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
1493 mValues[12] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
1495 mValues[13] = mAcc.getValue(ijk.
offsetBy( 0, 0, -3));
1496 mValues[14] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
1497 mValues[15] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
1498 mValues[16] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1499 mValues[17] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
1500 mValues[18] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
1504 using BaseType::mAcc;
1505 using BaseType::mValues;
1506 const ValueType _mDx2, mInv2Dx, mInvDx2;
1514 template<
typename Gr
idT,
bool IsSafe = true>
1524 static const int SIZE = 19;
1527 : BaseType(grid, SIZE)
1528 , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0]))
1529 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1534 : BaseType(grid, SIZE)
1535 , mInv2Dx(ValueType(0.5 / dx))
1536 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1546 Real alpha, normGrad;
1548 ValueType(alpha*mInv2Dx/
math::Pow3(normGrad)) : 0;
1557 Real alpha, normGrad;
1558 return this->gaussianCurvature(alpha, normGrad) ?
1559 ValueType(alpha*mInvDx2/
math::Pow4(normGrad)) : 0;
1569 Real alphaM, alphaG, normGrad;
1570 if (this->curvatures(alphaM, alphaG, normGrad)) {
1571 mean = ValueType(alphaM*mInv2Dx/
math::Pow3(normGrad));
1572 gauss = ValueType(alphaG*mInvDx2/
math::Pow4(normGrad));
1586 Real alpha, normGrad;
1588 ValueType(alpha*mInvDx2/(2*
math::Pow2(normGrad))) : 0;
1598 Real alpha, normGrad;
1599 return this->gaussianCurvature(alpha, normGrad) ?
1600 ValueType(2*alpha*mInv2Dx*mInvDx2/
math::Pow3(normGrad)) : 0;
1610 Real alphaM, alphaG, normGrad;
1611 if (this->curvatures(alphaM, alphaG, normGrad)) {
1612 mean = ValueType(alphaM*mInvDx2/(2*
math::Pow2(normGrad)));
1613 gauss = ValueType(2*alphaG*mInv2Dx*mInvDx2/
math::Pow3(normGrad));
1626 std::pair<ValueType, ValueType> pair(0, 0);
1627 Real alphaM, alphaG, normGrad;
1628 if (this->curvatures(alphaM, alphaG, normGrad)) {
1630 const Real tmp = std::sqrt(mean*mean - alphaG*mInvDx2/
math::Pow4(normGrad));
1631 pair.first = ValueType(mean - tmp);
1632 pair.second = ValueType(mean + tmp);
1645 mValues[1] + mValues[2] +
1646 mValues[3] + mValues[4] +
1647 mValues[5] + mValues[6] - 6*mValues[0]);
1658 mValues[2] - mValues[1],
1659 mValues[4] - mValues[3],
1660 mValues[6] - mValues[5])*mInv2Dx;
1664 inline void init(
const Coord &ijk)
1666 mValues[ 1] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1667 mValues[ 2] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1669 mValues[ 3] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
1670 mValues[ 4] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1672 mValues[ 5] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
1673 mValues[ 6] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1675 mValues[ 7] = mAcc.getValue(ijk.
offsetBy(-1, -1, 0));
1676 mValues[ 8] = mAcc.getValue(ijk.
offsetBy( 1, -1, 0));
1677 mValues[ 9] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
1678 mValues[10] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
1680 mValues[11] = mAcc.getValue(ijk.
offsetBy(-1, 0, -1));
1681 mValues[12] = mAcc.getValue(ijk.
offsetBy( 1, 0, -1));
1682 mValues[13] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
1683 mValues[14] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
1685 mValues[15] = mAcc.getValue(ijk.
offsetBy( 0, -1, -1));
1686 mValues[16] = mAcc.getValue(ijk.
offsetBy( 0, 1, -1));
1687 mValues[17] = mAcc.getValue(ijk.
offsetBy( 0, -1, 1));
1688 mValues[18] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
1691 inline Real Dx()
const {
return 0.5*(mValues[2] - mValues[1]); }
1692 inline Real Dy()
const {
return 0.5*(mValues[4] - mValues[3]); }
1693 inline Real Dz()
const {
return 0.5*(mValues[6] - mValues[5]); }
1694 inline Real Dxx()
const {
return mValues[2] - 2 * mValues[0] + mValues[1]; }
1695 inline Real Dyy()
const {
return mValues[4] - 2 * mValues[0] + mValues[3]; }
1696 inline Real Dzz()
const {
return mValues[6] - 2 * mValues[0] + mValues[5]; }
1697 inline Real Dxy()
const {
return 0.25 * (mValues[10] - mValues[ 8] + mValues[ 7] - mValues[ 9]); }
1698 inline Real Dxz()
const {
return 0.25 * (mValues[14] - mValues[12] + mValues[11] - mValues[13]); }
1699 inline Real Dyz()
const {
return 0.25 * (mValues[18] - mValues[16] + mValues[15] - mValues[17]); }
1704 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1705 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1707 alpha = normGrad = 0;
1710 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz();
1711 alpha = Dx2*(Dyy + Dzz) + Dy2*(Dxx + Dzz) + Dz2*(Dxx + Dyy) -
1712 2*(Dx*(Dy*this->Dxy() + Dz*this->Dxz()) + Dy*Dz*this->Dyz());
1713 normGrad = std::sqrt(normGrad2);
1717 inline bool gaussianCurvature(
Real& alpha,
Real& normGrad)
const 1720 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1721 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1723 alpha = normGrad = 0;
1726 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz(),
1727 Dxy = this->Dxy(), Dxz = this->Dxz(), Dyz = this->Dyz();
1728 alpha = Dx2*(Dyy*Dzz - Dyz*Dyz) + Dy2*(Dxx*Dzz - Dxz*Dxz) + Dz2*(Dxx*Dyy - Dxy*Dxy) +
1729 2*( Dy*Dz*(Dxy*Dxz - Dyz*Dxx) + Dx*Dz*(Dxy*Dyz - Dxz*Dyy) + Dx*Dy*(Dxz*Dyz - Dxy*Dzz) );
1730 normGrad = std::sqrt(normGrad2);
1733 inline bool curvatures(
Real& alphaM,
Real& alphaG,
Real& normGrad)
const 1736 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1737 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1739 alphaM = alphaG =normGrad = 0;
1742 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz(),
1743 Dxy = this->Dxy(), Dxz = this->Dxz(), Dyz = this->Dyz();
1744 alphaM = Dx2*(Dyy + Dzz) + Dy2*(Dxx + Dzz) + Dz2*(Dxx + Dyy) -
1745 2*(Dx*(Dy*Dxy + Dz*Dxz) + Dy*Dz*Dyz);
1746 alphaG = Dx2*(Dyy*Dzz - Dyz*Dyz) + Dy2*(Dxx*Dzz - Dxz*Dxz) + Dz2*(Dxx*Dyy - Dxy*Dxy) +
1747 2*( Dy*Dz*(Dxy*Dxz - Dyz*Dxx) + Dx*Dz*(Dxy*Dyz - Dxz*Dyy) + Dx*Dy*(Dxz*Dyz - Dxy*Dzz) );
1748 normGrad = std::sqrt(normGrad2);
1753 using BaseType::mAcc;
1754 using BaseType::mValues;
1755 const ValueType mInv2Dx, mInvDx2;
1763 template<
typename Gr
idT,
bool IsSafe = true>
1774 : BaseType(grid, math::
Pow3(2 * halfWidth + 1))
1775 , mHalfWidth(halfWidth)
1777 assert(halfWidth>0);
1780 inline const ValueType&
getCenterValue()
const {
return mValues[(mValues.size()-1)>>1]; }
1786 BaseType::mCenter = ijk;
1791 template<
typename IterType>
1794 BaseType::mCenter = iter.getCoord();
1795 this->init(BaseType::mCenter);
1801 inline void init(
const Coord& ijk)
1805 for (p[1] = ijk[1]-mHalfWidth; p[1] <= q[1]; ++p[1]) {
1806 for (p[2] = ijk[2]-mHalfWidth; p[2] <= q[2]; ++p[2]) {
1807 mValues[n++] = mAcc.getValue(p);
1814 using BaseType::mAcc;
1815 using BaseType::mValues;
1816 const int mHalfWidth;
1824 #endif // OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED
ValueType max() const
Return the largest value in the stencil buffer.
Definition: Stencils.h:153
GridT GridType
Definition: Stencils.h:305
std::bitset< 6 > intersectionMask(const ValueType &isoValue=zeroVal< ValueType >()) const
Return true a bit-mask where the 6 bits indicates if the center of the stencil intersects the iso-con...
Definition: Stencils.h:188
const ValueType & getCenterValue() const
Definition: Stencils.h:1780
This is a special 19-point stencil that supports optimal fifth-order WENO upwinding, second-order central differencing, Laplacian, and zero-crossing test.
Definition: Stencils.h:1365
ValueType interpolation(const math::Vec3< ValueType > &xyz) const
Return the trilinear interpolation at the normalized position.
Definition: Stencils.h:338
Definition: Stencils.h:820
math::Vec3< ValueType > gradient(const math::Vec3< ValueType > &xyz) const
Return the gradient in world space of the trilinear interpolation kernel.
Definition: Stencils.h:372
Definition: Stencils.h:35
The Value Accessor Implementation and API methods. The majoirty of the API matches the API of a compa...
Definition: ValueAccessor.h:68
GridType::ValueType ValueType
Definition: Stencils.h:689
const ValueType & getValue() const
Return the value at the specified location relative to the center of the stencil. ...
Definition: Stencils.h:105
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
DenseStencil(const GridType &grid, int halfWidth)
Definition: Stencils.h:1773
Definition: Stencils.h:1231
GridT GridType
Definition: Stencils.h:251
ValueType gaussianCurvature() const
Return the Gaussian curvature at the previously buffered location.
Definition: Stencils.h:1555
GridT GridType
Definition: Stencils.h:1520
GridT::ValueType ValueType
Definition: Stencils.h:1522
GridT::ValueType ValueType
Definition: Stencils.h:253
GridType::ValueType ValueType
Definition: Stencils.h:828
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:836
void moveTo(const Coord &ijk)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:1784
GridT::TreeType TreeType
Definition: Stencils.h:1043
Type Pow4(Type x)
Return x4.
Definition: Math.h:556
__hostdev__ RealT GodunovsNormSqrd(bool isOutside, const Vec3< RealT > &gradient_m, const Vec3< RealT > &gradient_p)
Definition: Stencils.h:82
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:24
GridT::TreeType TreeType
Definition: Stencils.h:1770
WenoStencil(const GridType &grid, Real dx)
Definition: Stencils.h:1385
void setValue(const ValueType &value)
Set the value at the specified location relative to the center of the stencil.
Definition: Stencils.h:112
GridT::ValueType ValueType
Definition: Stencils.h:307
NineteenPointStencil(const GridType &grid)
Definition: Stencils.h:832
GridT::TreeType TreeType
Definition: Stencils.h:1237
GridType::ValueType ValueType
Definition: Stencils.h:1771
math::Vec3< ValueType > gradient(const math::Vec3< ValueType > &V) const
Definition: Stencils.h:1433
__hostdev__ ValueType WENO5(const ValueType &v1, const ValueType &v2, const ValueType &v3, const ValueType &v4, const ValueType &v5, RealT scale2=1.0)
Implementation of nominally fifth-order finite-difference WENO.
Definition: Stencils.h:35
CurvatureStencil(const GridType &grid, Real dx)
Definition: Stencils.h:1533
ValueType normSqGrad() const
Return the norm square of the single-sided upwind gradient (computed via Godunov's scheme) at the pre...
Definition: Stencils.h:1261
double Real
Definition: Types.h:60
BoxStencil(const GridType &grid)
Definition: Stencils.h:311
GridType::ValueType ValueType
Definition: Stencils.h:478
Definition: Stencils.h:246
void moveTo(const Coord &ijk, const ValueType ¢erValue)
Initialize the stencil buffer with the values of voxel (i, j, k) and its neighbors. The method also takes a value of the center element of the stencil, assuming it is already known.
Definition: Stencils.h:59
Definition: Stencils.h:550
tree::ValueAccessor< const TreeType, IsSafe > AccessorType
Definition: Stencils.h:41
GridType::ValueType ValueType
Definition: Stencils.h:1044
GradStencil(const GridType &grid, Real dx)
Definition: Stencils.h:1249
void moveTo(const IterType &iter)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:72
GridT GridType
Definition: Stencils.h:1769
ValueType normSqGrad(const ValueType &isoValue=zeroVal< ValueType >()) const
Return the norm-square of the WENO upwind gradient (computed via WENO upwinding and Godunov's scheme)...
Definition: Stencils.h:1399
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:1052
Definition: Stencils.h:300
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:1334
const ValueType & getValue(unsigned int pos=0) const
Return the value from the stencil buffer with linear offset pos.
Definition: Stencils.h:97
WenoStencil(const GridType &grid)
Definition: Stencils.h:1376
ValueType mean() const
Return the mean value of the current stencil.
Definition: Stencils.h:138
FourthOrderDenseStencil(const GridType &grid)
Definition: Stencils.h:693
SecondOrderDenseStencil(const GridType &grid)
Definition: Stencils.h:482
Coord mCenter
Definition: Stencils.h:222
BufferType mValues
Definition: Stencils.h:221
GridT::TreeType TreeType
Definition: Stencils.h:1521
GridT GridType
Definition: Stencils.h:1236
ValueType min() const
Return the smallest value in the stencil buffer.
Definition: Stencils.h:146
GridT::TreeType TreeType
Definition: Stencils.h:477
GridT GridType
Definition: Stencils.h:826
GridT GridType
Definition: Stencils.h:1042
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:486
const GridType * mGrid
Definition: Stencils.h:219
math::Vec3< ValueType > gradient() const
Definition: Stencils.h:1449
Type Pow3(Type x)
Return x3.
Definition: Math.h:552
GridT::TreeType TreeType
Definition: Stencils.h:688
ValueType gaussianCurvatureNormGrad() const
Definition: Stencils.h:1596
math::Vec3< ValueType > gradient() const
Definition: Stencils.h:1655
GridT::TreeType TreeType
Definition: Stencils.h:1371
GridType::ValueType ValueType
Definition: Stencils.h:1238
void moveTo(const Coord &ijk)
Initialize the stencil buffer with the values of voxel (i, j, k) and its neighbors.
Definition: Stencils.h:47
ValueType laplacian() const
Definition: Stencils.h:1297
ThirteenPointStencil(const GridType &grid)
Definition: Stencils.h:562
void curvaturesNormGrad(ValueType &mean, ValueType &gauss) const
Return both the mean and the Gaussian curvature at the previously buffered location.
Definition: Stencils.h:1608
GridT GridType
Definition: Stencils.h:687
GridType::ValueType ValueType
Definition: Stencils.h:558
CurvatureStencil(const GridType &grid)
Definition: Stencils.h:1526
bool intersects(const ValueType &isoValue=zeroVal< ValueType >()) const
Return true if the center of the stencil intersects the.
Definition: Stencils.h:319
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:566
Definition: Exceptions.h:13
void curvatures(ValueType &mean, ValueType &gauss) const
Return both the mean and the Gaussian curvature at the previously buffered location.
Definition: Stencils.h:1567
GridT GridType
Definition: Stencils.h:476
ValueType median() const
Return the median value of the current stencil.
Definition: Stencils.h:121
GridT::TreeType TreeType
Definition: Stencils.h:827
const Coord & getCenterCoord() const
Return the coordinates of the center point of the stencil.
Definition: Stencils.h:160
GridT::TreeType TreeType
Definition: Stencils.h:557
void moveTo(const IterType &iter)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:1792
Definition: Stencils.h:681
GradStencil(const GridType &grid)
Definition: Stencils.h:1242
SevenPointStencil(const GridT &grid)
Definition: Stencils.h:257
GridT GridType
Definition: Stencils.h:556
bool zeroCrossing() const
Definition: Stencils.h:1306
Dense stencil of a given width.
Definition: Stencils.h:1764
Definition: Stencils.h:1515
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:91
ValueAccessors are designed to help accelerate accesses into the OpenVDB Tree structures by storing c...
bool intersects(const ValueType &isoValue=zeroVal< ValueType >()) const
Return true if the center of the stencil intersects the iso-contour specified by the isoValue...
Definition: Stencils.h:167
int size()
Return the size of the stencil buffer.
Definition: Stencils.h:118
GridType::ValueType ValueType
Definition: Stencils.h:1372
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:315
BaseStencil(const GridType &grid, int size)
Definition: Stencils.h:211
std::pair< ValueType, ValueType > principalCurvatures() const
Return the pair (minimum, maximum) principal curvature at the previously buffered location...
Definition: Stencils.h:1624
ValueType laplacian() const
Definition: Stencils.h:1461
ValueType laplacian() const
Definition: Stencils.h:1642
GridT GridType
Definition: Stencils.h:1370
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:261
const GridType & grid() const
Return a const reference to the grid from which this stencil was constructed.
Definition: Stencils.h:203
const ValueType & getCenterValue() const
Return the value at the center of the stencil.
Definition: Stencils.h:163
SixthOrderDenseStencil(const GridType &grid)
Definition: Stencils.h:1048
Type Pow2(Type x)
Return x2.
Definition: Math.h:548
GridT::TreeType TreeType
Definition: Stencils.h:39
math::Vec3< ValueType > gradient() const
Return the gradient computed at the previously buffered location by second order central differencing...
Definition: Stencils.h:1277
void moveTo(const Vec3< RealType > &xyz)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:86
Tolerance for floating-point comparison.
Definition: Math.h:148
GridT GridType
Definition: Stencils.h:38
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:697
math::Vec3< ValueType > gradient(const math::Vec3< ValueType > &V) const
Return the first-order upwind gradient corresponding to the direction V.
Definition: Stencils.h:1287
GridT::ValueType ValueType
Definition: Stencils.h:40
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
ValueType meanCurvatureNormGrad() const
Definition: Stencils.h:1584
math::Vec3< ValueType > cpt()
Compute the closest-point transform to a level set.
Definition: Stencils.h:1320
std::vector< ValueType > BufferType
Definition: Stencils.h:42
Definition: Stencils.h:1036
const AccessorType & accessor() const
Return a const reference to the ValueAccessor associated with this Stencil.
Definition: Stencils.h:207
Definition: Stencils.h:470
bool zeroCrossing() const
Definition: Stencils.h:1471
AccessorType mAcc
Definition: Stencils.h:220
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:212
GridT::TreeType TreeType
Definition: Stencils.h:252
ValueType meanCurvature() const
Return the mean curvature at the previously buffered location.
Definition: Stencils.h:1544
GridT::TreeType TreeType
Definition: Stencils.h:306