50 void Foam::boundaryCutter::getFaceInfo
73 zoneFlip = fZone.flipMap()[fZone.whichFace(facei)];
80 Foam::face Foam::boundaryCutter::addEdgeCutsToFace
83 const Map<labelList>& edgeToAddedPoints
86 const edgeList& edges = mesh_.edges();
87 const face&
f = mesh_.faces()[facei];
88 const labelList& fEdges = mesh_.faceEdges()[facei];
91 DynamicList<label> newFace(2 *
f.size());
96 newFace.append(
f[fp]);
99 label v1 =
f.nextLabel(fp);
103 const auto fnd = edgeToAddedPoints.cfind(edgeI);
110 if (edges[edgeI].
start() ==
f[fp])
115 newFace.append(addedPoints[i]);
123 newFace.append(addedPoints[i]);
130 returnFace.transfer(newFace);
134 Pout<<
"addEdgeCutsToFace:" <<
nl
135 <<
" from : " <<
f <<
nl
136 <<
" to : " << returnFace <<
endl;
143 void Foam::boundaryCutter::addFace
149 polyTopoChange& meshMod
155 label own = mesh_.faceOwner()[facei];
156 label masterPoint = mesh_.faces()[facei][0];
202 bool Foam::boundaryCutter::splitFace
205 const Map<point>& pointToPos,
206 const Map<labelList>& edgeToAddedPoints,
207 polyTopoChange& meshMod
210 const edgeList& edges = mesh_.edges();
211 const face&
f = mesh_.faces()[facei];
212 const labelList& fEdges = mesh_.faceEdges()[facei];
215 label nSplitEdges = 0;
216 label nModPoints = 0;
217 label nTotalSplits = 0;
221 if (pointToPos.found(
f[fp]))
228 label nextV =
f.nextLabel(fp);
232 const auto fnd = edgeToAddedPoints.cfind(edgeI);
237 nTotalSplits += fnd().size();
243 Pout<<
"Face:" << facei
244 <<
" nModPoints:" << nModPoints
245 <<
" nSplitEdges:" << nSplitEdges
246 <<
" nTotalSplits:" << nTotalSplits <<
endl;
249 if (nSplitEdges == 0 && nModPoints == 0)
252 <<
" nSplitEdges:" << nSplitEdges
253 <<
" nTotalSplits:" << nTotalSplits
257 else if (nSplitEdges + nModPoints == 1)
261 Warning <<
"Face " << facei <<
" has only one edge cut " <<
endl;
276 face extendedFace(addEdgeCutsToFace(facei, edgeToAddedPoints));
283 if (extendedFace[fp] >= mesh_.nPoints())
295 if (pointToPos.found(extendedFace[fp]))
311 bool modifiedFace =
false;
335 DynamicList<label> newFace(extendedFace.size());
341 label pointi = extendedFace[fp];
343 newFace.append(pointi);
349 pointi >= mesh_.nPoints()
350 || pointToPos.found(pointi)
356 tmpFace.transfer(newFace);
359 addFace(facei, tmpFace, modifiedFace, meshMod);
362 newFace.append(extendedFace[startFp]);
363 newFace.append(extendedFace[fp]);
366 fp = (fp+1) % extendedFace.size();
370 if (newFace.size() > 2)
374 tmpFace.transfer(newFace);
377 addFace(facei, tmpFace, modifiedFace, meshMod);
415 edgeAddedPoints_.clear();
417 faceAddedPoint_.clear();
418 faceAddedPoint_.resize(faceToFeaturePoint.size());
451 const label edgeI = iter.key();
454 const edge&
e = mesh_.edges()[edgeI];
461 const point& featurePoint = cuts[cutI];
475 auto fnd = edgeToAddedPoints.find(edgeI);
481 label sz = addedPoints.size();
483 addedPoints[sz] = addedPointi;
487 edgeToAddedPoints.insert(edgeI,
labelList(1, addedPointi));
492 Pout<<
"Added point " << addedPointi <<
" for edge " << edgeI
493 <<
" with cuts:" << edgeToAddedPoints[edgeI] <<
endl;
505 const label facei = iter.key();
507 const face&
f = mesh_.faces()[facei];
509 if (faceToSplit.found(facei))
512 <<
"Face " << facei <<
" vertices " <<
f
513 <<
" is both marked for face-centre decomposition and"
514 <<
" diagonal splitting."
518 if (mesh_.isInternalFace(facei))
521 <<
"Face " << facei <<
" vertices " <<
f
522 <<
" is not an external face. Cannot split it"
538 faceAddedPoint_.insert(facei, addedPointi);
542 Pout<<
"Added point " << addedPointi <<
" for feature point "
543 << iter.val() <<
" on face " << facei <<
" with centre "
544 << mesh_.faceCentres()[facei] <<
endl;
556 boolList faceUptodate(mesh_.nFaces(),
false);
562 const label facei = iter.key();
563 const label addedPointi = iter.val();
566 face newFace(addEdgeCutsToFace(facei, edgeToAddedPoints));
571 label own = mesh_.faceOwner()[facei];
572 label masterPoint = mesh_.faces()[facei][0];
582 tri[0] = newFace[fp];
584 tri[2] = addedPointi;
627 faceUptodate[facei] =
true;
634 const label facei = iter.key();
636 const face&
f = mesh_.faces()[facei];
638 if (faceAddedPoint_.found(facei))
641 <<
"Face " << facei <<
" vertices " <<
f
642 <<
" is both marked for face-centre decomposition and"
643 <<
" diagonal splitting."
649 face newFace(addEdgeCutsToFace(facei, edgeToAddedPoints));
654 label own = mesh_.faceOwner()[facei];
655 label masterPoint = mesh_.faces()[facei][0];
663 if (fp0 == -1 || fp1 == -1 || fp0 == fp1)
666 <<
"Problem : Face " << facei <<
" vertices " <<
f
667 <<
" newFace:" << newFace <<
" diagonal:" <<
f[
diag[0]]
682 newVerts.
append(newFace[fp]);
684 fp = (fp == newFace.size()-1 ? 0 : fp+1);
688 newVerts.append(newFace[fp1]);
696 face(newVerts.shrink()),
715 newVerts.append(newFace[fp]);
717 fp = (fp == newFace.size()-1 ? 0 : fp+1);
721 newVerts.append(newFace[fp0]);
728 face(newVerts.shrink()),
741 faceUptodate[facei] =
true;
749 const label edgeI = iter.key();
751 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
755 label facei = eFaces[i];
757 if (!faceUptodate[facei] && !mesh_.isInternalFace(facei))
760 if (splitFace(facei, pointToPos, edgeToAddedPoints, meshMod))
763 faceUptodate[facei] =
true;
775 const label edgeI = iter.key();
777 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
781 label facei = eFaces[i];
783 if (!faceUptodate[facei])
786 face newFace(addEdgeCutsToFace(facei, edgeToAddedPoints));
788 const label own = mesh_.faceOwner()[facei];
792 if (mesh_.isInternalFace(facei))
794 nei = mesh_.faceNeighbour()[facei];
816 faceUptodate[facei] =
true;
823 edgeAddedPoints_.resize(edgeToCuts.size());
827 edgeAddedPoints_.insert(mesh_.edges()[iter.key()], iter.val());
842 Map<label> newAddedPoints(faceAddedPoint_.size());
846 const label oldFacei = iter.key();
847 const label oldPointi = iter.val();
854 newAddedPoints.insert(newFacei,
newPointi);
859 faceAddedPoint_.
transfer(newAddedPoints);
874 const edge&
e = iter.key();
875 const labelList& addedPoints = iter.val();
880 if (newStart >= 0 && newEnd >= 0)
882 labelList newAddedPoints(addedPoints.size());
887 label newAddedPointi =
890 if (newAddedPointi >= 0)
892 newAddedPoints[newI++] = newAddedPointi;
901 newEdgeAddedPoints.insert(newE, newAddedPoints);
907 edgeAddedPoints_.transfer(newEdgeAddedPoints);