49 forAll(meshMod.points(), i)
51 points[i] = meshMod.points()[i];
63 if (nUnique <
points.size())
69 if (newToOld[newI].size() != 1)
72 <<
"duplicate verts:" << newToOld[newI]
74 << UIndirectList<point>(
points, newToOld[newI])()
85 const polyTopoChange& meshMod,
86 const fileName& prefix
89 OFstream str1(prefix +
"Faces.obj");
90 OFstream str2(prefix +
"Edges.obj");
92 Info<<
"Dumping current polyTopoChange. Faces to " << str1.name()
93 <<
" , points and edges to " << str2.name() <<
endl;
95 const DynamicList<point>&
points = meshMod.points();
103 const DynamicList<face>& faces = meshMod.faces();
107 const face&
f = faces[faceI];
112 str1<<
' ' <<
f[fp]+1;
119 str2<<
' ' <<
f[fp]+1;
121 str2<<
' ' <<
f[0]+1 <<
nl;
134 const labelList& dualCells = pointToDualCells_[pointI];
136 if (dualCells.size() == 1)
144 return dualCells[index];
153 const PackedBoolList& isBoundaryEdge,
155 polyTopoChange& meshMod
158 const labelList& pEdges = mesh_.pointEdges()[pointI];
162 label edgeI = pEdges[pEdgeI];
164 if (edgeToDualPoint_[edgeI] == -1 && isBoundaryEdge.get(edgeI) == 1)
166 const edge&
e = mesh_.edges()[edgeI];
168 edgeToDualPoint_[edgeI] = meshMod.addPoint
170 e.centre(mesh_.points()),
188 if (!mesh_.isInternalFace(faceI))
191 <<
"face:" << faceI <<
" is not internal face."
195 label own = mesh_.faceOwner()[faceI];
196 label nei = mesh_.faceNeighbour()[faceI];
198 return findDualCell(own, pointI) == findDualCell(nei, pointI);
204 const label masterPointI,
205 const label masterEdgeI,
206 const label masterFaceI,
208 const bool edgeOrder,
209 const label dualCell0,
210 const label dualCell1,
211 const DynamicList<label>& verts,
212 polyTopoChange& meshMod
217 if (edgeOrder != (dualCell0 < dualCell1))
224 pointField facePoints(meshMod.points(), newFace);
235 if (nUnique < facePoints.size())
238 <<
"verts:" << verts <<
" newFace:" << newFace
239 <<
" face points:" << facePoints
246 bool zoneFlip =
false;
247 if (masterFaceI != -1)
249 zoneID = mesh_.faceZones().whichZone(masterFaceI);
253 const faceZone& fZone = mesh_.faceZones()[zoneID];
255 zoneFlip = fZone.flipMap()[fZone.whichFace(masterFaceI)];
261 if (dualCell0 < dualCell1)
263 dualFaceI = meshMod.addFace
290 dualFaceI = meshMod.addFace
321 const label masterPointI,
322 const label masterEdgeI,
323 const label masterFaceI,
325 const label dualCellI,
327 const DynamicList<label>& verts,
328 polyTopoChange& meshMod
334 bool zoneFlip =
false;
335 if (masterFaceI != -1)
337 zoneID = mesh_.faceZones().whichZone(masterFaceI);
341 const faceZone& fZone = mesh_.faceZones()[zoneID];
343 zoneFlip = fZone.flipMap()[fZone.whichFace(masterFaceI)];
347 label dualFaceI = meshMod.addFace
380 const bool splitFace,
381 const PackedBoolList& isBoundaryEdge,
383 const label startFaceI,
384 polyTopoChange& meshMod,
388 const edge&
e = mesh_.edges()[edgeI];
389 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
393 mesh_.faces()[startFaceI],
398 edgeFaceCirculator ie
404 isBoundaryEdge.get(edgeI) == 1
408 bool edgeOrder = ie.sameOrder(
e[0],
e[1]);
409 label startFaceLabel = ie.faceLabel();
420 DynamicList<label> verts(100);
422 if (edgeToDualPoint_[edgeI] != -1)
424 verts.append(edgeToDualPoint_[edgeI]);
426 if (faceToDualPoint_[ie.faceLabel()] != -1)
428 doneEFaces[
findIndex(eFaces, ie.faceLabel())] =
true;
429 verts.append(faceToDualPoint_[ie.faceLabel()]);
431 if (cellToDualPoint_[ie.cellLabel()] != -1)
433 verts.append(cellToDualPoint_[ie.cellLabel()]);
436 label currentDualCell0 = findDualCell(ie.cellLabel(),
e[0]);
437 label currentDualCell1 = findDualCell(ie.cellLabel(),
e[1]);
443 label faceI = ie.faceLabel();
446 doneEFaces[
findIndex(eFaces, faceI)] =
true;
448 if (faceToDualPoint_[faceI] != -1)
450 verts.append(faceToDualPoint_[faceI]);
453 label cellI = ie.cellLabel();
463 label dualCell0 = findDualCell(cellI,
e[0]);
464 label dualCell1 = findDualCell(cellI,
e[1]);
472 dualCell0 != currentDualCell0
473 || dualCell1 != currentDualCell1
491 currentDualCell0 = dualCell0;
492 currentDualCell1 = dualCell1;
495 if (edgeToDualPoint_[edgeI] != -1)
497 verts.append(edgeToDualPoint_[edgeI]);
499 if (faceToDualPoint_[faceI] != -1)
501 verts.append(faceToDualPoint_[faceI]);
505 if (cellToDualPoint_[cellI] != -1)
507 verts.append(cellToDualPoint_[cellI]);
516 if (isBoundaryEdge.get(edgeI) == 0)
518 label startDual = faceToDualPoint_[startFaceLabel];
520 if (startDual != -1 &&
findIndex(verts, startDual) == -1)
522 verts.append(startDual);
551 polyTopoChange& meshMod
554 const face&
f = mesh_.faces()[faceI];
555 const labelList& fEdges = mesh_.faceEdges()[faceI];
556 label own = mesh_.faceOwner()[faceI];
557 label nei = mesh_.faceNeighbour()[faceI];
568 DynamicList<label> verts(100);
570 verts.append(faceToDualPoint_[faceI]);
571 verts.append(edgeToDualPoint_[fEdges[fp]]);
577 label currentDualCell0 = findDualCell(own,
f[fp]);
578 label currentDualCell1 = findDualCell(nei,
f[fp]);
583 if (pointToDualPoint_[
f[fp]] != -1)
585 verts.append(pointToDualPoint_[
f[fp]]);
589 label edgeI = fEdges[fp];
591 if (edgeToDualPoint_[edgeI] != -1)
593 verts.append(edgeToDualPoint_[edgeI]);
597 label nextFp =
f.fcIndex(fp);
600 label dualCell0 = findDualCell(own,
f[nextFp]);
601 label dualCell1 = findDualCell(nei,
f[nextFp]);
603 if (dualCell0 != currentDualCell0 || dualCell1 != currentDualCell1)
606 if (edgeToDualPoint_[edgeI] == -1)
609 <<
"face:" << faceI <<
" verts:" <<
f
610 <<
" points:" << UIndirectList<point>(mesh_.points(),
f)()
611 <<
" no feature edge between " <<
f[fp]
612 <<
" and " <<
f[nextFp] <<
" although have different"
613 <<
" dual cells." <<
endl
614 <<
"point " <<
f[fp] <<
" has dual cells "
615 << currentDualCell0 <<
" and " << currentDualCell1
616 <<
" ; point "<<
f[nextFp] <<
" has dual cells "
617 << dualCell0 <<
" and " << dualCell1
648 const label patchPointI,
649 const label startFaceI,
650 polyTopoChange& meshMod,
654 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
655 const polyPatch& pp =
patches[patchI];
657 const labelList& own = mesh_.faceOwner();
659 label pointI = pp.meshPoints()[patchPointI];
661 if (pointToDualPoint_[pointI] == -1)
667 label faceI = startFaceI;
669 DynamicList<label> verts(4);
676 if (donePFaces[index])
680 donePFaces[index] =
true;
683 verts.append(faceToDualPoint_[faceI]);
685 label dualCellI = findDualCell(own[faceI], pointI);
688 const face&
f = mesh_.faces()[faceI];
690 label prevFp =
f.rcIndex(fp);
691 label edgeI = mesh_.faceEdges()[faceI][prevFp];
693 if (edgeToDualPoint_[edgeI] != -1)
695 verts.append(edgeToDualPoint_[edgeI]);
699 edgeFaceCirculator circ
712 while (mesh_.isInternalFace(circ.faceLabel()));
715 faceI = circ.faceLabel();
717 if (faceI < pp.start() || faceI >= pp.start()+pp.size())
720 <<
"Walked from face on patch:" << patchI
721 <<
" to face:" << faceI
722 <<
" fc:" << mesh_.faceCentres()[faceI]
723 <<
" on patch:" <<
patches.whichPatch(faceI)
728 if (dualCellI != findDualCell(own[faceI], pointI))
731 <<
"Different dual cells but no feature edge"
732 <<
" inbetween point:" << pointI
733 <<
" coord:" << mesh_.points()[pointI]
740 label dualCellI = findDualCell(own[faceI], pointI);
760 label faceI = startFaceI;
763 DynamicList<label> verts(mesh_.faces()[faceI].size());
766 verts.append(pointToDualPoint_[pointI]);
769 const labelList& fEdges = mesh_.faceEdges()[faceI];
770 label nextEdgeI = fEdges[
findIndex(mesh_.faces()[faceI], pointI)];
771 if (edgeToDualPoint_[nextEdgeI] != -1)
773 verts.append(edgeToDualPoint_[nextEdgeI]);
781 if (donePFaces[index])
785 donePFaces[index] =
true;
788 verts.append(faceToDualPoint_[faceI]);
791 const labelList& fEdges = mesh_.faceEdges()[faceI];
792 const face&
f = mesh_.faces()[faceI];
794 label edgeI = fEdges[prevFp];
796 if (edgeToDualPoint_[edgeI] != -1)
800 verts.append(edgeToDualPoint_[edgeI]);
806 findDualCell(own[faceI], pointI),
813 verts.append(pointToDualPoint_[pointI]);
814 verts.append(edgeToDualPoint_[edgeI]);
818 edgeFaceCirculator circ
831 while (mesh_.isInternalFace(circ.faceLabel()));
834 faceI = circ.faceLabel();
839 && faceI >= pp.start()
840 && faceI < pp.start()+pp.size()
843 if (verts.size() > 2)
851 findDualCell(own[faceI], pointI),
866 pointToDualCells_(mesh_.
nPoints()),
867 pointToDualPoint_(mesh_.
nPoints(), -1),
868 cellToDualPoint_(mesh_.nCells()),
869 faceToDualPoint_(mesh_.nFaces(), -1),
870 edgeToDualPoint_(mesh_.nEdges(), -1)
878 const bool splitFace,
881 const labelList& singleCellFeaturePoints,
883 polyTopoChange& meshMod
886 const labelList& own = mesh_.faceOwner();
887 const labelList& nei = mesh_.faceNeighbour();
888 const vectorField& cellCentres = mesh_.cellCentres();
893 PackedBoolList isBoundaryEdge(mesh_.nEdges());
894 for (
label faceI = mesh_.nInternalFaces(); faceI < mesh_.nFaces(); faceI++)
896 const labelList& fEdges = mesh_.faceEdges()[faceI];
900 isBoundaryEdge.set(fEdges[i], 1);
914 boolList featureFaceSet(mesh_.nFaces(),
false);
917 featureFaceSet[featureFaces[i]] =
true;
924 <<
"In split-face-mode (splitFace=true) but not all faces"
925 <<
" marked as feature faces." <<
endl
926 <<
"First conflicting face:" << faceI
927 <<
" centre:" << mesh_.faceCentres()[faceI]
931 boolList featureEdgeSet(mesh_.nEdges(),
false);
934 featureEdgeSet[featureEdges[i]] =
true;
940 const edge&
e = mesh_.edges()[edgeI];
942 <<
"In split-face-mode (splitFace=true) but not all edges"
943 <<
" marked as feature edges." <<
endl
944 <<
"First conflicting edge:" << edgeI
946 <<
" coords:" << mesh_.points()[
e[0]] << mesh_.points()[
e[1]]
954 boolList featureFaceSet(mesh_.nFaces(),
false);
957 featureFaceSet[featureFaces[i]] =
true;
961 label faceI = mesh_.nInternalFaces();
962 faceI < mesh_.nFaces();
966 if (!featureFaceSet[faceI])
969 <<
"Not all boundary faces marked as feature faces."
971 <<
"First conflicting face:" << faceI
972 <<
" centre:" << mesh_.faceCentres()[faceI]
1002 autoPtr<OFstream> dualCcStr;
1005 dualCcStr.reset(
new OFstream(
"dualCc.obj"));
1006 Pout<<
"Dumping centres of dual cells to " << dualCcStr().
name()
1021 forAll(singleCellFeaturePoints, i)
1023 label pointI = singleCellFeaturePoints[i];
1025 pointToDualPoint_[pointI] = meshMod.addPoint
1027 mesh_.points()[pointI],
1029 mesh_.pointZones().whichZone(pointI),
1034 pointToDualCells_[pointI].setSize(1);
1035 pointToDualCells_[pointI][0] = meshMod.addCell
1043 if (dualCcStr.valid())
1050 forAll(multiCellFeaturePoints, i)
1052 label pointI = multiCellFeaturePoints[i];
1054 if (pointToDualCells_[pointI].size() > 0)
1057 <<
"Point " << pointI <<
" at:" << mesh_.points()[pointI]
1058 <<
" is both in singleCellFeaturePoints"
1059 <<
" and multiCellFeaturePoints."
1063 pointToDualPoint_[pointI] = meshMod.addPoint
1065 mesh_.points()[pointI],
1067 mesh_.pointZones().whichZone(pointI),
1073 const labelList& pCells = mesh_.pointCells()[pointI];
1075 pointToDualCells_[pointI].
setSize(pCells.size());
1079 pointToDualCells_[pointI][pCellI] = meshMod.addCell
1085 mesh_.cellZones().whichZone(pCells[pCellI])
1087 if (dualCcStr.valid())
1092 0.5*(mesh_.points()[pointI]+cellCentres[pCells[pCellI]])
1098 forAll(mesh_.points(), pointI)
1100 if (pointToDualCells_[pointI].empty())
1102 pointToDualCells_[pointI].setSize(1);
1103 pointToDualCells_[pointI][0] = meshMod.addCell
1112 if (dualCcStr.valid())
1123 forAll(cellToDualPoint_, cellI)
1125 cellToDualPoint_[cellI] = meshMod.addPoint
1128 mesh_.faces()[mesh_.cells()[cellI][0]][0],
1138 label faceI = featureFaces[i];
1140 faceToDualPoint_[faceI] = meshMod.addPoint
1142 mesh_.faceCentres()[faceI],
1143 mesh_.faces()[faceI][0],
1151 for (
label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
1153 if (faceToDualPoint_[faceI] == -1)
1155 const face&
f = mesh_.faces()[faceI];
1159 label ownDualCell = findDualCell(own[faceI],
f[fp]);
1160 label neiDualCell = findDualCell(nei[faceI],
f[fp]);
1162 if (ownDualCell != neiDualCell)
1164 faceToDualPoint_[faceI] = meshMod.addPoint
1166 mesh_.faceCentres()[faceI],
1182 label edgeI = featureEdges[i];
1184 const edge&
e = mesh_.edges()[edgeI];
1186 edgeToDualPoint_[edgeI] = meshMod.addPoint
1188 e.centre(mesh_.points()),
1203 if (edgeToDualPoint_[edgeI] == -1)
1205 const edge&
e = mesh_.edges()[edgeI];
1210 const labelList& eCells = mesh_.edgeCells()[edgeI];
1212 label dualE0 = findDualCell(eCells[0],
e[0]);
1213 label dualE1 = findDualCell(eCells[0],
e[1]);
1215 for (
label i = 1; i < eCells.size(); i++)
1217 label newDualE0 = findDualCell(eCells[i],
e[0]);
1219 if (dualE0 != newDualE0)
1221 edgeToDualPoint_[edgeI] = meshMod.addPoint
1223 e.centre(mesh_.points()),
1225 mesh_.pointZones().whichZone(
e[0]),
1232 label newDualE1 = findDualCell(eCells[i],
e[1]);
1234 if (dualE1 != newDualE1)
1236 edgeToDualPoint_[edgeI] = meshMod.addPoint
1238 e.centre(mesh_.points()),
1240 mesh_.pointZones().whichZone(
e[1]),
1252 forAll(singleCellFeaturePoints, i)
1254 generateDualBoundaryEdges
1257 singleCellFeaturePoints[i],
1261 forAll(multiCellFeaturePoints, i)
1263 generateDualBoundaryEdges
1266 multiCellFeaturePoints[i],
1275 dumpPolyTopoChange(meshMod,
"generatedPoints_");
1276 checkPolyTopoChange(meshMod);
1290 const edgeList& edges = mesh_.edges();
1294 const labelList& eFaces = mesh_.edgeFaces()[edgeI];
1296 boolList doneEFaces(eFaces.size(),
false);
1306 label startFaceI = eFaces[i];
1315 createFacesAroundEdge
1330 dumpPolyTopoChange(meshMod,
"generatedFacesFromEdges_");
1339 forAll(faceToDualPoint_, faceI)
1341 if (faceToDualPoint_[faceI] != -1 && mesh_.isInternalFace(faceI))
1343 const face&
f = mesh_.faces()[faceI];
1344 const labelList& fEdges = mesh_.faceEdges()[faceI];
1353 bool foundStart =
false;
1359 edgeToDualPoint_[fEdges[fp]] != -1
1360 && !sameDualCell(faceI,
f.nextLabel(fp))
1376 createFaceFromInternalFace
1389 dumpPolyTopoChange(meshMod,
"generatedFacesFromFeatFaces_");
1395 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
1399 const polyPatch& pp =
patches[patchI];
1403 forAll(pointFaces, patchPointI)
1423 createFacesAroundBoundaryPoint
1438 dumpPolyTopoChange(meshMod,
"generatedFacesFromBndFaces_");