41 std::pair<T, T>
operator()(
const hrleVectorType<hrleIndexType, D> &indices,
43 auto &grid = levelSet->getGrid();
44 double gridDelta = grid.getGridDelta();
46 hrleVectorType<T, 3> coordinate(0., 0., 0.);
47 for (
unsigned i = 0; i <
D; ++i) {
48 coordinate[i] = indices[i] * gridDelta;
52 neighborIterator.goToIndicesSequential(indices);
60 for (
int i = 0; i <
D; i++) {
61 const T deltaPos = gridDelta;
62 const T deltaNeg = -gridDelta;
64 const T phi0 = neighborIterator.getCenter().getValue();
65 const T phiPos = neighborIterator.getNeighbor(i).getValue();
66 const T phiNeg = neighborIterator.getNeighbor(i +
D).getValue();
68 T diffPos = (phiPos - phi0) / deltaPos;
69 T diffNeg = (phiNeg - phi0) / deltaNeg;
72 const T deltaPosPos = 2 * gridDelta;
73 const T deltaNegNeg = -2 * gridDelta;
76 neighborIterator.getNeighbor((
D * order) + i).getValue();
78 neighborIterator.getNeighbor((
D * order) +
D + i).getValue();
81 (((deltaNeg * phiPos - deltaPos * phiNeg) / (deltaPos - deltaNeg) +
83 (deltaPos * deltaNeg);
84 const T diffNegNeg = (((deltaNeg * phiNegNeg - deltaNegNeg * phiNeg) /
85 (deltaNegNeg - deltaNeg) +
87 (deltaNegNeg * deltaNeg);
88 const T diffPosPos = (((deltaPos * phiPosPos - deltaPosPos * phiPos) /
89 (deltaPosPos - deltaPos) +
91 (deltaPosPos * deltaPos);
93 if (std::signbit(diff00) == std::signbit(diffPosPos)) {
94 if (std::abs(diffPosPos * deltaPos) < std::abs(diff00 * deltaNeg)) {
95 diffPos -= deltaPos * diffPosPos;
97 diffPos += deltaNeg * diff00;
101 if (std::signbit(diff00) == std::signbit(diffNegNeg)) {
102 if (std::abs(diffNegNeg * deltaNeg) < std::abs(diff00 * deltaPos)) {
103 diffNeg -= deltaNeg * diffNegNeg;
105 diffNeg += deltaPos * diff00;
110 gradPos[i] = diffNeg;
111 gradNeg[i] = diffPos;
114 pow2(std::max(diffNeg,
T(0))) + pow2(std::min(diffPos,
T(0)));
116 pow2(std::min(diffNeg,
T(0))) + pow2(std::max(diffPos,
T(0)));
123 Vec3D<T> normalVector = {};
124 if (calculateNormalVectors) {
126 for (
int i = 0; i <
D; i++) {
127 T pos = neighborIterator.getNeighbor(i).getValue() -
128 neighborIterator.getCenter().getValue();
129 T neg = neighborIterator.getCenter().getValue() -
130 neighborIterator.getNeighbor(i +
D).getValue();
131 normalVector[i] = (pos + neg) * 0.5;
132 denominator += normalVector[i] * normalVector[i];
134 denominator = std::sqrt(denominator);
135 for (
unsigned i = 0; i <
D; ++i) {
136 normalVector[i] /= denominator;
141 Vec3D<T> coordArray = {coordinate[0], coordinate[1], coordinate[2]};
143 double scalarVelocity = velocities->getScalarVelocity(
144 coordArray, material, normalVector,
145 neighborIterator.getCenter().getPointId());
146 Vec3D<T> vectorVelocity = velocities->getVectorVelocity(
147 coordArray, material, normalVector,
148 neighborIterator.getCenter().getPointId());
150 if (scalarVelocity > 0) {
151 vel_grad += std::sqrt(gradPosTotal) * scalarVelocity;
153 vel_grad += std::sqrt(gradNegTotal) * scalarVelocity;
156 for (
int w = 0; w <
D; w++) {
157 if (vectorVelocity[w] > 0.) {
158 vel_grad += vectorVelocity[w] * gradPos[w];
160 vel_grad += vectorVelocity[w] * gradNeg[w];
164 return {vel_grad, 0.};