40 Info<<
"bool polyMeshZipUpCells(polyMesh& mesh) const: "
41 <<
"zipping up topologically open cells" <<
endl;
62 label nChangedFacesInMesh = 0;
69 nChangedFacesInMesh = 0;
82 const edgeList cellEdges = Cells[cellI].edges(oldFaces);
83 const labelList cellPoints = Cells[cellI].labels(oldFaces);
91 edgeList curFaceEdges = oldFaces[curFaces[faceI]].edges();
93 forAll (curFaceEdges, faceEdgeI)
95 const edge& curEdge = curFaceEdges[faceEdgeI];
97 forAll (cellEdges, cellEdgeI)
99 if (cellEdges[cellEdgeI] == curEdge)
101 edgeUsage[cellEdgeI]++;
109 label nSingleEdges = 0;
113 if (edgeUsage[edgeI] == 1)
115 singleEdges[nSingleEdges] = cellEdges[edgeI];
118 else if (edgeUsage[edgeI] != 2)
120 WarningIn(
"void polyMeshZipUpCells(polyMesh& mesh)")
121 <<
"edge " << cellEdges[edgeI] <<
" in cell " << cellI
122 <<
" used " << edgeUsage[edgeI] <<
" times. " <<
nl
123 <<
"Should be 1 or 2 - serious error "
124 <<
"in mesh structure. " <<
endl;
129 Info<<
"face: " << oldFaces[curFaces[faceI]]
133 Info<<
"Cell edges: " << cellEdges <<
nl
134 <<
"Edge usage: " << edgeUsage <<
nl
135 <<
"Cell points: " << cellPoints <<
endl;
139 Info<<
"vertex create \"" << cellPoints[cpI]
141 << Points[cellPoints[cpI]] <<
endl;
146 problemCells.
insert(cellI);
151 if (nSingleEdges == 0)
continue;
153 singleEdges.setSize(nSingleEdges);
160 Info<<
"face: " << oldFaces[curFaces[faceI]] <<
endl;
163 Info<<
"Cell edges: " << cellEdges <<
nl
164 <<
"Edge usage: " << edgeUsage <<
nl
165 <<
"Single edges: " << singleEdges <<
nl
166 <<
"Cell points: " << cellPoints <<
endl;
170 Info<<
"vertex create \"" << cellPoints[cpI]
182 forAll (singleEdges, edgeI)
184 const edge& curEdge = singleEdges[edgeI];
186 forAll (cellPoints, pointI)
190 cellPoints[pointI] == curEdge.
start()
191 || cellPoints[pointI] == curEdge.
end()
194 pointUsage[pointI]++;
199 boolList singleEdgeUsage(singleEdges.size(),
false);
203 forAll (singleEdges, edgeI)
205 bool blockedHead =
false;
206 bool blockedTail =
false;
208 label newEdgeStart = singleEdges[edgeI].start();
209 label newEdgeEnd = singleEdges[edgeI].end();
212 forAll (cellPoints, pointI)
214 if (cellPoints[pointI] == newEdgeStart)
216 if (pointUsage[pointI] > 2)
221 else if (cellPoints[pointI] == newEdgeEnd)
223 if (pointUsage[pointI] > 2)
230 if (blockedHead && blockedTail)
233 singleEdgeUsage[edgeI] =
true;
242 label nEdgesToInsert = 0;
245 forAll (singleEdges, edgeI)
249 bool blockHead =
false;
250 bool blockTail =
false;
252 if (!singleEdgeUsage[edgeI])
255 singleEdgeUsage[edgeI] =
true;
257 label newEdgeStart = singleEdges[edgeI].start();
258 label newEdgeEnd = singleEdges[edgeI].
end();
260 pointChain.
insert(newEdgeStart);
261 pointChain.
append(newEdgeEnd);
264 Info<<
"found edge to start with: "
265 << singleEdges[edgeI] <<
endl;
269 forAll (cellPoints, pointI)
271 if (cellPoints[pointI] == newEdgeStart)
273 if (pointUsage[pointI] > 2)
276 Info <<
"start head blocked" <<
endl;
282 else if(cellPoints[pointI] == newEdgeEnd)
284 if (pointUsage[pointI] > 2)
287 Info <<
"start tail blocked" <<
endl;
295 bool stopSearching =
false;
300 stopSearching =
false;
302 forAll (singleEdges, addEdgeI)
304 if (!singleEdgeUsage[addEdgeI])
308 singleEdges[addEdgeI].start();
311 singleEdges[addEdgeI].end();
314 Info<<
"Trying candidate "
315 << singleEdges[addEdgeI] <<
endl;
321 if (pointChain.
first() == addStart)
324 pointChain.
insert(addEnd);
326 singleEdgeUsage[addEdgeI] =
true;
328 else if (pointChain.
first() == addEnd)
330 pointChain.
insert(addStart);
332 singleEdgeUsage[addEdgeI] =
true;
338 if (!blockTail && !singleEdgeUsage[addEdgeI])
340 if (pointChain.
last() == addStart)
343 pointChain.
append(addEnd);
345 singleEdgeUsage[addEdgeI] =
true;
347 else if (pointChain.
last() == addEnd)
349 pointChain.
append(addStart);
351 singleEdgeUsage[addEdgeI] =
true;
356 label curEdgeStart = pointChain.
first();
357 label curEdgeEnd = pointChain.
last();
360 Info<<
"curEdgeStart: " << curEdgeStart
361 <<
" curEdgeEnd: " << curEdgeEnd <<
endl;
364 forAll (cellPoints, pointI)
366 if (cellPoints[pointI] == curEdgeStart)
368 if (pointUsage[pointI] > 2)
377 else if(cellPoints[pointI] == curEdgeEnd)
379 if (pointUsage[pointI] > 2)
391 if (curEdgeStart == curEdgeEnd)
402 stopSearching =
true;
406 Info<<
"current pointChain: " << pointChain
410 if (stopSearching)
break;
413 }
while (stopSearching);
417 Info <<
"completed patch chain: " << pointChain <<
endl;
420 if (pointChain.
size() > 2)
422 edgesToInsert[nEdgesToInsert] = pointChain;
427 edgesToInsert.setSize(nEdgesToInsert);
430 Info <<
"edgesToInsert: " << edgesToInsert <<
endl;
434 forAll (edgesToInsert, edgeToInsertI)
442 const labelList& unorderedEdge = edgesToInsert[edgeToInsertI];
447 point startPoint = Points[unorderedEdge[0]];
451 Points[unorderedEdge[unorderedEdge.size() - 1]]
454 for (label i = 1; i <
dist.size(); i++)
456 dist[i] = (Points[unorderedEdge[i]] - startPoint) & dir;
460 labelList orderedEdge(unorderedEdge.size(), -1);
461 boolList used(unorderedEdge.size(),
false);
465 label nextPoint = -1;
466 scalar minDist = GREAT;
470 if (!used[i] &&
dist[i] < minDist)
478 orderedEdge[epI] = unorderedEdge[nextPoint];
479 used[nextPoint] =
true;
483 Info<<
"unorderedEdge: " << unorderedEdge <<
nl
484 <<
"orderedEdge: " << orderedEdge <<
endl;
488 forAll (orderedEdge, checkI)
492 label checkJ = checkI + 1;
493 checkJ < orderedEdge.size();
497 if (orderedEdge[checkI] == orderedEdge[checkJ])
499 WarningIn(
"void polyMeshZipUpCells(polyMesh& mesh)")
500 <<
"Duplicate point found in edge to insert. "
501 <<
nl <<
"Point: " << orderedEdge[checkI]
502 <<
" edge: " << orderedEdge <<
endl;
504 problemCells.
insert(cellI);
512 orderedEdge[orderedEdge.size() - 1]
517 const labelList& startPF = pFaces[testEdge.start()];
518 const labelList& endPF = pFaces[testEdge.start()];
525 facesSharingEdge[nfse++] = startPF[pfI];
529 facesSharingEdge[nfse++] = endPF[pfI];
532 forAll (facesSharingEdge, faceI)
534 bool faceChanges =
false;
537 const label currentFaceIndex = facesSharingEdge[faceI];
540 oldFaces[currentFaceIndex].edges();
542 forAll (curFaceEdges, cfeI)
544 if (curFaceEdges[cfeI] == testEdge)
553 nChangedFacesInMesh++;
566 face& newFace = newFaces[currentFaceIndex];
568 bool allPointsPresent =
true;
572 bool curPointFound =
false;
576 if (newFace[nfI] == orderedEdge[oeI])
578 curPointFound =
true;
584 allPointsPresent && curPointFound;
588 if (allPointsPresent)
590 Info <<
"All points present" <<
endl;
594 if (!allPointsPresent)
607 Info <<
"Not all points present." <<
endl;
610 label nNewFacePoints = 0;
612 bool edgeAdded =
false;
614 forAll (newFaceEdges, curFacEdgI)
617 if (newFaceEdges[curFacEdgI] == testEdge)
627 + orderedEdge.size() - 2
632 newFaceEdges[curFacEdgI].start()
640 i < orderedEdge.size() - 1;
644 newFace[nNewFacePoints] =
654 label i = orderedEdge.size() - 1;
659 newFace[nNewFacePoints] =
669 newFace[nNewFacePoints] =
670 newFaceEdges[curFacEdgI].start();
677 << oldFaces[currentFaceIndex] <<
nl
678 <<
"newFace: " << newFace <<
endl;
686 label checkJ = checkI + 1;
687 checkJ < newFace.
size();
691 if (newFace[checkI] == newFace[checkJ])
693 WarningIn(
"void polyMeshZipUpCells(polyMesh& mesh)")
694 <<
"Duplicate point found "
695 <<
"in the new face. " <<
nl
697 << orderedEdge[checkI]
701 problemCells.
insert(cellI);
712 Info<<
"This edge modifies an already modified "
713 <<
"edge. Point insertions skipped."
722 if (problemCells.
size())
729 <<
"Found " << problemCells.
size() <<
" problem cells." <<
nl
734 Info<<
"Cycle " << ++nCycles
735 <<
" changed " << nChangedFacesInMesh <<
" faces." <<
endl;
750 patchSizes[patchI] = bMesh[patchI].
size();
751 patchStarts[patchI] = bMesh[patchI].start();
773 }
while (nChangedFacesInMesh > 0 || nCycles > 100);
778 if (nChangedFacesInMesh > 0)
781 <<
"cell zip-up failed after 100 cycles. Probable problem "
782 <<
"with the original mesh"