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>
43 typedef typename BufferType::iterator
IterType;
51 mValues[0] = mAcc.getValue(ijk);
52 static_cast<DerivedType&
>(*this).init(mCenter);
60 inline void moveTo(
const Coord& ijk,
const ValueType& centerValue)
63 mValues[0] = centerValue;
64 static_cast<DerivedType&
>(*this).init(mCenter);
72 template<
typename IterType>
73 inline void moveTo(
const IterType& iter)
75 mCenter = iter.getCoord();
77 static_cast<DerivedType&
>(*this).init(mCenter);
86 template<
typename RealType>
89 Coord ijk = Coord::floor(xyz);
90 if (ijk != mCenter) this->moveTo(ijk);
98 inline const ValueType&
getValue(
unsigned int pos = 0)
const 100 assert(pos < mValues.size());
105 template<
int i,
int j,
int k>
108 return mValues[
static_cast<const DerivedType&
>(*this).template pos<i,j,k>()];
112 template<
int i,
int j,
int k>
115 mValues[
static_cast<const DerivedType&
>(*this).template pos<i,j,k>()] = value;
119 inline int size() {
return mValues.size(); }
124 BufferType tmp(mValues);
125 assert(!tmp.empty());
126 size_t midpoint = (tmp.size() - 1) >> 1;
128 #if !defined(_MSC_VER) || _MSC_VER < 1924 129 std::nth_element(tmp.begin(), tmp.begin() + midpoint, tmp.end());
132 std::nth_element(tmp.begin(), tmp.begin() + midpoint, tmp.end(),
133 std::less<ValueType>());
135 return tmp[midpoint];
142 for (
int n = 0, s =
int(mValues.size()); n < s; ++n) sum += mValues[n];
143 return sum / ValueType(mValues.size());
147 inline ValueType
min()
const 149 IterType iter = std::min_element(mValues.begin(), mValues.end());
154 inline ValueType
max()
const 156 IterType iter = std::max_element(mValues.begin(), mValues.end());
168 inline bool intersects(
const ValueType &isoValue = zeroVal<ValueType>())
const 170 const bool less = this->getValue< 0, 0, 0>() < isoValue;
171 return (less ^ (this->getValue<-1, 0, 0>() < isoValue)) ||
172 (less ^ (this->getValue< 1, 0, 0>() < isoValue)) ||
173 (less ^ (this->getValue< 0,-1, 0>() < isoValue)) ||
174 (less ^ (this->getValue< 0, 1, 0>() < isoValue)) ||
175 (less ^ (this->getValue< 0, 0,-1>() < isoValue)) ||
176 (less ^ (this->getValue< 0, 0, 1>() < isoValue)) ;
189 inline std::bitset<6>
intersectionMask(
const ValueType &isoValue = zeroVal<ValueType>())
const 192 const bool less = this->getValue< 0, 0, 0>() < isoValue;
193 mask[0] = less ^ (this->getValue<-1, 0, 0>() < isoValue);
194 mask[1] = less ^ (this->getValue< 1, 0, 0>() < isoValue);
195 mask[2] = less ^ (this->getValue< 0,-1, 0>() < isoValue);
196 mask[3] = less ^ (this->getValue< 0, 1, 0>() < isoValue);
197 mask[4] = less ^ (this->getValue< 0, 0,-1>() < isoValue);
198 mask[5] = less ^ (this->getValue< 0, 0, 1>() < isoValue);
204 inline const GridType&
grid()
const {
return *mGrid; }
208 inline const AccessorType&
accessor()
const {
return mAcc; }
234 template<
int i,
int j,
int k>
struct SevenPt {};
235 template<>
struct SevenPt< 0, 0, 0> {
enum { idx = 0 }; };
236 template<>
struct SevenPt< 1, 0, 0> {
enum { idx = 1 }; };
237 template<>
struct SevenPt< 0, 1, 0> {
enum { idx = 2 }; };
238 template<>
struct SevenPt< 0, 0, 1> {
enum { idx = 3 }; };
239 template<>
struct SevenPt<-1, 0, 0> {
enum { idx = 4 }; };
240 template<>
struct SevenPt< 0,-1, 0> {
enum { idx = 5 }; };
241 template<>
struct SevenPt< 0, 0,-1> {
enum { idx = 6 }; };
246 template<
typename Gr
idT,
bool IsSafe = true>
256 static const int SIZE = 7;
261 template<
int i,
int j,
int k>
262 unsigned int pos()
const {
return SevenPt<i,j,k>::idx; }
265 inline void init(
const Coord& ijk)
267 BaseType::template setValue<-1, 0, 0>(mAcc.getValue(ijk.
offsetBy(-1, 0, 0)));
268 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
270 BaseType::template setValue< 0,-1, 0>(mAcc.getValue(ijk.
offsetBy( 0,-1, 0)));
271 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
273 BaseType::template setValue< 0, 0,-1>(mAcc.getValue(ijk.
offsetBy( 0, 0,-1)));
274 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
278 using BaseType::mAcc;
279 using BaseType::mValues;
289 template<
int i,
int j,
int k>
struct BoxPt {};
290 template<>
struct BoxPt< 0, 0, 0> {
enum { idx = 0 }; };
291 template<>
struct BoxPt< 0, 0, 1> {
enum { idx = 1 }; };
292 template<>
struct BoxPt< 0, 1, 1> {
enum { idx = 2 }; };
293 template<>
struct BoxPt< 0, 1, 0> {
enum { idx = 3 }; };
294 template<>
struct BoxPt< 1, 0, 0> {
enum { idx = 4 }; };
295 template<>
struct BoxPt< 1, 0, 1> {
enum { idx = 5 }; };
296 template<>
struct BoxPt< 1, 1, 1> {
enum { idx = 6 }; };
297 template<>
struct BoxPt< 1, 1, 0> {
enum { idx = 7 }; };
300 template<
typename Gr
idT,
bool IsSafe = true>
310 static const int SIZE = 8;
315 template<
int i,
int j,
int k>
316 unsigned int pos()
const {
return BoxPt<i,j,k>::idx; }
320 inline bool intersects(
const ValueType &isoValue = zeroVal<ValueType>())
const 322 const bool less = mValues[0] < isoValue;
323 return (less ^ (mValues[1] < isoValue)) ||
324 (less ^ (mValues[2] < isoValue)) ||
325 (less ^ (mValues[3] < isoValue)) ||
326 (less ^ (mValues[4] < isoValue)) ||
327 (less ^ (mValues[5] < isoValue)) ||
328 (less ^ (mValues[6] < isoValue)) ||
329 (less ^ (mValues[7] < isoValue)) ;
342 const ValueType u = xyz[0] - BaseType::mCenter[0];
343 const ValueType v = xyz[1] - BaseType::mCenter[1];
344 const ValueType w = xyz[2] - BaseType::mCenter[2];
347 assert(u>=0 && u<=1);
348 assert(v>=0 && v<=1);
349 assert(w>=0 && w<=1);
351 ValueType V = BaseType::template getValue<0,0,0>();
352 ValueType A =
static_cast<ValueType
>(V + (BaseType::template getValue<0,0,1>() - V) * w);
353 V = BaseType::template getValue< 0, 1, 0>();
354 ValueType B =
static_cast<ValueType
>(V + (BaseType::template getValue<0,1,1>() - V) * w);
355 ValueType C =
static_cast<ValueType
>(A + (B - A) * v);
357 V = BaseType::template getValue<1,0,0>();
358 A =
static_cast<ValueType
>(V + (BaseType::template getValue<1,0,1>() - V) * w);
359 V = BaseType::template getValue<1,1,0>();
360 B =
static_cast<ValueType
>(V + (BaseType::template getValue<1,1,1>() - V) * w);
361 ValueType D =
static_cast<ValueType
>(A + (B - A) * v);
363 return static_cast<ValueType
>(C + (D - C) * u);
376 const ValueType u = xyz[0] - BaseType::mCenter[0];
377 const ValueType v = xyz[1] - BaseType::mCenter[1];
378 const ValueType w = xyz[2] - BaseType::mCenter[2];
381 assert(u>=0 && u<=1);
382 assert(v>=0 && v<=1);
383 assert(w>=0 && w<=1);
385 ValueType D[4]={BaseType::template getValue<0,0,1>()-BaseType::template getValue<0,0,0>(),
386 BaseType::template getValue<0,1,1>()-BaseType::template getValue<0,1,0>(),
387 BaseType::template getValue<1,0,1>()-BaseType::template getValue<1,0,0>(),
388 BaseType::template getValue<1,1,1>()-BaseType::template getValue<1,1,0>()};
391 ValueType A =
static_cast<ValueType
>(D[0] + (D[1]- D[0]) * v);
392 ValueType B =
static_cast<ValueType
>(D[2] + (D[3]- D[2]) * v);
394 zeroVal<ValueType>(),
395 static_cast<ValueType>(A + (B - A) * u));
397 D[0] =
static_cast<ValueType
>(BaseType::template getValue<0,0,0>() + D[0] * w);
398 D[1] =
static_cast<ValueType
>(BaseType::template getValue<0,1,0>() + D[1] * w);
399 D[2] =
static_cast<ValueType
>(BaseType::template getValue<1,0,0>() + D[2] * w);
400 D[3] =
static_cast<ValueType
>(BaseType::template getValue<1,1,0>() + D[3] * w);
403 A =
static_cast<ValueType
>(D[0] + (D[1] - D[0]) * v);
404 B =
static_cast<ValueType
>(D[2] + (D[3] - D[2]) * v);
412 grad[1] =
static_cast<ValueType
>(A + (B - A) * u);
414 return BaseType::mGrid->transform().baseMap()->applyIJT(grad, xyz);
418 inline void init(
const Coord& ijk)
420 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
421 BaseType::template setValue< 0, 1, 1>(mAcc.getValue(ijk.
offsetBy( 0, 1, 1)));
422 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
423 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
424 BaseType::template setValue< 1, 0, 1>(mAcc.getValue(ijk.
offsetBy( 1, 0, 1)));
425 BaseType::template setValue< 1, 1, 1>(mAcc.getValue(ijk.
offsetBy( 1, 1, 1)));
426 BaseType::template setValue< 1, 1, 0>(mAcc.getValue(ijk.
offsetBy( 1, 1, 0)));
430 using BaseType::mAcc;
431 using BaseType::mValues;
441 template<
int i,
int j,
int k>
struct DensePt {};
442 template<>
struct DensePt< 0, 0, 0> {
enum { idx = 0 }; };
444 template<>
struct DensePt< 1, 0, 0> {
enum { idx = 1 }; };
445 template<>
struct DensePt< 0, 1, 0> {
enum { idx = 2 }; };
446 template<>
struct DensePt< 0, 0, 1> {
enum { idx = 3 }; };
448 template<>
struct DensePt<-1, 0, 0> {
enum { idx = 4 }; };
449 template<>
struct DensePt< 0,-1, 0> {
enum { idx = 5 }; };
450 template<>
struct DensePt< 0, 0,-1> {
enum { idx = 6 }; };
452 template<>
struct DensePt<-1,-1, 0> {
enum { idx = 7 }; };
453 template<>
struct DensePt< 0,-1,-1> {
enum { idx = 8 }; };
454 template<>
struct DensePt<-1, 0,-1> {
enum { idx = 9 }; };
456 template<>
struct DensePt< 1,-1, 0> {
enum { idx = 10 }; };
457 template<>
struct DensePt< 0, 1,-1> {
enum { idx = 11 }; };
458 template<>
struct DensePt<-1, 0, 1> {
enum { idx = 12 }; };
460 template<>
struct DensePt<-1, 1, 0> {
enum { idx = 13 }; };
461 template<>
struct DensePt< 0,-1, 1> {
enum { idx = 14 }; };
462 template<>
struct DensePt< 1, 0,-1> {
enum { idx = 15 }; };
464 template<>
struct DensePt< 1, 1, 0> {
enum { idx = 16 }; };
465 template<>
struct DensePt< 0, 1, 1> {
enum { idx = 17 }; };
466 template<>
struct DensePt< 1, 0, 1> {
enum { idx = 18 }; };
470 template<
typename Gr
idT,
bool IsSafe = true>
472 :
public BaseStencil<SecondOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe >
481 static const int SIZE = 19;
486 template<
int i,
int j,
int k>
487 unsigned int pos()
const {
return DensePt<i,j,k>::idx; }
490 inline void init(
const Coord& ijk)
492 mValues[DensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
493 mValues[DensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
494 mValues[DensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
496 mValues[DensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
497 mValues[DensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
498 mValues[DensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
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));
503 mValues[DensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
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));
508 mValues[DensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 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));
513 mValues[DensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
517 using BaseType::mAcc;
518 using BaseType::mValues;
528 template<
int i,
int j,
int k>
struct ThirteenPt {};
529 template<>
struct ThirteenPt< 0, 0, 0> {
enum { idx = 0 }; };
531 template<>
struct ThirteenPt< 1, 0, 0> {
enum { idx = 1 }; };
532 template<>
struct ThirteenPt< 0, 1, 0> {
enum { idx = 2 }; };
533 template<>
struct ThirteenPt< 0, 0, 1> {
enum { idx = 3 }; };
535 template<>
struct ThirteenPt<-1, 0, 0> {
enum { idx = 4 }; };
536 template<>
struct ThirteenPt< 0,-1, 0> {
enum { idx = 5 }; };
537 template<>
struct ThirteenPt< 0, 0,-1> {
enum { idx = 6 }; };
539 template<>
struct ThirteenPt< 2, 0, 0> {
enum { idx = 7 }; };
540 template<>
struct ThirteenPt< 0, 2, 0> {
enum { idx = 8 }; };
541 template<>
struct ThirteenPt< 0, 0, 2> {
enum { idx = 9 }; };
543 template<>
struct ThirteenPt<-2, 0, 0> {
enum { idx = 10 }; };
544 template<>
struct ThirteenPt< 0,-2, 0> {
enum { idx = 11 }; };
545 template<>
struct ThirteenPt< 0, 0,-2> {
enum { idx = 12 }; };
550 template<
typename Gr
idT,
bool IsSafe = true>
552 :
public BaseStencil<ThirteenPointStencil<GridT, IsSafe>, GridT, IsSafe>
561 static const int SIZE = 13;
566 template<
int i,
int j,
int k>
567 unsigned int pos()
const {
return ThirteenPt<i,j,k>::idx; }
570 inline void init(
const Coord& ijk)
572 mValues[ThirteenPt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
573 mValues[ThirteenPt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
574 mValues[ThirteenPt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
575 mValues[ThirteenPt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
577 mValues[ThirteenPt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
578 mValues[ThirteenPt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
579 mValues[ThirteenPt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
580 mValues[ThirteenPt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
582 mValues[ThirteenPt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
583 mValues[ThirteenPt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
584 mValues[ThirteenPt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
585 mValues[ThirteenPt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
589 using BaseType::mAcc;
590 using BaseType::mValues;
600 template<
int i,
int j,
int k>
struct FourthDensePt {};
601 template<>
struct FourthDensePt< 0, 0, 0> {
enum { idx = 0 }; };
603 template<>
struct FourthDensePt<-2, 2, 0> {
enum { idx = 1 }; };
604 template<>
struct FourthDensePt<-1, 2, 0> {
enum { idx = 2 }; };
605 template<>
struct FourthDensePt< 0, 2, 0> {
enum { idx = 3 }; };
606 template<>
struct FourthDensePt< 1, 2, 0> {
enum { idx = 4 }; };
607 template<>
struct FourthDensePt< 2, 2, 0> {
enum { idx = 5 }; };
609 template<>
struct FourthDensePt<-2, 1, 0> {
enum { idx = 6 }; };
610 template<>
struct FourthDensePt<-1, 1, 0> {
enum { idx = 7 }; };
611 template<>
struct FourthDensePt< 0, 1, 0> {
enum { idx = 8 }; };
612 template<>
struct FourthDensePt< 1, 1, 0> {
enum { idx = 9 }; };
613 template<>
struct FourthDensePt< 2, 1, 0> {
enum { idx = 10 }; };
615 template<>
struct FourthDensePt<-2, 0, 0> {
enum { idx = 11 }; };
616 template<>
struct FourthDensePt<-1, 0, 0> {
enum { idx = 12 }; };
617 template<>
struct FourthDensePt< 1, 0, 0> {
enum { idx = 13 }; };
618 template<>
struct FourthDensePt< 2, 0, 0> {
enum { idx = 14 }; };
620 template<>
struct FourthDensePt<-2,-1, 0> {
enum { idx = 15 }; };
621 template<>
struct FourthDensePt<-1,-1, 0> {
enum { idx = 16 }; };
622 template<>
struct FourthDensePt< 0,-1, 0> {
enum { idx = 17 }; };
623 template<>
struct FourthDensePt< 1,-1, 0> {
enum { idx = 18 }; };
624 template<>
struct FourthDensePt< 2,-1, 0> {
enum { idx = 19 }; };
626 template<>
struct FourthDensePt<-2,-2, 0> {
enum { idx = 20 }; };
627 template<>
struct FourthDensePt<-1,-2, 0> {
enum { idx = 21 }; };
628 template<>
struct FourthDensePt< 0,-2, 0> {
enum { idx = 22 }; };
629 template<>
struct FourthDensePt< 1,-2, 0> {
enum { idx = 23 }; };
630 template<>
struct FourthDensePt< 2,-2, 0> {
enum { idx = 24 }; };
633 template<>
struct FourthDensePt<-2, 0, 2> {
enum { idx = 25 }; };
634 template<>
struct FourthDensePt<-1, 0, 2> {
enum { idx = 26 }; };
635 template<>
struct FourthDensePt< 0, 0, 2> {
enum { idx = 27 }; };
636 template<>
struct FourthDensePt< 1, 0, 2> {
enum { idx = 28 }; };
637 template<>
struct FourthDensePt< 2, 0, 2> {
enum { idx = 29 }; };
639 template<>
struct FourthDensePt<-2, 0, 1> {
enum { idx = 30 }; };
640 template<>
struct FourthDensePt<-1, 0, 1> {
enum { idx = 31 }; };
641 template<>
struct FourthDensePt< 0, 0, 1> {
enum { idx = 32 }; };
642 template<>
struct FourthDensePt< 1, 0, 1> {
enum { idx = 33 }; };
643 template<>
struct FourthDensePt< 2, 0, 1> {
enum { idx = 34 }; };
645 template<>
struct FourthDensePt<-2, 0,-1> {
enum { idx = 35 }; };
646 template<>
struct FourthDensePt<-1, 0,-1> {
enum { idx = 36 }; };
647 template<>
struct FourthDensePt< 0, 0,-1> {
enum { idx = 37 }; };
648 template<>
struct FourthDensePt< 1, 0,-1> {
enum { idx = 38 }; };
649 template<>
struct FourthDensePt< 2, 0,-1> {
enum { idx = 39 }; };
651 template<>
struct FourthDensePt<-2, 0,-2> {
enum { idx = 40 }; };
652 template<>
struct FourthDensePt<-1, 0,-2> {
enum { idx = 41 }; };
653 template<>
struct FourthDensePt< 0, 0,-2> {
enum { idx = 42 }; };
654 template<>
struct FourthDensePt< 1, 0,-2> {
enum { idx = 43 }; };
655 template<>
struct FourthDensePt< 2, 0,-2> {
enum { idx = 44 }; };
658 template<>
struct FourthDensePt< 0,-2, 2> {
enum { idx = 45 }; };
659 template<>
struct FourthDensePt< 0,-1, 2> {
enum { idx = 46 }; };
660 template<>
struct FourthDensePt< 0, 1, 2> {
enum { idx = 47 }; };
661 template<>
struct FourthDensePt< 0, 2, 2> {
enum { idx = 48 }; };
663 template<>
struct FourthDensePt< 0,-2, 1> {
enum { idx = 49 }; };
664 template<>
struct FourthDensePt< 0,-1, 1> {
enum { idx = 50 }; };
665 template<>
struct FourthDensePt< 0, 1, 1> {
enum { idx = 51 }; };
666 template<>
struct FourthDensePt< 0, 2, 1> {
enum { idx = 52 }; };
668 template<>
struct FourthDensePt< 0,-2,-1> {
enum { idx = 53 }; };
669 template<>
struct FourthDensePt< 0,-1,-1> {
enum { idx = 54 }; };
670 template<>
struct FourthDensePt< 0, 1,-1> {
enum { idx = 55 }; };
671 template<>
struct FourthDensePt< 0, 2,-1> {
enum { idx = 56 }; };
673 template<>
struct FourthDensePt< 0,-2,-2> {
enum { idx = 57 }; };
674 template<>
struct FourthDensePt< 0,-1,-2> {
enum { idx = 58 }; };
675 template<>
struct FourthDensePt< 0, 1,-2> {
enum { idx = 59 }; };
676 template<>
struct FourthDensePt< 0, 2,-2> {
enum { idx = 60 }; };
681 template<
typename Gr
idT,
bool IsSafe = true>
683 :
public BaseStencil<FourthOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe>
692 static const int SIZE = 61;
697 template<
int i,
int j,
int k>
698 unsigned int pos()
const {
return FourthDensePt<i,j,k>::idx; }
701 inline void init(
const Coord& ijk)
703 mValues[FourthDensePt<-2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 2, 0));
704 mValues[FourthDensePt<-1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 2, 0));
705 mValues[FourthDensePt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
706 mValues[FourthDensePt< 1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 2, 0));
707 mValues[FourthDensePt< 2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 2, 0));
709 mValues[FourthDensePt<-2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 1, 0));
710 mValues[FourthDensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
711 mValues[FourthDensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
712 mValues[FourthDensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
713 mValues[FourthDensePt< 2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 1, 0));
715 mValues[FourthDensePt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
716 mValues[FourthDensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
717 mValues[FourthDensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
718 mValues[FourthDensePt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
720 mValues[FourthDensePt<-2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-1, 0));
721 mValues[FourthDensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-1, 0));
722 mValues[FourthDensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 0));
723 mValues[FourthDensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-1, 0));
724 mValues[FourthDensePt< 2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-1, 0));
726 mValues[FourthDensePt<-2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-2, 0));
727 mValues[FourthDensePt<-1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-2, 0));
728 mValues[FourthDensePt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 0));
729 mValues[FourthDensePt< 1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-2, 0));
730 mValues[FourthDensePt< 2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-2, 0));
732 mValues[FourthDensePt<-2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 2));
733 mValues[FourthDensePt<-1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 2));
734 mValues[FourthDensePt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
735 mValues[FourthDensePt< 1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 2));
736 mValues[FourthDensePt< 2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 2));
738 mValues[FourthDensePt<-2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 1));
739 mValues[FourthDensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
740 mValues[FourthDensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
741 mValues[FourthDensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
742 mValues[FourthDensePt< 2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 1));
744 mValues[FourthDensePt<-2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-1));
745 mValues[FourthDensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-1));
746 mValues[FourthDensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-1));
747 mValues[FourthDensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-1));
748 mValues[FourthDensePt< 2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-1));
750 mValues[FourthDensePt<-2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-2));
751 mValues[FourthDensePt<-1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-2));
752 mValues[FourthDensePt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-2));
753 mValues[FourthDensePt< 1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-2));
754 mValues[FourthDensePt< 2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-2));
757 mValues[FourthDensePt< 0,-2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 2));
758 mValues[FourthDensePt< 0,-1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 2));
759 mValues[FourthDensePt< 0, 1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 2));
760 mValues[FourthDensePt< 0, 2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 2));
762 mValues[FourthDensePt< 0,-2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 1));
763 mValues[FourthDensePt< 0,-1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 1));
764 mValues[FourthDensePt< 0, 1, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
765 mValues[FourthDensePt< 0, 2, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 1));
767 mValues[FourthDensePt< 0,-2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-1));
768 mValues[FourthDensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-1));
769 mValues[FourthDensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-1));
770 mValues[FourthDensePt< 0, 2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-1));
772 mValues[FourthDensePt< 0,-2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-2));
773 mValues[FourthDensePt< 0,-1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-2));
774 mValues[FourthDensePt< 0, 1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-2));
775 mValues[FourthDensePt< 0, 2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-2));
779 using BaseType::mAcc;
780 using BaseType::mValues;
790 template<
int i,
int j,
int k>
struct NineteenPt {};
791 template<>
struct NineteenPt< 0, 0, 0> {
enum { idx = 0 }; };
793 template<>
struct NineteenPt< 1, 0, 0> {
enum { idx = 1 }; };
794 template<>
struct NineteenPt< 0, 1, 0> {
enum { idx = 2 }; };
795 template<>
struct NineteenPt< 0, 0, 1> {
enum { idx = 3 }; };
797 template<>
struct NineteenPt<-1, 0, 0> {
enum { idx = 4 }; };
798 template<>
struct NineteenPt< 0,-1, 0> {
enum { idx = 5 }; };
799 template<>
struct NineteenPt< 0, 0,-1> {
enum { idx = 6 }; };
801 template<>
struct NineteenPt< 2, 0, 0> {
enum { idx = 7 }; };
802 template<>
struct NineteenPt< 0, 2, 0> {
enum { idx = 8 }; };
803 template<>
struct NineteenPt< 0, 0, 2> {
enum { idx = 9 }; };
805 template<>
struct NineteenPt<-2, 0, 0> {
enum { idx = 10 }; };
806 template<>
struct NineteenPt< 0,-2, 0> {
enum { idx = 11 }; };
807 template<>
struct NineteenPt< 0, 0,-2> {
enum { idx = 12 }; };
809 template<>
struct NineteenPt< 3, 0, 0> {
enum { idx = 13 }; };
810 template<>
struct NineteenPt< 0, 3, 0> {
enum { idx = 14 }; };
811 template<>
struct NineteenPt< 0, 0, 3> {
enum { idx = 15 }; };
813 template<>
struct NineteenPt<-3, 0, 0> {
enum { idx = 16 }; };
814 template<>
struct NineteenPt< 0,-3, 0> {
enum { idx = 17 }; };
815 template<>
struct NineteenPt< 0, 0,-3> {
enum { idx = 18 }; };
820 template<
typename Gr
idT,
bool IsSafe = true>
822 :
public BaseStencil<NineteenPointStencil<GridT, IsSafe>, GridT, IsSafe>
831 static const int SIZE = 19;
836 template<
int i,
int j,
int k>
837 unsigned int pos()
const {
return NineteenPt<i,j,k>::idx; }
840 inline void init(
const Coord& ijk)
842 mValues[NineteenPt< 3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
843 mValues[NineteenPt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
844 mValues[NineteenPt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
845 mValues[NineteenPt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
846 mValues[NineteenPt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
847 mValues[NineteenPt<-3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
849 mValues[NineteenPt< 0, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
850 mValues[NineteenPt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
851 mValues[NineteenPt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
852 mValues[NineteenPt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
853 mValues[NineteenPt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
854 mValues[NineteenPt< 0,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, -3, 0));
856 mValues[NineteenPt< 0, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
857 mValues[NineteenPt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
858 mValues[NineteenPt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
859 mValues[NineteenPt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
860 mValues[NineteenPt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
861 mValues[NineteenPt< 0, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, -3));
865 using BaseType::mAcc;
866 using BaseType::mValues;
876 template<
int i,
int j,
int k>
struct SixthDensePt { };
877 template<>
struct SixthDensePt< 0, 0, 0> {
enum { idx = 0 }; };
879 template<>
struct SixthDensePt<-3, 3, 0> {
enum { idx = 1 }; };
880 template<>
struct SixthDensePt<-2, 3, 0> {
enum { idx = 2 }; };
881 template<>
struct SixthDensePt<-1, 3, 0> {
enum { idx = 3 }; };
882 template<>
struct SixthDensePt< 0, 3, 0> {
enum { idx = 4 }; };
883 template<>
struct SixthDensePt< 1, 3, 0> {
enum { idx = 5 }; };
884 template<>
struct SixthDensePt< 2, 3, 0> {
enum { idx = 6 }; };
885 template<>
struct SixthDensePt< 3, 3, 0> {
enum { idx = 7 }; };
887 template<>
struct SixthDensePt<-3, 2, 0> {
enum { idx = 8 }; };
888 template<>
struct SixthDensePt<-2, 2, 0> {
enum { idx = 9 }; };
889 template<>
struct SixthDensePt<-1, 2, 0> {
enum { idx = 10 }; };
890 template<>
struct SixthDensePt< 0, 2, 0> {
enum { idx = 11 }; };
891 template<>
struct SixthDensePt< 1, 2, 0> {
enum { idx = 12 }; };
892 template<>
struct SixthDensePt< 2, 2, 0> {
enum { idx = 13 }; };
893 template<>
struct SixthDensePt< 3, 2, 0> {
enum { idx = 14 }; };
895 template<>
struct SixthDensePt<-3, 1, 0> {
enum { idx = 15 }; };
896 template<>
struct SixthDensePt<-2, 1, 0> {
enum { idx = 16 }; };
897 template<>
struct SixthDensePt<-1, 1, 0> {
enum { idx = 17 }; };
898 template<>
struct SixthDensePt< 0, 1, 0> {
enum { idx = 18 }; };
899 template<>
struct SixthDensePt< 1, 1, 0> {
enum { idx = 19 }; };
900 template<>
struct SixthDensePt< 2, 1, 0> {
enum { idx = 20 }; };
901 template<>
struct SixthDensePt< 3, 1, 0> {
enum { idx = 21 }; };
903 template<>
struct SixthDensePt<-3, 0, 0> {
enum { idx = 22 }; };
904 template<>
struct SixthDensePt<-2, 0, 0> {
enum { idx = 23 }; };
905 template<>
struct SixthDensePt<-1, 0, 0> {
enum { idx = 24 }; };
906 template<>
struct SixthDensePt< 1, 0, 0> {
enum { idx = 25 }; };
907 template<>
struct SixthDensePt< 2, 0, 0> {
enum { idx = 26 }; };
908 template<>
struct SixthDensePt< 3, 0, 0> {
enum { idx = 27 }; };
911 template<>
struct SixthDensePt<-3,-1, 0> {
enum { idx = 28 }; };
912 template<>
struct SixthDensePt<-2,-1, 0> {
enum { idx = 29 }; };
913 template<>
struct SixthDensePt<-1,-1, 0> {
enum { idx = 30 }; };
914 template<>
struct SixthDensePt< 0,-1, 0> {
enum { idx = 31 }; };
915 template<>
struct SixthDensePt< 1,-1, 0> {
enum { idx = 32 }; };
916 template<>
struct SixthDensePt< 2,-1, 0> {
enum { idx = 33 }; };
917 template<>
struct SixthDensePt< 3,-1, 0> {
enum { idx = 34 }; };
920 template<>
struct SixthDensePt<-3,-2, 0> {
enum { idx = 35 }; };
921 template<>
struct SixthDensePt<-2,-2, 0> {
enum { idx = 36 }; };
922 template<>
struct SixthDensePt<-1,-2, 0> {
enum { idx = 37 }; };
923 template<>
struct SixthDensePt< 0,-2, 0> {
enum { idx = 38 }; };
924 template<>
struct SixthDensePt< 1,-2, 0> {
enum { idx = 39 }; };
925 template<>
struct SixthDensePt< 2,-2, 0> {
enum { idx = 40 }; };
926 template<>
struct SixthDensePt< 3,-2, 0> {
enum { idx = 41 }; };
929 template<>
struct SixthDensePt<-3,-3, 0> {
enum { idx = 42 }; };
930 template<>
struct SixthDensePt<-2,-3, 0> {
enum { idx = 43 }; };
931 template<>
struct SixthDensePt<-1,-3, 0> {
enum { idx = 44 }; };
932 template<>
struct SixthDensePt< 0,-3, 0> {
enum { idx = 45 }; };
933 template<>
struct SixthDensePt< 1,-3, 0> {
enum { idx = 46 }; };
934 template<>
struct SixthDensePt< 2,-3, 0> {
enum { idx = 47 }; };
935 template<>
struct SixthDensePt< 3,-3, 0> {
enum { idx = 48 }; };
938 template<>
struct SixthDensePt<-3, 0, 3> {
enum { idx = 49 }; };
939 template<>
struct SixthDensePt<-2, 0, 3> {
enum { idx = 50 }; };
940 template<>
struct SixthDensePt<-1, 0, 3> {
enum { idx = 51 }; };
941 template<>
struct SixthDensePt< 0, 0, 3> {
enum { idx = 52 }; };
942 template<>
struct SixthDensePt< 1, 0, 3> {
enum { idx = 53 }; };
943 template<>
struct SixthDensePt< 2, 0, 3> {
enum { idx = 54 }; };
944 template<>
struct SixthDensePt< 3, 0, 3> {
enum { idx = 55 }; };
947 template<>
struct SixthDensePt<-3, 0, 2> {
enum { idx = 56 }; };
948 template<>
struct SixthDensePt<-2, 0, 2> {
enum { idx = 57 }; };
949 template<>
struct SixthDensePt<-1, 0, 2> {
enum { idx = 58 }; };
950 template<>
struct SixthDensePt< 0, 0, 2> {
enum { idx = 59 }; };
951 template<>
struct SixthDensePt< 1, 0, 2> {
enum { idx = 60 }; };
952 template<>
struct SixthDensePt< 2, 0, 2> {
enum { idx = 61 }; };
953 template<>
struct SixthDensePt< 3, 0, 2> {
enum { idx = 62 }; };
955 template<>
struct SixthDensePt<-3, 0, 1> {
enum { idx = 63 }; };
956 template<>
struct SixthDensePt<-2, 0, 1> {
enum { idx = 64 }; };
957 template<>
struct SixthDensePt<-1, 0, 1> {
enum { idx = 65 }; };
958 template<>
struct SixthDensePt< 0, 0, 1> {
enum { idx = 66 }; };
959 template<>
struct SixthDensePt< 1, 0, 1> {
enum { idx = 67 }; };
960 template<>
struct SixthDensePt< 2, 0, 1> {
enum { idx = 68 }; };
961 template<>
struct SixthDensePt< 3, 0, 1> {
enum { idx = 69 }; };
964 template<>
struct SixthDensePt<-3, 0,-1> {
enum { idx = 70 }; };
965 template<>
struct SixthDensePt<-2, 0,-1> {
enum { idx = 71 }; };
966 template<>
struct SixthDensePt<-1, 0,-1> {
enum { idx = 72 }; };
967 template<>
struct SixthDensePt< 0, 0,-1> {
enum { idx = 73 }; };
968 template<>
struct SixthDensePt< 1, 0,-1> {
enum { idx = 74 }; };
969 template<>
struct SixthDensePt< 2, 0,-1> {
enum { idx = 75 }; };
970 template<>
struct SixthDensePt< 3, 0,-1> {
enum { idx = 76 }; };
973 template<>
struct SixthDensePt<-3, 0,-2> {
enum { idx = 77 }; };
974 template<>
struct SixthDensePt<-2, 0,-2> {
enum { idx = 78 }; };
975 template<>
struct SixthDensePt<-1, 0,-2> {
enum { idx = 79 }; };
976 template<>
struct SixthDensePt< 0, 0,-2> {
enum { idx = 80 }; };
977 template<>
struct SixthDensePt< 1, 0,-2> {
enum { idx = 81 }; };
978 template<>
struct SixthDensePt< 2, 0,-2> {
enum { idx = 82 }; };
979 template<>
struct SixthDensePt< 3, 0,-2> {
enum { idx = 83 }; };
982 template<>
struct SixthDensePt<-3, 0,-3> {
enum { idx = 84 }; };
983 template<>
struct SixthDensePt<-2, 0,-3> {
enum { idx = 85 }; };
984 template<>
struct SixthDensePt<-1, 0,-3> {
enum { idx = 86 }; };
985 template<>
struct SixthDensePt< 0, 0,-3> {
enum { idx = 87 }; };
986 template<>
struct SixthDensePt< 1, 0,-3> {
enum { idx = 88 }; };
987 template<>
struct SixthDensePt< 2, 0,-3> {
enum { idx = 89 }; };
988 template<>
struct SixthDensePt< 3, 0,-3> {
enum { idx = 90 }; };
991 template<>
struct SixthDensePt< 0,-3, 3> {
enum { idx = 91 }; };
992 template<>
struct SixthDensePt< 0,-2, 3> {
enum { idx = 92 }; };
993 template<>
struct SixthDensePt< 0,-1, 3> {
enum { idx = 93 }; };
994 template<>
struct SixthDensePt< 0, 1, 3> {
enum { idx = 94 }; };
995 template<>
struct SixthDensePt< 0, 2, 3> {
enum { idx = 95 }; };
996 template<>
struct SixthDensePt< 0, 3, 3> {
enum { idx = 96 }; };
998 template<>
struct SixthDensePt< 0,-3, 2> {
enum { idx = 97 }; };
999 template<>
struct SixthDensePt< 0,-2, 2> {
enum { idx = 98 }; };
1000 template<>
struct SixthDensePt< 0,-1, 2> {
enum { idx = 99 }; };
1001 template<>
struct SixthDensePt< 0, 1, 2> {
enum { idx = 100 }; };
1002 template<>
struct SixthDensePt< 0, 2, 2> {
enum { idx = 101 }; };
1003 template<>
struct SixthDensePt< 0, 3, 2> {
enum { idx = 102 }; };
1005 template<>
struct SixthDensePt< 0,-3, 1> {
enum { idx = 103 }; };
1006 template<>
struct SixthDensePt< 0,-2, 1> {
enum { idx = 104 }; };
1007 template<>
struct SixthDensePt< 0,-1, 1> {
enum { idx = 105 }; };
1008 template<>
struct SixthDensePt< 0, 1, 1> {
enum { idx = 106 }; };
1009 template<>
struct SixthDensePt< 0, 2, 1> {
enum { idx = 107 }; };
1010 template<>
struct SixthDensePt< 0, 3, 1> {
enum { idx = 108 }; };
1012 template<>
struct SixthDensePt< 0,-3,-1> {
enum { idx = 109 }; };
1013 template<>
struct SixthDensePt< 0,-2,-1> {
enum { idx = 110 }; };
1014 template<>
struct SixthDensePt< 0,-1,-1> {
enum { idx = 111 }; };
1015 template<>
struct SixthDensePt< 0, 1,-1> {
enum { idx = 112 }; };
1016 template<>
struct SixthDensePt< 0, 2,-1> {
enum { idx = 113 }; };
1017 template<>
struct SixthDensePt< 0, 3,-1> {
enum { idx = 114 }; };
1019 template<>
struct SixthDensePt< 0,-3,-2> {
enum { idx = 115 }; };
1020 template<>
struct SixthDensePt< 0,-2,-2> {
enum { idx = 116 }; };
1021 template<>
struct SixthDensePt< 0,-1,-2> {
enum { idx = 117 }; };
1022 template<>
struct SixthDensePt< 0, 1,-2> {
enum { idx = 118 }; };
1023 template<>
struct SixthDensePt< 0, 2,-2> {
enum { idx = 119 }; };
1024 template<>
struct SixthDensePt< 0, 3,-2> {
enum { idx = 120 }; };
1026 template<>
struct SixthDensePt< 0,-3,-3> {
enum { idx = 121 }; };
1027 template<>
struct SixthDensePt< 0,-2,-3> {
enum { idx = 122 }; };
1028 template<>
struct SixthDensePt< 0,-1,-3> {
enum { idx = 123 }; };
1029 template<>
struct SixthDensePt< 0, 1,-3> {
enum { idx = 124 }; };
1030 template<>
struct SixthDensePt< 0, 2,-3> {
enum { idx = 125 }; };
1031 template<>
struct SixthDensePt< 0, 3,-3> {
enum { idx = 126 }; };
1036 template<
typename Gr
idT,
bool IsSafe = true>
1038 :
public BaseStencil<SixthOrderDenseStencil<GridT, IsSafe>, GridT, IsSafe>
1047 static const int SIZE = 127;
1052 template<
int i,
int j,
int k>
1053 unsigned int pos()
const {
return SixthDensePt<i,j,k>::idx; }
1056 inline void init(
const Coord& ijk)
1058 mValues[SixthDensePt<-3, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 3, 0));
1059 mValues[SixthDensePt<-2, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 3, 0));
1060 mValues[SixthDensePt<-1, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 3, 0));
1061 mValues[SixthDensePt< 0, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
1062 mValues[SixthDensePt< 1, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 3, 0));
1063 mValues[SixthDensePt< 2, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 3, 0));
1064 mValues[SixthDensePt< 3, 3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 3, 0));
1066 mValues[SixthDensePt<-3, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 2, 0));
1067 mValues[SixthDensePt<-2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 2, 0));
1068 mValues[SixthDensePt<-1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 2, 0));
1069 mValues[SixthDensePt< 0, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
1070 mValues[SixthDensePt< 1, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 2, 0));
1071 mValues[SixthDensePt< 2, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 2, 0));
1072 mValues[SixthDensePt< 3, 2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 2, 0));
1074 mValues[SixthDensePt<-3, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 1, 0));
1075 mValues[SixthDensePt<-2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 1, 0));
1076 mValues[SixthDensePt<-1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
1077 mValues[SixthDensePt< 0, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1078 mValues[SixthDensePt< 1, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
1079 mValues[SixthDensePt< 2, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 1, 0));
1080 mValues[SixthDensePt< 3, 1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 1, 0));
1082 mValues[SixthDensePt<-3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
1083 mValues[SixthDensePt<-2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
1084 mValues[SixthDensePt<-1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1085 mValues[SixthDensePt< 1, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1086 mValues[SixthDensePt< 2, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
1087 mValues[SixthDensePt< 3, 0, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
1089 mValues[SixthDensePt<-3,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-1, 0));
1090 mValues[SixthDensePt<-2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-1, 0));
1091 mValues[SixthDensePt<-1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-1, 0));
1092 mValues[SixthDensePt< 0,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 0));
1093 mValues[SixthDensePt< 1,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-1, 0));
1094 mValues[SixthDensePt< 2,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-1, 0));
1095 mValues[SixthDensePt< 3,-1, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-1, 0));
1097 mValues[SixthDensePt<-3,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-2, 0));
1098 mValues[SixthDensePt<-2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-2, 0));
1099 mValues[SixthDensePt<-1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-2, 0));
1100 mValues[SixthDensePt< 0,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 0));
1101 mValues[SixthDensePt< 1,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-2, 0));
1102 mValues[SixthDensePt< 2,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-2, 0));
1103 mValues[SixthDensePt< 3,-2, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-2, 0));
1105 mValues[SixthDensePt<-3,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-3,-3, 0));
1106 mValues[SixthDensePt<-2,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-2,-3, 0));
1107 mValues[SixthDensePt<-1,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy(-1,-3, 0));
1108 mValues[SixthDensePt< 0,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 0));
1109 mValues[SixthDensePt< 1,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 1,-3, 0));
1110 mValues[SixthDensePt< 2,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 2,-3, 0));
1111 mValues[SixthDensePt< 3,-3, 0>::idx] = mAcc.getValue(ijk.
offsetBy( 3,-3, 0));
1113 mValues[SixthDensePt<-3, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 3));
1114 mValues[SixthDensePt<-2, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 3));
1115 mValues[SixthDensePt<-1, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 3));
1116 mValues[SixthDensePt< 0, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
1117 mValues[SixthDensePt< 1, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 3));
1118 mValues[SixthDensePt< 2, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 3));
1119 mValues[SixthDensePt< 3, 0, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 3));
1121 mValues[SixthDensePt<-3, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 2));
1122 mValues[SixthDensePt<-2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 2));
1123 mValues[SixthDensePt<-1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 2));
1124 mValues[SixthDensePt< 0, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
1125 mValues[SixthDensePt< 1, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 2));
1126 mValues[SixthDensePt< 2, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 2));
1127 mValues[SixthDensePt< 3, 0, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 2));
1129 mValues[SixthDensePt<-3, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0, 1));
1130 mValues[SixthDensePt<-2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0, 1));
1131 mValues[SixthDensePt<-1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
1132 mValues[SixthDensePt< 0, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1133 mValues[SixthDensePt< 1, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
1134 mValues[SixthDensePt< 2, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0, 1));
1135 mValues[SixthDensePt< 3, 0, 1>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0, 1));
1137 mValues[SixthDensePt<-3, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-1));
1138 mValues[SixthDensePt<-2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-1));
1139 mValues[SixthDensePt<-1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-1));
1140 mValues[SixthDensePt< 0, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-1));
1141 mValues[SixthDensePt< 1, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-1));
1142 mValues[SixthDensePt< 2, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-1));
1143 mValues[SixthDensePt< 3, 0,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-1));
1145 mValues[SixthDensePt<-3, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-2));
1146 mValues[SixthDensePt<-2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-2));
1147 mValues[SixthDensePt<-1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-2));
1148 mValues[SixthDensePt< 0, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-2));
1149 mValues[SixthDensePt< 1, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-2));
1150 mValues[SixthDensePt< 2, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-2));
1151 mValues[SixthDensePt< 3, 0,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-2));
1153 mValues[SixthDensePt<-3, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-3, 0,-3));
1154 mValues[SixthDensePt<-2, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-2, 0,-3));
1155 mValues[SixthDensePt<-1, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy(-1, 0,-3));
1156 mValues[SixthDensePt< 0, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 0,-3));
1157 mValues[SixthDensePt< 1, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 1, 0,-3));
1158 mValues[SixthDensePt< 2, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 2, 0,-3));
1159 mValues[SixthDensePt< 3, 0,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 3, 0,-3));
1161 mValues[SixthDensePt< 0,-3, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 3));
1162 mValues[SixthDensePt< 0,-2, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 3));
1163 mValues[SixthDensePt< 0,-1, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 3));
1164 mValues[SixthDensePt< 0, 1, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 3));
1165 mValues[SixthDensePt< 0, 2, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 3));
1166 mValues[SixthDensePt< 0, 3, 3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 3));
1168 mValues[SixthDensePt< 0,-3, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3, 2));
1169 mValues[SixthDensePt< 0,-2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2, 2));
1170 mValues[SixthDensePt< 0,-1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1, 2));
1171 mValues[SixthDensePt< 0, 1, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1, 2));
1172 mValues[SixthDensePt< 0, 2, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2, 2));
1173 mValues[SixthDensePt< 0, 3, 2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3, 2));
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,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-1));
1183 mValues[SixthDensePt< 0,-2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-1));
1184 mValues[SixthDensePt< 0,-1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-1));
1185 mValues[SixthDensePt< 0, 1,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-1));
1186 mValues[SixthDensePt< 0, 2,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-1));
1187 mValues[SixthDensePt< 0, 3,-1>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-1));
1189 mValues[SixthDensePt< 0,-3,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-2));
1190 mValues[SixthDensePt< 0,-2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-2));
1191 mValues[SixthDensePt< 0,-1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-2));
1192 mValues[SixthDensePt< 0, 1,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-2));
1193 mValues[SixthDensePt< 0, 2,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-2));
1194 mValues[SixthDensePt< 0, 3,-2>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-2));
1196 mValues[SixthDensePt< 0,-3,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-3,-3));
1197 mValues[SixthDensePt< 0,-2,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-2,-3));
1198 mValues[SixthDensePt< 0,-1,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0,-1,-3));
1199 mValues[SixthDensePt< 0, 1,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 1,-3));
1200 mValues[SixthDensePt< 0, 2,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 2,-3));
1201 mValues[SixthDensePt< 0, 3,-3>::idx] = mAcc.getValue(ijk.
offsetBy( 0, 3,-3));
1205 using BaseType::mAcc;
1206 using BaseType::mValues;
1215 template<
int i,
int j,
int k>
struct GradPt {};
1216 template<>
struct GradPt< 0, 0, 0> {
enum { idx = 0 }; };
1217 template<>
struct GradPt< 1, 0, 0> {
enum { idx = 2 }; };
1218 template<>
struct GradPt< 0, 1, 0> {
enum { idx = 4 }; };
1219 template<>
struct GradPt< 0, 0, 1> {
enum { idx = 6 }; };
1220 template<>
struct GradPt<-1, 0, 0> {
enum { idx = 1 }; };
1221 template<>
struct GradPt< 0,-1, 0> {
enum { idx = 3 }; };
1222 template<>
struct GradPt< 0, 0,-1> {
enum { idx = 5 }; };
1231 template<
typename Gr
idT,
bool IsSafe = true>
1241 static const int SIZE = 7;
1244 : BaseType(grid, SIZE)
1245 , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0]))
1246 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1251 : BaseType(grid, SIZE)
1252 , mInv2Dx(ValueType(0.5 / dx))
1253 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1265 mValues[0] - mValues[1],
1266 mValues[2] - mValues[0],
1267 mValues[0] - mValues[3],
1268 mValues[4] - mValues[0],
1269 mValues[0] - mValues[5],
1270 mValues[6] - mValues[0]);
1281 mValues[4] - mValues[3],
1282 mValues[6] - mValues[5])*mInv2Dx;
1291 V[0]>0 ? mValues[0] - mValues[1] : mValues[2] - mValues[0],
1292 V[1]>0 ? mValues[0] - mValues[3] : mValues[4] - mValues[0],
1293 V[2]>0 ? mValues[0] - mValues[5] : mValues[6] - mValues[0])*2*mInv2Dx;
1300 return mInvDx2 * (mValues[1] + mValues[2] +
1301 mValues[3] + mValues[4] +
1302 mValues[5] + mValues[6] - 6*mValues[0]);
1310 return (v[0]>0 ? (v[1]<0 || v[2]<0 || v[3]<0 || v[4]<0 || v[5]<0 || v[6]<0)
1311 : (v[1]>0 || v[2]>0 || v[3]>0 || v[4]>0 || v[5]>0 || v[6]>0));
1323 const Coord& ijk = BaseType::getCenterCoord();
1324 const ValueType d = ValueType(mValues[0] * 0.5 * mInvDx2);
1327 ijk[1] - d*(mValues[4] - mValues[3]),
1328 ijk[2] - d*(mValues[6] - mValues[5]));
1334 template<
int i,
int j,
int k>
1335 unsigned int pos()
const {
return GradPt<i,j,k>::idx; }
1339 inline void init(
const Coord& ijk)
1341 BaseType::template setValue<-1, 0, 0>(mAcc.getValue(ijk.
offsetBy(-1, 0, 0)));
1342 BaseType::template setValue< 1, 0, 0>(mAcc.getValue(ijk.
offsetBy( 1, 0, 0)));
1344 BaseType::template setValue< 0,-1, 0>(mAcc.getValue(ijk.
offsetBy( 0,-1, 0)));
1345 BaseType::template setValue< 0, 1, 0>(mAcc.getValue(ijk.
offsetBy( 0, 1, 0)));
1347 BaseType::template setValue< 0, 0,-1>(mAcc.getValue(ijk.
offsetBy( 0, 0,-1)));
1348 BaseType::template setValue< 0, 0, 1>(mAcc.getValue(ijk.
offsetBy( 0, 0, 1)));
1352 using BaseType::mAcc;
1353 using BaseType::mValues;
1354 const ValueType mInv2Dx, mInvDx2;
1365 template<
typename Gr
idT,
bool IsSafe = true>
1375 static const int SIZE = 19;
1378 : BaseType(grid, SIZE)
1379 , _mDx2(ValueType(math::
Pow2(grid.voxelSize()[0])))
1380 , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0]))
1381 , mInvDx2(ValueType(1.0 / _mDx2))
1382 , mDx2(static_cast<float>(_mDx2))
1387 : BaseType(grid, SIZE)
1388 , _mDx2(ValueType(dx * dx))
1389 , mInv2Dx(ValueType(0.5 / dx))
1390 , mInvDx2(ValueType(1.0 / _mDx2))
1391 , mDx2(static_cast<float>(_mDx2))
1400 inline ValueType
normSqGrad(
const ValueType &isoValue = zeroVal<ValueType>())
const 1406 v1(v[2]-v[1], v[ 8]-v[ 7], v[14]-v[13], 0),
1407 v2(v[3]-v[2], v[ 9]-v[ 8], v[15]-v[14], 0),
1408 v3(v[0]-v[3], v[ 0]-v[ 9], v[ 0]-v[15], 0),
1409 v4(v[4]-v[0], v[10]-v[ 0], v[16]-v[ 0], 0),
1410 v5(v[5]-v[4], v[11]-v[10], v[17]-v[16], 0),
1411 v6(v[6]-v[5], v[12]-v[11], v[18]-v[17], 0),
1418 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),
1419 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),
1420 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),
1421 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),
1422 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),
1423 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);
1424 return static_cast<ValueType
>(
1438 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)
1439 :
math::WENO5(v[ 6]-v[ 5],v[ 5]-v[ 4],v[ 4]-v[ 0], v[ 0]-v[ 3],v[ 3]-v[ 2],mDx2),
1440 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)
1441 :
math::WENO5(v[12]-v[11],v[11]-v[10],v[10]-v[ 0], v[ 0]-v[ 9],v[ 9]-v[ 8],mDx2),
1442 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)
1443 :
math::WENO5(v[18]-v[17],v[17]-v[16],v[16]-v[ 0], v[ 0]-v[15],v[15]-v[14],mDx2));
1453 mValues[10] - mValues[ 9],
1454 mValues[16] - mValues[15]);
1465 mValues[ 3] + mValues[ 4] +
1466 mValues[ 9] + mValues[10] +
1467 mValues[15] + mValues[16] - 6*mValues[0]);
1475 return (v[ 0]>0 ? (v[ 3]<0 || v[ 4]<0 || v[ 9]<0 || v[10]<0 || v[15]<0 || v[16]<0)
1476 : (v[ 3]>0 || v[ 4]>0 || v[ 9]>0 || v[10]>0 || v[15]>0 || v[16]>0));
1480 inline void init(
const Coord& ijk)
1482 mValues[ 1] = mAcc.getValue(ijk.
offsetBy(-3, 0, 0));
1483 mValues[ 2] = mAcc.getValue(ijk.
offsetBy(-2, 0, 0));
1484 mValues[ 3] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1485 mValues[ 4] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1486 mValues[ 5] = mAcc.getValue(ijk.
offsetBy( 2, 0, 0));
1487 mValues[ 6] = mAcc.getValue(ijk.
offsetBy( 3, 0, 0));
1489 mValues[ 7] = mAcc.getValue(ijk.
offsetBy( 0, -3, 0));
1490 mValues[ 8] = mAcc.getValue(ijk.
offsetBy( 0, -2, 0));
1491 mValues[ 9] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
1492 mValues[10] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1493 mValues[11] = mAcc.getValue(ijk.
offsetBy( 0, 2, 0));
1494 mValues[12] = mAcc.getValue(ijk.
offsetBy( 0, 3, 0));
1496 mValues[13] = mAcc.getValue(ijk.
offsetBy( 0, 0, -3));
1497 mValues[14] = mAcc.getValue(ijk.
offsetBy( 0, 0, -2));
1498 mValues[15] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
1499 mValues[16] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1500 mValues[17] = mAcc.getValue(ijk.
offsetBy( 0, 0, 2));
1501 mValues[18] = mAcc.getValue(ijk.
offsetBy( 0, 0, 3));
1505 using BaseType::mAcc;
1506 using BaseType::mValues;
1507 const ValueType _mDx2, mInv2Dx, mInvDx2;
1515 template<
typename Gr
idT,
bool IsSafe = true>
1525 static const int SIZE = 19;
1528 : BaseType(grid, SIZE)
1529 , mInv2Dx(ValueType(0.5 / grid.voxelSize()[0]))
1530 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1535 : BaseType(grid, SIZE)
1536 , mInv2Dx(ValueType(0.5 / dx))
1537 , mInvDx2(ValueType(4.0 * mInv2Dx * mInv2Dx))
1547 Real alpha, normGrad;
1549 ValueType(alpha*mInv2Dx/
math::Pow3(normGrad)) : 0;
1558 Real alpha, normGrad;
1559 return this->gaussianCurvature(alpha, normGrad) ?
1560 ValueType(alpha*mInvDx2/
math::Pow4(normGrad)) : 0;
1570 Real alphaM, alphaG, normGrad;
1571 if (this->curvatures(alphaM, alphaG, normGrad)) {
1572 mean = ValueType(alphaM*mInv2Dx/
math::Pow3(normGrad));
1573 gauss = ValueType(alphaG*mInvDx2/
math::Pow4(normGrad));
1587 Real alpha, normGrad;
1589 ValueType(alpha*mInvDx2/(2*
math::Pow2(normGrad))) : 0;
1599 Real alpha, normGrad;
1600 return this->gaussianCurvature(alpha, normGrad) ?
1601 ValueType(2*alpha*mInv2Dx*mInvDx2/
math::Pow3(normGrad)) : 0;
1611 Real alphaM, alphaG, normGrad;
1612 if (this->curvatures(alphaM, alphaG, normGrad)) {
1613 mean = ValueType(alphaM*mInvDx2/(2*
math::Pow2(normGrad)));
1614 gauss = ValueType(2*alphaG*mInv2Dx*mInvDx2/
math::Pow3(normGrad));
1627 std::pair<ValueType, ValueType> pair(0, 0);
1628 Real alphaM, alphaG, normGrad;
1629 if (this->curvatures(alphaM, alphaG, normGrad)) {
1631 const Real tmp = std::sqrt(mean*mean - alphaG*mInvDx2/
math::Pow4(normGrad));
1632 pair.first = ValueType(mean - tmp);
1633 pair.second = ValueType(mean + tmp);
1646 mValues[1] + mValues[2] +
1647 mValues[3] + mValues[4] +
1648 mValues[5] + mValues[6] - 6*mValues[0]);
1659 mValues[2] - mValues[1],
1660 mValues[4] - mValues[3],
1661 mValues[6] - mValues[5])*mInv2Dx;
1665 inline void init(
const Coord &ijk)
1667 mValues[ 1] = mAcc.getValue(ijk.
offsetBy(-1, 0, 0));
1668 mValues[ 2] = mAcc.getValue(ijk.
offsetBy( 1, 0, 0));
1670 mValues[ 3] = mAcc.getValue(ijk.
offsetBy( 0, -1, 0));
1671 mValues[ 4] = mAcc.getValue(ijk.
offsetBy( 0, 1, 0));
1673 mValues[ 5] = mAcc.getValue(ijk.
offsetBy( 0, 0, -1));
1674 mValues[ 6] = mAcc.getValue(ijk.
offsetBy( 0, 0, 1));
1676 mValues[ 7] = mAcc.getValue(ijk.
offsetBy(-1, -1, 0));
1677 mValues[ 8] = mAcc.getValue(ijk.
offsetBy( 1, -1, 0));
1678 mValues[ 9] = mAcc.getValue(ijk.
offsetBy(-1, 1, 0));
1679 mValues[10] = mAcc.getValue(ijk.
offsetBy( 1, 1, 0));
1681 mValues[11] = mAcc.getValue(ijk.
offsetBy(-1, 0, -1));
1682 mValues[12] = mAcc.getValue(ijk.
offsetBy( 1, 0, -1));
1683 mValues[13] = mAcc.getValue(ijk.
offsetBy(-1, 0, 1));
1684 mValues[14] = mAcc.getValue(ijk.
offsetBy( 1, 0, 1));
1686 mValues[15] = mAcc.getValue(ijk.
offsetBy( 0, -1, -1));
1687 mValues[16] = mAcc.getValue(ijk.
offsetBy( 0, 1, -1));
1688 mValues[17] = mAcc.getValue(ijk.
offsetBy( 0, -1, 1));
1689 mValues[18] = mAcc.getValue(ijk.
offsetBy( 0, 1, 1));
1692 inline Real Dx()
const {
return 0.5*(mValues[2] - mValues[1]); }
1693 inline Real Dy()
const {
return 0.5*(mValues[4] - mValues[3]); }
1694 inline Real Dz()
const {
return 0.5*(mValues[6] - mValues[5]); }
1695 inline Real Dxx()
const {
return mValues[2] - 2 * mValues[0] + mValues[1]; }
1696 inline Real Dyy()
const {
return mValues[4] - 2 * mValues[0] + mValues[3]; }
1697 inline Real Dzz()
const {
return mValues[6] - 2 * mValues[0] + mValues[5]; }
1698 inline Real Dxy()
const {
return 0.25 * (mValues[10] - mValues[ 8] + mValues[ 7] - mValues[ 9]); }
1699 inline Real Dxz()
const {
return 0.25 * (mValues[14] - mValues[12] + mValues[11] - mValues[13]); }
1700 inline Real Dyz()
const {
return 0.25 * (mValues[18] - mValues[16] + mValues[15] - mValues[17]); }
1705 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1706 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1708 alpha = normGrad = 0;
1711 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz();
1712 alpha = Dx2*(Dyy + Dzz) + Dy2*(Dxx + Dzz) + Dz2*(Dxx + Dyy) -
1713 2*(Dx*(Dy*this->Dxy() + Dz*this->Dxz()) + Dy*Dz*this->Dyz());
1714 normGrad = std::sqrt(normGrad2);
1718 inline bool gaussianCurvature(
Real& alpha,
Real& normGrad)
const 1721 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1722 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1724 alpha = normGrad = 0;
1727 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz(),
1728 Dxy = this->Dxy(), Dxz = this->Dxz(), Dyz = this->Dyz();
1729 alpha = Dx2*(Dyy*Dzz - Dyz*Dyz) + Dy2*(Dxx*Dzz - Dxz*Dxz) + Dz2*(Dxx*Dyy - Dxy*Dxy) +
1730 2*( Dy*Dz*(Dxy*Dxz - Dyz*Dxx) + Dx*Dz*(Dxy*Dyz - Dxz*Dyy) + Dx*Dy*(Dxz*Dyz - Dxy*Dzz) );
1731 normGrad = std::sqrt(normGrad2);
1734 inline bool curvatures(
Real& alphaM,
Real& alphaG,
Real& normGrad)
const 1737 const Real Dx = this->Dx(), Dy = this->Dy(), Dz = this->Dz(),
1738 Dx2 = Dx*Dx, Dy2 = Dy*Dy, Dz2 = Dz*Dz, normGrad2 = Dx2 + Dy2 + Dz2;
1740 alphaM = alphaG =normGrad = 0;
1743 const Real Dxx = this->Dxx(), Dyy = this->Dyy(), Dzz = this->Dzz(),
1744 Dxy = this->Dxy(), Dxz = this->Dxz(), Dyz = this->Dyz();
1745 alphaM = Dx2*(Dyy + Dzz) + Dy2*(Dxx + Dzz) + Dz2*(Dxx + Dyy) -
1746 2*(Dx*(Dy*Dxy + Dz*Dxz) + Dy*Dz*Dyz);
1747 alphaG = Dx2*(Dyy*Dzz - Dyz*Dyz) + Dy2*(Dxx*Dzz - Dxz*Dxz) + Dz2*(Dxx*Dyy - Dxy*Dxy) +
1748 2*( Dy*Dz*(Dxy*Dxz - Dyz*Dxx) + Dx*Dz*(Dxy*Dyz - Dxz*Dyy) + Dx*Dy*(Dxz*Dyz - Dxy*Dzz) );
1749 normGrad = std::sqrt(normGrad2);
1754 using BaseType::mAcc;
1755 using BaseType::mValues;
1756 const ValueType mInv2Dx, mInvDx2;
1764 template<
typename Gr
idT,
bool IsSafe = true>
1775 : BaseType(grid, math::
Pow3(2 * halfWidth + 1))
1776 , mHalfWidth(halfWidth)
1778 assert(halfWidth>0);
1781 inline const ValueType&
getCenterValue()
const {
return mValues[(mValues.size()-1)>>1]; }
1787 BaseType::mCenter = ijk;
1792 template<
typename IterType>
1795 BaseType::mCenter = iter.getCoord();
1796 this->init(BaseType::mCenter);
1802 inline void init(
const Coord& ijk)
1806 for (p[1] = ijk[1]-mHalfWidth; p[1] <= q[1]; ++p[1]) {
1807 for (p[2] = ijk[2]-mHalfWidth; p[2] <= q[2]; ++p[2]) {
1808 mValues[n++] = mAcc.getValue(p);
1815 using BaseType::mAcc;
1816 using BaseType::mValues;
1817 const int mHalfWidth;
1825 #endif // OPENVDB_MATH_STENCILS_HAS_BEEN_INCLUDED GradStencil(const GridType &grid)
Definition: Stencils.h:1243
Definition: Stencils.h:301
bool intersects(const ValueType &isoValue=zeroVal< ValueType >()) const
Return true if the center of the stencil intersects the.
Definition: Stencils.h:320
bool zeroCrossing() const
Definition: Stencils.h:1307
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:1366
GridT GridType
Definition: Stencils.h:38
GridT GridType
Definition: Stencils.h:1237
GridT::TreeType TreeType
Definition: Stencils.h:558
ValueType min() const
Return the smallest value in the stencil buffer.
Definition: Stencils.h:147
ValueType meanCurvatureNormGrad() const
Definition: Stencils.h:1585
Definition: Stencils.h:551
Definition: Stencils.h:35
GridT::ValueType ValueType
Definition: Stencils.h:1523
BufferType::iterator IterType
Definition: Stencils.h:43
Definition: Stencils.h:1232
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
GridT::TreeType TreeType
Definition: Stencils.h:1771
const AccessorType & accessor() const
Return a const reference to the ValueAccessor associated with this Stencil.
Definition: Stencils.h:208
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:837
ValueType meanCurvature() const
Return the mean curvature at the previously buffered location.
Definition: Stencils.h:1545
AccessorType mAcc
Definition: Stencils.h:221
void setValue(const ValueType &value)
Set the value at the specified location relative to the center of the stencil.
Definition: Stencils.h:113
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:24
NineteenPointStencil(const GridType &grid)
Definition: Stencils.h:833
GridT GridType
Definition: Stencils.h:477
ValueType gaussianCurvature() const
Return the Gaussian curvature at the previously buffered location.
Definition: Stencils.h:1556
GridType::ValueType ValueType
Definition: Stencils.h:1772
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:91
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:698
GridType::ValueType ValueType
Definition: Stencils.h:829
ThirteenPointStencil(const GridType &grid)
Definition: Stencils.h:563
const GridType & grid() const
Return a const reference to the grid from which this stencil was constructed.
Definition: Stencils.h:204
math::Vec3< ValueType > cpt()
Compute the closest-point transform to a level set.
Definition: Stencils.h:1321
GridT::ValueType ValueType
Definition: Stencils.h:40
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:316
GridT GridType
Definition: Stencils.h:1770
RealT GodunovsNormSqrd(bool isOutside, const Vec3< RealT > &gradient_m, const Vec3< RealT > &gradient_p)
Definition: Stencils.h:82
Type Pow4(Type x)
Return x4.
Definition: Math.h:556
GridT GridType
Definition: Stencils.h:1521
GridType::ValueType ValueType
Definition: Stencils.h:1239
GridT GridType
Definition: Stencils.h:252
GridType::ValueType ValueType
Definition: Stencils.h:690
Definition: Stencils.h:247
void moveTo(const Coord &ijk)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:1785
GridT GridType
Definition: Stencils.h:557
math::Vec3< ValueType > gradient() const
Definition: Stencils.h:1656
BaseStencil(const GridType &grid, int size)
Definition: Stencils.h:212
GridType::ValueType ValueType
Definition: Stencils.h:479
SecondOrderDenseStencil(const GridType &grid)
Definition: Stencils.h:483
GridT::TreeType TreeType
Definition: Stencils.h:689
Definition: Stencils.h:821
const GridType * mGrid
Definition: Stencils.h:220
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:1534
GridT::TreeType TreeType
Definition: Stencils.h:307
SixthOrderDenseStencil(const GridType &grid)
Definition: Stencils.h:1049
ValueType laplacian() const
Definition: Stencils.h:1298
math::Vec3< ValueType > gradient(const math::Vec3< ValueType > &V) const
Definition: Stencils.h:1434
ValueType mean() const
Return the mean value of the current stencil.
Definition: Stencils.h:139
math::Vec3< ValueType > gradient() const
Return the gradient computed at the previously buffered location by second order central differencing...
Definition: Stencils.h:1278
Type Pow2(Type x)
Return x2.
Definition: Math.h:548
GridT::TreeType TreeType
Definition: Stencils.h:1522
GridType::ValueType ValueType
Definition: Stencils.h:1045
void curvatures(ValueType &mean, ValueType &gauss) const
Return both the mean and the Gaussian curvature at the previously buffered location.
Definition: Stencils.h:1568
ValueType max() const
Return the largest value in the stencil buffer.
Definition: Stencils.h:154
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:1053
GridType::ValueType ValueType
Definition: Stencils.h:1373
const Coord & getCenterCoord() const
Return the coordinates of the center point of the stencil.
Definition: Stencils.h:161
math::Vec3< ValueType > gradient(const math::Vec3< ValueType > &xyz) const
Return the gradient in world space of the trilinear interpolation kernel.
Definition: Stencils.h:373
GridT GridType
Definition: Stencils.h:827
GridT::ValueType ValueType
Definition: Stencils.h:254
void moveTo(const IterType &iter)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:1793
void moveTo(const Coord &ijk)
Initialize the stencil buffer with the values of voxel (i, j, k) and its neighbors.
Definition: Stencils.h:48
GridT GridType
Definition: Stencils.h:1371
ValueType gaussianCurvatureNormGrad() const
Definition: Stencils.h:1597
Definition: Exceptions.h:13
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:1400
SevenPointStencil(const GridT &grid)
Definition: Stencils.h:258
GridT GridType
Definition: Stencils.h:306
ValueType interpolation(const math::Vec3< ValueType > &xyz) const
Return the trilinear interpolation at the normalized position.
Definition: Stencils.h:339
ValueT value
Definition: GridBuilder.h:1290
WenoStencil(const GridType &grid)
Definition: Stencils.h:1377
GridT GridType
Definition: Stencils.h:1043
Definition: Stencils.h:682
FourthOrderDenseStencil(const GridType &grid)
Definition: Stencils.h:694
ValueType normSqGrad() const
Return the norm square of the single-sided upwind gradient (computed via Godunov's scheme) at the pre...
Definition: Stencils.h:1262
Tolerance for floating-point comparison.
Definition: Math.h:148
GridT::TreeType TreeType
Definition: Stencils.h:828
std::pair< ValueType, ValueType > principalCurvatures() const
Return the pair (minimum, maximum) principal curvature at the previously buffered location...
Definition: Stencils.h:1625
math::Vec3< ValueType > gradient() const
Definition: Stencils.h:1450
void curvaturesNormGrad(ValueType &mean, ValueType &gauss) const
Return both the mean and the Gaussian curvature at the previously buffered location.
Definition: Stencils.h:1609
ValueType laplacian() const
Definition: Stencils.h:1643
CurvatureStencil(const GridType &grid)
Definition: Stencils.h:1527
GridT::TreeType TreeType
Definition: Stencils.h:1372
const ValueType & getValue() const
Return the value at the specified location relative to the center of the stencil. ...
Definition: Stencils.h:106
BoxStencil(const GridType &grid)
Definition: Stencils.h:312
GridT::TreeType TreeType
Definition: Stencils.h:39
bool zeroCrossing() const
Definition: Stencils.h:1472
GridT::ValueType ValueType
Definition: Stencils.h:308
ValueType median() const
Return the median value of the current stencil.
Definition: Stencils.h:122
int size()
Return the size of the stencil buffer.
Definition: Stencils.h:119
GridT::TreeType TreeType
Definition: Stencils.h:1044
void moveTo(const Vec3< RealType > &xyz)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:87
Dense stencil of a given width.
Definition: Stencils.h:1765
math::Vec3< ValueType > gradient(const math::Vec3< ValueType > &V) const
Return the first-order upwind gradient corresponding to the direction V.
Definition: Stencils.h:1288
Coord mCenter
Definition: Stencils.h:223
BufferType mValues
Definition: Stencils.h:222
GridType::ValueType ValueType
Definition: Stencils.h:559
const ValueType & getCenterValue() const
Return the value at the center of the stencil.
Definition: Stencils.h:164
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:262
GridT::TreeType TreeType
Definition: Stencils.h:1238
const ValueType & getValue(unsigned int pos=0) const
Return the value from the stencil buffer with linear offset pos.
Definition: Stencils.h:98
tree::ValueAccessor< const TreeType, IsSafe > AccessorType
Definition: Stencils.h:41
std::vector< ValueType > BufferType
Definition: Stencils.h:42
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:168
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
GridT GridType
Definition: Stencils.h:688
GridT::TreeType TreeType
Definition: Stencils.h:253
double Real
Definition: Types.h:60
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:567
GridT::TreeType TreeType
Definition: Stencils.h:478
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:60
Definition: Stencils.h:1516
DenseStencil(const GridType &grid, int halfWidth)
Definition: Stencils.h:1774
void moveTo(const IterType &iter)
Initialize the stencil buffer with the values of voxel (x, y, z) and its neighbors.
Definition: Stencils.h:73
Type Pow3(Type x)
Return x3.
Definition: Math.h:552
const ValueType & getCenterValue() const
Definition: Stencils.h:1781
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:487
Definition: Stencils.h:1037
WenoStencil(const GridType &grid, Real dx)
Definition: Stencils.h:1386
Definition: Stencils.h:471
ValueType laplacian() const
Definition: Stencils.h:1462
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:212
unsigned int pos() const
Return linear offset for the specified stencil point relative to its center.
Definition: Stencils.h:1335
GradStencil(const GridType &grid, Real dx)
Definition: Stencils.h:1250
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:189