54 void Foam::boundaryCutter::getFaceInfo
75 const faceZone& fZone = mesh_.
faceZones()[zoneID];
77 zoneFlip = fZone.flipMap()[fZone.whichFace(faceI)];
84 Foam::face Foam::boundaryCutter::addEdgeCutsToFace
87 const Map<labelList>& edgeToAddedPoints
90 const edgeList& edges = mesh_.edges();
91 const face&
f = mesh_.faces()[faceI];
92 const labelList& fEdges = mesh_.faceEdges()[faceI];
95 DynamicList<label> newFace(2 * f.size());
100 newFace.append(f[fp]);
103 label
v1 = f.nextLabel(fp);
109 if (fnd != edgeToAddedPoints.end())
114 if (edges[edgeI].start() == f[fp])
119 newFace.append(addedPoints[i]);
127 newFace.append(addedPoints[i]);
134 returnFace.transfer(newFace);
138 Pout<<
"addEdgeCutsToFace:" <<
nl
139 <<
" from : " << f <<
nl
140 <<
" to : " << returnFace <<
endl;
147 void Foam::boundaryCutter::addFace
153 polyTopoChange& meshMod
157 label patchID, zoneID, zoneFlip;
158 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
159 label own = mesh_.faceOwner()[faceI];
160 label masterPoint = mesh_.faces()[faceI][0];
206 bool Foam::boundaryCutter::splitFace
209 const Map<point>& pointToPos,
210 const Map<labelList>& edgeToAddedPoints,
211 polyTopoChange& meshMod
214 const edgeList& edges = mesh_.edges();
215 const face& f = mesh_.faces()[faceI];
216 const labelList& fEdges = mesh_.faceEdges()[faceI];
219 label nSplitEdges = 0;
220 label nModPoints = 0;
221 label nTotalSplits = 0;
225 if (pointToPos.found(f[fp]))
232 label nextV = f.nextLabel(fp);
238 if (fnd != edgeToAddedPoints.end())
241 nTotalSplits += fnd().size();
247 Pout<<
"Face:" << faceI
248 <<
" nModPoints:" << nModPoints
249 <<
" nSplitEdges:" << nSplitEdges
250 <<
" nTotalSplits:" << nTotalSplits <<
endl;
253 if (nSplitEdges == 0 && nModPoints == 0)
255 FatalErrorIn(
"boundaryCutter::splitFace") <<
"Problem : face:" << faceI
256 <<
" nSplitEdges:" << nSplitEdges
257 <<
" nTotalSplits:" << nTotalSplits
261 else if (nSplitEdges + nModPoints == 1)
265 Warning <<
"Face " << faceI <<
" has only one edge cut " <<
endl;
276 label patchID, zoneID, zoneFlip;
277 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
280 face extendedFace(addEdgeCutsToFace(faceI, edgeToAddedPoints));
287 if (extendedFace[fp] >= mesh_.nPoints())
299 if (pointToPos.found(extendedFace[fp]))
315 bool modifiedFace =
false;
339 DynamicList<label> newFace(extendedFace.size());
345 label pointI = extendedFace[fp];
347 newFace.append(pointI);
353 pointI >= mesh_.nPoints()
354 || pointToPos.found(pointI)
360 tmpFace.transfer(newFace);
363 addFace(faceI, tmpFace, modifiedFace, meshMod);
366 newFace.append(extendedFace[startFp]);
367 newFace.append(extendedFace[fp]);
370 fp = (fp+1) % extendedFace.size();
374 if (newFace.size() > 2)
378 tmpFace.transfer(newFace);
381 addFace(faceI, tmpFace, modifiedFace, meshMod);
419 edgeAddedPoints_.clear();
421 faceAddedPoint_.clear();
422 faceAddedPoint_.resize(faceToFeaturePoint.
size());
455 label edgeI = iter.key();
457 const edge&
e = mesh_.edges()[edgeI];
465 const point& featurePoint = cuts[cutI];
481 if (fnd != edgeToAddedPoints.
end())
485 label sz = addedPoints.
size();
487 addedPoints[sz] = addedPointI;
491 edgeToAddedPoints.insert(edgeI,
labelList(1, addedPointI));
496 Pout<<
"Added point " << addedPointI <<
" for edge " << edgeI
497 <<
" with cuts:" << edgeToAddedPoints[edgeI] <<
endl;
509 label faceI = iter.key();
511 const face& f = mesh_.faces()[faceI];
513 if (faceToSplit.
found(faceI))
516 <<
"Face " << faceI <<
" vertices " << f
517 <<
" is both marked for face-centre decomposition and"
518 <<
" diagonal splitting."
522 if (mesh_.isInternalFace(faceI))
525 <<
"Face " << faceI <<
" vertices " << f
526 <<
" is not an external face. Cannot split it"
541 faceAddedPoint_.insert(faceI, addedPointI);
545 Pout<<
"Added point " << addedPointI <<
" for feature point "
546 << iter() <<
" on face " << faceI <<
" with centre "
547 << mesh_.faceCentres()[faceI] <<
endl;
559 boolList faceUptodate(mesh_.nFaces(),
false);
565 label faceI = iter.key();
568 face newFace(addEdgeCutsToFace(faceI, edgeToAddedPoints));
570 label addedPointI = iter();
573 label patchID, zoneID, zoneFlip;
574 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
575 label own = mesh_.faceOwner()[faceI];
576 label masterPoint = mesh_.faces()[faceI][0];
586 tri[0] = newFace[fp];
588 tri[2] = addedPointI;
631 faceUptodate[faceI] =
true;
638 label faceI = iter.key();
640 const face& f = mesh_.faces()[faceI];
642 if (faceAddedPoint_.found(faceI))
645 <<
"Face " << faceI <<
" vertices " << f
646 <<
" is both marked for face-centre decomposition and"
647 <<
" diagonal splitting."
653 face newFace(addEdgeCutsToFace(faceI, edgeToAddedPoints));
656 label patchID, zoneID, zoneFlip;
657 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
658 label own = mesh_.faceOwner()[faceI];
659 label masterPoint = mesh_.faces()[faceI][0];
664 label fp0 =
findIndex(newFace, f[diag[0]]);
665 label fp1 =
findIndex(newFace, f[diag[1]]);
667 if (fp0 == -1 || fp1 == -1 || fp0 == fp1)
670 <<
"Problem : Face " << faceI <<
" vertices " << f
671 <<
" newFace:" << newFace <<
" diagonal:" << f[diag[0]]
686 newVerts.
append(newFace[fp]);
688 fp = (fp == newFace.
size()-1 ? 0 : fp+1);
692 newVerts.append(newFace[fp1]);
700 face(newVerts.shrink()),
719 newVerts.append(newFace[fp]);
721 fp = (fp == newFace.
size()-1 ? 0 : fp+1);
725 newVerts.append(newFace[fp0]);
732 face(newVerts.shrink()),
745 faceUptodate[faceI] =
true;
753 label edgeI = iter.key();
755 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
759 label faceI = eFaces[i];
761 if (!faceUptodate[faceI] && !mesh_.isInternalFace(faceI))
764 if (splitFace(faceI, pointToPos, edgeToAddedPoints, meshMod))
767 faceUptodate[faceI] =
true;
779 label edgeI = iter.key();
781 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
785 label faceI = eFaces[i];
787 if (!faceUptodate[faceI])
790 face newFace(addEdgeCutsToFace(faceI, edgeToAddedPoints));
792 label own = mesh_.faceOwner()[faceI];
796 if (mesh_.isInternalFace(faceI))
798 nei = mesh_.faceNeighbour()[faceI];
801 label patchID, zoneID, zoneFlip;
802 getFaceInfo(faceI, patchID, zoneID, zoneFlip);
820 faceUptodate[faceI] =
true;
827 edgeAddedPoints_.resize(edgeToCuts.size());
831 edgeAddedPoints_.insert(mesh_.edges()[iter.key()], iter());
846 Map<label> newAddedPoints(faceAddedPoint_.size());
850 label oldFaceI = iter.key();
854 label oldPointI = iter();
858 if (newFaceI >= 0 && newPointI >= 0)
860 newAddedPoints.insert(newFaceI, newPointI);
865 faceAddedPoint_.
transfer(newAddedPoints);
877 newEdgeAddedPoints(edgeAddedPoints_.size());
882 edgeAddedPoints_.begin();
883 iter != edgeAddedPoints_.end();
887 const edge&
e = iter.key();
893 if (newStart >= 0 && newEnd >= 0)
902 label newAddedPointI =
905 if (newAddedPointI >= 0)
907 newAddedPoints[newI++] = newAddedPointI;
916 newEdgeAddedPoints.insert(newE, newAddedPoints);
922 edgeAddedPoints_.transfer(newEdgeAddedPoints);