diff --git a/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H b/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H index 5ec0a1bc78..4df5a84b86 100644 --- a/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H +++ b/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.H @@ -93,6 +93,15 @@ public: rmFine // Rebuild the conformation with fine tolerances (slower) }; + enum faceCollapseMode + { + fcmNone, // Do not collapse face + fcmEdge, // Collapse face to a single edge + fcmPoint, // Collapse face to a point + fcmDeferredMultiEdge // Collapse face to several edges + }; + + private: // Private data @@ -214,9 +223,6 @@ private: //- Return the local maximum surface protrusion distance inline scalar maxSurfaceProtrusion(const point& pt) const; - //- Return the local minimum allowed dual edge length - inline scalar minimumEdgeLength(const point& pt) const; - //- Return the required alignment directions at the given location tensor requiredAlignment(const point& pt) const; @@ -504,7 +510,7 @@ private: //- Collapse a face to an edge, updating the point and point //- map. Returns a bool of success or failure. - bool collapseFaceToEdge + bool collapseFace ( const face& f, pointField& pts, diff --git a/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C b/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C index 5652b580f8..156d01bb2b 100644 --- a/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C +++ b/src/mesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshCalcDualMesh.C @@ -76,8 +76,6 @@ void Foam::conformalVoronoiMesh::calcDualMesh } } - // Dual face filtering - // Indexing Delaunay cells, which are the dual vertices label dualVertI = 0; @@ -386,7 +384,7 @@ Foam::label Foam::conformalVoronoiMesh::mergeCloseDualVertices { label nPtsMerged = 0; - scalar closenessTolerance = 1e-6; + scalar closenessTolerance = cvMeshControls().mergeClosenessCoeff(); for ( @@ -512,7 +510,10 @@ Foam::label Foam::conformalVoronoiMesh::smoothSurfaceDualFaces { label nCollapsedFaces = 0; - const scalar cosPerpendicularToleranceAngle = cos(degToRad(80)); + const scalar cosPerpendicularToleranceAngle = cos + ( + degToRad(cvMeshControls().surfaceStepFaceAngle()) + ); for ( @@ -579,7 +580,16 @@ Foam::label Foam::conformalVoronoiMesh::smoothSurfaceDualFaces vector faceNormal = dualFace.normal(pts); - faceNormal /= mag(faceNormal); + if (mag(faceNormal) < VSMALL) + { + // If the face is essentially zero area, then force it + // to be collapsed by making the dot product result -1 + faceNormal = -surfaceNormal; + } + else + { + faceNormal /= mag(faceNormal); + } if ((faceNormal & surfaceNormal) < cosPerpendicularToleranceAngle) { @@ -591,7 +601,7 @@ Foam::label Foam::conformalVoronoiMesh::smoothSurfaceDualFaces if ( - collapseFaceToEdge + collapseFace ( dualFace, pts, @@ -642,7 +652,7 @@ Foam::label Foam::conformalVoronoiMesh::collapseFaces { label nCollapsedFaces = 0; - scalar collapseSizeLimitCoeff = cvMeshControls().minimumEdgeLengthCoeff(); + scalar collapseSizeLimitCoeff = cvMeshControls().filterSizeCoeff(); for ( @@ -687,7 +697,7 @@ Foam::label Foam::conformalVoronoiMesh::collapseFaces if ( - collapseFaceToEdge + collapseFace ( dualFace, pts, @@ -706,7 +716,7 @@ Foam::label Foam::conformalVoronoiMesh::collapseFaces } -bool Foam::conformalVoronoiMesh::collapseFaceToEdge +bool Foam::conformalVoronoiMesh::collapseFace ( const face& f, pointField& pts, @@ -715,7 +725,7 @@ bool Foam::conformalVoronoiMesh::collapseFaceToEdge scalar collapseSizeLimitCoeff ) const { - scalar guardFraction = 0.3; + bool limitToQuadsOrTris = true; const vector fC = f.centre(pts); @@ -730,58 +740,28 @@ bool Foam::conformalVoronoiMesh::collapseFaceToEdge // eigenvector corresponding to the smaller of the two remaining // eigenvalues is the dominant axis in a high aspect ratio face. - // Normalise inertia tensor to remove problems with small values - scalar magJ = mag(J); + scalar detJ = SMALL; + if (magJ > VSMALL) { + // Normalise inertia tensor to remove problems with small values + J /= mag(J); // J /= cmptMax(J); // J /= max(eigenValues(J).x(), SMALL); - } - else - { - WarningIn - ( - "Foam::conformalVoronoiMesh::collapseFaceToEdge" - "(" - "const face& f," - "pointField& pts," - "Map