45 Foam::label Foam::meshCutAndRemove::firstCommon
53 label index1 =
findIndex(elems2, elems1[elemI]);
65 bool Foam::meshCutAndRemove::isIn
71 label index =
findIndex(cuts, twoCuts[0]);
80 cuts[cuts.fcIndex(index)] == twoCuts[1]
81 || cuts[cuts.rcIndex(index)] == twoCuts[1]
89 Foam::label Foam::meshCutAndRemove::findCutCell
97 label cellI = cellLabels[
labelI];
99 if (cuts.cellLoops()[cellI].size())
112 Foam::label Foam::meshCutAndRemove::findInternalFacePoint
119 label pointI = pointLabels[
labelI];
125 label faceI = pFaces[pFaceI];
127 if (
mesh().isInternalFace(faceI))
134 if (pointLabels.empty())
136 FatalErrorIn(
"meshCutAndRemove::findInternalFacePoint(const labelList&)")
146 Foam::label Foam::meshCutAndRemove::findPatchFacePoint
149 const label exposedPatchI
157 label pointI = f[fp];
161 const labelList& pFaces = pointFaces[pointI];
165 if (patches.whichPatch(pFaces[i]) == exposedPatchI)
178 void Foam::meshCutAndRemove::faceCells
180 const cellCuts& cuts,
181 const label exposedPatchI,
195 if (cellLoops[own].size() && firstCommon(f, anchorPts[own]) == -1)
203 if (
mesh().isInternalFace(faceI))
207 if (cellLoops[nei].size() && firstCommon(f, anchorPts[nei]) == -1)
215 if (patchID == -1 && (own == -1 || nei == -1))
218 patchID = exposedPatchI;
223 void Foam::meshCutAndRemove::getZoneInfo
238 zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
244 void Foam::meshCutAndRemove::addFace
246 polyTopoChange& meshMod,
248 const label masterPointI,
258 getZoneInfo(faceI, zoneID, zoneFlip);
260 if ((nei == -1) || (own != -1 && own < nei))
265 Pout<<
"Adding face " << newFace
266 <<
" with new owner:" << own
267 <<
" with new neighbour:" << nei
268 <<
" patchID:" << patchID
269 <<
" anchor:" << masterPointI
270 <<
" zoneID:" << zoneID
271 <<
" zoneFlip:" << zoneFlip
297 Pout<<
"Adding (reversed) face " << newFace.reverseFace()
298 <<
" with new owner:" << nei
299 <<
" with new neighbour:" << own
300 <<
" patchID:" << patchID
301 <<
" anchor:" << masterPointI
302 <<
" zoneID:" << zoneID
303 <<
" zoneFlip:" << zoneFlip
311 newFace.reverseFace(),
328 void Foam::meshCutAndRemove::modFace
330 polyTopoChange& meshMod,
341 getZoneInfo(faceI, zoneID, zoneFlip);
345 (own !=
mesh().faceOwner()[faceI])
347 mesh().isInternalFace(faceI)
348 && (nei !=
mesh().faceNeighbour()[faceI])
350 || (newFace !=
mesh().faces()[faceI])
355 Pout<<
"Modifying face " << faceI
356 <<
" old vertices:" <<
mesh().
faces()[faceI]
357 <<
" new vertices:" << newFace
358 <<
" new owner:" << own
359 <<
" new neighbour:" << nei
360 <<
" new patch:" << patchID
361 <<
" new zoneID:" << zoneID
362 <<
" new zoneFlip:" << zoneFlip
366 if ((nei == -1) || (own != -1 && own < nei))
390 newFace.reverseFace(),
407 void Foam::meshCutAndRemove::copyFace
421 newFace[newFp++] = f[fp];
423 fp = (fp + 1) % f.size();
425 newFace[newFp] = f[fp];
433 void Foam::meshCutAndRemove::splitFace
450 "meshCutAndRemove::splitFace"
451 ", const face&, const label, const label, face&, face&)"
452 ) <<
"Cannot find vertex (new numbering) " << v0
463 "meshCutAndRemove::splitFace("
464 ", const face&, const label, const label, face&, face&)"
465 ) <<
"Cannot find vertex (new numbering) " << v1
471 f0.setSize((endFp + 1 + f.size() - startFp) % f.size());
472 f1.setSize(f.size() - f0.size() + 2);
474 copyFace(f, startFp, endFp, f0);
475 copyFace(f, endFp, startFp, f1);
481 Foam::face Foam::meshCutAndRemove::addEdgeCutsToFace(
const label faceI)
const
485 face newFace(2 * f.size());
492 newFace[newFp++] = f[fp];
495 label fp1 = f.fcIndex(fp);
497 HashTable<label, edge, Hash<edge> >::const_iterator fnd =
498 addedPoints_.find(edge(f[fp], f[fp1]));
500 if (fnd != addedPoints_.end())
503 newFace[newFp++] = fnd();
507 newFace.setSize(newFp);
522 face newFace(2*loop.size());
528 label cut = loop[fp];
532 label edgeI = getEdge(cut);
536 label vertI = addedPoints_[
e];
538 newFace[newFaceI++] = vertI;
543 label vertI = getVertex(cut);
545 newFace[newFaceI++] = vertI;
547 label nextCut = loop[loop.fcIndex(fp)];
549 if (!isEdge(nextCut))
552 label nextVertI = getVertex(nextCut);
559 HashTable<label, edge, Hash<edge> >::const_iterator fnd =
560 addedPoints_.find(
mesh().edges()[edgeI]);
562 if (fnd != addedPoints_.end())
564 newFace[newFaceI++] = fnd();
570 newFace.setSize(newFaceI);
591 const label exposedPatchI,
599 addedFaces_.resize(cuts.
nLoops());
601 addedPoints_.clear();
602 addedPoints_.resize(cuts.
nLoops());
613 if (exposedPatchI < 0 || exposedPatchI >= patches.
size())
617 "meshCutAndRemove::setRefinement("
618 ", const label, const cellCuts&, const labelList&"
620 ) <<
"Illegal exposed patch " << exposedPatchI
636 if (debug && findCutCell(cuts,
mesh().edgeCells()[edgeI]) == -1)
640 "meshCutAndRemove::setRefinement("
641 ", const label, const cellCuts&, const labelList&"
643 ) <<
"Problem: cut edge but none of the cells using it is\n"
644 <<
"edge:" << edgeI <<
" verts:" << e
649 label masterPointI = e.
start();
656 point newPt = weight*v1 + (1.0-weight)*v0;
671 addedPoints_.insert(e, addedPointI);
675 Pout<<
"Added point " << addedPointI
677 << masterPointI <<
" of edge " << edgeI
678 <<
" vertices " << e <<
endl;
692 const labelList& loop = cellLoops[cellI];
699 label cut = loop[fp];
703 usedPoint[getVertex(cut)] =
true;
707 const labelList& anchors = anchorPts[cellI];
711 usedPoint[anchors[i]] =
true;
721 usedPoint[cPoints[i]] =
true;
732 const edge& fCut = iter();
740 label pointI = getVertex(cut);
742 if (!usedPoint[pointI])
746 "meshCutAndRemove::setRefinement("
747 ", const label, const cellCuts&, const labelList&"
749 ) <<
"Problem: faceSplitCut not used by any loop"
750 <<
" or cell anchor point"
751 <<
"face:" << iter.key() <<
" point:" << pointI
763 if (!usedPoint[pointI])
767 "meshCutAndRemove::setRefinement("
768 ", const label, const cellCuts&, const labelList&"
770 ) <<
"Problem: point is marked as cut but"
771 <<
" not used by any loop"
772 <<
" or cell anchor point"
773 <<
"point:" << pointI
784 if (!usedPoint[pointI])
790 Pout<<
"Removing unused point " << pointI <<
endl;
803 const labelList& loop = cellLoops[cellI];
807 if (cutPatch[cellI] < 0 || cutPatch[cellI] >= patches.
size())
811 "meshCutAndRemove::setRefinement("
812 ", const label, const cellCuts&, const labelList&"
814 ) <<
"Illegal patch " << cutPatch[cellI]
815 <<
" provided for cut cell " << cellI
823 face newFace(loopToFace(cellI, loop));
828 label masterPointI = findPatchFacePoint(newFace, exposedPatchI);
848 addedFaces_.insert(cellI, addedFaceI);
852 Pout<<
"Added splitting face " << newFace <<
" index:"
853 << addedFaceI <<
" from masterPoint:" << masterPointI
854 <<
" to owner " << cellI <<
" with anchors:"
871 writeCuts(
Pout, loop, weights);
893 iter != faceSplitCuts.
end();
897 label faceI = iter.key();
900 face newFace(addEdgeCutsToFace(faceI));
903 const edge& splitEdge = iter();
905 label cut0 = splitEdge[0];
910 label edgeI = getEdge(cut0);
911 v0 = addedPoints_[
mesh().
edges()[edgeI]];
915 v0 = getVertex(cut0);
918 label cut1 = splitEdge[1];
922 label edgeI = getEdge(cut1);
923 v1 = addedPoints_[
mesh().
edges()[edgeI]];
927 v1 = getVertex(cut1);
932 splitFace(newFace, v0, v1, f0, f1);
938 if (
mesh().isInternalFace(faceI))
946 <<
" own:" << own <<
" nei:" << nei
948 <<
" and f1:" << f1 <<
endl;
967 if (cellLoops[own].empty())
973 else if (isIn(splitEdge, cellLoops[own]))
977 if (firstCommon(f0, anchorPts[own]) != -1)
994 if (firstCommon(f, anchorPts[own]) != -1)
1014 if (cellLoops[nei].empty())
1019 else if (isIn(splitEdge, cellLoops[nei]))
1025 if (firstCommon(f0, anchorPts[nei]) != -1)
1041 if (firstCommon(f, anchorPts[nei]) != -1)
1058 Pout<<
"f0 own:" << f0Own <<
" nei:" << f0Nei
1059 <<
" f1 own:" << f1Own <<
" nei:" << f1Nei
1070 patchID = exposedPatchI;
1077 bool modifiedFaceI =
false;
1084 modFace(meshMod, faceI, f0, f0Own, f0Nei, patchID);
1085 modifiedFaceI =
true;
1093 modFace(meshMod, faceI, f0, f0Own, f0Nei, patchID);
1094 modifiedFaceI =
true;
1099 modFace(meshMod, faceI, f0, f0Own, f0Nei, -1);
1100 modifiedFaceI =
true;
1118 modFace(meshMod, faceI, f1, f1Own, f1Nei, patchID);
1119 modifiedFaceI =
true;
1123 label masterPointI = findPatchFacePoint(f1, patchID);
1145 modFace(meshMod, faceI, f1, f1Own, f1Nei, patchID);
1146 modifiedFaceI =
true;
1150 label masterPointI = findPatchFacePoint(f1, patchID);
1169 modFace(meshMod, faceI, f1, f1Own, f1Nei, -1);
1170 modifiedFaceI =
true;
1174 label masterPointI = findPatchFacePoint(f1, -1);
1176 addFace(meshMod, faceI, masterPointI, f1, f1Own, f1Nei, -1);
1181 if (f0Own == -1 && f0Nei == -1 && !modifiedFaceI)
1187 Pout<<
"Removed face " << faceI <<
endl;
1191 faceUptodate[faceI] =
true;
1204 if (edgeIsCut[edgeI])
1210 label faceI = eFaces[i];
1212 if (!faceUptodate[faceI])
1219 label own, nei, patchID;
1220 faceCells(cuts, exposedPatchI, faceI, own, nei, patchID);
1223 if (own == -1 && nei == -1)
1229 Pout<<
"Removed face " << faceI <<
endl;
1235 face newFace(addEdgeCutsToFace(faceI));
1239 Pout<<
"Added edge cuts to face " << faceI
1241 <<
" newFace:" << newFace <<
endl;
1255 faceUptodate[faceI] =
true;
1272 if (!faceUptodate[faceI])
1275 label own, nei, patchID;
1276 faceCells(cuts, exposedPatchI, faceI, own, nei, patchID);
1278 if (own == -1 && nei == -1)
1284 Pout<<
"Removed face " << faceI <<
endl;
1289 modFace(meshMod, faceI, faces[faceI], own, nei, patchID);
1292 faceUptodate[faceI] =
true;
1298 Pout<<
"meshCutAndRemove:" <<
nl
1299 <<
" cells split:" << cuts.
nLoops() <<
nl
1300 <<
" faces added:" << addedFaces_.size() <<
nl
1301 <<
" points added on edges:" << addedPoints_.size() <<
nl
1311 Map<label> newAddedFaces(addedFaces_.size());
1316 iter != addedFaces_.end();
1320 label cellI = iter.key();
1324 label addedFaceI = iter();
1328 if ((newCellI >= 0) && (newAddedFaceI >= 0))
1333 && (newCellI != cellI || newAddedFaceI != addedFaceI)
1336 Pout<<
"meshCutAndRemove::updateMesh :"
1337 <<
" updating addedFace for cell " << cellI
1338 <<
" from " << addedFaceI
1339 <<
" to " << newAddedFaceI
1342 newAddedFaces.insert(newCellI, newAddedFaceI);
1347 addedFaces_.transfer(newAddedFaces);
1356 addedPoints_.begin();
1357 iter != addedPoints_.end();
1361 const edge& e = iter.key();
1367 label addedPointI = iter();
1371 if ((newStart >= 0) && (newEnd >= 0) && (newAddedPointI >= 0))
1373 edge newE =
edge(newStart, newEnd);
1378 && (e != newE || newAddedPointI != addedPointI)
1381 Pout<<
"meshCutAndRemove::updateMesh :"
1382 <<
" updating addedPoints for edge " << e
1383 <<
" from " << addedPointI
1384 <<
" to " << newAddedPointI
1388 newAddedPoints.insert(newE, newAddedPointI);
1393 addedPoints_.transfer(newAddedPoints);