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:
Vuko Vukcevic 2018-02-28 14:13:39 +01:00
parent e1523d07ac
commit 7459da3a36
10 changed files with 58 additions and 9153 deletions

View file

@ -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

View file

@ -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));
}
// ************************************************************************* //

View file

@ -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
// ************************************************************************* //

View file

@ -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

View file

@ -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
// ************************************************************************* //

View file

@ -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
// ************************************************************************* //

View file

@ -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;
}
// ************************************************************************* //