42 Info<<
"bool polyMeshZipUpCells(polyMesh& mesh) const: "
43 <<
"zipping up topologically open cells" <<
endl;
64 label nChangedFacesInMesh = 0;
71 nChangedFacesInMesh = 0;
84 const edgeList cellEdges = Cells[celli].edges(oldFaces);
85 const labelList cellPoints = Cells[celli].labels(oldFaces);
93 edgeList curFaceEdges = oldFaces[curFaces[facei]].edges();
95 forAll(curFaceEdges, faceEdgeI)
97 const edge& curEdge = curFaceEdges[faceEdgeI];
99 forAll(cellEdges, cellEdgeI)
101 if (cellEdges[cellEdgeI] == curEdge)
103 edgeUsage[cellEdgeI]++;
111 label nSingleEdges = 0;
115 if (edgeUsage[edgeI] == 1)
117 singleEdges[nSingleEdges] = cellEdges[edgeI];
120 else if (edgeUsage[edgeI] != 2)
123 <<
"edge " << cellEdges[edgeI] <<
" in cell " << celli
124 <<
" used " << edgeUsage[edgeI] <<
" times. " <<
nl
125 <<
"Should be 1 or 2 - serious error "
126 <<
"in mesh structure. " <<
endl;
131 Info<<
"face: " << oldFaces[curFaces[facei]]
135 Info<<
"Cell edges: " << cellEdges <<
nl
136 <<
"Edge usage: " << edgeUsage <<
nl
137 <<
"Cell points: " << cellPoints <<
endl;
141 Info<<
"vertex create \"" << cellPoints[cpI]
143 << Points[cellPoints[cpI]] <<
endl;
148 problemCells.
insert(celli);
153 if (nSingleEdges == 0)
continue;
155 singleEdges.
setSize(nSingleEdges);
162 Info<<
"face: " << oldFaces[curFaces[facei]] <<
endl;
165 Info<<
"Cell edges: " << cellEdges <<
nl
166 <<
"Edge usage: " << edgeUsage <<
nl
167 <<
"Single edges: " << singleEdges <<
nl
168 <<
"Cell points: " << cellPoints <<
endl;
172 Info<<
"vertex create \"" << cellPoints[cpI]
184 forAll(singleEdges, edgeI)
186 const edge& curEdge = singleEdges[edgeI];
188 forAll(cellPoints, pointi)
192 cellPoints[pointi] == curEdge.
start()
193 || cellPoints[pointi] == curEdge.
end()
196 pointUsage[pointi]++;
205 forAll(singleEdges, edgeI)
207 bool blockedHead =
false;
208 bool blockedTail =
false;
210 label newEdgeStart = singleEdges[edgeI].start();
211 label newEdgeEnd = singleEdges[edgeI].
end();
214 forAll(cellPoints, pointi)
216 if (cellPoints[pointi] == newEdgeStart)
218 if (pointUsage[pointi] > 2)
223 else if (cellPoints[pointi] == newEdgeEnd)
225 if (pointUsage[pointi] > 2)
232 if (blockedHead && blockedTail)
235 singleEdgeUsage[edgeI] =
true;
244 label nEdgesToInsert = 0;
247 forAll(singleEdges, edgeI)
251 bool blockHead =
false;
252 bool blockTail =
false;
254 if (!singleEdgeUsage[edgeI])
257 singleEdgeUsage[edgeI] =
true;
259 label newEdgeStart = singleEdges[edgeI].start();
260 label newEdgeEnd = singleEdges[edgeI].
end();
262 pointChain.
insert(newEdgeStart);
263 pointChain.
append(newEdgeEnd);
266 Info<<
"found edge to start with: "
267 << singleEdges[edgeI] <<
endl;
271 forAll(cellPoints, pointi)
273 if (cellPoints[pointi] == newEdgeStart)
275 if (pointUsage[pointi] > 2)
278 Info<<
"start head blocked" <<
endl;
284 else if (cellPoints[pointi] == newEdgeEnd)
286 if (pointUsage[pointi] > 2)
289 Info<<
"start tail blocked" <<
endl;
297 bool stopSearching =
false;
302 stopSearching =
false;
304 forAll(singleEdges, addEdgeI)
306 if (!singleEdgeUsage[addEdgeI])
310 singleEdges[addEdgeI].start();
313 singleEdges[addEdgeI].
end();
316 Info<<
"Trying candidate "
317 << singleEdges[addEdgeI] <<
endl;
323 if (pointChain.
first() == addStart)
326 pointChain.
insert(addEnd);
328 singleEdgeUsage[addEdgeI] =
true;
330 else if (pointChain.
first() == addEnd)
332 pointChain.
insert(addStart);
334 singleEdgeUsage[addEdgeI] =
true;
340 if (!blockTail && !singleEdgeUsage[addEdgeI])
342 if (pointChain.
last() == addStart)
345 pointChain.
append(addEnd);
347 singleEdgeUsage[addEdgeI] =
true;
349 else if (pointChain.
last() == addEnd)
351 pointChain.
append(addStart);
353 singleEdgeUsage[addEdgeI] =
true;
358 label curEdgeStart = pointChain.
first();
359 label curEdgeEnd = pointChain.
last();
362 Info<<
"curEdgeStart: " << curEdgeStart
363 <<
" curEdgeEnd: " << curEdgeEnd <<
endl;
366 forAll(cellPoints, pointi)
368 if (cellPoints[pointi] == curEdgeStart)
370 if (pointUsage[pointi] > 2)
379 else if (cellPoints[pointi] == curEdgeEnd)
381 if (pointUsage[pointi] > 2)
393 if (curEdgeStart == curEdgeEnd)
404 stopSearching =
true;
408 Info<<
"current pointChain: " << pointChain
412 if (stopSearching)
break;
415 }
while (stopSearching);
419 Info<<
"completed patch chain: " << pointChain <<
endl;
422 if (pointChain.size() > 2)
424 edgesToInsert[nEdgesToInsert] = pointChain;
429 edgesToInsert.
setSize(nEdgesToInsert);
432 Info<<
"edgesToInsert: " << edgesToInsert <<
endl;
436 forAll(edgesToInsert, edgeToInsertI)
444 const labelList& unorderedEdge = edgesToInsert[edgeToInsertI];
449 point startPoint = Points[unorderedEdge[0]];
452 vector dir = Points[unorderedEdge.
last()] - startPoint;
454 for (label i = 1; i < dist.
size(); i++)
456 dist[i] = (Points[unorderedEdge[i]] - startPoint) & dir;
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])
500 <<
"Duplicate point found in edge to insert. "
501 <<
nl <<
"Point: " << orderedEdge[checkI]
502 <<
" edge: " << orderedEdge <<
endl;
504 problemCells.
insert(celli);
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])
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())
726 <<
"Found " << problemCells.
size() <<
" problem cells." <<
nl
731 Info<<
"Cycle " << ++nCycles
732 <<
" changed " << nChangedFacesInMesh <<
" faces." <<
endl;
747 patchSizes[patchi] =
bMesh[patchi].size();
748 patchStarts[patchi] =
bMesh[patchi].start();
765 mesh.faceZones().clearAddressing();
770 }
while (nChangedFacesInMesh > 0 || nCycles > 100);
773 mesh.setInstance(
mesh.time().timeName());
775 if (nChangedFacesInMesh > 0)
778 <<
"with the original mesh"
bool insert(const Key &key)
Insert a new entry, not overwriting existing entries.
List< Key > sortedToc() const
The table of contents (the keys) in sorted order.
label size() const noexcept
The number of elements in table.
Template class for non-intrusive linked lists.
T removeHead()
Remove and return first entry.
reference last()
The last entry in the list.
void insert(const T &elem)
Add copy at front of list. Same as prepend()
void append(const T &elem)
Add copy at back of list.
reference first()
The first entry in the list.
void setSize(const label n)
Alias for resize()
A list of faces which address into the list of points.
iterator end() noexcept
Return an iterator to end traversing the UList.
void size(const label n)
Older name for setAddressableSize.
T & last()
Return the last element of the list.
Pointer management similar to std::unique_ptr, with some additional methods and type checking.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
label end() const
Return end (last/second) vertex label.
label start() const
Return start (first) vertex label.
A face is a list of labels corresponding to mesh vertices.
edgeList edges() const
Return list of edges in forward walk order.
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO.
Mesh consisting of general polyhedral cells.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
#define WarningInFunction
Report a warning using Foam::Warning.
messageStream Info
Information stream (stdout output on master, null elsewhere)
Ostream & endl(Ostream &os)
Add newline and flush stream.
errorManip< error > abort(error &err)
bool polyMeshZipUpCells(polyMesh &mesh)
constexpr char nl
The newline '\n' character (0x0a)
Cell zip-up tool. This function modifies the list of faces such that all the cells are topologically ...
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints, -1);const cellModel &hex=cellModel::ref(cellModel::HEX);labelList hexLabels(8);label activeCells=0;labelList pointMap(nPoints);forAll(pointMap, i){ pointMap[i]=i;}for(label i=0;i< nPoints;i++){ if(f[i] > 0.0) { hexLabels[0]=i;hexLabels[1]=i1tab[i];hexLabels[2]=i3tab[i1tab[i]];hexLabels[3]=i3tab[i];hexLabels[4]=i8tab[i];hexLabels[5]=i1tab[i8tab[i]];hexLabels[6]=i3tab[i1tab[i8tab[i]]];hexLabels[7]=i3tab[i8tab[i]];cellShapes[activeCells].reset(hex, hexLabels);edgeList edges=cellShapes[activeCells].edges();forAll(edges, ei) { if(edges[ei].mag(points)< SMALL) { label start=pointMap[edges[ei].start()];while(start !=pointMap[start]) { start=pointMap[start];} label end=pointMap[edges[ei].end()];while(end !=pointMap[end]) { end=pointMap[end];} label minLabel=min(start, end);pointMap[start]=pointMap[end]=minLabel;} } cellZoning[activeCells]=idreg[i];activeCells++;}}cellShapes.setSize(activeCells);cellZoning.setSize(activeCells);forAll(cellShapes, celli){ cellShape &cs=cellShapes[celli];forAll(cs, i) { cs[i]=pointMap[cs[i]];} cs.collapse();}label bcIDs[11]={-1, 0, 2, 4, -1, 5, -1, 6, 7, 8, 9};const label nBCs=12;const word *kivaPatchTypes[nBCs]={ &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &symmetryPolyPatch::typeName, &wedgePolyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &symmetryPolyPatch::typeName, &oldCyclicPolyPatch::typeName};enum patchTypeNames{ PISTON, VALVE, LINER, CYLINDERHEAD, AXIS, WEDGE, INFLOW, OUTFLOW, PRESIN, PRESOUT, SYMMETRYPLANE, CYCLIC};const char *kivaPatchNames[nBCs]={ "piston", "valve", "liner", "cylinderHead", "axis", "wedge", "inflow", "outflow", "presin", "presout", "symmetryPlane", "cyclic"};List< SLList< face > > pFaces[nBCs]
#define forAll(list, i)
Loop across all elements in list.