From e81813a9c2550427f41c938df51b6a98eafe4c70 Mon Sep 17 00:00:00 2001 From: laurence Date: Tue, 11 Dec 2012 17:12:27 +0000 Subject: [PATCH] ENH: Add edgeCollapser utility and libraries. edgeCollapser collapses small edges and faces. Works in parallel by using PointEdgeWave. --- .../mesh/advanced/collapseEdges/Make/files | 1 - .../mesh/advanced/collapseEdges/Make/options | 3 +- .../mesh/advanced/collapseEdges/collapseDict | 85 + .../advanced/collapseEdges/collapseEdges.C | 1420 +----------- .../mesh/advanced/modifyMesh/modifyMesh.C | 30 +- .../extrude/extrudeMesh/extrudeMesh.C | 24 +- .../extrude2DMesh/extrude2DMeshApp.C | 23 +- src/dynamicMesh/Make/files | 2 + .../polyMeshFilter/polyMeshFilter.C | 1082 +++++++++ .../polyMeshFilter/polyMeshFilter.H | 238 ++ .../polyTopoChange/edgeCollapser.C | 1962 ++++++++++++++--- .../polyTopoChange/edgeCollapser.H | 292 ++- .../pointEdgeCollapse/pointEdgeCollapse.C | 8 +- .../pointEdgeCollapse/pointEdgeCollapse.H | 8 +- .../pointEdgeCollapse/pointEdgeCollapseI.H | 76 +- 15 files changed, 3428 insertions(+), 1826 deletions(-) create mode 100644 applications/utilities/mesh/advanced/collapseEdges/collapseDict create mode 100644 src/dynamicMesh/polyMeshFilter/polyMeshFilter.C create mode 100644 src/dynamicMesh/polyMeshFilter/polyMeshFilter.H rename {applications/utilities/mesh/advanced/collapseEdges => src/dynamicMesh/polyTopoChange/polyTopoChange}/pointEdgeCollapse/pointEdgeCollapse.C (88%) rename {applications/utilities/mesh/advanced/collapseEdges => src/dynamicMesh/polyTopoChange/polyTopoChange}/pointEdgeCollapse/pointEdgeCollapse.H (96%) rename {applications/utilities/mesh/advanced/collapseEdges => src/dynamicMesh/polyTopoChange/polyTopoChange}/pointEdgeCollapse/pointEdgeCollapseI.H (85%) diff --git a/applications/utilities/mesh/advanced/collapseEdges/Make/files b/applications/utilities/mesh/advanced/collapseEdges/Make/files index a15838abe8..d89ca6e737 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/Make/files +++ b/applications/utilities/mesh/advanced/collapseEdges/Make/files @@ -1,4 +1,3 @@ collapseEdges.C -pointEdgeCollapse/pointEdgeCollapse.C EXE = $(FOAM_APPBIN)/collapseEdges diff --git a/applications/utilities/mesh/advanced/collapseEdges/Make/options b/applications/utilities/mesh/advanced/collapseEdges/Make/options index d1efa61fd5..987eae5ed7 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/Make/options +++ b/applications/utilities/mesh/advanced/collapseEdges/Make/options @@ -1,8 +1,7 @@ EXE_INC = \ -I$(LIB_SRC)/dynamicMesh/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ - -I$(LIB_SRC)/finiteVolume/lnInclude \ - -IpointEdgeCollapse + -I$(LIB_SRC)/finiteVolume/lnInclude EXE_LIBS = \ -ldynamicMesh \ diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseDict b/applications/utilities/mesh/advanced/collapseEdges/collapseDict new file mode 100644 index 0000000000..78905475e3 --- /dev/null +++ b/applications/utilities/mesh/advanced/collapseEdges/collapseDict @@ -0,0 +1,85 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: http://www.openfoam.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ + +FoamFile +{ + version 2.0; + format ascii; + + root ""; + case ""; + instance ""; + local ""; + + class dictionary; + object collapseDict; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +collapseEdgesCoeffs +{ + // Edges shorter than this absolute value will be merged + minimumEdgeLength 1e-8; + + // The maximum angle between two edges that share a point attached to + // no other edges + maximumMergeAngle 30; + + // The amount that minimumEdgeLength will be reduced by for each + // edge if that edge's collapse generates a poor quality face + reductionFactor 0.5; +} + + +collapseFacesCoeffs +{ + // The initial face length factor + initialFaceLengthFactor 0.5; + + // The amount that initialFaceLengthFactor will be reduced by for each + // face if its collapse generates a poor quality face + reductionFactor $initialFaceLengthFactor; + + // If the face can't be collapsed to an edge, and it has a span less than + // the target face length multiplied by this coefficient, collapse it + // to a point. + maxCollapseFaceToPointSideLengthCoeff 0.3; + + // Allow early collapse of edges to a point + allowEarlyCollapseToPoint on; + + // Fraction to premultiply maxCollapseFaceToPointSideLengthCoeff by if + // allowEarlyCollapseToPoint is enabled + allowEarlyCollapseCoeff 0.2; + + // Defining how close to the midpoint (M) of the projected + // vertices line a projected vertex (X) can be before making this + // an invalid edge collapse + // + // X---X-g----------------M----X-----------g----X--X + // + // Only allow a collapse if all projected vertices are outwith + // guardFraction (g) of the distance form the face centre to the + // furthest vertex in the considered direction + guardFraction 0.1; +} + + +meshQualityCoeffs +{ + // Name of the dictionary that has the mesh quality coefficients used + // by motionSmoother::checkMesh + meshQualityCoeffDict meshQualityDict; + + // Maximum number of outer iterations is mesh quality checking is enabled + maximumIterations 30; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C index c0523bf43b..132a602b1a 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C +++ b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2012 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -27,1425 +27,96 @@ Description - collapse short edges. Length of edges to collapse provided as argument. - merge two edges if they are in line. Maximum angle provided as argument. - remove unused points. + - collapse faces: + - with small areas to a single point + - that have a high aspect ratio (i.e. sliver face) to a single edge - Optionally removes cells. Can remove faces and points but does not check - for nonsense resulting topology. + Optionally checks the resulting mesh for bad faces and reduces the desired + face length factor for those faces attached to the bad faces. When collapsing an edge with one point on the boundary it will leave the boundary point intact. When both points inside it chooses random. When both points on boundary random again. Usage - - collapseEdges [OPTION] - - \param -allowCellCollapse \n - Allow collapsing of cells to a single point - - \param -meshQuality \n - Only collapse if not exceeding user defined (in \a system/meshQualityDict) - quality settings + - collapseEdges [OPTION] \*---------------------------------------------------------------------------*/ #include "argList.H" #include "Time.H" +#include "timeSelector.H" #include "polyTopoChange.H" #include "fvMesh.H" -#include "mapPolyMesh.H" -#include "mathematicalConstants.H" -#include "PackedBoolList.H" -#include "unitConversion.H" -#include "globalMeshData.H" -#include "globalIndex.H" -#include "PointEdgeWave.H" -#include "pointEdgeCollapse.H" -#include "motionSmoother.H" -#include "removePoints.H" +#include "polyMeshFilter.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -void filterFace -( - const label faceI, - face& f, - const List& allPointInfo, - const Map >& collapseStrings -) -{ - label newFp = 0; - - face oldFace = f; - - forAll(f, fp) - { - label pointI = f[fp]; - - label collapsePoint = allPointInfo[pointI].collapseIndex(); - - if (collapseStrings.found(collapsePoint)) - { - collapsePoint = collapseStrings[collapsePoint][0]; - } - - if (collapsePoint == -1) - { - WarningIn - ( - "filterFace" - "(const label, face&, const List&)" - ) - << "Point " << pointI << " was not visited by PointEdgeWave" - << endl; - } - else if (collapsePoint == -2) - { - f[newFp++] = pointI; - } - else - { - if (findIndex(SubList