33 Foam::label Foam::edgeCollapser::findIndex
41 for (label i = start; i < size; i++)
55 Foam::label Foam::edgeCollapser::changePointRegion
58 const label oldRegion,
64 if (pointRegion_[pointI] == oldRegion)
66 pointRegion_[pointI] = newRegion;
71 const labelList& pEdges = mesh_.pointEdges()[pointI];
75 label otherPointI = mesh_.edges()[pEdges[i]].otherVertex(pointI);
77 nChanged += changePointRegion(otherPointI, oldRegion, newRegion);
84 bool Foam::edgeCollapser::pointRemoved(
const label pointI)
const
86 label region = pointRegion_[pointI];
88 if (region == -1 || pointRegionMaster_[region] == pointI)
99 void Foam::edgeCollapser::filterFace(
const label faceI, face&
f)
const
105 label pointI = f[fp];
107 label region = pointRegion_[pointI];
115 label master = pointRegionMaster_[region];
117 if (
findIndex(f, 0, newFp, master) == -1)
130 const label size = newFp;
134 for (label fp = 2; fp < size; fp++)
139 label pointI = f[fp];
142 label index =
findIndex(f, 0, fp, pointI);
148 "Foam::edgeCollapser::filterFace(const label faceI, "
150 ) <<
"Removing consecutive duplicate vertex in face "
154 else if (index == fp2)
158 "Foam::edgeCollapser::filterFace(const label faceI, "
160 ) <<
"Removing non-consecutive duplicate vertex in face "
165 else if (index != -1)
169 "Foam::edgeCollapser::filterFace(const label faceI, "
171 ) <<
"Pinched face " << f <<
endl;
185 void Foam::edgeCollapser::printRegions()
const
187 forAll(pointRegionMaster_, regionI)
189 label master = pointRegionMaster_[regionI];
193 Info<<
"Region:" << regionI <<
nl
194 <<
" master:" << master
195 <<
' ' << mesh_.points()[master] <<
nl;
197 forAll(pointRegion_, pointI)
199 if (pointRegion_[pointI] == regionI && pointI != master)
201 Info<<
" slave:" << pointI
202 <<
' ' << mesh_.points()[pointI] <<
nl;
212 void Foam::edgeCollapser::collapseEdges(
const labelList& edgeLabels)
214 const edgeList& edges = mesh_.edges();
218 label edgeI = edgeLabels[i];
219 const edge&
e = edges[edgeI];
221 label region0 = pointRegion_[e[0]];
222 label region1 = pointRegion_[e[1]];
247 if (pointRegionMaster_[region0] == e[0])
252 else if (pointRegionMaster_[region1] == e[1])
274 pointRegion_(mesh.
nPoints(), -1),
275 pointRegionMaster_(mesh.
nPoints() / 100),
284 const edge& e = mesh_.edges()[edgeI];
286 return (pointRegion_[e[0]] == -1) && (pointRegion_[e[1]] == -1);
292 const edge& e = mesh_.edges()[edgeI];
294 label pointRegion0 = pointRegion_[e[0]];
295 label pointRegion1 = pointRegion_[e[1]];
297 if (pointRegion0 == -1)
299 if (pointRegion1 == -1)
303 label freeRegion = -1;
305 if (freeRegions_.size())
307 freeRegion = freeRegions_.removeHead();
309 if (pointRegionMaster_[freeRegion] != -1)
312 (
"edgeCollapser::collapseEdge(const label, const label)")
313 <<
"Problem : freeed region :" << freeRegion
314 <<
" has already master "
315 << pointRegionMaster_[freeRegion]
323 freeRegion = pointRegionMaster_.size();
326 pointRegion_[e[0]] = freeRegion;
327 pointRegion_[e[1]] = freeRegion;
329 pointRegionMaster_(freeRegion) = master;
334 pointRegion_[e[0]] = pointRegion1;
336 pointRegionMaster_[pointRegion1] = master;
341 if (pointRegion1 == -1)
344 pointRegion_[e[1]] = pointRegion0;
346 pointRegionMaster_[pointRegion0] = master;
348 else if (pointRegion0 != pointRegion1)
353 label minRegion =
min(pointRegion0, pointRegion1);
354 label maxRegion =
max(pointRegion0, pointRegion1);
357 pointRegionMaster_[minRegion] = master;
358 pointRegionMaster_[maxRegion] = -1;
359 freeRegions_.insert(maxRegion);
361 if (minRegion != pointRegion0)
363 changePointRegion(e[0], pointRegion0, minRegion);
365 if (minRegion != pointRegion1)
367 changePointRegion(e[1], pointRegion1, minRegion);
379 const labelList& faceOwner = mesh_.faceOwner();
380 const labelList& faceNeighbour = mesh_.faceNeighbour();
387 bool meshChanged =
false;
394 boolList cellRemoved(mesh_.nCells(),
false);
402 filterFace(faceI, newFaces[faceI]);
406 label nCellCollapsed = 0;
410 if (!cellRemoved[cellI])
412 const cell& cFaces = cells[cellI];
414 label nFaces = cFaces.
size();
418 label faceI = cFaces[i];
420 if (newFaces[faceI].size() < 3)
426 Info<<
"Cell:" << cellI
427 <<
" uses faces:" << cFaces
428 <<
" of which too many are marked for removal:"
433 if (newFaces[cFaces[j]].size() < 3)
435 Info<<
' '<< cFaces[j];
440 cellRemoved[cellI] =
true;
443 collapseEdges(cellEdges[cellI]);
454 if (nCellCollapsed == 0)
462 boolList doneFace(mesh_.nFaces(),
false);
466 boolList usedPoint(mesh_.nPoints(),
false);
469 forAll(cellRemoved, cellI)
471 if (cellRemoved[cellI])
481 const face& f = newFaces[faceI];
489 doneFace[faceI] =
true;
496 usedPoint[f[fp]] =
true;
504 if (!usedPoint[pointI] && !pointRemoved(pointI))
515 forAll(pointRegion_, pointI)
517 if (pointRemoved(pointI))
531 forAll(pointRegion_, pointI)
533 if (pointRemoved(pointI))
535 const labelList& changedFaces = pointFaces[pointI];
537 forAll(changedFaces, changedFaceI)
539 label faceI = changedFaces[changedFaceI];
541 if (!doneFace[faceI])
543 doneFace[faceI] =
true;
546 label zoneID = faceZones.
whichZone(faceI);
548 bool zoneFlip =
false;
552 const faceZone& fZone = faceZones[zoneID];
558 label own = faceOwner[faceI];
562 if (mesh_.isInternalFace(faceI))
564 nei = faceNeighbour[faceI];
594 pointRegion_.setSize(mesh_.nPoints());
597 pointRegionMaster_.clear();
598 freeRegions_.clear();