From fb52acf4be83b81ede95c9e3d6df2a558a9f471c Mon Sep 17 00:00:00 2001 From: laurence Date: Fri, 31 May 2013 09:42:09 +0100 Subject: [PATCH] ENH: Update collapesEdges to work with any supplied face zone --- .../advanced/collapseEdges/collapseEdges.C | 18 +- .../polyMeshFilter/polyMeshFilter.C | 395 +++++++++++++++--- .../polyMeshFilter/polyMeshFilter.H | 3 +- .../polyTopoChange/edgeCollapser.C | 192 ++++++--- .../polyTopoChange/edgeCollapser.H | 5 +- 5 files changed, 477 insertions(+), 136 deletions(-) diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C index c2c9d0a0d3..7a07b63d8f 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C +++ b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C @@ -72,10 +72,11 @@ int main(int argc, char *argv[]) "Collapse small and sliver faces as well as small edges" ); - argList::addBoolOption + argList::addOption ( - "collapseIndirectPatchFaces", - "Collapse faces that are in the face zone indirectPatchFaces" + "collapseFaceZone", + "zoneName", + "Collapse faces that are in the supplied face zone" ); # include "addOverwriteOption.H" @@ -92,8 +93,7 @@ int main(int argc, char *argv[]) const bool overwrite = args.optionFound("overwrite"); const bool collapseFaces = args.optionFound("collapseFaces"); - const bool collapseIndirectPatchFaces = - args.optionFound("collapseIndirectPatchFaces"); + const bool collapseFaceZone = args.optionFound("collapseFaceZone"); forAll(timeDirs, timeI) { @@ -115,11 +115,15 @@ int main(int argc, char *argv[]) meshMod.changeMesh(mesh, false); } - if (collapseIndirectPatchFaces) + if (collapseFaceZone) { + const word faceZoneName = args.optionRead("collapseFaceZone"); + + const faceZone& fZone = mesh.faceZones()[faceZoneName]; + // Filter faces. Pass in the number of bad faces that are present // from the previous edge filtering to use as a stopping criterion. - meshFilter.filterIndirectPatchFaces(); + meshFilter.filterFaceZone(fZone); { polyTopoChange meshMod(newMesh); diff --git a/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C b/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C index ab3360be1d..a04890d59b 100644 --- a/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C +++ b/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C @@ -32,6 +32,7 @@ License #include "polyTopoChange.H" #include "globalIndex.H" #include "PackedBoolList.H" +#include "faceZone.H" // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // @@ -1134,83 +1135,330 @@ Foam::label Foam::polyMeshFilter::filterEdges } -Foam::label Foam::polyMeshFilter::filterIndirectPatchFaces() +Foam::label Foam::polyMeshFilter::filterFaceZone(const faceZone& fZone) { - newMeshPtr_ = copyMesh(mesh_); - fvMesh& newMesh = newMeshPtr_(); + const label nOriginalBadFaces = 0; - label nIterations = 0; - label nBadFaces = 0; + label nBadFaces = labelMax; + label nOuterIterations = 0; - while (true) + minEdgeLen_.resize(mesh_.nEdges(), minLen_); + faceFilterFactor_.resize(mesh_.nFaces(), initialFaceLengthFactor_); + + // Maintain the number of times a point has been part of a bad face + labelList pointErrorCount(mesh_.nPoints(), 0); + + // Main loop + // ~~~~~~~~~ + // It tries and do some collapses, checks the resulting mesh and + // 'freezes' some edges (by marking in minEdgeLen) and tries again. + // This will iterate ultimately to the situation where every edge is + // frozen and nothing gets collapsed. + while + ( + nOuterIterations < maxIterations_ + && nBadFaces > nOriginalBadFaces + ) { - Info<< nl << indent << "Iteration = " - << nIterations++ << nl << incrIndent << endl; + Info<< nl << "Outer Iteration = " << nOuterIterations++ << nl + << endl; - // Per edge collapse status - PackedBoolList collapseEdge(newMesh.nEdges()); + printScalarFieldStats("Edge Filter Factor", minEdgeLen_); + printScalarFieldStats("Face Filter Factor", faceFilterFactor_); - Map collapsePointToLocation(newMesh.nPoints()); + // Reset the new mesh to the old mesh + newMeshPtr_ = copyMesh(mesh_); + fvMesh& newMesh = newMeshPtr_(); - labelList boundaryPoint(newMesh.nPoints()); + scalarField newMeshFaceFilterFactor = faceFilterFactor_; - edgeCollapser collapser(newMesh, collapseFacesCoeffDict_); - - collapser.markIndirectPatchFaces - ( - collapseEdge, - collapsePointToLocation - ); - - // Merge edge collapses into consistent collapse-network. - // Make sure no cells get collapsed. - List allPointInfo; - const globalIndex globalPoints(newMesh.nPoints()); - - collapser.consistentCollapse - ( - globalPoints, - boundaryPoint, - collapsePointToLocation, - collapseEdge, - allPointInfo - ); - - label nLocalCollapse = collapseEdge.count(); - - reduce(nLocalCollapse, sumOp