55 if (elems2.found(elems1[elemI]))
64 bool Foam::meshCutter::isIn
70 label index = cuts.find(twoCuts[0]);
79 cuts[cuts.fcIndex(index)] == twoCuts[1]
80 || cuts[cuts.rcIndex(index)] == twoCuts[1]
97 if (cuts.cellLoops()[celli].size())
106 Foam::label Foam::meshCutter::findInternalFacePoint
121 if (
mesh().isInternalFace(facei))
138 void Foam::meshCutter::faceCells
140 const cellCuts& cuts,
153 if (cellLoops[own].size() && uses(
f, anchorPts[own]))
155 own = addedCells_[own];
160 if (
mesh().isInternalFace(facei))
164 if (cellLoops[nei].size() && uses(
f, anchorPts[nei]))
166 nei = addedCells_[nei];
172 void Foam::meshCutter::getFaceInfo
182 if (!
mesh().isInternalFace(facei))
195 zoneFlip = fZone.flipMap()[fZone.whichFace(facei)];
200 void Foam::meshCutter::addFace
202 polyTopoChange& meshMod,
213 if ((nei == -1) || (own < nei))
218 Pout<<
"Adding face " << newFace
219 <<
" with new owner:" << own
220 <<
" with new neighbour:" << nei
223 <<
" zoneFlip:" << zoneFlip
249 Pout<<
"Adding (reversed) face " << newFace.reverseFace()
250 <<
" with new owner:" << nei
251 <<
" with new neighbour:" << own
254 <<
" zoneFlip:" << zoneFlip
262 newFace.reverseFace(),
278 void Foam::meshCutter::modFace
280 polyTopoChange& meshMod,
293 (own !=
mesh().faceOwner()[facei])
295 mesh().isInternalFace(facei)
296 && (nei !=
mesh().faceNeighbour()[facei])
298 || (newFace !=
mesh().faces()[facei])
303 Pout<<
"Modifying face " << facei
304 <<
" old vertices:" <<
mesh().
faces()[facei]
305 <<
" new vertices:" << newFace
306 <<
" new owner:" << own
307 <<
" new neighbour:" << nei
308 <<
" new zoneID:" <<
zoneID
309 <<
" new zoneFlip:" << zoneFlip
313 if ((nei == -1) || (own < nei))
337 newFace.reverseFace(),
353 void Foam::meshCutter::copyFace
367 newFace[newFp++] =
f[fp];
369 fp = (fp + 1) %
f.size();
371 newFace[newFp] =
f[fp];
375 void Foam::meshCutter::splitFace
386 label startFp =
f.find(v0);
391 <<
"Cannot find vertex (new numbering) " << v0
401 <<
"Cannot find vertex (new numbering) " << v1
407 f0.setSize((endFp + 1 +
f.size() - startFp) %
f.size());
408 f1.setSize(
f.size() - f0.size() + 2);
410 copyFace(
f, startFp, endFp, f0);
411 copyFace(
f, endFp, startFp, f1);
415 Foam::face Foam::meshCutter::addEdgeCutsToFace(
const label facei)
const
419 face newFace(2 *
f.size());
426 newFace[newFp++] =
f[fp];
429 label fp1 =
f.fcIndex(fp);
431 EdgeMap<label>::const_iterator fnd =
432 addedPoints_.find(edge(
f[fp],
f[fp1]));
437 newFace[newFp++] = fnd.val();
453 face newFace(2*loop.size());
467 label vertI = addedPoints_[
e];
469 newFace[newFacei++] = vertI;
476 newFace[newFacei++] = vertI;
478 label nextCut = loop[loop.fcIndex(fp)];
480 if (!isEdge(nextCut))
483 label nextVertI = getVertex(nextCut);
490 EdgeMap<label>::const_iterator fnd =
491 addedPoints_.find(
mesh().edges()[edgeI]);
495 newFace[newFacei++] = fnd.val();
501 newFace.setSize(newFacei);
535 addedCells_.resize(cuts.
nLoops());
538 addedFaces_.resize(cuts.
nLoops());
540 addedPoints_.clear();
541 addedPoints_.resize(cuts.
nLoops());
562 edgeOnCutCell[cEdges[i]] =
true;
570 if (cuts.
edgeIsCut()[edgeI] && !edgeOnCutCell[edgeI])
575 <<
"Problem: cut edge but none of the cells using"
577 <<
"edge:" << edgeI <<
" verts:" <<
e
596 label masterPointi =
e.start();
603 point newPt = weight*v1 + (1.0-weight)*v0;
618 addedPoints_.insert(
e, addedPointi);
622 Pout<<
"Added point " << addedPointi
624 << masterPointi <<
" of edge " << edgeI
625 <<
" vertices " <<
e <<
endl;
636 if (cellLoops[celli].size())
648 mesh().cellZones().whichZone(celli)
652 addedCells_.insert(celli, addedCelli);
656 Pout<<
"Added cell " << addedCells_[celli] <<
" to cell "
669 const labelList& loop = cellLoops[celli];
676 face newFace(loopToFace(celli, loop));
679 label masterPointi = findInternalFacePoint(anchorPts[celli]);
699 addedFaces_.insert(celli, addedFacei);
717 Pout<<
"Added splitting face " << newFace <<
" index:"
719 <<
" to owner " << celli
720 <<
" neighbour " << addedCells_[celli]
722 writeCuts(
Pout, loop, weights);
742 const label facei = iter.key();
744 const edge& splitEdge = iter.val();
747 face newFace(addEdgeCutsToFace(facei));
750 label cut0 = splitEdge[0];
755 label edgeI = getEdge(cut0);
756 v0 = addedPoints_[
mesh().
edges()[edgeI]];
760 v0 = getVertex(cut0);
763 label cut1 = splitEdge[1];
767 label edgeI = getEdge(cut1);
768 v1 = addedPoints_[
mesh().
edges()[edgeI]];
772 v1 = getVertex(cut1);
777 splitFace(newFace, v0, v1, f0, f1);
783 if (
mesh().isInternalFace(facei))
791 <<
" own:" << own <<
" nei:" << nei
793 <<
" and f1:" << f1 <<
endl;
809 if (cellLoops[own].empty())
814 else if (isIn(splitEdge, cellLoops[own]))
818 if (uses(f0, anchorPts[own]))
820 f0Owner = addedCells_[own];
826 f1Owner = addedCells_[own];
833 if (uses(
f, anchorPts[own]))
835 label newCelli = addedCells_[own];
847 label f0Neighbour = -1;
848 label f1Neighbour = -1;
852 if (cellLoops[nei].empty())
857 else if (isIn(splitEdge, cellLoops[nei]))
861 if (uses(f0, anchorPts[nei]))
863 f0Neighbour = addedCells_[nei];
869 f1Neighbour = addedCells_[nei];
876 if (uses(
f, anchorPts[nei]))
878 label newCelli = addedCells_[nei];
879 f0Neighbour = newCelli;
880 f1Neighbour = newCelli;
891 addFace(meshMod, facei, f0, f0Owner, f0Neighbour);
893 modFace(meshMod, facei, f1, f1Owner, f1Neighbour);
895 faceUptodate[facei] =
true;
908 if (edgeIsCut[edgeI])
914 label facei = eFaces[i];
916 if (!faceUptodate[facei])
919 face newFace(addEdgeCutsToFace(facei));
923 Pout<<
"Added edge cuts to face " << facei
925 <<
" newFace:" << newFace <<
endl;
932 modFace(meshMod, facei, newFace, own, nei);
934 faceUptodate[facei] =
true;
947 if (cellLoops[celli].size())
951 forAll(cllFaces, cllFacei)
953 label facei = cllFaces[cllFacei];
955 if (!faceUptodate[facei])
960 if (
debug && (
f != addEdgeCutsToFace(facei)))
963 <<
"Problem: edges added to face which does "
964 <<
" not use a marked cut" <<
endl
965 <<
"facei:" << facei <<
endl
966 <<
"face:" <<
f <<
endl
967 <<
"newFace:" << addEdgeCutsToFace(facei)
984 faceUptodate[facei] =
true;
992 Pout<<
"meshCutter:" <<
nl
993 <<
" cells split:" << addedCells_.size() <<
nl
994 <<
" faces added:" << addedFaces_.size() <<
nl
995 <<
" points added on edges:" << addedPoints_.size() <<
nl
1008 Map<label> newAddedCells(addedCells_.size());
1012 const label celli = iter.key();
1013 const label addedCelli = iter.val();
1018 if (newCelli >= 0 && newAddedCelli >= 0)
1023 && (newCelli != celli || newAddedCelli != addedCelli)
1026 Pout<<
"meshCutter::updateMesh :"
1027 <<
" updating addedCell for cell " << celli
1028 <<
" from " << addedCelli
1029 <<
" to " << newAddedCelli <<
endl;
1031 newAddedCells.insert(newCelli, newAddedCelli);
1036 addedCells_.transfer(newAddedCells);
1040 Map<label> newAddedFaces(addedFaces_.size());
1044 const label celli = iter.key();
1045 const label addedFacei = iter.val();
1050 if ((newCelli >= 0) && (newAddedFacei >= 0))
1055 && (newCelli != celli || newAddedFacei != addedFacei)
1058 Pout<<
"meshCutter::updateMesh :"
1059 <<
" updating addedFace for cell " << celli
1060 <<
" from " << addedFacei
1061 <<
" to " << newAddedFacei
1064 newAddedFaces.insert(newCelli, newAddedFacei);
1069 addedFaces_.transfer(newAddedFaces);
1077 const edge&
e = iter.key();
1078 const label addedPointi = iter.val();
1086 if ((newStart >= 0) && (newEnd >= 0) && (newAddedPointi >= 0))
1088 edge newE =
edge(newStart, newEnd);
1093 && (
e != newE || newAddedPointi != addedPointi)
1096 Pout<<
"meshCutter::updateMesh :"
1097 <<
" updating addedPoints for edge " <<
e
1098 <<
" from " << addedPointi
1099 <<
" to " << newAddedPointi
1103 newAddedPoints.insert(newE, newAddedPointi);
1108 addedPoints_.transfer(newAddedPoints);