52 bool Foam::combineFaces::convexFace
54 const scalar minConcaveCos,
60 vector n = f.normal(points);
64 vector ePrev(points[f[0]] - points[f[f.size()-1]]);
65 scalar magEPrev =
mag(ePrev);
66 ePrev /= magEPrev + VSMALL;
71 label fp1 = f.fcIndex(fp0);
74 vector e10(points[f[fp1]] - points[f[fp0]]);
75 scalar magE10 =
mag(e10);
76 e10 /= magE10 + VSMALL;
78 if (magEPrev > SMALL && magE10 > SMALL)
80 vector edgeNormal = ePrev ^ e10;
82 if ((edgeNormal & n) < 0)
85 if ((ePrev & e10) < minConcaveCos)
102 bool Foam::combineFaces::validFace
104 const scalar minConcaveCos,
111 if (edgeLoops.size() > 1)
117 face
f(getOutsideFace(bigFace));
119 return convexFace(minConcaveCos, bigFace.points(),
f);
123 void Foam::combineFaces::regioniseFaces
128 Map<label>& faceRegion
131 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
135 label edgeI = cEdges[i];
140 label p0 = patches.whichPatch(f0);
141 label p1 = patches.whichPatch(f1);
146 if (p0 != -1 && p0 == p1 && !patches[p0].coupled())
148 vector f0Normal = mesh_.faceAreas()[f0];
149 f0Normal /=
mag(f0Normal);
150 vector f1Normal = mesh_.faceAreas()[f1];
151 f1Normal /=
mag(f1Normal);
153 if ((f0Normal&f1Normal) > minCos)
158 if (f0Fnd != faceRegion.end())
166 if (f1Fnd != faceRegion.end())
175 label useRegion = faceRegion.size();
176 faceRegion.insert(f0, useRegion);
177 faceRegion.insert(f1, useRegion);
181 faceRegion.insert(f0, region1);
188 faceRegion.insert(f1, region0);
190 else if (region0 != region1)
193 label useRegion =
min(region0, region1);
194 label freeRegion =
max(region0, region1);
198 if (iter() == freeRegion)
211 bool Foam::combineFaces::faceNeighboursValid
214 const Map<label>& faceRegion
217 if (faceRegion.size() <= 1)
222 const cell& cFaces = mesh_.cells()[cellI];
224 DynamicList<label> storage;
229 label faceI = cFaces[cFaceI];
231 if (!faceRegion.found(faceI))
233 const labelList& fEdges = mesh_.faceEdges(faceI, storage);
239 DynamicList<label> neighbourFaces(cFaces.size());
245 label edgeI = fEdges[i];
250 if (iter == faceRegion.end())
252 if (
findIndex(neighbourFaces, nbrI) == -1)
254 neighbourFaces.append(nbrI);
259 neighbourRegions.insert(iter());
263 if ((neighbourFaces.size()+neighbourRegions.size()) < 3)
276 Foam::combineFaces::combineFaces
285 faceSetsVertices_(0),
286 savedPointLabels_(0),
295 const scalar featureCos,
296 const scalar minConcaveCos,
308 label cellI = iter.key();
310 const cell& cFaces = mesh_.cells()[cellI];
312 const labelList& cEdges = mesh_.cellEdges(cellI, storage);
316 regioniseFaces(featureCos, cellI, cEdges, faceRegion);
324 if (faceNeighboursValid(cellI, faceRegion))
331 label faceI = iter.key();
332 label region = iter();
336 if (regionFnd != regionToFaces.
end())
339 label sz = setFaces.
size();
341 setFaces[sz] = faceI;
345 regionToFaces.insert(region,
labelList(1, faceI));
365 if (validFace(minConcaveCos, bigFace))
367 allFaceSets.append(iter());
373 return allFaceSets.shrink();
379 const scalar featureCos,
380 const scalar minConcaveCos
386 labelHashSet boundaryCells(mesh_.nFaces()-mesh_.nInternalFaces());
390 const polyPatch& patch = patches[patchI];
396 boundaryCells.
insert(mesh_.faceOwner()[patch.
start()+i]);
401 return getMergeSets(featureCos, minConcaveCos, boundaryCells);
417 "combineFaces::getOutsideFace(const indirectPrimitivePatch&)"
418 ) <<
"Multiple outside loops:" << fp.
edgeLoops()
430 if (eFaces.
size() != 1)
434 "combineFaces::getOutsideFace(const indirectPrimitivePatch&)"
435 ) <<
"boundary edge:" << bEdgeI
438 <<
" on indirectPrimitivePatch has " << eFaces.
size()
452 bool edgeLoopConsistent =
false;
455 label index0 =
findIndex(outsideLoop, e[0]);
456 label index1 =
findIndex(outsideLoop, e[1]);
458 if (index0 == -1 || index1 == -1)
462 "combineFaces::getOutsideFace"
463 "(const indirectPrimitivePatch&)"
464 ) <<
"Cannot find boundary edge:" << e
469 else if (index1 == outsideLoop.
fcIndex(index0))
471 edgeLoopConsistent =
true;
473 else if (index0 == outsideLoop.
fcIndex(index1))
475 edgeLoopConsistent =
false;
481 "combineFaces::getOutsideFace"
482 "(const indirectPrimitivePatch&)"
483 ) <<
"Cannot find boundary edge:" << e
486 <<
" on consecutive points in edgeLoop:"
500 bool faceEdgeConsistent =
false;
510 "combineFaces::getOutsideFace"
511 "(const indirectPrimitivePatch&)"
512 ) <<
"Cannot find boundary edge:" << e
515 <<
" in face:" << eFaces[0]
516 <<
" edges:" << fp.
faceEdges()[eFaces[0]]
519 else if (localF[index] == e[0] && localF.
nextLabel(index) == e[1])
521 faceEdgeConsistent =
true;
523 else if (localF[index] == e[1] && localF.
nextLabel(index) == e[0])
525 faceEdgeConsistent =
false;
531 "combineFaces::getOutsideFace"
532 "(const indirectPrimitivePatch&)"
533 ) <<
"Cannot find boundary edge:" << e
536 <<
" in face:" << eFaces[0] <<
" verts:" << localF
544 if (faceEdgeConsistent != edgeLoopConsistent)
560 masterFace_.setSize(faceSets.
size());
561 faceSetsVertices_.setSize(faceSets.
size());
564 const labelList& setFaces = faceSets[setI];
566 masterFace_[setI] = setFaces[0];
576 labelList nPointFaces(mesh_.nPoints(), 0);
580 forAll(pointFaces, pointI)
582 nPointFaces[pointI] = pointFaces[pointI].size();
589 const labelList& setFaces = faceSets[setI];
596 label patchI = patches.
whichPatch(setFaces[i]);
598 if (patchI == -1 || patches[patchI].coupled())
602 "combineFaces::setRefinement"
603 "(const bool, const labelListList&"
605 ) <<
"Can only merge non-coupled boundary faces"
606 <<
" but found internal or coupled face:"
607 << setFaces[i] <<
" in set " << setI
627 if (edgeLoops.size() != 1)
631 "combineFaces::setRefinement"
632 "(const bool, const labelListList&, polyTopoChange&)"
633 ) <<
"Faces to-be-merged " << setFaces
634 <<
" do not form a single big face." <<
nl
644 label masterFaceI = setFaces[0];
647 face outsideFace(getOutsideFace(bigFace));
649 label zoneID = mesh_.faceZones().whichZone(masterFaceI);
651 bool zoneFlip =
false;
655 const faceZone& fZone = mesh_.faceZones()[zoneID];
660 label patchI = mesh_.boundaryMesh().whichPatch(masterFaceI);
668 mesh_.faceOwner()[masterFaceI],
682 for (label i = 1; i < setFaces.
size(); i++)
694 const face& f = mesh_.faces()[setFaces[i]];
698 nPointFaces[f[fp]]--;
704 nPointFaces[outsideFace[fp]]++;
722 forAll(nPointFaces, pointI)
724 if (nPointFaces[pointI] == 0)
734 forAll(nPointFaces, pointI)
736 if (nPointFaces[pointI] == 0)
742 savedPointLabels_.setSize(n);
743 savedPoints_.setSize(n);
748 forAll(nPointFaces, pointI)
750 if (nPointFaces[pointI] == 0)
754 savedPointLabels_[n] = pointI;
755 savedPoints_[n] = mesh_.points()[pointI];
757 meshToSaved.
insert(pointI, n);
763 forAll(faceSetsVertices_, setI)
765 faceList& setFaces = faceSetsVertices_[setI];
769 face& f = setFaces[i];
773 label pointI = f[fp];
775 if (nPointFaces[pointI] == 0)
777 f[fp] = -meshToSaved[pointI]-1;
795 forAll(faceSetsVertices_, setI)
797 faceList& faces = faceSetsVertices_[setI];
806 label pointI = f[fp];
816 "combineFaces::updateMesh"
817 "(const mapPolyMesh&)"
818 ) <<
"In set " << setI <<
" at position " << i
819 <<
" with master face "
820 << masterFace_[setI] <<
nl
821 <<
"the points of the slave face " << faces[i]
822 <<
" don't exist anymore."
850 "combineFaces::setUnrefinement"
851 "(const labelList&, polyTopoChange&"
852 ", Map<label>&, Map<label>&, Map<label>&)"
853 ) <<
"Can only call setUnrefinement if constructed with"
859 labelList addedPoints(savedPoints_.size(), -1);
866 if (masterFace_[setI] >= 0)
868 masterToSet.insert(masterFace_[setI], setI);
874 label masterFaceI = masterFaces[i];
878 if (iter == masterToSet.
end())
882 "combineFaces::setUnrefinement"
883 "(const labelList&, polyTopoChange&"
884 ", Map<label>&, Map<label>&, Map<label>&)"
885 ) <<
"Master face " << masterFaceI
886 <<
" is not the master of one of the merge sets"
887 <<
" or has already been merged"
897 faceList& faces = faceSetsVertices_[setI];
903 "combineFaces::setUnrefinement"
904 "(const labelList&, polyTopoChange&"
905 ", Map<label>&, Map<label>&, Map<label>&)"
906 ) <<
"Set " << setI <<
" with master face " << masterFaceI
916 label pointI = f[fp];
920 label localI = -pointI-1;
922 if (addedPoints[localI] == -1)
929 savedPoints_[localI],
938 savedPointLabels_[localI]
942 f[fp] = addedPoints[localI];
951 label own = mesh_.faceOwner()[masterFaceI];
952 label zoneID = mesh_.faceZones().whichZone(masterFaceI);
953 bool zoneFlip =
false;
956 const faceZone& fZone = mesh_.faceZones()[zoneID];
959 label patchI = mesh_.boundaryMesh().whichPatch(masterFaceI);
961 if (mesh_.boundaryMesh()[patchI].coupled())
965 "combineFaces::setUnrefinement"
966 "(const labelList&, polyTopoChange&"
967 ", Map<label>&, Map<label>&, Map<label>&)"
968 ) <<
"Master face " << masterFaceI <<
" is on coupled patch "
969 << mesh_.boundaryMesh()[patchI].name()
994 for (label i = 1; i < faces.
size(); i++)
1018 faceSetsVertices_[setI].clear();
1019 masterFace_[setI] = -1;