46 std::pair<T, T>
operator()(
const hrleVectorType<hrleIndexType, D> &indices,
49 auto &grid = levelSet->getGrid();
50 double gridDelta = grid.getGridDelta();
52 hrleVectorType<T, 3> coordinate(0., 0., 0.);
53 for (
unsigned i = 0; i <
D; ++i) {
54 coordinate[i] = indices[i] * gridDelta;
58 neighborIterator.goToIndicesSequential(indices);
61 Vec3D<T> coordArray = {coordinate[0], coordinate[1], coordinate[2]};
69 Vec3D<T> normalVector = {};
72 for (
int i = 0; i <
D; i++) {
74 const T deltaPos = gridDelta;
75 const T deltaNeg = -gridDelta;
77 const T phi0 = neighborIterator.getCenter().getValue();
78 const T phiPos = neighborIterator.getNeighbor(i).getValue();
79 const T phiNeg = neighborIterator.getNeighbor(i +
D).getValue();
81 T diffPos = (phiPos - phi0) / deltaPos;
82 T diffNeg = (phiNeg - phi0) / deltaNeg;
85 const T deltaPosPos = 2 * gridDelta;
86 const T deltaNegNeg = -2 * gridDelta;
89 (((deltaNeg * phiPos - deltaPos * phiNeg) / (deltaPos - deltaNeg) +
91 (deltaPos * deltaNeg);
93 neighborIterator.getNeighbor((
D * order) + i).getValue();
95 neighborIterator.getNeighbor((
D * order) +
D + i).getValue();
97 const T diffNegNeg = (((deltaNeg * phiNegNeg - deltaNegNeg * phiNeg) /
98 (deltaNegNeg - deltaNeg) +
100 (deltaNegNeg * deltaNeg);
101 const T diffPosPos = (((deltaPos * phiPosPos - deltaPosPos * phiPos) /
102 (deltaPosPos - deltaPos) +
104 (deltaPosPos * deltaPos);
106 if (std::signbit(diff00) == std::signbit(diffPosPos)) {
107 if (std::abs(diffPosPos * deltaPos) < std::abs(diff00 * deltaNeg)) {
108 diffPos -= deltaPos * diffPosPos;
110 diffPos += deltaNeg * diff00;
114 if (std::signbit(diff00) == std::signbit(diffNegNeg)) {
115 if (std::abs(diffNegNeg * deltaNeg) < std::abs(diff00 * deltaPos)) {
116 diffNeg -= deltaNeg * diffNegNeg;
118 diffNeg += deltaPos * diff00;
123 gradPos[i] = diffNeg;
124 gradNeg[i] = diffPos;
126 normalVector[i] = (diffNeg + diffPos) * 0.5;
127 normalModulus += normalVector[i] * normalVector[i];
129 grad += pow2((diffNeg + diffPos) * 0.5);
133 normalModulus = std::sqrt(normalModulus);
134 for (
unsigned i = 0; i <
D; ++i) {
135 normalVector[i] /= normalModulus;
139 double scalarVelocity = velocities->getScalarVelocity(
140 coordArray, material, normalVector,
141 neighborIterator.getCenter().getPointId());
142 Vec3D<T> vectorVelocity = velocities->getVectorVelocity(
143 coordArray, material, normalVector,
144 neighborIterator.getCenter().getPointId());
148 if (scalarVelocity != 0.) {
149 totalGrad = scalarVelocity * std::sqrt(grad);
152 for (
int w = 0; w <
D; w++) {
153 if (vectorVelocity[w] > 0.) {
154 totalGrad += vectorVelocity[w] * gradPos[w];
156 totalGrad += vectorVelocity[w] * gradNeg[w];
162 for (
unsigned i = 0; i <
D; ++i) {
164 std::abs((scalarVelocity + vectorVelocity[i]) * normalVector[i]);
165 finalAlphas[i] = std::max(finalAlphas[i], alpha);
166 dissipation += alphaFactor * alpha * (gradNeg[i] - gradPos[i]) * 0.5;
169 return {totalGrad, ((totalGrad != 0.) ? dissipation : 0)};