46 Info<<
"Zipping up topologically open cells" <<
endl;
72 label nChangedFacesInMesh;
79 nChangedFacesInMesh = 0;
83 Info <<
"Starting pointFaces addressing " <<
endl;
89 const face&
f = faces[fI];
96 pFaces.setRowSize(pI, nUsage[pI]);
102 const face&
f = faces[fI];
104 pFaces(
f[pI], nUsage[
f[pI]]++) = fI;
110 Info <<
"Starting zipping cells " <<
endl;
125 edgeList curFaceEdges = faces[curFaces[faceI]].edges();
127 forAll (curFaceEdges, faceEdgeI)
129 const edge& curEdge = curFaceEdges[faceEdgeI];
131 forAll (cellEdges, cellEdgeI)
133 if (cellEdges[cellEdgeI] == curEdge)
135 edgeUsage[cellEdgeI]++;
143 label nSingleEdges = 0;
147 if (edgeUsage[edgeI] == 1)
149 singleEdges[nSingleEdges] = cellEdges[edgeI];
152 else if (edgeUsage[edgeI] != 2)
155 <<
"void polyMesh::zipUpCells() : "
156 <<
"edge " << cellEdges[edgeI] <<
" in cell " << cellI
157 <<
" used " << edgeUsage[edgeI] <<
" times. " <<
nl
158 <<
"Should be 1 or 2 - serious error "
159 <<
"in mesh structure. " <<
endl;
164 Info<<
"face: " << faces[curFaces[faceI]]
168 Info<<
"Cell edges: " << cellEdges <<
nl
169 <<
"Edge usage: " << edgeUsage <<
nl
170 <<
"Cell points: " << cellPoints <<
endl;
174 Info<<
"vertex create \"" << cellPoints[cpI]
181 problemCells.
insert(cellI);
186 if (nSingleEdges == 0)
continue;
188 singleEdges.
setSize(nSingleEdges);
195 Info<<
"face: " << faces[curFaces[faceI]] <<
endl;
198 Info<<
"Cell edges: " << cellEdges <<
nl
199 <<
"Edge usage: " << edgeUsage <<
nl
200 <<
"Single edges: " << singleEdges <<
nl
201 <<
"Cell points: " << cellPoints <<
endl;
205 Info<<
"vertex create \"" << cellPoints[cpI]
217 forAll (singleEdges, edgeI)
219 const edge& curEdge = singleEdges[edgeI];
221 forAll (cellPoints, pointI)
225 cellPoints[pointI] == curEdge.
start()
226 || cellPoints[pointI] == curEdge.
end()
229 pointUsage[pointI]++;
238 forAll (singleEdges, edgeI)
240 bool blockedHead =
false;
241 bool blockedTail =
false;
243 label newEdgeStart = singleEdges[edgeI].start();
244 label newEdgeEnd = singleEdges[edgeI].end();
247 forAll (cellPoints, pointI)
249 if (cellPoints[pointI] == newEdgeStart)
251 if (pointUsage[pointI] > 2)
256 else if (cellPoints[pointI] == newEdgeEnd)
258 if (pointUsage[pointI] > 2)
265 if (blockedHead && blockedTail)
268 singleEdgeUsage[edgeI] =
true;
277 label nEdgesToInsert = 0;
280 forAll (singleEdges, edgeI)
284 bool blockHead =
false;
285 bool blockTail =
false;
287 if (!singleEdgeUsage[edgeI])
290 singleEdgeUsage[edgeI] =
true;
292 label newEdgeStart = singleEdges[edgeI].start();
293 label newEdgeEnd = singleEdges[edgeI].end();
295 pointChain.
insert(newEdgeStart);
296 pointChain.
append(newEdgeEnd);
299 Info<<
"found edge to start with: "
300 << singleEdges[edgeI] <<
endl;
304 forAll (cellPoints, pointI)
306 if (cellPoints[pointI] == newEdgeStart)
308 if (pointUsage[pointI] > 2)
311 Info <<
"start head blocked" <<
endl;
317 else if(cellPoints[pointI] == newEdgeEnd)
319 if (pointUsage[pointI] > 2)
322 Info <<
"start tail blocked" <<
endl;
330 bool stopSearching =
false;
335 stopSearching =
false;
337 forAll (singleEdges, addEdgeI)
339 if (!singleEdgeUsage[addEdgeI])
343 singleEdges[addEdgeI].start();
346 singleEdges[addEdgeI].end();
349 Info<<
"Trying candidate "
350 << singleEdges[addEdgeI] <<
endl;
356 if (pointChain.
first() == addStart)
359 pointChain.
insert(addEnd);
361 singleEdgeUsage[addEdgeI] =
true;
363 else if (pointChain.
first() == addEnd)
365 pointChain.
insert(addStart);
367 singleEdgeUsage[addEdgeI] =
true;
373 if (!blockTail && !singleEdgeUsage[addEdgeI])
375 if (pointChain.
last() == addStart)
378 pointChain.
append(addEnd);
380 singleEdgeUsage[addEdgeI] =
true;
382 else if (pointChain.
last() == addEnd)
384 pointChain.
append(addStart);
386 singleEdgeUsage[addEdgeI] =
true;
395 Info<<
"curEdgeStart: " << curEdgeStart
396 <<
" curEdgeEnd: " << curEdgeEnd <<
endl;
399 forAll (cellPoints, pointI)
401 if (cellPoints[pointI] == curEdgeStart)
403 if (pointUsage[pointI] > 2)
412 else if(cellPoints[pointI] == curEdgeEnd)
414 if (pointUsage[pointI] > 2)
426 if (curEdgeStart == curEdgeEnd)
437 stopSearching =
true;
441 Info<<
"current pointChain: " << pointChain
445 if (stopSearching)
break;
448 }
while (stopSearching);
452 Info <<
"completed patch chain: " << pointChain <<
endl;
455 if (pointChain.size() > 2)
457 edgesToInsert[nEdgesToInsert] = pointChain;
462 edgesToInsert.
setSize(nEdgesToInsert);
465 Info <<
"edgesToInsert: " << edgesToInsert <<
endl;
469 forAll (edgesToInsert, edgeToInsertI)
477 const labelList& unorderedEdge = edgesToInsert[edgeToInsertI];
486 points[unorderedEdge[unorderedEdge.size() - 1]]
489 for (
label i = 1; i < dist.size(); i++)
491 dist[i] = (
points[unorderedEdge[i]] - startPoint) & dir;
495 labelList orderedEdge(unorderedEdge.size(), -1);
496 boolList used(unorderedEdge.size(),
false);
500 label nextPoint = -1;
501 scalar minDist = GREAT;
505 if (!used[i] && dist[i] < minDist)
513 orderedEdge[epI] = unorderedEdge[nextPoint];
514 used[nextPoint] =
true;
518 Info<<
"unorderedEdge: " << unorderedEdge <<
nl
519 <<
"orderedEdge: " << orderedEdge <<
endl;
523 forAll (orderedEdge, checkI)
527 label checkJ = checkI + 1;
528 checkJ < orderedEdge.
size();
532 if (orderedEdge[checkI] == orderedEdge[checkJ])
535 <<
"void polyMesh::zipUpCells() : "
536 <<
"Duplicate point found in edge to insert. "
537 <<
nl <<
"Point: " << orderedEdge[checkI]
538 <<
" edge: " << orderedEdge <<
endl;
540 problemCells.
insert(cellI);
548 orderedEdge[orderedEdge.
size() - 1]
564 facesSharingEdge[nfse++] =
pFaces(start, pfI);
567 facesSharingEdge[nfse++] =
pFaces(end, pfI);
569 forAll(facesSharingEdge, faceI)
571 bool faceChanges =
false;
574 const label currentFaceIndex = facesSharingEdge[faceI];
577 faces[currentFaceIndex].edges();
579 forAll (curFaceEdges, cfeI)
581 if (curFaceEdges[cfeI] == testEdge)
590 nChangedFacesInMesh++;
603 face& newFace = faces[currentFaceIndex];
605 bool allPointsPresent =
true;
609 bool curPointFound =
false;
613 if (newFace[nfI] == orderedEdge[oeI])
615 curPointFound =
true;
621 allPointsPresent && curPointFound;
625 if (allPointsPresent)
627 Info <<
"All points present" <<
endl;
631 if (!allPointsPresent)
644 Info <<
"Not all points present." <<
endl;
647 label nNewFacePoints = 0;
649 bool edgeAdded =
false;
651 forAll (newFaceEdges, curFacEdgI)
654 if (newFaceEdges[curFacEdgI] == testEdge)
664 + orderedEdge.
size() - 2
669 newFaceEdges[curFacEdgI].start()
677 i < orderedEdge.
size() - 1;
681 newFace[nNewFacePoints] =
696 newFace[nNewFacePoints] =
706 newFace[nNewFacePoints] =
707 newFaceEdges[curFacEdgI].start();
721 << faces[currentFaceIndex] <<
nl
722 <<
"newFace: " << newFace <<
endl;
730 label checkJ = checkI + 1;
731 checkJ < newFace.
size();
735 if (newFace[checkI] == newFace[checkJ])
738 <<
"void polyMesh::zipUpCells()"
739 <<
"Duplicate point found "
740 <<
"in the new face. " <<
nl
742 << orderedEdge[checkI]
746 problemCells.
insert(cellI);
757 Info<<
"This edge modifies an already modified "
758 <<
"edge. Point insertions skipped."
767 if (problemCells.
size() > 0)
774 <<
"Found " << problemCells.
size() <<
" problem cells." <<
nl
779 Info<<
"Cycle " << ++nCycles
780 <<
" changed " << nChangedFacesInMesh <<
" faces." <<
endl;
781 }
while (nChangedFacesInMesh > 0 || nCycles > 100);
783 if (nChangedFacesInMesh > 0)
786 <<
"cell zip-up failed after 100 cycles. Probable problem "
787 <<
"with the original mesh"
790 Info <<
"Finished zipping the mesh." <<
endl;