99 label edgeI = edgeLabels[i];
101 const edge&
e = edges[edgeI];
109 faceEdges[fp] = edgeI;
114 faceEdges[f.
rcIndex(fp)] = edgeI;
136 label nCollapsed = 0;
138 forAll(pointEdges, pointI)
140 const labelList& pEdges = pointEdges[pointI];
142 if (pEdges.
size() == 2)
144 const edge& leftE = edges[pEdges[0]];
145 const edge& rightE = edges[pEdges[1]];
153 label midMaster = -1;
154 if (region[pointI] != -1)
156 midMaster = master[region[pointI]];
159 label leftMaster = -2;
160 if (region[leftV] != -1)
162 leftMaster = master[region[leftV]];
165 label rightMaster = -3;
166 if (region[rightV] != -1)
168 rightMaster = master[region[rightV]];
173 midMaster != leftMaster
174 && midMaster != rightMaster
175 && leftMaster != rightMaster
179 vector leftVec = points[pointI] - points[leftV];
180 leftVec /=
mag(leftVec) + VSMALL;
182 vector rightVec = points[rightV] - points[pointI];
183 rightVec /=
mag(rightVec) + VSMALL;
185 if ((leftVec & rightVec) > maxCos)
206 label masterPoint = -1;
209 if (boundaryPoint.
get(e[0]))
211 if (boundaryPoint.
get(e[1]))
224 if (boundaryPoint.
get(e[1]))
239 label collapseSmallEdges
253 label nCollapsed = 0;
257 const edge& e = edges[edgeI];
259 if (e.
mag(points) < minLen)
261 label master = edgeMaster(boundaryPoint, e);
278 label collapseHighAspectFaces
282 const scalar areaFac,
283 const scalar edgeRatio,
294 label maxIndex =
findMax(magArea);
296 scalar minArea = areaFac * magArea[maxIndex];
298 Info<<
"Max face area:" << magArea[maxIndex] <<
endl
299 <<
"Collapse area factor:" << areaFac <<
endl
300 <<
"Collapse area:" << minArea <<
endl;
302 label nCollapsed = 0;
306 if (magArea[faceI] < minArea)
308 const face& f = faces[faceI];
311 labelList fEdges(getSortedEdges(edges, f, faceEdges[faceI]));
316 lengths[i] = edges[fEdges[i]].mag(points);
326 if (lengths[2] > edgeRatio*lengths[0])
330 edgeI = fEdges[lengths.indices()[0]];
333 else if (f.
size() == 3)
336 if (lengths[1] > edgeRatio*lengths[0])
338 edgeI = fEdges[lengths.indices()[0]];
345 label master = edgeMaster(boundaryPoint, edges[edgeI]);
364 status[elems[i]] = val;
389 label nCollapsed = 0;
395 const face& f = faces[faceI];
400 && cells[faceOwner[faceI]].
size() >= 6
403 && cells[faceNeighbour[faceI]].
size() >= 6
408 labelList fEdges(getSortedEdges(edges, f, faceEdges[faceI]));
413 lengths[i] = edges[fEdges[i]].mag(points);
423 for (label i = f.
size()-1-minSize; i >= 0; --i)
425 if (lengths[i+1] > lenGap*lengths[i])
438 label edgeI = fEdges[lengths.indices()[i]];
440 if (!protectedEdge[edgeI])
442 const edge& e = edges[edgeI];
444 label master = edgeMaster(boundaryPoint, e);
453 const labelList& pCells0 = pointCells[e[0]];
457 set(cellEdges[pCells0[i]],
true, protectedEdge);
459 const labelList& pCells1 = pointCells[e[1]];
463 set(cellEdges[pCells1[i]],
true, protectedEdge);
480 int main(
int argc,
char *argv[])
489 runTime.functionObjects().off();
500 <<
" edges with length less than " << minLen <<
" meters" <<
nl
501 <<
" edges split by a point with edges in line to within " << angle
506 bool meshChanged =
false;
516 for (label faceI = nIntFaces; faceI < mesh.
nFaces(); faceI++)
518 const face& f = faces[faceI];
522 boundaryPoint.
set(f[fp], 1);
539 Info<<
"Collapsing " << nCollapsed <<
" small edges" <<
endl;
545 nCollapsed = mergeEdges(mesh, maxCos, collapser);
546 Info<<
"Collapsing " << nCollapsed <<
" in line edges" <<
endl;
554 collapseHighAspectFaces
563 Info<<
"Collapsing " << nCollapsed
564 <<
" small high aspect ratio faces" <<
endl;
600 if (morphMap().hasMotionPoints())
602 mesh.
movePoints(morphMap().preMotionPoints());
620 Info<<
"Writing collapsed mesh to time " << runTime.timeName() <<
endl;