36 Type Foam::isoSurfaceCell::generatePoint
38 const DynamicList<Type>& snappedPoints,
49 const scalar d = s1-s0;
53 const scalar
s = (
iso_-s0)/d;
55 if (
s >= 0.5 &&
s <= 1 && p1Index != -1)
57 return snappedPoints[p1Index];
59 else if (
s >= 0.0 &&
s <= 0.5 && p0Index != -1)
61 return snappedPoints[p0Index];
65 return s*p1 + (1.0-
s)*
p0;
72 return s*p1 + (1.0-
s)*
p0;
78 void Foam::isoSurfaceCell::generateTriPoints
80 const DynamicList<Type>& snapped,
98 DynamicList<Type>& pts
129 pts.append(generatePoint(snapped,s0,
p0,p0Index,s1,p1,p1Index));
130 pts.append(generatePoint(snapped,s0,
p0,p0Index,s2,p2,p2Index));
131 pts.append(generatePoint(snapped,s0,
p0,p0Index,s3,p3,p3Index));
132 if (triIndex == 0x0E)
135 const label sz = pts.size();
136 Swap(pts[sz-2], pts[sz-1]);
144 pts.append(generatePoint(snapped,s1,p1,p1Index,s0,
p0,p0Index));
145 pts.append(generatePoint(snapped,s1,p1,p1Index,s3,p3,p3Index));
146 pts.append(generatePoint(snapped,s1,p1,p1Index,s2,p2,p2Index));
148 if (triIndex == 0x0D)
151 const label sz = pts.size();
152 Swap(pts[sz-2], pts[sz-1]);
160 Type p0p2 = generatePoint(snapped,s0,
p0,p0Index,s2,p2,p2Index);
161 Type p1p3 = generatePoint(snapped,s1,p1,p1Index,s3,p3,p3Index);
163 pts.append(generatePoint(snapped,s0,
p0,p0Index,s3,p3,p3Index));
170 generatePoint(snapped,s1,p1,p1Index,s2,p2,p2Index)
174 if (triIndex == 0x0C)
177 label sz = pts.size();
178 Swap(pts[sz-5], pts[sz-4]);
179 Swap(pts[sz-2], pts[sz-1]);
187 pts.append(generatePoint(snapped,s2,p2,p2Index,s0,
p0,p0Index));
188 pts.append(generatePoint(snapped,s2,p2,p2Index,s1,p1,p1Index));
189 pts.append(generatePoint(snapped,s2,p2,p2Index,s3,p3,p3Index));
191 if (triIndex == 0x0B)
194 const label sz = pts.size();
195 Swap(pts[sz-2], pts[sz-1]);
203 Type p0p1 = generatePoint(snapped,s0,
p0,p0Index,s1,p1,p1Index);
204 Type p2p3 = generatePoint(snapped,s2,p2,p2Index,s3,p3,p3Index);
208 pts.append(generatePoint(snapped,s0,
p0,p0Index,s3,p3,p3Index));
211 pts.append(generatePoint(snapped,s1,p1,p1Index,s2,p2,p2Index));
214 if (triIndex == 0x0A)
217 const label sz = pts.size();
218 Swap(pts[sz-5], pts[sz-4]);
219 Swap(pts[sz-2], pts[sz-1]);
227 Type p0p1 = generatePoint(snapped,s0,
p0,p0Index,s1,p1,p1Index);
228 Type p2p3 = generatePoint(snapped,s2,p2,p2Index,s3,p3,p3Index);
231 pts.append(generatePoint(snapped,s1,p1,p1Index,s3,p3,p3Index));
236 pts.append(generatePoint(snapped,s0,
p0,p0Index,s2,p2,p2Index));
238 if (triIndex == 0x09)
241 const label sz = pts.size();
242 Swap(pts[sz-5], pts[sz-4]);
243 Swap(pts[sz-2], pts[sz-1]);
251 pts.append(generatePoint(snapped,s3,p3,p3Index,s0,
p0,p0Index));
252 pts.append(generatePoint(snapped,s3,p3,p3Index,s2,p2,p2Index));
253 pts.append(generatePoint(snapped,s3,p3,p3Index,s1,p1,p1Index));
254 if (triIndex == 0x07)
257 const label sz = pts.size();
258 Swap(pts[sz-2], pts[sz-1]);
267 void Foam::isoSurfaceCell::generateTriPoints
272 const Field<Type>& cCoords,
273 const Field<Type>& pCoords,
275 const DynamicList<Type>& snappedPoints,
279 DynamicList<Type>& triPoints,
280 DynamicList<label>& triMeshCells
284 label countNotFoundTets = 0;
286 forAll(mesh_.cells(), celli)
288 if (cellCutType_[celli] != NOTCUT)
290 label oldNPoints = triPoints.size();
292 const cell& cFaces = mesh_.cells()[celli];
294 if (tet.isA(mesh_, celli))
299 const face& f0 = mesh_.faces()[cFaces[0]];
302 const face& f1 = mesh_.faces()[cFaces[1]];
303 label oppositeI = -1;
308 if (!f0.found(oppositeI))
316 if (mesh_.faceOwner()[cFaces[0]] == celli)
336 snappedPoint[oppositeI],
361 snappedPoint[oppositeI],
371 label facei = cFaces[cFacei];
372 const face&
f = mesh_.faces()[facei];
374 label fp0 = mesh_.tetBasePtIs()[facei];
383 label fp =
f.fcIndex(fp0);
384 for (label i = 2; i <
f.size(); i++)
386 label nextFp =
f.fcIndex(fp);
391 if (mesh_.faceOwner()[facei] == celli)
399 snappedPoint[tri[1]],
403 snappedPoint[tri[0]],
407 snappedPoint[tri[2]],
424 snappedPoint[tri[0]],
428 snappedPoint[tri[1]],
432 snappedPoint[tri[2]],
449 label nCells = (triPoints.size()-oldNPoints)/3;
450 for (label i = 0; i < nCells; i++)
452 triMeshCells.append(celli);
457 if (countNotFoundTets > 0)
460 <<
"Could not find " << countNotFoundTets
461 <<
" tet base points, which may lead to inverted triangles."
466 triMeshCells.shrink();
484 labelList snappedPoint(mesh_.nPoints(), -1);
502 return isoSurface::interpolate
507 interpolatedOldPoints_,
508 interpolationWeights_,