From d598afbd901c20fceb4c563212564018695d7c88 Mon Sep 17 00:00:00 2001 From: graham Date: Fri, 8 Jan 2010 16:40:04 +0000 Subject: [PATCH] Adding faceCollapseMode enum to control mode. Fixing logic error, returning validCollapse as the status of the faceCollapse was wrong, it didn't necessarily mean the face was collapsed. Adding mpre filtering controls to cvContol and using them in the filtering functions. Removing minimumEdgeLength(const point& pt) - not needed, always using the stored vertex size. --- .../conformalVoronoiMesh.H | 14 +- .../conformalVoronoiMeshCalcDualMesh.C | 282 ++++++++---------- .../conformalVoronoiMeshConformToSurface.C | 2 + .../conformalVoronoiMeshI.H | 9 - .../cvControls/cvControls.C | 23 +- .../cvControls/cvControls.H | 48 ++- .../cvControls/cvControlsI.H | 33 +- 7 files changed, 233 insertions(+), 178 deletions(-) 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