13 #ifndef OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED
14 #define OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED
33 template<
typename DerivedType,
typename Gr
idT,
bool IsSafe>
42 typedef typename BufferType::iterator
IterType;
50 mValues[0] = mAcc.getValue(ijk);
51 static_cast<DerivedType&>(*this).init(mCenter);
62 mValues[0] = centerValue;
63 static_cast<DerivedType&>(*this).init(mCenter);
71 template<
typename IterType>
74 mCenter = iter.getCoord();
76 static_cast<DerivedType&>(*this).init(mCenter);
85 template<
typename RealType>
89 if (ijk != mCenter) this->moveTo(ijk);
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(); }
124 assert(!tmp.empty());
125 size_t midpoint = (tmp.size() - 1) >> 1;
127 std::nth_element(tmp.begin(), tmp.begin() + midpoint, tmp.end());
128 return tmp[midpoint];
135 for (
int n = 0, s =
int(mValues.size()); n < s; ++n) sum += mValues[n];
142 IterType iter = std::min_element(mValues.begin(), mValues.end());
149 IterType iter = std::max_element(mValues.begin(), mValues.end());
163 const bool less = this->getValue< 0, 0, 0>() < isoValue;
164 return (less ^ (this->getValue<-1, 0, 0>() < isoValue)) ||
165 (less ^ (this->getValue< 1, 0, 0>() < isoValue)) ||
166 (less ^ (this->getValue< 0,-1, 0>() < isoValue)) ||
167 (less ^ (this->getValue< 0, 1, 0>() < isoValue)) ||
168 (less ^ (this->getValue< 0, 0,-1>() < isoValue)) ||
169 (less ^ (this->getValue< 0, 0, 1>() < isoValue)) ;
185 const bool less = this->getValue< 0, 0, 0>() < isoValue;
186 mask[0] = less ^ (this->getValue<-1, 0, 0>() < isoValue);
187 mask[1] = less ^ (this->getValue< 1, 0, 0>() < isoValue);
188 mask[2] = less ^ (this->getValue< 0,-1, 0>() < isoValue);
189 mask[3] = less ^ (this->getValue< 0, 1, 0>() < isoValue);
190 mask[4] = less ^ (this->getValue< 0, 0,-1>() < isoValue);
191 mask[5] = less ^ (this->getValue< 0, 0, 1>() < isoValue);
227 template<
int i,
int j,
int k>
struct SevenPt {};
228 template<>
struct SevenPt< 0, 0, 0> {
enum { idx = 0 }; };
229 template<>
struct SevenPt< 1, 0, 0> {
enum { idx = 1 }; };
230 template<>
struct SevenPt< 0, 1, 0> {
enum { idx = 2 }; };
231 template<>
struct SevenPt< 0, 0, 1> {
enum { idx = 3 }; };
232 template<>
struct SevenPt<-1, 0, 0> {
enum { idx = 4 }; };
233 template<>
struct SevenPt< 0,-1, 0> {
enum { idx = 5 }; };
234 template<>
struct SevenPt< 0, 0,-1> {
enum { idx = 6 }; };
239 template<
typename Gr
idT,
bool IsSafe = true>
249 static const int SIZE = 7;
254 template<
int i,
int j,
int k>
255 unsigned int pos()
const {
return SevenPt<i,j,k>::idx; }
258 inline void init(
const Coord& ijk)
260 BaseType::template setValue<-1, 0, 0>(mAcc.getValue(ijk.
offsetBy(-1, 0, 0)));
261 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
263 BaseType::template setValue< 0,-1, 0>(mAcc.getValue(ijk.
offsetBy( 0,-1, 0)));
264 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
266 BaseType::template setValue< 0, 0,-1>(mAcc.getValue(ijk.
offsetBy( 0, 0,-1)));
267 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
271 using BaseType::mAcc;
272 using BaseType::mValues;
282 template<
int i,
int j,
int k>
struct BoxPt {};
283 template<>
struct BoxPt< 0, 0, 0> {
enum { idx = 0 }; };
284 template<>
struct BoxPt< 0, 0, 1> {
enum { idx = 1 }; };
285 template<>
struct BoxPt< 0, 1, 1> {
enum { idx = 2 }; };
286 template<>
struct BoxPt< 0, 1, 0> {
enum { idx = 3 }; };
287 template<>
struct BoxPt< 1, 0, 0> {
enum { idx = 4 }; };
288 template<>
struct BoxPt< 1, 0, 1> {
enum { idx = 5 }; };
289 template<>
struct BoxPt< 1, 1, 1> {
enum { idx = 6 }; };
290 template<>
struct BoxPt< 1, 1, 0> {
enum { idx = 7 }; };
293 template<
typename Gr
idT,
bool IsSafe = true>
303 static const int SIZE = 8;
308 template<
int i,
int j,
int k>
309 unsigned int pos()
const {
return BoxPt<i,j,k>::idx; }
315 const bool less = mValues[0] < isoValue;
316 return (less ^ (mValues[1] < isoValue)) ||
317 (less ^ (mValues[2] < isoValue)) ||
318 (less ^ (mValues[3] < isoValue)) ||
319 (less ^ (mValues[4] < isoValue)) ||
320 (less ^ (mValues[5] < isoValue)) ||
321 (less ^ (mValues[6] < isoValue)) ||
322 (less ^ (mValues[7] < isoValue)) ;
335 const ValueType u = xyz[0] - BaseType::mCenter[0];
336 const ValueType v = xyz[1] - BaseType::mCenter[1];
337 const ValueType w = xyz[2] - BaseType::mCenter[2];
340 assert(u>=0 && u<=1);
341 assert(v>=0 && v<=1);
342 assert(w>=0 && w<=1);
344 ValueType V = BaseType::template getValue<0,0,0>();
345 ValueType A = static_cast<ValueType>(V + (BaseType::template getValue<0,0,1>() - V) * w);
346 V = BaseType::template getValue< 0, 1, 0>();
347 ValueType B = static_cast<ValueType>(V + (BaseType::template getValue<0,1,1>() - V) * w);
348 ValueType C = static_cast<ValueType>(A + (B - A) * v);
350 V = BaseType::template getValue<1,0,0>();
351 A = static_cast<ValueType>(V + (BaseType::template getValue<1,0,1>() - V) * w);
352 V = BaseType::template getValue<1,1,0>();
353 B = static_cast<ValueType>(V + (BaseType::template getValue<1,1,1>() - V) * w);
354 ValueType D = static_cast<ValueType>(A + (B - A) * v);
356 return static_cast<ValueType>(C + (D - C) * u);
369 const ValueType u = xyz[0] - BaseType::mCenter[0];
370 const ValueType v = xyz[1] - BaseType::mCenter[1];
371 const ValueType w = xyz[2] - BaseType::mCenter[2];
374 assert(u>=0 && u<=1);
375 assert(v>=0 && v<=1);
376 assert(w>=0 && w<=1);
378 ValueType D[4]={BaseType::template getValue<0,0,1>()-BaseType::template getValue<0,0,0>(),
379 BaseType::template getValue<0,1,1>()-BaseType::template getValue<0,1,0>(),
380 BaseType::template getValue<1,0,1>()-BaseType::template getValue<1,0,0>(),
381 BaseType::template getValue<1,1,1>()-BaseType::template getValue<1,1,0>()};
384 ValueType A = static_cast<ValueType>(D[0] + (D[1]- D[0]) * v);
385 ValueType B = static_cast<ValueType>(D[2] + (D[3]- D[2]) * v);
387 zeroVal<ValueType>(),
388 static_cast<ValueType>(A + (B - A) * u));
390 D[0] = static_cast<ValueType>(BaseType::template getValue<0,0,0>() + D[0] * w);
391 D[1] = static_cast<ValueType>(BaseType::template getValue<0,1,0>() + D[1] * w);
392 D[2] = static_cast<ValueType>(BaseType::template getValue<1,0,0>() + D[2] * w);
393 D[3] = static_cast<ValueType>(BaseType::template getValue<1,1,0>() + D[3] * w);
396 A = static_cast<ValueType>(D[0] + (D[1] - D[0]) * v);
397 B = static_cast<ValueType>(D[2] + (D[3] - D[2]) * v);
405 grad[1] = static_cast<ValueType>(A + (B - A) * u);
407 return BaseType::mGrid->transform().baseMap()->applyIJT(grad, xyz);
411 inline void init(
const Coord& ijk)
413 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
414 BaseType::template setValue< 0, 1, 1>(mAcc.getValue(ijk.
offsetBy( 0, 1, 1)));
415 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
416 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
417 BaseType::template setValue< 1, 0, 1>(mAcc.getValue(ijk.
offsetBy( 1, 0, 1)));
418 BaseType::template setValue< 1, 1, 1>(mAcc.getValue(ijk.
offsetBy( 1, 1, 1)));
419 BaseType::template setValue< 1, 1, 0>(mAcc.getValue(ijk.
offsetBy( 1, 1, 0)));
423 using BaseType::mAcc;
424 using BaseType::mValues;
434 template<
int i,
int j,
int k>
struct DensePt {};
435 template<>
struct DensePt< 0, 0, 0> {
enum { idx = 0 }; };
437 template<>
struct DensePt< 1, 0, 0> {
enum { idx = 1 }; };
438 template<>
struct DensePt< 0, 1, 0> {
enum { idx = 2 }; };
439 template<>
struct DensePt< 0, 0, 1> {
enum { idx = 3 }; };
441 template<>
struct DensePt<-1, 0, 0> {
enum { idx = 4 }; };
442 template<>
struct DensePt< 0,-1, 0> {
enum { idx = 5 }; };
443 template<>
struct DensePt< 0, 0,-1> {
enum { idx = 6 }; };
445 template<>
struct DensePt<-1,-1, 0> {
enum { idx = 7 }; };
446 template<>
struct DensePt< 0,-1,-1> {
enum { idx = 8 }; };
447 template<>
struct DensePt<-1, 0,-1> {
enum { idx = 9 }; };
449 template<>
struct DensePt< 1,-1, 0> {
enum { idx = 10 }; };
450 template<>
struct DensePt< 0, 1,-1> {
enum { idx = 11 }; };
451 template<>
struct DensePt<-1, 0, 1> {
enum { idx = 12 }; };
453 template<>
struct DensePt<-1, 1, 0> {
enum { idx = 13 }; };
454 template<>
struct DensePt< 0,-1, 1> {
enum { idx = 14 }; };
455 template<>
struct DensePt< 1, 0,-1> {
enum { idx = 15 }; };
457 template<>
struct DensePt< 1, 1, 0> {
enum { idx = 16 }; };
458 template<>
struct DensePt< 0, 1, 1> {
enum { idx = 17 }; };
459 template<>
struct DensePt< 1, 0, 1> {
enum { idx = 18 }; };
463 template<
typename Gr
idT,
bool IsSafe = true>
465 :
public BaseStencil<SecondOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe >
474 static const int SIZE = 19;
479 template<
int i,
int j,
int k>
480 unsigned int pos()
const {
return DensePt<i,j,k>::idx; }
483 inline void init(
const Coord& ijk)
485 mValues[DensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
486 mValues[DensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
487 mValues[DensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
489 mValues[DensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
490 mValues[DensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
491 mValues[DensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
493 mValues[DensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, -1, 0));
494 mValues[DensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, -1, 0));
495 mValues[DensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
496 mValues[DensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
498 mValues[DensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, -1));
499 mValues[DensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, -1));
500 mValues[DensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
501 mValues[DensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
503 mValues[DensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, -1));
504 mValues[DensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, -1));
505 mValues[DensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 1));
506 mValues[DensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
510 using BaseType::mAcc;
511 using BaseType::mValues;
521 template<
int i,
int j,
int k>
struct ThirteenPt {};
522 template<>
struct ThirteenPt< 0, 0, 0> {
enum { idx = 0 }; };
524 template<>
struct ThirteenPt< 1, 0, 0> {
enum { idx = 1 }; };
525 template<>
struct ThirteenPt< 0, 1, 0> {
enum { idx = 2 }; };
526 template<>
struct ThirteenPt< 0, 0, 1> {
enum { idx = 3 }; };
528 template<>
struct ThirteenPt<-1, 0, 0> {
enum { idx = 4 }; };
529 template<>
struct ThirteenPt< 0,-1, 0> {
enum { idx = 5 }; };
530 template<>
struct ThirteenPt< 0, 0,-1> {
enum { idx = 6 }; };
532 template<>
struct ThirteenPt< 2, 0, 0> {
enum { idx = 7 }; };
533 template<>
struct ThirteenPt< 0, 2, 0> {
enum { idx = 8 }; };
534 template<>
struct ThirteenPt< 0, 0, 2> {
enum { idx = 9 }; };
536 template<>
struct ThirteenPt<-2, 0, 0> {
enum { idx = 10 }; };
537 template<>
struct ThirteenPt< 0,-2, 0> {
enum { idx = 11 }; };
538 template<>
struct ThirteenPt< 0, 0,-2> {
enum { idx = 12 }; };
543 template<
typename Gr
idT,
bool IsSafe = true>
545 :
public BaseStencil<ThirteenPointStencil<GridT, IsSafe>, GridT, IsSafe>
554 static const int SIZE = 13;
559 template<
int i,
int j,
int k>
560 unsigned int pos()
const {
return ThirteenPt<i,j,k>::idx; }
563 inline void init(
const Coord& ijk)
565 mValues[ThirteenPt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
566 mValues[ThirteenPt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
567 mValues[ThirteenPt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
568 mValues[ThirteenPt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
570 mValues[ThirteenPt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
571 mValues[ThirteenPt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
572 mValues[ThirteenPt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
573 mValues[ThirteenPt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
575 mValues[ThirteenPt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
576 mValues[ThirteenPt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
577 mValues[ThirteenPt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
578 mValues[ThirteenPt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
582 using BaseType::mAcc;
583 using BaseType::mValues;
593 template<
int i,
int j,
int k>
struct FourthDensePt {};
594 template<>
struct FourthDensePt< 0, 0, 0> {
enum { idx = 0 }; };
596 template<>
struct FourthDensePt<-2, 2, 0> {
enum { idx = 1 }; };
597 template<>
struct FourthDensePt<-1, 2, 0> {
enum { idx = 2 }; };
598 template<>
struct FourthDensePt< 0, 2, 0> {
enum { idx = 3 }; };
599 template<>
struct FourthDensePt< 1, 2, 0> {
enum { idx = 4 }; };
600 template<>
struct FourthDensePt< 2, 2, 0> {
enum { idx = 5 }; };
602 template<>
struct FourthDensePt<-2, 1, 0> {
enum { idx = 6 }; };
603 template<>
struct FourthDensePt<-1, 1, 0> {
enum { idx = 7 }; };
604 template<>
struct FourthDensePt< 0, 1, 0> {
enum { idx = 8 }; };
605 template<>
struct FourthDensePt< 1, 1, 0> {
enum { idx = 9 }; };
606 template<>
struct FourthDensePt< 2, 1, 0> {
enum { idx = 10 }; };
608 template<>
struct FourthDensePt<-2, 0, 0> {
enum { idx = 11 }; };
609 template<>
struct FourthDensePt<-1, 0, 0> {
enum { idx = 12 }; };
610 template<>
struct FourthDensePt< 1, 0, 0> {
enum { idx = 13 }; };
611 template<>
struct FourthDensePt< 2, 0, 0> {
enum { idx = 14 }; };
613 template<>
struct FourthDensePt<-2,-1, 0> {
enum { idx = 15 }; };
614 template<>
struct FourthDensePt<-1,-1, 0> {
enum { idx = 16 }; };
615 template<>
struct FourthDensePt< 0,-1, 0> {
enum { idx = 17 }; };
616 template<>
struct FourthDensePt< 1,-1, 0> {
enum { idx = 18 }; };
617 template<>
struct FourthDensePt< 2,-1, 0> {
enum { idx = 19 }; };
619 template<>
struct FourthDensePt<-2,-2, 0> {
enum { idx = 20 }; };
620 template<>
struct FourthDensePt<-1,-2, 0> {
enum { idx = 21 }; };
621 template<>
struct FourthDensePt< 0,-2, 0> {
enum { idx = 22 }; };
622 template<>
struct FourthDensePt< 1,-2, 0> {
enum { idx = 23 }; };
623 template<>
struct FourthDensePt< 2,-2, 0> {
enum { idx = 24 }; };
626 template<>
struct FourthDensePt<-2, 0, 2> {
enum { idx = 25 }; };
627 template<>
struct FourthDensePt<-1, 0, 2> {
enum { idx = 26 }; };
628 template<>
struct FourthDensePt< 0, 0, 2> {
enum { idx = 27 }; };
629 template<>
struct FourthDensePt< 1, 0, 2> {
enum { idx = 28 }; };
630 template<>
struct FourthDensePt< 2, 0, 2> {
enum { idx = 29 }; };
632 template<>
struct FourthDensePt<-2, 0, 1> {
enum { idx = 30 }; };
633 template<>
struct FourthDensePt<-1, 0, 1> {
enum { idx = 31 }; };
634 template<>
struct FourthDensePt< 0, 0, 1> {
enum { idx = 32 }; };
635 template<>
struct FourthDensePt< 1, 0, 1> {
enum { idx = 33 }; };
636 template<>
struct FourthDensePt< 2, 0, 1> {
enum { idx = 34 }; };
638 template<>
struct FourthDensePt<-2, 0,-1> {
enum { idx = 35 }; };
639 template<>
struct FourthDensePt<-1, 0,-1> {
enum { idx = 36 }; };
640 template<>
struct FourthDensePt< 0, 0,-1> {
enum { idx = 37 }; };
641 template<>
struct FourthDensePt< 1, 0,-1> {
enum { idx = 38 }; };
642 template<>
struct FourthDensePt< 2, 0,-1> {
enum { idx = 39 }; };
644 template<>
struct FourthDensePt<-2, 0,-2> {
enum { idx = 40 }; };
645 template<>
struct FourthDensePt<-1, 0,-2> {
enum { idx = 41 }; };
646 template<>
struct FourthDensePt< 0, 0,-2> {
enum { idx = 42 }; };
647 template<>
struct FourthDensePt< 1, 0,-2> {
enum { idx = 43 }; };
648 template<>
struct FourthDensePt< 2, 0,-2> {
enum { idx = 44 }; };
651 template<>
struct FourthDensePt< 0,-2, 2> {
enum { idx = 45 }; };
652 template<>
struct FourthDensePt< 0,-1, 2> {
enum { idx = 46 }; };
653 template<>
struct FourthDensePt< 0, 1, 2> {
enum { idx = 47 }; };
654 template<>
struct FourthDensePt< 0, 2, 2> {
enum { idx = 48 }; };
656 template<>
struct FourthDensePt< 0,-2, 1> {
enum { idx = 49 }; };
657 template<>
struct FourthDensePt< 0,-1, 1> {
enum { idx = 50 }; };
658 template<>
struct FourthDensePt< 0, 1, 1> {
enum { idx = 51 }; };
659 template<>
struct FourthDensePt< 0, 2, 1> {
enum { idx = 52 }; };
661 template<>
struct FourthDensePt< 0,-2,-1> {
enum { idx = 53 }; };
662 template<>
struct FourthDensePt< 0,-1,-1> {
enum { idx = 54 }; };
663 template<>
struct FourthDensePt< 0, 1,-1> {
enum { idx = 55 }; };
664 template<>
struct FourthDensePt< 0, 2,-1> {
enum { idx = 56 }; };
666 template<>
struct FourthDensePt< 0,-2,-2> {
enum { idx = 57 }; };
667 template<>
struct FourthDensePt< 0,-1,-2> {
enum { idx = 58 }; };
668 template<>
struct FourthDensePt< 0, 1,-2> {
enum { idx = 59 }; };
669 template<>
struct FourthDensePt< 0, 2,-2> {
enum { idx = 60 }; };
674 template<
typename Gr
idT,
bool IsSafe = true>
676 :
public BaseStencil<FourthOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe>
685 static const int SIZE = 61;
690 template<
int i,
int j,
int k>
691 unsigned int pos()
const {
return FourthDensePt<i,j,k>::idx; }
694 inline void init(
const Coord& ijk)
696 mValues[FourthDensePt<-2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 2, 0));
697 mValues[FourthDensePt<-1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 2, 0));
698 mValues[FourthDensePt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
699 mValues[FourthDensePt< 1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 2, 0));
700 mValues[FourthDensePt< 2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 2, 0));
702 mValues[FourthDensePt<-2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 1, 0));
703 mValues[FourthDensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
704 mValues[FourthDensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
705 mValues[FourthDensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
706 mValues[FourthDensePt< 2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 1, 0));
708 mValues[FourthDensePt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
709 mValues[FourthDensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
710 mValues[FourthDensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
711 mValues[FourthDensePt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
713 mValues[FourthDensePt<-2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-1, 0));
714 mValues[FourthDensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-1, 0));
715 mValues[FourthDensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 0));
716 mValues[FourthDensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-1, 0));
717 mValues[FourthDensePt< 2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-1, 0));
719 mValues[FourthDensePt<-2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-2, 0));
720 mValues[FourthDensePt<-1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-2, 0));
721 mValues[FourthDensePt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 0));
722 mValues[FourthDensePt< 1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-2, 0));
723 mValues[FourthDensePt< 2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-2, 0));
725 mValues[FourthDensePt<-2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 2));
726 mValues[FourthDensePt<-1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 2));
727 mValues[FourthDensePt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
728 mValues[FourthDensePt< 1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 2));
729 mValues[FourthDensePt< 2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 2));
731 mValues[FourthDensePt<-2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 1));
732 mValues[FourthDensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
733 mValues[FourthDensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
734 mValues[FourthDensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
735 mValues[FourthDensePt< 2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 1));
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,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-2));
744 mValues[FourthDensePt<-1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-2));
745 mValues[FourthDensePt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-2));
746 mValues[FourthDensePt< 1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-2));
747 mValues[FourthDensePt< 2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-2));
750 mValues[FourthDensePt< 0,-2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 2));
751 mValues[FourthDensePt< 0,-1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 2));
752 mValues[FourthDensePt< 0, 1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 2));
753 mValues[FourthDensePt< 0, 2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 2));
755 mValues[FourthDensePt< 0,-2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 1));
756 mValues[FourthDensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 1));
757 mValues[FourthDensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
758 mValues[FourthDensePt< 0, 2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 1));
760 mValues[FourthDensePt< 0,-2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-1));
761 mValues[FourthDensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-1));
762 mValues[FourthDensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-1));
763 mValues[FourthDensePt< 0, 2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-1));
765 mValues[FourthDensePt< 0,-2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-2));
766 mValues[FourthDensePt< 0,-1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-2));
767 mValues[FourthDensePt< 0, 1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-2));
768 mValues[FourthDensePt< 0, 2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-2));
772 using BaseType::mAcc;
773 using BaseType::mValues;
783 template<
int i,
int j,
int k>
struct NineteenPt {};
784 template<>
struct NineteenPt< 0, 0, 0> {
enum { idx = 0 }; };
786 template<>
struct NineteenPt< 1, 0, 0> {
enum { idx = 1 }; };
787 template<>
struct NineteenPt< 0, 1, 0> {
enum { idx = 2 }; };
788 template<>
struct NineteenPt< 0, 0, 1> {
enum { idx = 3 }; };
790 template<>
struct NineteenPt<-1, 0, 0> {
enum { idx = 4 }; };
791 template<>
struct NineteenPt< 0,-1, 0> {
enum { idx = 5 }; };
792 template<>
struct NineteenPt< 0, 0,-1> {
enum { idx = 6 }; };
794 template<>
struct NineteenPt< 2, 0, 0> {
enum { idx = 7 }; };
795 template<>
struct NineteenPt< 0, 2, 0> {
enum { idx = 8 }; };
796 template<>
struct NineteenPt< 0, 0, 2> {
enum { idx = 9 }; };
798 template<>
struct NineteenPt<-2, 0, 0> {
enum { idx = 10 }; };
799 template<>
struct NineteenPt< 0,-2, 0> {
enum { idx = 11 }; };
800 template<>
struct NineteenPt< 0, 0,-2> {
enum { idx = 12 }; };
802 template<>
struct NineteenPt< 3, 0, 0> {
enum { idx = 13 }; };
803 template<>
struct NineteenPt< 0, 3, 0> {
enum { idx = 14 }; };
804 template<>
struct NineteenPt< 0, 0, 3> {
enum { idx = 15 }; };
806 template<>
struct NineteenPt<-3, 0, 0> {
enum { idx = 16 }; };
807 template<>
struct NineteenPt< 0,-3, 0> {
enum { idx = 17 }; };
808 template<>
struct NineteenPt< 0, 0,-3> {
enum { idx = 18 }; };
813 template<
typename Gr
idT,
bool IsSafe = true>
815 :
public BaseStencil<NineteenPointStencil<GridT, IsSafe>, GridT, IsSafe>
824 static const int SIZE = 19;
829 template<
int i,
int j,
int k>
830 unsigned int pos()
const {
return NineteenPt<i,j,k>::idx; }
833 inline void init(
const Coord& ijk)
835 mValues[NineteenPt< 3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
836 mValues[NineteenPt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
837 mValues[NineteenPt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
838 mValues[NineteenPt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
839 mValues[NineteenPt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
840 mValues[NineteenPt<-3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
842 mValues[NineteenPt< 0, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
843 mValues[NineteenPt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
844 mValues[NineteenPt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
845 mValues[NineteenPt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
846 mValues[NineteenPt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
847 mValues[NineteenPt< 0,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -3, 0));
849 mValues[NineteenPt< 0, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
850 mValues[NineteenPt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
851 mValues[NineteenPt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
852 mValues[NineteenPt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
853 mValues[NineteenPt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
854 mValues[NineteenPt< 0, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -3));
858 using BaseType::mAcc;
859 using BaseType::mValues;
869 template<
int i,
int j,
int k>
struct SixthDensePt { };
870 template<>
struct SixthDensePt< 0, 0, 0> {
enum { idx = 0 }; };
872 template<>
struct SixthDensePt<-3, 3, 0> {
enum { idx = 1 }; };
873 template<>
struct SixthDensePt<-2, 3, 0> {
enum { idx = 2 }; };
874 template<>
struct SixthDensePt<-1, 3, 0> {
enum { idx = 3 }; };
875 template<>
struct SixthDensePt< 0, 3, 0> {
enum { idx = 4 }; };
876 template<>
struct SixthDensePt< 1, 3, 0> {
enum { idx = 5 }; };
877 template<>
struct SixthDensePt< 2, 3, 0> {
enum { idx = 6 }; };
878 template<>
struct SixthDensePt< 3, 3, 0> {
enum { idx = 7 }; };
880 template<>
struct SixthDensePt<-3, 2, 0> {
enum { idx = 8 }; };
881 template<>
struct SixthDensePt<-2, 2, 0> {
enum { idx = 9 }; };
882 template<>
struct SixthDensePt<-1, 2, 0> {
enum { idx = 10 }; };
883 template<>
struct SixthDensePt< 0, 2, 0> {
enum { idx = 11 }; };
884 template<>
struct SixthDensePt< 1, 2, 0> {
enum { idx = 12 }; };
885 template<>
struct SixthDensePt< 2, 2, 0> {
enum { idx = 13 }; };
886 template<>
struct SixthDensePt< 3, 2, 0> {
enum { idx = 14 }; };
888 template<>
struct SixthDensePt<-3, 1, 0> {
enum { idx = 15 }; };
889 template<>
struct SixthDensePt<-2, 1, 0> {
enum { idx = 16 }; };
890 template<>
struct SixthDensePt<-1, 1, 0> {
enum { idx = 17 }; };
891 template<>
struct SixthDensePt< 0, 1, 0> {
enum { idx = 18 }; };
892 template<>
struct SixthDensePt< 1, 1, 0> {
enum { idx = 19 }; };
893 template<>
struct SixthDensePt< 2, 1, 0> {
enum { idx = 20 }; };
894 template<>
struct SixthDensePt< 3, 1, 0> {
enum { idx = 21 }; };
896 template<>
struct SixthDensePt<-3, 0, 0> {
enum { idx = 22 }; };
897 template<>
struct SixthDensePt<-2, 0, 0> {
enum { idx = 23 }; };
898 template<>
struct SixthDensePt<-1, 0, 0> {
enum { idx = 24 }; };
899 template<>
struct SixthDensePt< 1, 0, 0> {
enum { idx = 25 }; };
900 template<>
struct SixthDensePt< 2, 0, 0> {
enum { idx = 26 }; };
901 template<>
struct SixthDensePt< 3, 0, 0> {
enum { idx = 27 }; };
904 template<>
struct SixthDensePt<-3,-1, 0> {
enum { idx = 28 }; };
905 template<>
struct SixthDensePt<-2,-1, 0> {
enum { idx = 29 }; };
906 template<>
struct SixthDensePt<-1,-1, 0> {
enum { idx = 30 }; };
907 template<>
struct SixthDensePt< 0,-1, 0> {
enum { idx = 31 }; };
908 template<>
struct SixthDensePt< 1,-1, 0> {
enum { idx = 32 }; };
909 template<>
struct SixthDensePt< 2,-1, 0> {
enum { idx = 33 }; };
910 template<>
struct SixthDensePt< 3,-1, 0> {
enum { idx = 34 }; };
913 template<>
struct SixthDensePt<-3,-2, 0> {
enum { idx = 35 }; };
914 template<>
struct SixthDensePt<-2,-2, 0> {
enum { idx = 36 }; };
915 template<>
struct SixthDensePt<-1,-2, 0> {
enum { idx = 37 }; };
916 template<>
struct SixthDensePt< 0,-2, 0> {
enum { idx = 38 }; };
917 template<>
struct SixthDensePt< 1,-2, 0> {
enum { idx = 39 }; };
918 template<>
struct SixthDensePt< 2,-2, 0> {
enum { idx = 40 }; };
919 template<>
struct SixthDensePt< 3,-2, 0> {
enum { idx = 41 }; };
922 template<>
struct SixthDensePt<-3,-3, 0> {
enum { idx = 42 }; };
923 template<>
struct SixthDensePt<-2,-3, 0> {
enum { idx = 43 }; };
924 template<>
struct SixthDensePt<-1,-3, 0> {
enum { idx = 44 }; };
925 template<>
struct SixthDensePt< 0,-3, 0> {
enum { idx = 45 }; };
926 template<>
struct SixthDensePt< 1,-3, 0> {
enum { idx = 46 }; };
927 template<>
struct SixthDensePt< 2,-3, 0> {
enum { idx = 47 }; };
928 template<>
struct SixthDensePt< 3,-3, 0> {
enum { idx = 48 }; };
931 template<>
struct SixthDensePt<-3, 0, 3> {
enum { idx = 49 }; };
932 template<>
struct SixthDensePt<-2, 0, 3> {
enum { idx = 50 }; };
933 template<>
struct SixthDensePt<-1, 0, 3> {
enum { idx = 51 }; };
934 template<>
struct SixthDensePt< 0, 0, 3> {
enum { idx = 52 }; };
935 template<>
struct SixthDensePt< 1, 0, 3> {
enum { idx = 53 }; };
936 template<>
struct SixthDensePt< 2, 0, 3> {
enum { idx = 54 }; };
937 template<>
struct SixthDensePt< 3, 0, 3> {
enum { idx = 55 }; };
940 template<>
struct SixthDensePt<-3, 0, 2> {
enum { idx = 56 }; };
941 template<>
struct SixthDensePt<-2, 0, 2> {
enum { idx = 57 }; };
942 template<>
struct SixthDensePt<-1, 0, 2> {
enum { idx = 58 }; };
943 template<>
struct SixthDensePt< 0, 0, 2> {
enum { idx = 59 }; };
944 template<>
struct SixthDensePt< 1, 0, 2> {
enum { idx = 60 }; };
945 template<>
struct SixthDensePt< 2, 0, 2> {
enum { idx = 61 }; };
946 template<>
struct SixthDensePt< 3, 0, 2> {
enum { idx = 62 }; };
948 template<>
struct SixthDensePt<-3, 0, 1> {
enum { idx = 63 }; };
949 template<>
struct SixthDensePt<-2, 0, 1> {
enum { idx = 64 }; };
950 template<>
struct SixthDensePt<-1, 0, 1> {
enum { idx = 65 }; };
951 template<>
struct SixthDensePt< 0, 0, 1> {
enum { idx = 66 }; };
952 template<>
struct SixthDensePt< 1, 0, 1> {
enum { idx = 67 }; };
953 template<>
struct SixthDensePt< 2, 0, 1> {
enum { idx = 68 }; };
954 template<>
struct SixthDensePt< 3, 0, 1> {
enum { idx = 69 }; };
957 template<>
struct SixthDensePt<-3, 0,-1> {
enum { idx = 70 }; };
958 template<>
struct SixthDensePt<-2, 0,-1> {
enum { idx = 71 }; };
959 template<>
struct SixthDensePt<-1, 0,-1> {
enum { idx = 72 }; };
960 template<>
struct SixthDensePt< 0, 0,-1> {
enum { idx = 73 }; };
961 template<>
struct SixthDensePt< 1, 0,-1> {
enum { idx = 74 }; };
962 template<>
struct SixthDensePt< 2, 0,-1> {
enum { idx = 75 }; };
963 template<>
struct SixthDensePt< 3, 0,-1> {
enum { idx = 76 }; };
966 template<>
struct SixthDensePt<-3, 0,-2> {
enum { idx = 77 }; };
967 template<>
struct SixthDensePt<-2, 0,-2> {
enum { idx = 78 }; };
968 template<>
struct SixthDensePt<-1, 0,-2> {
enum { idx = 79 }; };
969 template<>
struct SixthDensePt< 0, 0,-2> {
enum { idx = 80 }; };
970 template<>
struct SixthDensePt< 1, 0,-2> {
enum { idx = 81 }; };
971 template<>
struct SixthDensePt< 2, 0,-2> {
enum { idx = 82 }; };
972 template<>
struct SixthDensePt< 3, 0,-2> {
enum { idx = 83 }; };
975 template<>
struct SixthDensePt<-3, 0,-3> {
enum { idx = 84 }; };
976 template<>
struct SixthDensePt<-2, 0,-3> {
enum { idx = 85 }; };
977 template<>
struct SixthDensePt<-1, 0,-3> {
enum { idx = 86 }; };
978 template<>
struct SixthDensePt< 0, 0,-3> {
enum { idx = 87 }; };
979 template<>
struct SixthDensePt< 1, 0,-3> {
enum { idx = 88 }; };
980 template<>
struct SixthDensePt< 2, 0,-3> {
enum { idx = 89 }; };
981 template<>
struct SixthDensePt< 3, 0,-3> {
enum { idx = 90 }; };
984 template<>
struct SixthDensePt< 0,-3, 3> {
enum { idx = 91 }; };
985 template<>
struct SixthDensePt< 0,-2, 3> {
enum { idx = 92 }; };
986 template<>
struct SixthDensePt< 0,-1, 3> {
enum { idx = 93 }; };
987 template<>
struct SixthDensePt< 0, 1, 3> {
enum { idx = 94 }; };
988 template<>
struct SixthDensePt< 0, 2, 3> {
enum { idx = 95 }; };
989 template<>
struct SixthDensePt< 0, 3, 3> {
enum { idx = 96 }; };
991 template<>
struct SixthDensePt< 0,-3, 2> {
enum { idx = 97 }; };
992 template<>
struct SixthDensePt< 0,-2, 2> {
enum { idx = 98 }; };
993 template<>
struct SixthDensePt< 0,-1, 2> {
enum { idx = 99 }; };
994 template<>
struct SixthDensePt< 0, 1, 2> {
enum { idx = 100 }; };
995 template<>
struct SixthDensePt< 0, 2, 2> {
enum { idx = 101 }; };
996 template<>
struct SixthDensePt< 0, 3, 2> {
enum { idx = 102 }; };
998 template<>
struct SixthDensePt< 0,-3, 1> {
enum { idx = 103 }; };
999 template<>
struct SixthDensePt< 0,-2, 1> {
enum { idx = 104 }; };
1000 template<>
struct SixthDensePt< 0,-1, 1> {
enum { idx = 105 }; };
1001 template<>
struct SixthDensePt< 0, 1, 1> {
enum { idx = 106 }; };
1002 template<>
struct SixthDensePt< 0, 2, 1> {
enum { idx = 107 }; };
1003 template<>
struct SixthDensePt< 0, 3, 1> {
enum { idx = 108 }; };
1005 template<>
struct SixthDensePt< 0,-3,-1> {
enum { idx = 109 }; };
1006 template<>
struct SixthDensePt< 0,-2,-1> {
enum { idx = 110 }; };
1007 template<>
struct SixthDensePt< 0,-1,-1> {
enum { idx = 111 }; };
1008 template<>
struct SixthDensePt< 0, 1,-1> {
enum { idx = 112 }; };
1009 template<>
struct SixthDensePt< 0, 2,-1> {
enum { idx = 113 }; };
1010 template<>
struct SixthDensePt< 0, 3,-1> {
enum { idx = 114 }; };
1012 template<>
struct SixthDensePt< 0,-3,-2> {
enum { idx = 115 }; };
1013 template<>
struct SixthDensePt< 0,-2,-2> {
enum { idx = 116 }; };
1014 template<>
struct SixthDensePt< 0,-1,-2> {
enum { idx = 117 }; };
1015 template<>
struct SixthDensePt< 0, 1,-2> {
enum { idx = 118 }; };
1016 template<>
struct SixthDensePt< 0, 2,-2> {
enum { idx = 119 }; };
1017 template<>
struct SixthDensePt< 0, 3,-2> {
enum { idx = 120 }; };
1019 template<>
struct SixthDensePt< 0,-3,-3> {
enum { idx = 121 }; };
1020 template<>
struct SixthDensePt< 0,-2,-3> {
enum { idx = 122 }; };
1021 template<>
struct SixthDensePt< 0,-1,-3> {
enum { idx = 123 }; };
1022 template<>
struct SixthDensePt< 0, 1,-3> {
enum { idx = 124 }; };
1023 template<>
struct SixthDensePt< 0, 2,-3> {
enum { idx = 125 }; };
1024 template<>
struct SixthDensePt< 0, 3,-3> {
enum { idx = 126 }; };
1029 template<
typename Gr
idT,
bool IsSafe = true>
1031 :
public BaseStencil<SixthOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe>
1040 static const int SIZE = 127;
1045 template<
int i,
int j,
int k>
1046 unsigned int pos()
const {
return SixthDensePt<i,j,k>::idx; }
1049 inline void init(
const Coord& ijk)
1051 mValues[SixthDensePt<-3, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 3, 0));
1052 mValues[SixthDensePt<-2, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 3, 0));
1053 mValues[SixthDensePt<-1, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 3, 0));
1054 mValues[SixthDensePt< 0, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
1055 mValues[SixthDensePt< 1, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 3, 0));
1056 mValues[SixthDensePt< 2, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 3, 0));
1057 mValues[SixthDensePt< 3, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 3, 0));
1059 mValues[SixthDensePt<-3, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 2, 0));
1060 mValues[SixthDensePt<-2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 2, 0));
1061 mValues[SixthDensePt<-1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 2, 0));
1062 mValues[SixthDensePt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
1063 mValues[SixthDensePt< 1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 2, 0));
1064 mValues[SixthDensePt< 2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 2, 0));
1065 mValues[SixthDensePt< 3, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 2, 0));
1067 mValues[SixthDensePt<-3, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 1, 0));
1068 mValues[SixthDensePt<-2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 1, 0));
1069 mValues[SixthDensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
1070 mValues[SixthDensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1071 mValues[SixthDensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
1072 mValues[SixthDensePt< 2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 1, 0));
1073 mValues[SixthDensePt< 3, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 1, 0));
1075 mValues[SixthDensePt<-3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
1076 mValues[SixthDensePt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
1077 mValues[SixthDensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1078 mValues[SixthDensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1079 mValues[SixthDensePt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
1080 mValues[SixthDensePt< 3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
1082 mValues[SixthDensePt<-3,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-1, 0));
1083 mValues[SixthDensePt<-2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-1, 0));
1084 mValues[SixthDensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-1, 0));
1085 mValues[SixthDensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 0));
1086 mValues[SixthDensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-1, 0));
1087 mValues[SixthDensePt< 2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-1, 0));
1088 mValues[SixthDensePt< 3,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-1, 0));
1090 mValues[SixthDensePt<-3,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-2, 0));
1091 mValues[SixthDensePt<-2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-2, 0));
1092 mValues[SixthDensePt<-1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-2, 0));
1093 mValues[SixthDensePt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 0));
1094 mValues[SixthDensePt< 1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-2, 0));
1095 mValues[SixthDensePt< 2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-2, 0));
1096 mValues[SixthDensePt< 3,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-2, 0));
1098 mValues[SixthDensePt<-3,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-3, 0));
1099 mValues[SixthDensePt<-2,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-3, 0));
1100 mValues[SixthDensePt<-1,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-3, 0));
1101 mValues[SixthDensePt< 0,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 0));
1102 mValues[SixthDensePt< 1,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-3, 0));
1103 mValues[SixthDensePt< 2,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-3, 0));
1104 mValues[SixthDensePt< 3,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-3, 0));
1106 mValues[SixthDensePt<-3, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 3));
1107 mValues[SixthDensePt<-2, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 3));
1108 mValues[SixthDensePt<-1, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 3));
1109 mValues[SixthDensePt< 0, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
1110 mValues[SixthDensePt< 1, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 3));
1111 mValues[SixthDensePt< 2, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 3));
1112 mValues[SixthDensePt< 3, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 3));
1114 mValues[SixthDensePt<-3, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 2));
1115 mValues[SixthDensePt<-2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 2));
1116 mValues[SixthDensePt<-1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 2));
1117 mValues[SixthDensePt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
1118 mValues[SixthDensePt< 1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 2));
1119 mValues[SixthDensePt< 2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 2));
1120 mValues[SixthDensePt< 3, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 2));
1122 mValues[SixthDensePt<-3, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 1));
1123 mValues[SixthDensePt<-2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 1));
1124 mValues[SixthDensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
1125 mValues[SixthDensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1126 mValues[SixthDensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
1127 mValues[SixthDensePt< 2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 1));
1128 mValues[SixthDensePt< 3, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 1));
1130 mValues[SixthDensePt<-3, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-1));
1131 mValues[SixthDensePt<-2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-1));
1132 mValues[SixthDensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-1));
1133 mValues[SixthDensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-1));
1134 mValues[SixthDensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-1));
1135 mValues[SixthDensePt< 2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-1));
1136 mValues[SixthDensePt< 3, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-1));
1138 mValues[SixthDensePt<-3, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-2));
1139 mValues[SixthDensePt<-2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-2));
1140 mValues[SixthDensePt<-1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-2));
1141 mValues[SixthDensePt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-2));
1142 mValues[SixthDensePt< 1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-2));
1143 mValues[SixthDensePt< 2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-2));
1144 mValues[SixthDensePt< 3, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-2));
1146 mValues[SixthDensePt<-3, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-3));
1147 mValues[SixthDensePt<-2, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-3));
1148 mValues[SixthDensePt<-1, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-3));
1149 mValues[SixthDensePt< 0, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-3));
1150 mValues[SixthDensePt< 1, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-3));
1151 mValues[SixthDensePt< 2, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-3));
1152 mValues[SixthDensePt< 3, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-3));
1154 mValues[SixthDensePt< 0,-3, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 3));
1155 mValues[SixthDensePt< 0,-2, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 3));
1156 mValues[SixthDensePt< 0,-1, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 3));
1157 mValues[SixthDensePt< 0, 1, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 3));
1158 mValues[SixthDensePt< 0, 2, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 3));
1159 mValues[SixthDensePt< 0, 3, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 3));
1161 mValues[SixthDensePt< 0,-3, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 2));
1162 mValues[SixthDensePt< 0,-2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 2));
1163 mValues[SixthDensePt< 0,-1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 2));
1164 mValues[SixthDensePt< 0, 1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 2));
1165 mValues[SixthDensePt< 0, 2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 2));
1166 mValues[SixthDensePt< 0, 3, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 2));
1168 mValues[SixthDensePt< 0,-3, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 1));
1169 mValues[SixthDensePt< 0,-2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 1));
1170 mValues[SixthDensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 1));
1171 mValues[SixthDensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
1172 mValues[SixthDensePt< 0, 2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 1));
1173 mValues[SixthDensePt< 0, 3, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 1));
1175 mValues[SixthDensePt< 0,-3,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-1));
1176 mValues[SixthDensePt< 0,-2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-1));
1177 mValues[SixthDensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-1));
1178 mValues[SixthDensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-1));
1179 mValues[SixthDensePt< 0, 2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-1));
1180 mValues[SixthDensePt< 0, 3,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-1));
1182 mValues[SixthDensePt< 0,-3,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-2));
1183 mValues[SixthDensePt< 0,-2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-2));
1184 mValues[SixthDensePt< 0,-1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-2));
1185 mValues[SixthDensePt< 0, 1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-2));
1186 mValues[SixthDensePt< 0, 2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-2));
1187 mValues[SixthDensePt< 0, 3,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-2));
1189 mValues[SixthDensePt< 0,-3,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-3));
1190 mValues[SixthDensePt< 0,-2,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-3));
1191 mValues[SixthDensePt< 0,-1,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-3));
1192 mValues[SixthDensePt< 0, 1,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-3));
1193 mValues[SixthDensePt< 0, 2,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-3));
1194 mValues[SixthDensePt< 0, 3,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-3));
1198 using BaseType::mAcc;
1199 using BaseType::mValues;
1208 template<
int i,
int j,
int k>
struct GradPt {};
1209 template<>
struct GradPt< 0, 0, 0> {
enum { idx = 0 }; };
1210 template<>
struct GradPt< 1, 0, 0> {
enum { idx = 2 }; };
1211 template<>
struct GradPt< 0, 1, 0> {
enum { idx = 4 }; };
1212 template<>
struct GradPt< 0, 0, 1> {
enum { idx = 6 }; };
1213 template<>
struct GradPt<-1, 0, 0> {
enum { idx = 1 }; };
1214 template<>
struct GradPt< 0,-1, 0> {
enum { idx = 3 }; };
1215 template<>
struct GradPt< 0, 0,-1> {
enum { idx = 5 }; };
1224 template<
typename Gr
idT,
bool IsSafe = true>
1234 static const int SIZE = 7;
1238 , mInv2Dx(
ValueType(0.5 / grid.voxelSize()[0]))
1239 , mInvDx2(
ValueType(4.0 * mInv2Dx * mInv2Dx))
1246 , mInvDx2(
ValueType(4.0 * mInv2Dx * mInv2Dx))
1258 mValues[0] - mValues[1],
1259 mValues[2] - mValues[0],
1260 mValues[0] - mValues[3],
1261 mValues[4] - mValues[0],
1262 mValues[0] - mValues[5],
1263 mValues[6] - mValues[0]);
1274 mValues[4] - mValues[3],
1275 mValues[6] - mValues[5])*mInv2Dx;
1284 V[0]>0 ? mValues[0] - mValues[1] : mValues[2] - mValues[0],
1285 V[1]>0 ? mValues[0] - mValues[3] : mValues[4] - mValues[0],
1286 V[2]>0 ? mValues[0] - mValues[5] : mValues[6] - mValues[0])*2*mInv2Dx;
1293 return mInvDx2 * (mValues[1] + mValues[2] +
1294 mValues[3] + mValues[4] +
1295 mValues[5] + mValues[6] - 6*mValues[0]);
1303 return (v[0]>0 ? (v[1]<0 || v[2]<0 || v[3]<0 || v[4]<0 || v[5]<0 || v[6]<0)
1304 : (v[1]>0 || v[2]>0 || v[3]>0 || v[4]>0 || v[5]>0 || v[6]>0));
1316 const Coord& ijk = BaseType::getCenterCoord();
1320 ijk[1] - d*(mValues[4] - mValues[3]),
1321 ijk[2] - d*(mValues[6] - mValues[5]));
1327 template<
int i,
int j,
int k>
1328 unsigned int pos()
const {
return GradPt<i,j,k>::idx; }
1332 inline void init(
const Coord& ijk)
1334 BaseType::template setValue<-1, 0, 0>(mAcc.getValue(ijk.
offsetBy(-1, 0, 0)));
1335 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
1337 BaseType::template setValue< 0,-1, 0>(mAcc.getValue(ijk.
offsetBy( 0,-1, 0)));
1338 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
1340 BaseType::template setValue< 0, 0,-1>(mAcc.getValue(ijk.
offsetBy( 0, 0,-1)));
1341 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
1345 using BaseType::mAcc;
1346 using BaseType::mValues;
1358 template<
typename Gr
idT,
bool IsSafe = true>
1368 static const int SIZE = 19;
1373 , mInv2Dx(
ValueType(0.5 / grid.voxelSize()[0]))
1397 v1(v[2]-v[1], v[ 8]-v[ 7], v[14]-v[13], 0),
1398 v2(v[3]-v[2], v[ 9]-v[ 8], v[15]-v[14], 0),
1399 v3(v[0]-v[3], v[ 0]-v[ 9], v[ 0]-v[15], 0),
1400 v4(v[4]-v[0], v[10]-v[ 0], v[16]-v[ 0], 0),
1401 v5(v[5]-v[4], v[11]-v[10], v[17]-v[16], 0),
1402 v6(v[6]-v[5], v[12]-v[11], v[18]-v[17], 0),
1409 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),
1410 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),
1411 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),
1412 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),
1413 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),
1414 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);
1415 return static_cast<ValueType>(
1429 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)
1430 :
math::WENO5(v[ 6]-v[ 5],v[ 5]-v[ 4],v[ 4]-v[ 0], v[ 0]-v[ 3],v[ 3]-v[ 2],mDx2),
1431 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)
1432 :
math::WENO5(v[12]-v[11],v[11]-v[10],v[10]-v[ 0], v[ 0]-v[ 9],v[ 9]-v[ 8],mDx2),
1433 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)
1434 :
math::WENO5(v[18]-v[17],v[17]-v[16],v[16]-v[ 0], v[ 0]-v[15],v[15]-v[14],mDx2));
1444 mValues[10] - mValues[ 9],
1445 mValues[16] - mValues[15]);
1456 mValues[ 3] + mValues[ 4] +
1457 mValues[ 9] + mValues[10] +
1458 mValues[15] + mValues[16] - 6*mValues[0]);
1466 return (v[ 0]>0 ? (v[ 3]<0 || v[ 4]<0 || v[ 9]<0 || v[10]<0 || v[15]<0 || v[16]<0)
1467 : (v[ 3]>0 || v[ 4]>0 || v[ 9]>0 || v[10]>0 || v[15]>0 || v[16]>0));
1471 inline void init(
const Coord& ijk)
1473 mValues[ 1] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
1474 mValues[ 2] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
1475 mValues[ 3] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1476 mValues[ 4] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1477 mValues[ 5] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
1478 mValues[ 6] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
1480 mValues[ 7] = mAcc.getValue(ijk.
offsetBy( 0, -3, 0));
1481 mValues[ 8] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
1482 mValues[ 9] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
1483 mValues[10] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1484 mValues[11] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
1485 mValues[12] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
1487 mValues[13] = mAcc.getValue(ijk.
offsetBy( 0, 0, -3));
1488 mValues[14] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
1489 mValues[15] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
1490 mValues[16] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1491 mValues[17] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
1492 mValues[18] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
1496 using BaseType::mAcc;
1497 using BaseType::mValues;
1505 template<
typename Gr
idT,
bool IsSafe = true>
1515 static const int SIZE = 19;
1519 , mInv2Dx(
ValueType(0.5 / grid.voxelSize()[0]))
1520 , mInvDx2(
ValueType(4.0 * mInv2Dx * mInv2Dx))
1527 , mInvDx2(
ValueType(4.0 * mInv2Dx * mInv2Dx))
1537 Real alpha, normGrad;
1548 Real alpha, normGrad;
1549 return this->gaussianCurvature(alpha, normGrad) ?
1560 Real alphaM, alphaG, normGrad;
1561 if (this->curvatures(alphaM, alphaG, normGrad)) {
1577 Real alpha, normGrad;
1589 Real alpha, normGrad;
1590 return this->gaussianCurvature(alpha, normGrad) ?
1601 Real alphaM, alphaG, normGrad;
1602 if (this->curvatures(alphaM, alphaG, normGrad)) {
1617 std::pair<ValueType, ValueType> pair(0, 0);
1618 Real alphaM, alphaG, normGrad;
1619 if (this->curvatures(alphaM, alphaG, normGrad)) {
1621 const Real tmp = std::sqrt(mean*mean - alphaG*mInvDx2/
math::Pow4(normGrad));
1636 mValues[1] + mValues[2] +
1637 mValues[3] + mValues[4] +
1638 mValues[5] + mValues[6] - 6*mValues[0]);
1649 mValues[2] - mValues[1],
1650 mValues[4] - mValues[3],
1651 mValues[6] - mValues[5])*mInv2Dx;
1655 inline void init(
const Coord &ijk)
1657 mValues[ 1] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1658 mValues[ 2] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1660 mValues[ 3] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
1661 mValues[ 4] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1663 mValues[ 5] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
1664 mValues[ 6] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1666 mValues[ 7] = mAcc.getValue(ijk.
offsetBy(-1, -1, 0));
1667 mValues[ 8] = mAcc.getValue(ijk.
offsetBy( 1, -1, 0));
1668 mValues[ 9] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
1669 mValues[10] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
1671 mValues[11] = mAcc.getValue(ijk.
offsetBy(-1, 0, -1));
1672 mValues[12] = mAcc.getValue(ijk.
offsetBy( 1, 0, -1));
1673 mValues[13] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
1674 mValues[14] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
1676 mValues[15] = mAcc.getValue(ijk.
offsetBy( 0, -1, -1));
1677 mValues[16] = mAcc.getValue(ijk.
offsetBy( 0, 1, -1));
1678 mValues[17] = mAcc.getValue(ijk.
offsetBy( 0, -1, 1));
1679 mValues[18] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
1682 inline Real Dx()
const {
return 0.5*(mValues[2] - mValues[1]); }
1683 inline Real Dy()
const {
return 0.5*(mValues[4] - mValues[3]); }
1684 inline Real Dz()
const {
return 0.5*(mValues[6] - mValues[5]); }
1685 inline Real Dxx()
const {
return mValues[2] - 2 * mValues[0] + mValues[1]; }
1686 inline Real Dyy()
const {
return mValues[4] - 2 * mValues[0] + mValues[3]; }
1687 inline Real Dzz()
const {
return mValues[6] - 2 * mValues[0] + mValues[5]; }
1688 inline Real Dxy()
const {
return 0.25 * (mValues[10] - mValues[ 8] + mValues[ 7] - mValues[ 9]); }
1689 inline Real Dxz()
const {
return 0.25 * (mValues[14] - mValues[12] + mValues[11] - mValues[13]); }
1690 inline Real Dyz()
const {
return 0.25 * (mValues[18] - mValues[16] + mValues[15] - mValues[17]); }
1695 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1696 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1697 if (normGrad2 <= math::Tolerance<Real>::value()) {
1698 alpha = normGrad = 0;
1701 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz();
1702 alpha = Dx2*(Dyy + Dzz) + Dy2*(Dxx + Dzz) + Dz2*(Dxx + Dyy) -
1703 2*(Dx*(Dy*this->Dxy() + Dz*this->Dxz()) + Dy*Dz*this->Dyz());
1704 normGrad = std::sqrt(normGrad2);
1708 inline bool gaussianCurvature(
Real& alpha,
Real& normGrad)
const
1711 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1712 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1713 if (normGrad2 <= math::Tolerance<Real>::value()) {
1714 alpha = normGrad = 0;
1717 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz(),
1718 Dxy = this->Dxy(), Dxz = this->Dxz(), Dyz = this->Dyz();
1719 alpha = Dx2*(Dyy*Dzz - Dyz*Dyz) + Dy2*(Dxx*Dzz - Dxz*Dxz) + Dz2*(Dxx*Dyy - Dxy*Dxy) +
1720 2*( Dy*Dz*(Dxy*Dxz - Dyz*Dxx) + Dx*Dz*(Dxy*Dyz - Dxz*Dyy) + Dx*Dy*(Dxz*Dyz - Dxy*Dzz) );
1721 normGrad = std::sqrt(normGrad2);
1724 inline bool curvatures(
Real& alphaM,
Real& alphaG,
Real& normGrad)
const
1727 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1728 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1729 if (normGrad2 <= math::Tolerance<Real>::value()) {
1730 alphaM = alphaG =normGrad = 0;
1733 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz(),
1734 Dxy = this->Dxy(), Dxz = this->Dxz(), Dyz = this->Dyz();
1735 alphaM = Dx2*(Dyy + Dzz) + Dy2*(Dxx + Dzz) + Dz2*(Dxx + Dyy) -
1736 2*(Dx*(Dy*Dxy + Dz*Dxz) + Dy*Dz*Dyz);
1737 alphaG = Dx2*(Dyy*Dzz - Dyz*Dyz) + Dy2*(Dxx*Dzz - Dxz*Dxz) + Dz2*(Dxx*Dyy - Dxy*Dxy) +
1738 2*( Dy*Dz*(Dxy*Dxz - Dyz*Dxx) + Dx*Dz*(Dxy*Dyz - Dxz*Dyy) + Dx*Dy*(Dxz*Dyz - Dxy*Dzz) );
1739 normGrad = std::sqrt(normGrad2);
1744 using BaseType::mAcc;
1745 using BaseType::mValues;
1754 template<
typename Gr
idT,
bool IsSafe = true>
1766 , mHalfWidth(halfWidth)
1768 assert(halfWidth>0);
1777 BaseType::mCenter = ijk;
1782 template<
typename IterType>
1785 BaseType::mCenter = iter.getCoord();
1786 this->init(BaseType::mCenter);
1792 inline void init(
const Coord& ijk)
1796 for (p[1] = ijk[1]-mHalfWidth; p[1] <= q[1]; ++p[1]) {
1797 for (p[2] = ijk[2]-mHalfWidth; p[2] <= q[2]; ++p[2]) {
1798 mValues[n++] = mAcc.getValue(p);
1805 using BaseType::mAcc;
1806 using BaseType::mValues;
1807 const int mHalfWidth;
1815 #endif // OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED