60 label index1 = elems2.find(elems1[elemI]);
72 bool Foam::meshCutAndRemove::isIn
78 label index = cuts.find(twoCuts[0]);
87 cuts[cuts.fcIndex(index)] == twoCuts[1]
88 || cuts[cuts.rcIndex(index)] == twoCuts[1]
105 if (cuts.cellLoops()[celli].size())
114 Foam::label Foam::meshCutAndRemove::findInternalFacePoint
129 if (
mesh().isInternalFace(facei))
146 Foam::label Foam::meshCutAndRemove::findPatchFacePoint
149 const label exposedPatchi
176 void Foam::meshCutAndRemove::faceCells
178 const cellCuts& cuts,
179 const label exposedPatchi,
193 if (cellLoops[own].size() && firstCommon(
f, anchorPts[own]) == -1)
201 if (
mesh().isInternalFace(facei))
205 if (cellLoops[nei].size() && firstCommon(
f, anchorPts[nei]) == -1)
213 if (
patchID == -1 && (own == -1 || nei == -1))
221 void Foam::meshCutAndRemove::getZoneInfo
236 zoneFlip = fZone.flipMap()[fZone.whichFace(facei)];
241 void Foam::meshCutAndRemove::addFace
243 polyTopoChange& meshMod,
245 const label masterPointi,
255 getZoneInfo(facei,
zoneID, zoneFlip);
257 if ((nei == -1) || (own != -1 && own < nei))
262 Pout<<
"Adding face " << newFace
263 <<
" with new owner:" << own
264 <<
" with new neighbour:" << nei
266 <<
" anchor:" << masterPointi
268 <<
" zoneFlip:" << zoneFlip
294 Pout<<
"Adding (reversed) face " << newFace.reverseFace()
295 <<
" with new owner:" << nei
296 <<
" with new neighbour:" << own
298 <<
" anchor:" << masterPointi
300 <<
" zoneFlip:" << zoneFlip
308 newFace.reverseFace(),
325 void Foam::meshCutAndRemove::modFace
327 polyTopoChange& meshMod,
338 getZoneInfo(facei,
zoneID, zoneFlip);
342 (own !=
mesh().faceOwner()[facei])
344 mesh().isInternalFace(facei)
345 && (nei !=
mesh().faceNeighbour()[facei])
347 || (newFace !=
mesh().faces()[facei])
352 Pout<<
"Modifying face " << facei
353 <<
" old vertices:" <<
mesh().
faces()[facei]
354 <<
" new vertices:" << newFace
355 <<
" new owner:" << own
356 <<
" new neighbour:" << nei
358 <<
" new zoneID:" <<
zoneID
359 <<
" new zoneFlip:" << zoneFlip
363 if ((nei == -1) || (own != -1 && own < nei))
387 newFace.reverseFace(),
403 void Foam::meshCutAndRemove::copyFace
417 newFace[newFp++] =
f[fp];
419 fp = (fp + 1) %
f.size();
421 newFace[newFp] =
f[fp];
429 void Foam::meshCutAndRemove::splitFace
440 label startFp =
f.find(v0);
445 <<
"Cannot find vertex (new numbering) " << v0
455 <<
"Cannot find vertex (new numbering) " << v1
461 f0.setSize((endFp + 1 +
f.size() - startFp) %
f.size());
462 f1.setSize(
f.size() - f0.size() + 2);
464 copyFace(
f, startFp, endFp, f0);
465 copyFace(
f, endFp, startFp, f1);
469 Foam::face Foam::meshCutAndRemove::addEdgeCutsToFace(
const label facei)
const
473 face newFace(2 *
f.size());
480 newFace[newFp++] =
f[fp];
483 label fp1 =
f.fcIndex(fp);
485 EdgeMap<label>::const_iterator fnd =
486 addedPoints_.find(edge(
f[fp],
f[fp1]));
491 newFace[newFp++] = fnd.val();
510 face newFace(2*loop.size());
524 label vertI = addedPoints_[
e];
526 newFace[newFacei++] = vertI;
533 newFace[newFacei++] = vertI;
535 label nextCut = loop[loop.fcIndex(fp)];
537 if (!isEdge(nextCut))
540 label nextVertI = getVertex(nextCut);
547 EdgeMap<label>::const_iterator fnd =
548 addedPoints_.find(
mesh().edges()[edgeI]);
552 newFace[newFacei++] = fnd.val();
558 newFace.setSize(newFacei);
579 const label exposedPatchi,
587 addedFaces_.resize(cuts.
nLoops());
589 addedPoints_.clear();
590 addedPoints_.resize(cuts.
nLoops());
601 if (exposedPatchi < 0 || exposedPatchi >=
patches.size())
604 <<
"Illegal exposed patch " << exposedPatchi
620 if (
debug && findCutCell(cuts,
mesh().edgeCells()[edgeI]) == -1)
623 <<
"Problem: cut edge but none of the cells using it is\n"
624 <<
"edge:" << edgeI <<
" verts:" <<
e
629 label masterPointi =
e.start();
636 point newPt = weight*v1 + (1.0-weight)*v0;
651 addedPoints_.insert(
e, addedPointi);
655 Pout<<
"Added point " << addedPointi
657 << masterPointi <<
" of edge " << edgeI
658 <<
" vertices " <<
e <<
endl;
672 const labelList& loop = cellLoops[celli];
683 usedPoint[getVertex(
cut)] =
true;
687 const labelList& anchors = anchorPts[celli];
691 usedPoint[anchors[i]] =
true;
701 usedPoint[cPoints[i]] =
true;
712 const edge& fCut = iter.val();
722 if (!usedPoint[pointi])
725 <<
"Problem: faceSplitCut not used by any loop"
726 <<
" or cell anchor point"
727 <<
"face:" << iter.key() <<
" point:" << pointi
739 if (!usedPoint[pointi])
742 <<
"Problem: point is marked as cut but"
743 <<
" not used by any loop"
744 <<
" or cell anchor point"
745 <<
"point:" << pointi
756 if (!usedPoint[pointi])
762 Pout<<
"Removing unused point " << pointi <<
endl;
775 const labelList& loop = cellLoops[celli];
779 if (cutPatch[celli] < 0 || cutPatch[celli] >=
patches.size())
782 <<
"Illegal patch " << cutPatch[celli]
783 <<
" provided for cut cell " << celli
791 face newFace(loopToFace(celli, loop));
796 label masterPointi = findPatchFacePoint(newFace, exposedPatchi);
816 addedFaces_.insert(celli, addedFacei);
820 Pout<<
"Added splitting face " << newFace <<
" index:"
821 << addedFacei <<
" from masterPoint:" << masterPointi
822 <<
" to owner " << celli <<
" with anchors:"
839 writeCuts(
Pout, loop, weights);
860 const label facei = iter.key();
862 const edge& splitEdge = iter.val();
865 face newFace(addEdgeCutsToFace(facei));
868 label cut0 = splitEdge[0];
873 label edgeI = getEdge(cut0);
874 v0 = addedPoints_[
mesh().
edges()[edgeI]];
878 v0 = getVertex(cut0);
881 label cut1 = splitEdge[1];
885 label edgeI = getEdge(cut1);
886 v1 = addedPoints_[
mesh().
edges()[edgeI]];
890 v1 = getVertex(cut1);
895 splitFace(newFace, v0, v1, f0, f1);
901 if (
mesh().isInternalFace(facei))
909 <<
" own:" << own <<
" nei:" << nei
911 <<
" and f1:" << f1 <<
endl;
930 if (cellLoops[own].empty())
936 else if (isIn(splitEdge, cellLoops[own]))
940 if (firstCommon(f0, anchorPts[own]) != -1)
957 if (firstCommon(
f, anchorPts[own]) != -1)
977 if (cellLoops[nei].empty())
982 else if (isIn(splitEdge, cellLoops[nei]))
988 if (firstCommon(f0, anchorPts[nei]) != -1)
1004 if (firstCommon(
f, anchorPts[nei]) != -1)
1021 Pout<<
"f0 own:" << f0Own <<
" nei:" << f0Nei
1022 <<
" f1 own:" << f1Own <<
" nei:" << f1Nei
1040 bool modifiedFacei =
false;
1047 modFace(meshMod, facei, f0, f0Own, f0Nei,
patchID);
1048 modifiedFacei =
true;
1056 modFace(meshMod, facei, f0, f0Own, f0Nei,
patchID);
1057 modifiedFacei =
true;
1062 modFace(meshMod, facei, f0, f0Own, f0Nei, -1);
1063 modifiedFacei =
true;
1081 modFace(meshMod, facei, f1, f1Own, f1Nei,
patchID);
1082 modifiedFacei =
true;
1108 modFace(meshMod, facei, f1, f1Own, f1Nei,
patchID);
1109 modifiedFacei =
true;
1132 modFace(meshMod, facei, f1, f1Own, f1Nei, -1);
1133 modifiedFacei =
true;
1137 label masterPointi = findPatchFacePoint(f1, -1);
1139 addFace(meshMod, facei, masterPointi, f1, f1Own, f1Nei, -1);
1144 if (f0Own == -1 && f0Nei == -1 && !modifiedFacei)
1150 Pout<<
"Removed face " << facei <<
endl;
1154 faceUptodate[facei] =
true;
1167 if (edgeIsCut[edgeI])
1173 label facei = eFaces[i];
1175 if (!faceUptodate[facei])
1186 if (own == -1 && nei == -1)
1192 Pout<<
"Removed face " << facei <<
endl;
1198 face newFace(addEdgeCutsToFace(facei));
1202 Pout<<
"Added edge cuts to face " << facei
1204 <<
" newFace:" << newFace <<
endl;
1218 faceUptodate[facei] =
true;
1235 if (!faceUptodate[facei])
1241 if (own == -1 && nei == -1)
1247 Pout<<
"Removed face " << facei <<
endl;
1252 modFace(meshMod, facei, faces[facei], own, nei,
patchID);
1255 faceUptodate[facei] =
true;
1261 Pout<<
"meshCutAndRemove:" <<
nl
1262 <<
" cells split:" << cuts.
nLoops() <<
nl
1263 <<
" faces added:" << addedFaces_.size() <<
nl
1264 <<
" points added on edges:" << addedPoints_.size() <<
nl
1274 Map<label> newAddedFaces(addedFaces_.size());
1278 const label celli = iter.key();
1279 const label addedFacei = iter.val();
1284 if ((newCelli >= 0) && (newAddedFacei >= 0))
1289 && (newCelli != celli || newAddedFacei != addedFacei)
1292 Pout<<
"meshCutAndRemove::updateMesh :"
1293 <<
" updating addedFace for cell " << celli
1294 <<
" from " << addedFacei
1295 <<
" to " << newAddedFacei
1298 newAddedFaces.insert(newCelli, newAddedFacei);
1303 addedFaces_.transfer(newAddedFaces);
1311 const edge&
e = iter.key();
1312 const label addedPointi = iter.val();
1318 if ((newStart >= 0) && (newEnd >= 0) && (newAddedPointi >= 0))
1320 edge newE(newStart, newEnd);
1325 && (
e != newE || newAddedPointi != addedPointi)
1328 Pout<<
"meshCutAndRemove::updateMesh :"
1329 <<
" updating addedPoints for edge " <<
e
1330 <<
" from " << addedPointi
1331 <<
" to " << newAddedPointi
1335 newAddedPoints.insert(newE, newAddedPointi);
1340 addedPoints_.transfer(newAddedPoints);