Clean up of deprecated polyhedral AMR classes:
1. dynamicRefinePolyFvMesh class (replaced by dynamicPolyRefinementFvMesh) 2. polyRef class (replaced by polyhedralRefinement polyMesh modifier) 3. polyRefinementHistory (not required anymore)
This commit is contained in:
parent
e1523d07ac
commit
7459da3a36
10 changed files with 58 additions and 9153 deletions
|
@ -10,7 +10,6 @@ dynamicMotionSolverFvMesh/dynamicMotionSolverFvMesh.C
|
|||
subsetMotionSolverFvMesh/subsetMotionSolverFvMesh.C
|
||||
dynamicInkJetFvMesh/dynamicInkJetFvMesh.C
|
||||
dynamicRefineFvMesh/dynamicRefineFvMesh.C
|
||||
dynamicRefinePolyFvMesh/dynamicRefinePolyFvMesh.C
|
||||
|
||||
mixerGgiFvMesh/mixerGgiFvMesh.C
|
||||
turboFvMesh/turboFvMesh.C
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | foam-extend: Open Source CFD |
|
||||
| \\ / O peration | Version: 4.0 |
|
||||
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object dynamicMeshDict;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dynamicFvMesh dynamicRefinePolyFvMesh;
|
||||
|
||||
// Refinement
|
||||
dynamicRefineFvMeshCoeffs
|
||||
{
|
||||
// Refine every refineInterval timesteps
|
||||
refineInterval 3;
|
||||
|
||||
// Maximum refinement level (starts from 0)
|
||||
maxRefinement 2;
|
||||
|
||||
// Maximum cell limit (approximate)
|
||||
maxCells 1000000;
|
||||
|
||||
// volScalarField to base refinement on
|
||||
field gamma;
|
||||
|
||||
// Which cells to un/refine: based on point values (simple averaging).
|
||||
// - refine pointCells of point value inbetween minLevel..maxLevel
|
||||
// - unrefine pointCells that are within nBufferLayers of points marked
|
||||
// for refinement.
|
||||
minLevel 0.01;
|
||||
maxLevel 0.99;
|
||||
nBufferLayers 1;
|
||||
|
||||
// Newly introduced patch points optionally get projected onto a surface
|
||||
//projectSurfaces ("fixedWalls4.stl");
|
||||
//projectPatches (fixedWalls);
|
||||
// Maximum project distance
|
||||
//projectDistance 1;
|
||||
|
||||
// Fluxes to adapt. For newly created faces or split faces the flux
|
||||
// gets estimated from an interpolated volVectorField ('velocity')
|
||||
// First is name of the flux to adapt, second is velocity that will
|
||||
// be interpolated and inner-producted with the face area vector.
|
||||
correctFluxes ((phi U));
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
File diff suppressed because it is too large
Load diff
|
@ -1,220 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | foam-extend: Open Source CFD
|
||||
\\ / O peration | Version: 4.0
|
||||
\\ / A nd | Web: http://www.foam-extend.org
|
||||
\\/ M anipulation | For copyright notice see file Copyright
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of foam-extend.
|
||||
|
||||
foam-extend 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.
|
||||
|
||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::dynamicRefinePolyFvMesh
|
||||
|
||||
Description
|
||||
A fvMesh with built-in refinement of arbitrary polyhedral cells.
|
||||
|
||||
Determines which cells to refine/unrefine and does all in update().
|
||||
|
||||
SourceFiles
|
||||
dynamicRefinePolyFvMesh.C
|
||||
|
||||
Author
|
||||
Vuko Vukcevic, Wikki Ltd. All rights reserved
|
||||
|
||||
Notes
|
||||
Generalisation of dynamicRefineMesh for polyhedral cells
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef dynamicRefinePolyFvMesh_H
|
||||
#define dynamicRefinePolyFvMesh_H
|
||||
|
||||
#include "dynamicFvMesh.H"
|
||||
#include "polyRef.H"
|
||||
#include "PackedBoolList.H"
|
||||
#include "Switch.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class dynamicRefinePolyFvMesh Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class dynamicRefinePolyFvMesh
|
||||
:
|
||||
public dynamicFvMesh
|
||||
{
|
||||
|
||||
// Private data
|
||||
|
||||
// Helper variables to enable switching between a single and multiple
|
||||
// mesh motion updates within a time step (if update() is called more
|
||||
// than once in a single time step)
|
||||
|
||||
//- Switch for single motion update (true by default)
|
||||
Switch singleMotionUpdate_;
|
||||
|
||||
//- Helper varaible: current time index
|
||||
label curTimeIndex_;
|
||||
|
||||
//- Switch whether to use point based refinement (ensures 4:1 point
|
||||
// consistency, along with the 2:1 face consistency
|
||||
// consistency). Set based on max refinement level and user input
|
||||
Switch pointBasedRefinement_;
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
//- Mesh cutting engine
|
||||
polyRef meshCutter_;
|
||||
|
||||
//- Dump cellLevel for postprocessing
|
||||
Switch dumpLevel_;
|
||||
|
||||
//- Fluxes to map
|
||||
List<Pair<word> > correctFluxes_;
|
||||
|
||||
//- Number of refinement/unrefinement steps done so far.
|
||||
label nRefinementIterations_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Count set/unset elements in packedlist.
|
||||
static label count(const PackedBoolList&, const unsigned int);
|
||||
|
||||
//- Read the projection parameters from dictionary
|
||||
void readDict();
|
||||
|
||||
|
||||
//- Refine cells. Update mesh and fields.
|
||||
autoPtr<mapPolyMesh> refine(const labelList&);
|
||||
|
||||
//- Unrefine cells. Gets passed in centre points of cells to combine.
|
||||
autoPtr<mapPolyMesh> unrefine(const labelList&);
|
||||
|
||||
|
||||
// Selection of cells to un/refine
|
||||
|
||||
//- Get per cell max of connected point
|
||||
scalarField maxPointField(const scalarField&) const;
|
||||
|
||||
//- Get point min of connected cell
|
||||
scalarField minCellField(const volScalarField&) const;
|
||||
|
||||
//- Simple (non-parallel) interpolation by averaging
|
||||
scalarField cellToPoint(const scalarField& vFld) const;
|
||||
|
||||
//- Calculate error (= -1 by default or distance from inbetween
|
||||
// levels
|
||||
scalarField error
|
||||
(
|
||||
const scalarField& fld,
|
||||
const scalar minLevel,
|
||||
const scalar maxLevel
|
||||
) const;
|
||||
|
||||
//- Select candidate cells for refinement
|
||||
virtual void selectRefineCandidates
|
||||
(
|
||||
const scalar lowerRefineLevel,
|
||||
const scalar upperRefineLevel,
|
||||
const scalarField& vFld,
|
||||
PackedBoolList& candidateCell
|
||||
) const;
|
||||
|
||||
//- Subset candidate cells for refinement
|
||||
virtual labelList selectRefineCells
|
||||
(
|
||||
const label maxCells,
|
||||
const label maxRefinement,
|
||||
const PackedBoolList& candidateCell
|
||||
) const;
|
||||
|
||||
//- Select points that can be unrefined
|
||||
virtual labelList selectUnrefinePoints
|
||||
(
|
||||
const scalar unrefineLevel,
|
||||
const PackedBoolList& markedCell,
|
||||
const scalarField& pFld
|
||||
) const;
|
||||
|
||||
//- Extend markedCell with cell-face-cell
|
||||
void extendMarkedCells(PackedBoolList& markedCell) const;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
dynamicRefinePolyFvMesh(const dynamicRefinePolyFvMesh&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const dynamicRefinePolyFvMesh&);
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("dynamicRefinePolyFvMesh");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from IOobject
|
||||
explicit dynamicRefinePolyFvMesh(const IOobject& io);
|
||||
|
||||
|
||||
// Destructor
|
||||
|
||||
virtual ~dynamicRefinePolyFvMesh();
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Direct access to the refinement engine
|
||||
const polyRef& meshCutter() const
|
||||
{
|
||||
return meshCutter_;
|
||||
}
|
||||
|
||||
//- Update the mesh for both mesh motion and topology change
|
||||
virtual bool update();
|
||||
|
||||
|
||||
// Writing
|
||||
|
||||
//- Write using given format, version and compression
|
||||
virtual bool writeObject
|
||||
(
|
||||
IOstream::streamFormat fmt,
|
||||
IOstream::versionNumber ver,
|
||||
IOstream::compressionType cmp
|
||||
) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -55,7 +55,6 @@ motionSolver/motionSolver.C
|
|||
refinementData/refinementData.C
|
||||
refinementData/refinementDistanceData.C
|
||||
refinementData/refinementHistory.C
|
||||
refinementData/polyRefinementHistory.C
|
||||
|
||||
directTopoChange/directTopoChange/directTopoChange.C
|
||||
|
||||
|
@ -64,7 +63,6 @@ $(directActions)/addPatchCellLayer.C
|
|||
$(directActions)/edgeCollapser.C
|
||||
$(directActions)/faceCollapser.C
|
||||
$(directActions)/hexRef8.C
|
||||
$(directActions)/polyRef.C
|
||||
$(directActions)/removeCells.C
|
||||
$(directActions)/removeFaces.C
|
||||
$(directActions)/removePoints.C
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,583 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | foam-extend: Open Source CFD
|
||||
\\ / O peration | Version: 4.0
|
||||
\\ / A nd | Web: http://www.foam-extend.org
|
||||
\\/ M anipulation | For copyright notice see file Copyright
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of foam-extend.
|
||||
|
||||
foam-extend 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.
|
||||
|
||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::polyRef
|
||||
|
||||
Description
|
||||
Refinement of (split) polyhedra using directTopoChange.
|
||||
|
||||
Each polyhedron is split by the following procedure:
|
||||
1. Adding points at the edge centre, face centre and cell centre,
|
||||
2. Adding cells n cells where n is the number of points of the cell,
|
||||
3. Splitting each face into multiple faces going from:
|
||||
existing corner point -> new edge centre point -> new face centre
|
||||
point -> other new edge centre point (sharing the same corner point)
|
||||
4. Adding internal faces going from:
|
||||
new edge centre point -> new face centre point -> new cell centre
|
||||
point -> other new face centre point (sharing the same edge)
|
||||
|
||||
SourceFiles
|
||||
polyRef.C
|
||||
|
||||
Author
|
||||
Vuko Vukcevic, Wikki Ltd. All rights reserved.
|
||||
|
||||
Notes
|
||||
Generalisation of hexRef8 for polyhedral cells
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef polyRef_H
|
||||
#define polyRef_H
|
||||
|
||||
#include "labelIOList.H"
|
||||
#include "face.H"
|
||||
#include "HashSet.H"
|
||||
#include "DynamicList.H"
|
||||
#include "primitivePatch.H"
|
||||
#include "removeFaces.H"
|
||||
#include "polyRefinementHistory.H"
|
||||
#include "PackedList.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// Forward declaration of classes
|
||||
class polyMesh;
|
||||
class polyPatch;
|
||||
class directTopoChange;
|
||||
class mapPolyMesh;
|
||||
class mapDistributePolyMesh;
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class polyRef Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class polyRef
|
||||
{
|
||||
// Private data
|
||||
|
||||
//- Reference to underlying mesh
|
||||
const polyMesh& mesh_;
|
||||
|
||||
//- Per cell the refinement level
|
||||
labelIOList cellLevel_;
|
||||
|
||||
//- Per point the refinement level
|
||||
labelIOList pointLevel_;
|
||||
|
||||
//- Typical edge length between unrefined points
|
||||
const scalar level0Edge_;
|
||||
|
||||
//- Refinement history
|
||||
polyRefinementHistory history_;
|
||||
|
||||
//- Face remover engine
|
||||
removeFaces faceRemover_;
|
||||
|
||||
//- Level of saved points
|
||||
Map<label> savedPointLevel_;
|
||||
|
||||
//- Level of saved cells
|
||||
Map<label> savedCellLevel_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Reorder according to map
|
||||
static void reorder
|
||||
(
|
||||
const labelList& map,
|
||||
const label len,
|
||||
const label null,
|
||||
labelList& elems
|
||||
);
|
||||
|
||||
//- Get patch and zone info
|
||||
void getFaceInfo
|
||||
(
|
||||
const label faceI,
|
||||
label& patchID,
|
||||
label& zoneID,
|
||||
label& zoneFlip
|
||||
) const;
|
||||
|
||||
//- Adds a face on top of existing faceI. Reverses if nessecary
|
||||
label addFace
|
||||
(
|
||||
directTopoChange& meshMod,
|
||||
const label faceI,
|
||||
const face& newFace,
|
||||
const label own,
|
||||
const label nei
|
||||
) const;
|
||||
|
||||
//- Adds internal face from point. No checks on reversal
|
||||
label addInternalFace
|
||||
(
|
||||
directTopoChange& meshMod,
|
||||
const label meshFaceI,
|
||||
const label meshPointI,
|
||||
const face& newFace,
|
||||
const label own,
|
||||
const label nei
|
||||
) const;
|
||||
|
||||
//- Modifies existing faceI for either new owner/neighbour or new face
|
||||
// points. Reverses if nessecary
|
||||
void modFace
|
||||
(
|
||||
directTopoChange& meshMod,
|
||||
const label faceI,
|
||||
const face& newFace,
|
||||
const label own,
|
||||
const label nei
|
||||
) const;
|
||||
|
||||
scalar getLevel0EdgeLength() const;
|
||||
|
||||
//- Get cell added to point of cellI (if any)
|
||||
label getAnchorCell
|
||||
(
|
||||
const labelListList& cellAnchorPoints,
|
||||
const labelListList& cellAddedCells,
|
||||
const label cellI,
|
||||
const label faceI,
|
||||
const label pointI
|
||||
) const;
|
||||
|
||||
//- Get new owner and neighbour (in unspecified order) of pointI
|
||||
// on faceI
|
||||
void getFaceNeighbours
|
||||
(
|
||||
const labelListList& cellAnchorPoints,
|
||||
const labelListList& cellAddedCells,
|
||||
const label faceI,
|
||||
const label pointI,
|
||||
|
||||
label& own,
|
||||
label& nei
|
||||
) const;
|
||||
|
||||
|
||||
//- Get index of point with minimum pointlevel
|
||||
label findMinLevel(const labelList& f) const;
|
||||
|
||||
//- Get index of point with maximum pointlevel
|
||||
label findMaxLevel(const labelList& f) const;
|
||||
|
||||
//- Count number of vertices <= anchorLevel
|
||||
label countAnchors(const labelList&, const label) const;
|
||||
|
||||
//- Find index of point with wantedLevel, starting from fp
|
||||
label findLevel
|
||||
(
|
||||
const face& f,
|
||||
const label startFp,
|
||||
const bool searchForward,
|
||||
const label wantedLevel
|
||||
) const;
|
||||
|
||||
////- Print levels of list of points.
|
||||
//void printLevels(Ostream&, const labelList&) const;
|
||||
|
||||
//- debug: check orientation of added internal face
|
||||
static void checkInternalOrientation
|
||||
(
|
||||
directTopoChange& meshMod,
|
||||
const label cellI,
|
||||
const label faceI,
|
||||
const point& ownPt,
|
||||
const point& neiPt,
|
||||
const face& newFace
|
||||
);
|
||||
|
||||
//- debug: check orientation of new boundary face
|
||||
static void checkBoundaryOrientation
|
||||
(
|
||||
directTopoChange& meshMod,
|
||||
const label cellI,
|
||||
const label faceI,
|
||||
const point& ownPt,
|
||||
const point& boundaryPt,
|
||||
const face& newFace
|
||||
);
|
||||
|
||||
//- If p0 and p1 are existing vertices check if edge is split and insert
|
||||
// splitPoint
|
||||
void insertEdgeSplit
|
||||
(
|
||||
const labelList& edgeMidPoint,
|
||||
const label p0,
|
||||
const label p1,
|
||||
dynamicLabelList& verts
|
||||
) const;
|
||||
|
||||
//- Store in maps correspondence from midpoint to anchors and faces
|
||||
label storeMidPointInfo
|
||||
(
|
||||
const labelListList& cellAnchorPoints,
|
||||
const labelListList& cellAddedCells,
|
||||
const labelList& cellMidPoint,
|
||||
const labelList& edgeMidPoint,
|
||||
const label cellI,
|
||||
const label faceI,
|
||||
const bool faceOrder,
|
||||
const label midPointI,
|
||||
const label anchorPointI,
|
||||
const label faceMidPointI,
|
||||
|
||||
Map<edge>& midPointToAnchors,
|
||||
Map<edge>& midPointToFaceMids,
|
||||
directTopoChange& meshMod
|
||||
) const;
|
||||
|
||||
//- Create all internal faces from an unsplit face
|
||||
void createInternalFromSplitFace
|
||||
(
|
||||
const labelListList& cellAnchorPoints,
|
||||
const labelListList& cellAddedCells,
|
||||
const labelList& cellMidPoint,
|
||||
const labelList& faceMidPoint,
|
||||
const labelList& edgeMidPoint,
|
||||
const label cellI,
|
||||
const label faceI,
|
||||
|
||||
Map<edge>& midPointToAnchors,
|
||||
Map<edge>& midPointToFaceMids,
|
||||
directTopoChange& meshMod,
|
||||
label& nFacesAdded
|
||||
) const;
|
||||
|
||||
//- Create all internal faces to split cellI into n cells where n is the
|
||||
// number of cell points
|
||||
void createInternalFaces
|
||||
(
|
||||
const labelListList& cellAnchorPoints,
|
||||
const labelListList& cellAddedCells,
|
||||
const labelList& cellMidPoint,
|
||||
const labelList& faceMidPoint,
|
||||
const labelList& faceAnchorLevel,
|
||||
const labelList& edgeMidPoint,
|
||||
const label cellI,
|
||||
directTopoChange& meshMod
|
||||
) const;
|
||||
|
||||
//- Store vertices from startFp upto face split point.
|
||||
// Used when splitting face into n faces where n is the number of
|
||||
// points in a face (or number of edges)
|
||||
void walkFaceToMid
|
||||
(
|
||||
const labelList& edgeMidPoint,
|
||||
const label cLevel,
|
||||
const label faceI,
|
||||
const label startFp,
|
||||
dynamicLabelList& faceVerts
|
||||
) const;
|
||||
|
||||
//- Same as walkFaceToMid but now walk back
|
||||
void walkFaceFromMid
|
||||
(
|
||||
const labelList& edgeMidPoint,
|
||||
const label cLevel,
|
||||
const label faceI,
|
||||
const label startFp,
|
||||
dynamicLabelList& faceVerts
|
||||
) const;
|
||||
|
||||
//- Updates refineCell such that a face consistent 2:1 refinement is
|
||||
// obtained. Returns local number of cells changed
|
||||
label faceConsistentRefinement
|
||||
(
|
||||
const bool maxSet,
|
||||
PackedList<1>& refineCell
|
||||
) const;
|
||||
|
||||
//- Updates refineCell such that a point consistent 4:1 refinement is
|
||||
// obtained. Returns local number of cells changed
|
||||
label pointConsistentRefinement
|
||||
(
|
||||
PackedList<1>& refineCell
|
||||
) const;
|
||||
|
||||
//- Updates unrefineCell such that a face consistent 2:1 unrefinement is
|
||||
// obtained. Returns local number of cells changed
|
||||
label faceConsistentUnrefinement
|
||||
(
|
||||
const bool maxSet,
|
||||
PackedList<1>& unrefineCell
|
||||
) const;
|
||||
|
||||
//- Updates unrefineCell such that a point consistent 4:1 unrefinement
|
||||
// is obtained. Returns local number of cells changed
|
||||
label pointConsistentUnrefinement
|
||||
(
|
||||
const PackedList<1>& unrefinePoints,
|
||||
PackedList<1>& unrefineCell
|
||||
) const;
|
||||
|
||||
//- Check wanted refinement for 2:1 consistency
|
||||
void checkWantedRefinementLevels(const labelList&) const;
|
||||
|
||||
|
||||
// Copy control
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
polyRef(const polyRef&);
|
||||
|
||||
//- Disallow default bitwise assignment
|
||||
void operator=(const polyRef&);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
ClassName("polyRef");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from mesh, read_if_present refinement data
|
||||
// (from write below)
|
||||
polyRef(const polyMesh& mesh);
|
||||
|
||||
//- Construct from mesh and un/refinement data
|
||||
polyRef
|
||||
(
|
||||
const polyMesh& mesh,
|
||||
const labelList& cellLevel,
|
||||
const labelList& pointLevel,
|
||||
const polyRefinementHistory& history
|
||||
);
|
||||
|
||||
//- Construct from mesh and refinement data.
|
||||
polyRef
|
||||
(
|
||||
const polyMesh& mesh,
|
||||
const labelList& cellLevel,
|
||||
const labelList& pointLevel
|
||||
);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
// Access
|
||||
|
||||
const labelIOList& cellLevel() const
|
||||
{
|
||||
return cellLevel_;
|
||||
}
|
||||
|
||||
const labelIOList& pointLevel() const
|
||||
{
|
||||
return pointLevel_;
|
||||
}
|
||||
|
||||
const polyRefinementHistory& history() const
|
||||
{
|
||||
return history_;
|
||||
}
|
||||
|
||||
//- Typical edge length between unrefined points
|
||||
scalar level0EdgeLength() const
|
||||
{
|
||||
return level0Edge_;
|
||||
}
|
||||
|
||||
// Refinement
|
||||
|
||||
//- Gets level such that the face has n points <= level, where n is
|
||||
// the number of points (or edges) for a face.
|
||||
label getAnchorLevel(const label faceI) const;
|
||||
|
||||
//- Helper: get points of a cell without using cellPoints addressing
|
||||
labelList cellPoints(const label cellI) const;
|
||||
|
||||
//- Given valid mesh and current cell level and proposed
|
||||
// cells to refine calculate any clashes (due to 2:1) and return
|
||||
// ok list of cells to refine.
|
||||
// Either adds cells to refine to set (maxSet = true) or
|
||||
// removes cells to refine (maxSet = false)
|
||||
Xfer<labelList> consistentRefinement
|
||||
(
|
||||
const labelList& cellsToRefine,
|
||||
const bool maxSet,
|
||||
const bool pointBasedRefinement
|
||||
) const;
|
||||
|
||||
//- Like consistentRefinement but slower:
|
||||
// - specify number of cells between consecutive refinement levels
|
||||
// (consistentRefinement equivalent to 1)
|
||||
// - specify max level difference between point-connected cells.
|
||||
// (-1 to disable). Note that with normal 2:1 limitation
|
||||
// (maxFaceDiff=1) there can be 8:1 size difference across point
|
||||
// connected cells so maxPointDiff allows you to make that less.
|
||||
// cellsToRefine : cells we're thinking about refining. It will
|
||||
// extend this set. All refinement levels will be
|
||||
// at least maxFaceDiff layers thick.
|
||||
// facesToCheck : additional faces where to implement the
|
||||
// maxFaceDiff thickness (usually only boundary
|
||||
// faces)
|
||||
Xfer<labelList> consistentSlowRefinement
|
||||
(
|
||||
const label maxFaceDiff,
|
||||
const labelList& cellsToRefine,
|
||||
const labelList& facesToCheck,
|
||||
const label maxPointDiff,
|
||||
const labelList& pointsToCheck
|
||||
) const;
|
||||
|
||||
//- Like consistentSlowRefinement but uses different meshWave
|
||||
// (proper distance instead of toplogical count). No point checks
|
||||
// yet
|
||||
Xfer<labelList> consistentSlowRefinement2
|
||||
(
|
||||
const label maxFaceDiff,
|
||||
const labelList& cellsToRefine,
|
||||
const labelList& facesToCheck
|
||||
) const;
|
||||
|
||||
//- Insert refinement. All selected cells will be split into n cells
|
||||
// where n is the number of points per cell.
|
||||
// Returns per element in cells the n cells they were split into.
|
||||
// Guarantees that the 0th element is the original cell label.
|
||||
// Mapping:
|
||||
// -split cells: n new ones get added from original
|
||||
// -split faces: original gets modified; n - 1 new ones get added
|
||||
// from original
|
||||
// -added internal faces: added from original cell face (if
|
||||
// that was internal) or created out-of-nothing (so will not
|
||||
// get mapped!). Note: could make this inflate from point but
|
||||
// that will allocate interpolation.
|
||||
// -points added to split edge: added from edge start()
|
||||
// -midpoints added: added from cellPoints[0].
|
||||
labelListList setRefinement
|
||||
(
|
||||
const labelList& cells,
|
||||
directTopoChange&
|
||||
);
|
||||
|
||||
//- Update local numbering for changed mesh
|
||||
void updateMesh(const mapPolyMesh&);
|
||||
|
||||
|
||||
// Restoring : is where other processes delete and reinsert data.
|
||||
// These callbacks allow this to restore the cellLevel
|
||||
// and pointLevel for reintroduced points.
|
||||
// Is not related to undoing my refinement
|
||||
|
||||
//- Signal points/face/cells for which to store data
|
||||
void storeData
|
||||
(
|
||||
const labelList& pointsToStore,
|
||||
const labelList& facesToStore,
|
||||
const labelList& cellsToStore
|
||||
);
|
||||
|
||||
//- Update local numbering + undo
|
||||
// Data to restore given as new pointlabel + stored pointlabel
|
||||
// (i.e. what was in pointsToStore)
|
||||
void updateMesh
|
||||
(
|
||||
const mapPolyMesh&,
|
||||
const Map<label>& pointsToRestore,
|
||||
const Map<label>& facesToRestore,
|
||||
const Map<label>& cellsToRestore
|
||||
);
|
||||
|
||||
|
||||
//- Update local numbering for subsetted mesh.
|
||||
// Gets new-to-old maps. Not compatible with unrefinement.
|
||||
void subset
|
||||
(
|
||||
const labelList& pointMap,
|
||||
const labelList& faceMap,
|
||||
const labelList& cellMap
|
||||
);
|
||||
|
||||
//- Update local numbering for mesh redistribution
|
||||
void distribute(const mapDistributePolyMesh&);
|
||||
|
||||
//- Debug: Check coupled mesh for correctness
|
||||
void checkMesh() const;
|
||||
|
||||
//- Debug: Check 2:1 consistency across faces.
|
||||
// maxPointDiff==-1 : only check 2:1 across faces
|
||||
// maxPointDiff!=-1 : check point-connected cells.
|
||||
void checkRefinementLevels
|
||||
(
|
||||
const label maxPointDiff,
|
||||
const labelList& pointsToCheck
|
||||
) const;
|
||||
|
||||
|
||||
// Unrefinement (undoing refinement, not arbitrary coarsening)
|
||||
|
||||
//- Return the points at the centre of top-level split cells
|
||||
// that can be unsplit.
|
||||
labelList getSplitPoints() const;
|
||||
|
||||
//- Given proposed splitPoints to unrefine according to calculate
|
||||
// any clashes (due to 2:1) and return ok list of points to
|
||||
// unrefine. Either adds points to refine to set (maxSet = true)
|
||||
// or removes points to refine (maxSet = false)
|
||||
labelList consistentUnrefinement
|
||||
(
|
||||
const labelList& pointsToUnrefine,
|
||||
const bool maxSet,
|
||||
const bool pointBasedUnrefinement
|
||||
) const;
|
||||
|
||||
//- Remove some refinement. Needs to be supplied output of
|
||||
// consistentUnrefinement. Only call if undoable set.
|
||||
// All n pointCells of a split point will be combined into
|
||||
// the lowest numbered cell of those n.
|
||||
void setUnrefinement
|
||||
(
|
||||
const labelList& splitPointLabels,
|
||||
directTopoChange&
|
||||
);
|
||||
|
||||
|
||||
// Write
|
||||
|
||||
// Set instance for mesh files
|
||||
void setInstance(const fileName& inst);
|
||||
|
||||
//- Force writing refinement+history to polyMesh directory.
|
||||
bool write() const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
File diff suppressed because it is too large
Load diff
|
@ -1,381 +0,0 @@
|
|||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | foam-extend: Open Source CFD
|
||||
\\ / O peration | Version: 4.0
|
||||
\\ / A nd | Web: http://www.foam-extend.org
|
||||
\\/ M anipulation | For copyright notice see file Copyright
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of foam-extend.
|
||||
|
||||
foam-extend 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.
|
||||
|
||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::polyRefinementHistory
|
||||
|
||||
Description
|
||||
All refinement history. Used in unrefinement.
|
||||
|
||||
- visibleCells: valid for the current mesh and contains per cell -1
|
||||
(cell unrefined) or an index into splitCells_.
|
||||
- splitCells: for every split contains the parent (also index into
|
||||
splitCells) and optionally a subsplit as n indices into splitCells, where
|
||||
n is the number of points of a cell. Note that the numbers in splitCells
|
||||
are not cell labels, they are purely indices into splitCells.
|
||||
|
||||
E.g. 2 cells, cell 1 gets refined so end up with 9 cells:
|
||||
@verbatim
|
||||
// splitCells
|
||||
9
|
||||
(
|
||||
-1 (1 2 3 4 5 6 7 8)
|
||||
0 0()
|
||||
0 0()
|
||||
0 0()
|
||||
0 0()
|
||||
0 0()
|
||||
0 0()
|
||||
0 0()
|
||||
0 0()
|
||||
)
|
||||
|
||||
// visibleCells
|
||||
9(-1 1 2 3 4 5 6 7 8)
|
||||
@endverbatim
|
||||
|
||||
|
||||
So cell0 (visibleCells=-1) is unrefined.
|
||||
Cells 1-8 have all valid splitCells entries which are:
|
||||
- parent:0
|
||||
- subsplits:0()
|
||||
|
||||
The parent 0 refers back to the splitcell entries.
|
||||
|
||||
|
||||
SourceFiles
|
||||
polyRefinementHistory.C
|
||||
|
||||
<<<<<<< 7cd6e2357adfdf4cf68d7a6c8b8131585a0c68b7
|
||||
Author
|
||||
Vuko Vukcevic, Wikki Ltd. All rights reserved
|
||||
|
||||
Notes
|
||||
Generalisation of refinementHistory for polyhedral cells
|
||||
|
||||
=======
|
||||
>>>>>>> Created polyRefinementHistory
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef polyRefinementHistory_H
|
||||
#define polyRefinementHistory_H
|
||||
|
||||
#include "DynamicList.H"
|
||||
#include "dynamicLabelList.H"
|
||||
#include "labelList.H"
|
||||
#include "FixedList.H"
|
||||
#include "SLList.H"
|
||||
#include "autoPtr.H"
|
||||
#include "regIOobject.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// Forward declaration of classes
|
||||
class mapPolyMesh;
|
||||
class mapDistributePolyMesh;
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class polyRefinementHistory Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class polyRefinementHistory
|
||||
:
|
||||
public regIOobject
|
||||
{
|
||||
public:
|
||||
|
||||
class splitPolyCell
|
||||
{
|
||||
public:
|
||||
|
||||
// Index to original splitCell this cell was refined off from
|
||||
// -1: top level cell
|
||||
// -2: free splitCell (so should also be in freeSplitCells_)
|
||||
label parent_;
|
||||
|
||||
//- cells this cell was refined into
|
||||
autoPtr<labelList> addedCellsPtr_;
|
||||
|
||||
//- Construct null (parent = -1)
|
||||
splitPolyCell();
|
||||
|
||||
//- Construct from parent
|
||||
splitPolyCell(const label parent);
|
||||
|
||||
//- Construct from Istream
|
||||
splitPolyCell(Istream& is);
|
||||
|
||||
//- Construct as deep copy
|
||||
splitPolyCell(const splitPolyCell&);
|
||||
|
||||
//- Copy operator since autoPtr otherwise 'steals' storage.
|
||||
void operator=(const splitPolyCell& s)
|
||||
{
|
||||
// Check for assignment to self
|
||||
if (this == &s)
|
||||
{
|
||||
FatalErrorIn
|
||||
(
|
||||
"splitPolyCell::operator=(const Foam::splitPolyCell&)"
|
||||
) << "Attempted assignment to self"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
parent_ = s.parent_;
|
||||
|
||||
addedCellsPtr_.reset
|
||||
(
|
||||
s.addedCellsPtr_.valid()
|
||||
? new labelList(s.addedCellsPtr_())
|
||||
: NULL
|
||||
);
|
||||
}
|
||||
|
||||
bool operator==(const splitPolyCell& s) const
|
||||
{
|
||||
if (addedCellsPtr_.valid() != s.addedCellsPtr_.valid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (parent_ != s.parent_)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else if (addedCellsPtr_.valid())
|
||||
{
|
||||
return addedCellsPtr_() == s.addedCellsPtr_();
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool operator!=(const splitPolyCell& s) const
|
||||
{
|
||||
return !operator==(s);
|
||||
}
|
||||
|
||||
friend Istream& operator>>(Istream&, splitPolyCell&);
|
||||
friend Ostream& operator<<(Ostream&, const splitPolyCell&);
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
|
||||
TypeName("polyRefinementHistory");
|
||||
|
||||
// Private data
|
||||
|
||||
//- Storage for splitCells
|
||||
DynamicList<splitPolyCell> splitCells_;
|
||||
|
||||
//- Unused indices in splitCells
|
||||
dynamicLabelList freeSplitCells_;
|
||||
|
||||
//- Currently visible cells. Indices into splitCells.
|
||||
labelList visibleCells_;
|
||||
|
||||
|
||||
// Private member functions
|
||||
|
||||
//- Debug write
|
||||
static void writeEntry
|
||||
(
|
||||
const List<splitPolyCell>&,
|
||||
const splitPolyCell&
|
||||
);
|
||||
|
||||
//- Debug write
|
||||
static void writeDebug
|
||||
(
|
||||
const labelList&,
|
||||
const List<splitPolyCell>&
|
||||
);
|
||||
|
||||
//- Check consistency of structure, i.e. indices into splitCells_.
|
||||
void checkIndices() const;
|
||||
|
||||
//- Allocate a splitCell. Return index in splitCells_.
|
||||
label allocateSplitCell
|
||||
(
|
||||
const label parent,
|
||||
const label i,
|
||||
const label nCells
|
||||
);
|
||||
|
||||
//- Free a splitCell.
|
||||
void freeSplitCell(const label index);
|
||||
|
||||
//- Mark entry in splitCells. Recursively mark its parent and subs.
|
||||
void markSplit
|
||||
(
|
||||
const label,
|
||||
labelList& oldToNew,
|
||||
DynamicList<splitPolyCell>&
|
||||
) const;
|
||||
|
||||
void countProc
|
||||
(
|
||||
const label index,
|
||||
const label newProcNo,
|
||||
labelList& splitCellProc,
|
||||
labelList& splitCellNum
|
||||
) const;
|
||||
|
||||
public:
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct (read) given an IOobject
|
||||
polyRefinementHistory(const IOobject&);
|
||||
|
||||
//- Construct (read) or construct null
|
||||
polyRefinementHistory
|
||||
(
|
||||
const IOobject&,
|
||||
const List<splitPolyCell>& splitCells,
|
||||
const labelList& visibleCells
|
||||
);
|
||||
|
||||
//- Construct (read) or construct from initial number of cells
|
||||
// (all visible)
|
||||
polyRefinementHistory(const IOobject&, const label nCells);
|
||||
|
||||
//- Construct as copy
|
||||
polyRefinementHistory(const IOobject&, const polyRefinementHistory&);
|
||||
|
||||
//- Construct from Istream
|
||||
polyRefinementHistory(const IOobject&, Istream&);
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Per cell in the current mesh (i.e. visible) either -1 (unrefined)
|
||||
// or an index into splitCells.
|
||||
const labelList& visibleCells() const
|
||||
{
|
||||
return visibleCells_;
|
||||
}
|
||||
|
||||
//- Storage for splitPolyCells.
|
||||
const DynamicList<splitPolyCell>& splitCells() const
|
||||
{
|
||||
return splitCells_;
|
||||
}
|
||||
|
||||
//- Cache of unused indices in splitCells
|
||||
const dynamicLabelList& freeSplitCells() const
|
||||
{
|
||||
return freeSplitCells_;
|
||||
}
|
||||
|
||||
//- Is there unrefinement history. Note that this will fall over if
|
||||
// there are 0 cells in the mesh. But this gives problems with
|
||||
// lots of other programs anyway.
|
||||
bool active() const
|
||||
{
|
||||
return visibleCells_.size() > 0;
|
||||
}
|
||||
|
||||
//- Get parent of cell
|
||||
label parentIndex(const label cellI) const
|
||||
{
|
||||
label index = visibleCells_[cellI];
|
||||
|
||||
if (index < 0)
|
||||
{
|
||||
FatalErrorIn("polyRefinementHistory::parentIndex(const label)")
|
||||
<< "Cell " << cellI << " is not visible"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
return splitCells_[index].parent_;
|
||||
}
|
||||
|
||||
//- Store splitting of cell into n (number of points for a cell)
|
||||
void storeSplit
|
||||
(
|
||||
const label cellI,
|
||||
const labelList& addedCells
|
||||
);
|
||||
|
||||
//- Store combining n cells into master
|
||||
void combineCells
|
||||
(
|
||||
const label masterCellI,
|
||||
const labelList& combinedCells
|
||||
);
|
||||
|
||||
//- Update numbering for mesh changes
|
||||
void updateMesh(const mapPolyMesh&);
|
||||
|
||||
//- Update numbering for subsetting
|
||||
void subset
|
||||
(
|
||||
const labelList& pointMap,
|
||||
const labelList& faceMap,
|
||||
const labelList& cellMap
|
||||
);
|
||||
|
||||
//- Update local numbering for mesh redistribution.
|
||||
// Can only distribute clusters sent across in one go; cannot
|
||||
// handle parts recombined in multiple passes.
|
||||
void distribute(const mapDistributePolyMesh&);
|
||||
|
||||
//- Compact splitCells_. Removes all freeSplitCells_ elements.
|
||||
void compact();
|
||||
|
||||
//- Extend/shrink storage. additional visibleCells_ elements get
|
||||
// set to -1.
|
||||
void resize(const label nCells);
|
||||
|
||||
//- Debug write
|
||||
void writeDebug() const;
|
||||
|
||||
|
||||
//- ReadData function required for regIOobject read operation
|
||||
virtual bool readData(Istream&);
|
||||
|
||||
//- WriteData function required for regIOobject write operation
|
||||
virtual bool writeData(Ostream&) const;
|
||||
|
||||
|
||||
// IOstream Operators
|
||||
|
||||
friend Istream& operator>>(Istream&, polyRefinementHistory&);
|
||||
friend Ostream& operator<<(Ostream&, const polyRefinementHistory&);
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
|
@ -0,0 +1,58 @@
|
|||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | foam-extend: Open Source CFD |
|
||||
| \\ / O peration | Version: 4.0 |
|
||||
| \\ / A nd | Web: http://www.foam-extend.org |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "constant";
|
||||
object dynamicMeshDict;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
dynamicFvMesh dynamicPolyRefinementFvMesh;
|
||||
|
||||
dynamicPolyRefinementFvMeshCoeffs
|
||||
{
|
||||
// Dynamic mesh procedure controls
|
||||
refineInterval 1;
|
||||
|
||||
// Refinement selection criteria
|
||||
refinementSelection
|
||||
{
|
||||
// Refines all cells with 0.001 < alpha < 0.999, otherwise unrefines
|
||||
// previously refined cells
|
||||
type fieldBoundsRefinement;
|
||||
fieldName alpha;
|
||||
lowerBound 0.001;
|
||||
upperBound 0.999;
|
||||
|
||||
// Whether to use cell-point-cell smoothing for selecting refinement
|
||||
// candidates. Off by default
|
||||
cellPointCellSmoothing off;
|
||||
}
|
||||
|
||||
// Polyhedral refinement engine controls
|
||||
active yes;
|
||||
|
||||
// Maximum number of cells to allow (not strictly controlled)
|
||||
maxCells 2000000;
|
||||
|
||||
// Maximum refinement level
|
||||
maxRefinementLevel 3;
|
||||
|
||||
// Number of buffer layers between refinement levels
|
||||
nBufferLayers 1;
|
||||
|
||||
// Whether to use point based consistency check. Needed when one allows more
|
||||
// than 2 refinement levels (automatically switched on in that case)
|
||||
pointBasedRefinement yes;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
Reference in a new issue