From 017aee8845d8483b50cf1b5eb26f580edd0c86bd Mon Sep 17 00:00:00 2001 From: laurence <laurence> Date: Wed, 25 Sep 2013 11:10:00 +0100 Subject: [PATCH] ENH: polyMeshFilter: Add topoSet manipulation. Remove zone manipulation. --- .../polyMeshFilter/polyMeshFilter.C | 32 +++++- .../polyMeshFilter/polyMeshFilter.H | 38 ++++++- .../polyMeshFilter/polyMeshFilterSettings.H | 1 + .../polyMeshFilter/polyMeshFilterTemplates.C | 105 ++++++++++++++++++ 4 files changed, 168 insertions(+), 8 deletions(-) create mode 100644 src/dynamicMesh/polyMeshFilter/polyMeshFilterTemplates.C diff --git a/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C b/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C index 2958356dc96..968ea6c4835 100644 --- a/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C +++ b/src/dynamicMesh/polyMeshFilter/polyMeshFilter.C @@ -32,7 +32,9 @@ License #include "polyTopoChange.H" #include "globalIndex.H" #include "PackedBoolList.H" -#include "faceZone.H" +#include "pointSet.H" +#include "faceSet.H" +#include "cellSet.H" // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // @@ -42,6 +44,26 @@ defineTypeNameAndDebug(polyMeshFilter, 0); } +void Foam::polyMeshFilter::updateSets(const mapPolyMesh& map) +{ + updateSets<pointSet>(map); + updateSets<faceSet>(map); + updateSets<cellSet>(map); +} + + +void Foam::polyMeshFilter::copySets +( + const polyMesh& oldMesh, + const polyMesh& newMesh +) +{ + copySets<pointSet>(oldMesh, newMesh); + copySets<faceSet>(oldMesh, newMesh); + copySets<cellSet>(oldMesh, newMesh); +} + + Foam::autoPtr<Foam::fvMesh> Foam::polyMeshFilter::copyMesh(const fvMesh& mesh) { polyTopoChange originalMeshToNewMesh(mesh); @@ -72,6 +94,8 @@ Foam::autoPtr<Foam::fvMesh> Foam::polyMeshFilter::copyMesh(const fvMesh& mesh) meshCopy().movePoints(map.preMotionPoints()); } + copySets(mesh, meshCopy()); + return meshCopy; } @@ -359,6 +383,7 @@ Foam::label Foam::polyMeshFilter::filterFaces { newMesh.movePoints(newMap.preMotionPoints()); } + updateSets(newMap); updatePointPriorities(newMesh, newMap.pointMap()); @@ -475,6 +500,7 @@ Foam::label Foam::polyMeshFilter::filterEdges { newMesh.movePoints(newMap.preMotionPoints()); } + updateSets(newMap); // Synchronise the factors mapOldMeshEdgeFieldToNewMesh @@ -926,14 +952,14 @@ Foam::label Foam::polyMeshFilter::filter(const label nOriginalBadFaces) } -Foam::label Foam::polyMeshFilter::filter(const faceZone& fZone) +Foam::label Foam::polyMeshFilter::filter(const faceSet& fSet) { minEdgeLen_.resize(mesh_.nEdges(), minLen()); faceFilterFactor_.resize(mesh_.nFaces(), initialFaceLengthFactor()); forAll(faceFilterFactor_, fI) { - if (fZone.whichFace(fI) == -1) + if (!fSet.found(fI)) { faceFilterFactor_[fI] = -1; } diff --git a/src/dynamicMesh/polyMeshFilter/polyMeshFilter.H b/src/dynamicMesh/polyMeshFilter/polyMeshFilter.H index 95cddd0058c..816e75e126e 100644 --- a/src/dynamicMesh/polyMeshFilter/polyMeshFilter.H +++ b/src/dynamicMesh/polyMeshFilter/polyMeshFilter.H @@ -25,13 +25,14 @@ Class Foam::polyMeshFilter Description - Filter the edges and faces of a polyMesh whilst satisfying the given mesh + Remove the edges and faces of a polyMesh whilst satisfying the given mesh quality criteria. Works on a copy of the mesh. SourceFiles polyMeshFilter.C + polyMeshFilterTemplates.C \*---------------------------------------------------------------------------*/ @@ -53,7 +54,7 @@ namespace Foam class polyMesh; class fvMesh; class PackedBoolList; -class faceZone; +class faceSet; /*---------------------------------------------------------------------------*\ Class polyMeshFilter Declaration @@ -71,8 +72,12 @@ class polyMeshFilter //- Copy of the original mesh to perform the filtering on autoPtr<fvMesh> newMeshPtr_; - //- + //- Original point priorities. If a point has a higher priority than + // another point then the edge between them collapses towards the + // point with the higher priority. (e.g. 2 is a higher priority than 1) labelList originalPointPriority_; + + //- Point priority associated with the new mesh autoPtr<labelList> pointPriority_; //- The minimum edge length for each edge @@ -84,6 +89,12 @@ class polyMeshFilter // Private Member Functions + template<typename T> + static void updateSets(const mapPolyMesh& map); + + template<typename T> + static void copySets(const polyMesh& oldMesh, const polyMesh& newMesh); + label filterFacesLoop(const label nOriginalBadFaces); label filterFaces @@ -209,6 +220,7 @@ public: // mesh has actually been filtered. const autoPtr<fvMesh>& filteredMesh() const; + //- Return the new pointPriority list. const autoPtr<labelList>& pointPriority() const; @@ -217,11 +229,21 @@ public: //- Return a copy of an fvMesh static autoPtr<fvMesh> copyMesh(const fvMesh& mesh); + //- Copy loaded topoSets from the old mesh to the new mesh + static void copySets + ( + const polyMesh& oldMesh, + const polyMesh& newMesh + ); + + //- Update the loaded topoSets + static void updateSets(const mapPolyMesh& map); + //- Filter edges and faces label filter(const label nOriginalBadFaces); - //- Filter all faces that are in the face zone indirectPatchFaces - label filter(const faceZone& fZone); + //- Filter all faces that are in the face set + label filter(const faceSet& fSet); //- Filter edges only. label filterEdges(const label nOriginalBadFaces); @@ -234,6 +256,12 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#ifdef NoRepository +# include "polyMeshFilterTemplates.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/dynamicMesh/polyMeshFilter/polyMeshFilterSettings.H b/src/dynamicMesh/polyMeshFilter/polyMeshFilterSettings.H index e248ce80ad9..93bc4bd3b91 100644 --- a/src/dynamicMesh/polyMeshFilter/polyMeshFilterSettings.H +++ b/src/dynamicMesh/polyMeshFilter/polyMeshFilterSettings.H @@ -29,6 +29,7 @@ Description SourceFiles polyMeshFilterSettings.C + polyMeshFilterSettingsI.H \*---------------------------------------------------------------------------*/ diff --git a/src/dynamicMesh/polyMeshFilter/polyMeshFilterTemplates.C b/src/dynamicMesh/polyMeshFilter/polyMeshFilterTemplates.C new file mode 100644 index 00000000000..08fa9d6efe8 --- /dev/null +++ b/src/dynamicMesh/polyMeshFilter/polyMeshFilterTemplates.C @@ -0,0 +1,105 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "polyMeshFilter.H" +#include "polyMesh.H" +#include "mapPolyMesh.H" +#include "IOobjectList.H" + +// * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * * // + +template<typename SetType> +void Foam::polyMeshFilter::updateSets(const mapPolyMesh& map) +{ + HashTable<const SetType*> sets = + map.mesh().objectRegistry::lookupClass<const SetType>(); + + forAllIter(typename HashTable<const SetType*>, sets, iter) + { + SetType& set = const_cast<SetType&>(*iter()); + set.updateMesh(map); + set.sync(map.mesh()); + } + + IOobjectList Objects + ( + map.mesh().time(), + map.mesh().facesInstance(), + "polyMesh/sets" + ); + + IOobjectList fileSets(Objects.lookupClass(SetType::typeName)); + + forAllConstIter(IOobjectList, fileSets, iter) + { + if (!sets.found(iter.key())) + { + // Not in memory. Load it. + SetType set(*iter()); + set.updateMesh(map); + + set.write(); + } + } +} + + +template<typename SetType> +void Foam::polyMeshFilter::copySets +( + const polyMesh& oldMesh, + const polyMesh& newMesh +) +{ + HashTable<const SetType*> sets = + oldMesh.objectRegistry::lookupClass<const SetType>(); + + forAllConstIter(typename HashTable<const SetType*>, sets, iter) + { + const SetType& set = *iter(); + + if (newMesh.objectRegistry::foundObject<SetType>(set.name())) + { + const SetType& origSet = + newMesh.objectRegistry::lookupObject<SetType>(set.name()); + + const_cast<SetType&>(origSet) = set; + const_cast<SetType&>(origSet).sync(newMesh); + } + else + { + SetType* newSet + ( + new SetType(newMesh, set.name(), set, set.writeOpt()) + ); + + newSet->store(); + newSet->sync(newMesh); + } + } +} + + +// ************************************************************************* // -- GitLab