From c0695e04faff3c54386780c0476a7e8c2630baf6 Mon Sep 17 00:00:00 2001 From: laurence Date: Fri, 20 Apr 2012 17:07:10 +0100 Subject: [PATCH] ENH: collapseEdges: Use PointEdgeWave to propagate collapse information --- .../mesh/advanced/collapseEdges/Make/files | 1 + .../mesh/advanced/collapseEdges/Make/options | 7 +- .../advanced/collapseEdges/collapseEdges.C | 1293 ++++++++++++----- .../pointEdgeCollapse/pointEdgeCollapse.C | 51 + .../pointEdgeCollapse/pointEdgeCollapse.H | 227 +++ .../pointEdgeCollapse/pointEdgeCollapseI.H | 313 ++++ 6 files changed, 1549 insertions(+), 343 deletions(-) create mode 100644 applications/utilities/mesh/advanced/collapseEdges/pointEdgeCollapse/pointEdgeCollapse.C create mode 100644 applications/utilities/mesh/advanced/collapseEdges/pointEdgeCollapse/pointEdgeCollapse.H create mode 100644 applications/utilities/mesh/advanced/collapseEdges/pointEdgeCollapse/pointEdgeCollapseI.H diff --git a/applications/utilities/mesh/advanced/collapseEdges/Make/files b/applications/utilities/mesh/advanced/collapseEdges/Make/files index d89ca6e737..a15838abe8 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/Make/files +++ b/applications/utilities/mesh/advanced/collapseEdges/Make/files @@ -1,3 +1,4 @@ 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 73f34b0f85..d1efa61fd5 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/Make/options +++ b/applications/utilities/mesh/advanced/collapseEdges/Make/options @@ -1,7 +1,10 @@ EXE_INC = \ -I$(LIB_SRC)/dynamicMesh/lnInclude \ - -I$(LIB_SRC)/meshTools/lnInclude + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/finiteVolume/lnInclude \ + -IpointEdgeCollapse EXE_LIBS = \ -ldynamicMesh \ - -lmeshTools + -lmeshTools \ + -lfiniteVolume diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C index 400191275c..899159b2a2 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 @@ -41,10 +41,10 @@ Description #include "argList.H" #include "Time.H" -#include "edgeCollapser.H" #include "polyTopoChange.H" #include "polyTopoChanger.H" #include "polyMesh.H" +#include "fvMesh.H" #include "mapPolyMesh.H" #include "mathematicalConstants.H" #include "PackedBoolList.H" @@ -52,6 +52,9 @@ Description #include "unitConversion.H" #include "globalMeshData.H" #include "globalIndex.H" +#include "PointEdgeWave.H" +#include "pointEdgeCollapse.H" +#include "motionSmoother.H" #include "OFstream.H" #include "meshTools.H" @@ -60,6 +63,413 @@ using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +label findIndex +( + const labelList& elems, + const label start, + const label size, + const label val +) +{ + for (label i = start; i < size; i++) + { + if (elems[i] == val) + { + return i; + } + } + return -1; +} + + +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(f, 0, newFp, collapsePoint) == -1) + { + f[newFp++] = collapsePoint; + } + } + } + + + // Check for pinched face. Tries to correct + // - consecutive duplicate vertex. Removes duplicate vertex. + // - duplicate vertex with one other vertex in between (spike). + // Both of these should not really occur! and should be checked before + // collapsing edges. + + const label size = newFp; + + newFp = 2; + + for (label fp = 2; fp < size; fp++) + { + label fp1 = fp-1; + label fp2 = fp-2; + + label pointI = f[fp]; + + // Search for previous occurrence. + label index = findIndex(f, 0, fp, pointI); + + if (index == fp1) + { + WarningIn + ( + "Foam::edgeCollapser::filterFace(const label faceI, " + "face& f) const" + ) << "Removing consecutive duplicate vertex in face " + << f << endl; + // Don't store current pointI + } + else if (index == fp2) + { + WarningIn + ( + "Foam::edgeCollapser::filterFace(const label faceI, " + "face& f) const" + ) << "Removing non-consecutive duplicate vertex in face " + << f << endl; + // Don't store current pointI and remove previous + newFp--; + } + else if (index != -1) + { + WarningIn + ( + "Foam::edgeCollapser::filterFace(const label faceI, " + "face& f) const" + ) << "Pinched face " << f << endl; + f[newFp++] = pointI; + } + else + { + f[newFp++] = pointI; + } + } + + f.setSize(newFp); +} + + +bool setRefinement +( + const polyMesh& mesh, + polyTopoChange& meshMod, + const List& allPointInfo +) +{ + const cellList& cells = mesh.cells(); + const labelList& faceOwner = mesh.faceOwner(); + const labelList& faceNeighbour = mesh.faceNeighbour(); + const labelListList& pointFaces = mesh.pointFaces(); + const pointZoneMesh& pointZones = mesh.pointZones(); + + globalIndex globalStrings(mesh.nPoints()); + + boolList removedPoints(mesh.nPoints(), false); + + // Create strings of edges + Map > collapseStrings; + + forAll(allPointInfo, pointI) + { + const label collapseIndex = allPointInfo[pointI].collapseIndex(); + + if (collapseIndex != -1 && collapseIndex != -2) + { + collapseStrings(collapseIndex).append(pointI); + } + } + + bool meshChanged = false; + + // Current faces (is also collapseStatus: f.size() < 3) + faceList newFaces(mesh.faces()); + + // Current cellCollapse status + boolList cellRemoved(mesh.nCells(), false); + + label nUnvisited = 0; + label nUncollapsed = 0; + label nCollapsed = 0; + + forAll(allPointInfo, pI) + { + const pointEdgeCollapse& pec = allPointInfo[pI]; + + if (pec.collapseIndex() == -1) + { + nUnvisited++; + } + else if (pec.collapseIndex() == -2) + { + nUncollapsed++; + } + else if (pec.collapseIndex() >= 0) + { + nCollapsed++; + } + } + + label nPoints = allPointInfo.size(); + + reduce(nPoints, sumOp