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