#include <MeshRefine.H>
This class manages grid generation from sets of tagged cells. It is designed to be a pure virtual base class from which another class may be derived with a specific grid-generation algorithm (for example, the BRMeshRefine class).
There are two ways grids can be defined based on tagged cells. one takes a single IntVectSet of tags defined on the BaseLevel mesh and uses that set of tags for every level to be refined; the other takes a Vector<IntVectSet> of tags defined on all the mesh levels to be refined and uses those.
Long Description:
Create new meshes based on tagged cells on a range of levels of a mesh hierarchy. Each level of tagged cells is used to generate a new mesh at the next finer level. The finest level in the output mesh will be one level higher than the top of the range of levels given as input. As a special case, use the same tags (appropriately refined) for all levels.
Usage:
Call the regrid functions after computing error estimates and tagging cells. To add a new mesh level, set TopLevel to the index of the finest level in the existing mesh and define tags on the finest level. To keep the existing number of mesh levels, set TopLevel to one less than the index of the finest level and don't define any tags on the finest level. If a single IntVectSet of tags is passed (instead of a Vector<IntVectSet>) then the same tags (properly refined) will be used for all the new meshes up to level TopLevel+1. In any case, the meshes at levels BaseLevel and below are not modified. The output argument newmeshes will be reallocated to the necessary size before being used. When this function returns, the elements of the newmeshes vector corresponding to the unchanged levels will be filled in with copies of the levels from the old mesh vector. The variable tags is modified in an undefined way, so its contents should not be relied upon. The variable BlockFactor specifies the amount by which each box will be coarsenable. Every grid box will have an integral multiple of BlockFactor cells in each dimension and also lower index values that are integral multiples. As a side effect, the minimum box size will be BlockFactor.
Expensive validations are done only when debugging is enabled (i.e. the DEBUG make variable is "TRUE").
Usage Notes:
All the input vectors should be defined with max index >= TopLevel. They should have values for indices [BaseLevel:TopLevel]. (except for OldMeshes, which must be defined for all indices). The new mesh vector newmeshes will be redefined up to index TopLevel+1. RefRatios should be defined such that RefRatios[L] is the value to use to refine the level L mesh to produce the level L+1 mesh. The tags vector is modified in an undefined manner. The output variable newmeshes may not be completely defined if an exception occurs. The BlockFactor can be used to force a minimum box size.
Public Member Functions | |
MeshRefine () | |
default constructor -- leaves object in an unusable state | |
MeshRefine (const Box &a_baseDomain, const Vector< int > &a_refRatios, const Real a_fillRatio, const int a_blockFactor, const int a_bufferSize, const int a_maxSize) | |
full constructor -- leaves object in usable state | |
MeshRefine (const ProblemDomain &a_baseDomain, const Vector< int > &a_refRatios, const Real a_fillRatio, const int a_blockFactor, const int a_bufferSize, const int a_maxSize) | |
full constructor -- leaves object in usable state | |
virtual | ~MeshRefine () |
destructor | |
void | define (const Box &a_baseDomain, const Vector< int > &a_refRatios, const Real a_fillRatio, const int a_blockFactor, const int a_bufferSize, const int a_maxSize) |
define function -- size of RefRatios will define maximum number of levels | |
virtual void | define (const ProblemDomain &a_baseDomain, const Vector< int > &a_refRatios, const Real a_fillRatio, const int a_blockFactor, const int a_bufferSize, const int a_maxSize) |
define function -- size of RefRatios will define maximum number of levels | |
virtual int | regrid (Vector< Vector< Box > > &a_newmeshes, const IntVectSet &a_tags, const int a_baseLevel, const int a_topLevel, const Vector< Vector< Box > > &a_oldMeshes) |
create hierarchy of grids from a single level of tags | |
virtual int | regrid (Vector< Vector< Box > > &a_newmeshes, Vector< IntVectSet > &a_tags, const int a_baseLevel, const int a_topLevel, const Vector< Vector< Box > > &a_oldMeshes) |
create hierarchy of grids from tags at all levels | |
const Vector< int > & | refRatios () const |
returns vector of refinement ratios | |
Real | fillRatio () const |
returns fillRatio | |
int | blockFactor () const |
returns blocking factor | |
int | bufferSize () const |
returns proper nesting buffer size | |
int | maxSize () const |
returns maximum box size in any dimension -- 0 means no limit | |
void | refRatios (const Vector< int > &a_nRefVect) |
sets vector of refinement ratios | |
virtual void | fillRatio (const Real a_fill_ratio) |
sets fillRatio | |
virtual void | blockFactor (const int a_block_factor) |
sets blocking factor | |
virtual void | bufferSize (const int a_buffer_size) |
sets proper nesting buffer size | |
virtual void | maxSize (const int a_max_size) |
sets maximum box size in any dimension -- 0 means no limit | |
bool | isDefined () const |
has this object been defined properly? | |
void | granularity (int a_granularity) |
sets proper nesting region granularity. | |
virtual void | makeBoxes (Vector< Box > &a_mesh, const IntVectSet &a_tags, const IntVectSet &a_pnd, const ProblemDomain &a_domain, const int a_maxSize, const int a_totalBufferSize) const =0 |
constructs a set of boxes which covers a set of tagged cells | |
void | setPNDMode (int a_mode) |
void | setRefineDirs (const IntVect &a_refineDirs) |
set each component to 1 or 0 according to whether or not we refine in that direction. Default IntVect::Unit. | |
IntVect | inRefineDirs (int a_val) const |
returns IntVect with component d set to a_val if m_refineDirs[d] == 1; else 1. | |
void | restrictUnrefined (Box &a_box) const |
void | restrictUnrefined (IntVectSet &a_ivs) const |
Protected Member Functions | |
virtual void | computeLocalBlockFactors () |
computes local blockFactors used internally to enforce the BlockFactor | |
virtual bool | properlyNested (const Box &a_box, const ProblemDomain &a_domain, const IntVectSet &a_pnd, int a_totalBuffer) const |
virtual void | makePNDs (Vector< IntVectSet > &a_pnds, Vector< int > &a_totalBufferSize, const int a_baseLevel, const int a_topLevel, const Vector< ProblemDomain > &a_domains, const IntVectSet &a_baseMesh, const Vector< int > &a_bufferSize) const |
Computes proper nesting domains. | |
virtual void | makePNDs (Vector< IntVectSet > &a_pnds, Vector< int > &a_totalBufferSize, const int a_baseLevel, const int a_topLevel, const Vector< ProblemDomain > &a_domains, const Vector< Box > &a_baseMesh, const Vector< int > &a_bufferSize) const |
virtual void | buildSupport (const ProblemDomain &lvldomain, Vector< Box > &lvlboxes, IntVectSet &modifiedTags) |
virtual void | clipBox (Box &a_box, const ProblemDomain &a_domain) const |
Protected Attributes | |
bool | m_isDefined |
Vector< ProblemDomain > | m_vectDomains |
Vector< IntVectSet > | m_pnds |
int | m_lastBase |
int | m_lastTop |
int | m_lastBuffer |
Vector< int > | m_nRefVect |
Real | m_fillRatio |
int | m_blockFactor |
Vector< int > | m_level_blockfactors |
int | m_bufferSize |
int | m_maxSize |
int | m_granularity |
int | m_PNDMode |
IntVect | m_refineDirs |
int | m_lowestRefineDir |
MeshRefine::MeshRefine | ( | ) |
default constructor -- leaves object in an unusable state
MeshRefine::MeshRefine | ( | const Box & | a_baseDomain, | |
const Vector< int > & | a_refRatios, | |||
const Real | a_fillRatio, | |||
const int | a_blockFactor, | |||
const int | a_bufferSize, | |||
const int | a_maxSize | |||
) |
full constructor -- leaves object in usable state
a_baseDomain | level 0 domain |
a_refRatios | refinement ratios -- refRatio[0] is btwn levels 0 and 1 |
a_fillRatio | measure of how efficiently tagged cells will be covered |
a_blockFactor | amount by which grids are guaranteed to be coarsenable |
a_bufferSize | proper nesting buffer amount |
a_maxSize | maximum grid length in any direction -- 0 means no limit. |
MeshRefine::MeshRefine | ( | const ProblemDomain & | a_baseDomain, | |
const Vector< int > & | a_refRatios, | |||
const Real | a_fillRatio, | |||
const int | a_blockFactor, | |||
const int | a_bufferSize, | |||
const int | a_maxSize | |||
) |
full constructor -- leaves object in usable state
a_baseDomain | level 0 domain |
a_refRatios | refinement ratios -- refRatio[0] is btwn levels 0 and 1 |
a_fillRatio | measure of how efficiently tagged cells will be covered |
a_blockFactor | amount by which grids are guaranteed to be coarsenable |
a_bufferSize | proper nesting buffer amount |
a_maxSize | maximum grid length in any direction -- 0 means no limit. |
virtual MeshRefine::~MeshRefine | ( | ) | [virtual] |
destructor
void MeshRefine::define | ( | const Box & | a_baseDomain, | |
const Vector< int > & | a_refRatios, | |||
const Real | a_fillRatio, | |||
const int | a_blockFactor, | |||
const int | a_bufferSize, | |||
const int | a_maxSize | |||
) |
define function -- size of RefRatios will define maximum number of levels
a_baseDomain | level 0 domain |
a_refRatios | refinement ratios -- refRatio[0] is btwn levels 0 and 1 |
a_fillRatio | measure of how efficiently tagged cells will be covered |
a_blockFactor | amount by which grids are guaranteed to be coarsenable |
a_bufferSize | proper nesting buffer amount |
a_maxSize | maximum grid length in any direction -- 0 means no limit |
Reimplemented in BRMeshRefine.
virtual void MeshRefine::define | ( | const ProblemDomain & | a_baseDomain, | |
const Vector< int > & | a_refRatios, | |||
const Real | a_fillRatio, | |||
const int | a_blockFactor, | |||
const int | a_bufferSize, | |||
const int | a_maxSize | |||
) | [virtual] |
define function -- size of RefRatios will define maximum number of levels
a_baseDomain | level 0 domain |
a_refRatios | refinement ratios -- refRatio[0] is btwn levels 0 and 1 |
a_fillRatio | measure of how efficiently tagged cells will be covered |
a_blockFactor | amount by which grids are guaranteed to be coarsenable |
a_bufferSize | proper nesting buffer amount |
a_maxSize | maximum grid length in any direction -- 0 means no limit |
Reimplemented in BRMeshRefine.
virtual int MeshRefine::regrid | ( | Vector< Vector< Box > > & | a_newmeshes, | |
const IntVectSet & | a_tags, | |||
const int | a_baseLevel, | |||
const int | a_topLevel, | |||
const Vector< Vector< Box > > & | a_oldMeshes | |||
) | [virtual] |
create hierarchy of grids from a single level of tags
This function creates a hierarchy of grids from a single level of tags on BaseLevel. If tags exist, then all levels will have grids. Returns the new finest level of grids.
If m_refineDirs != IntVect::Unit, then a_tags and a_oldMeshes must have ranges restricted to 0 in all dimensions d with m_refineDirs[d] == 0, and the output a_newmeshes will have this same restriction.
a_newmeshes | new set of grids at every level |
a_tags | tagged cells on baseLevel |
a_baseLevel | index of base mesh level (finest unchanged level) |
a_topLevel | top level to refine (one less than finest possible level) |
a_oldMeshes | existing grids (if no previous grids, set to domains) |
virtual int MeshRefine::regrid | ( | Vector< Vector< Box > > & | a_newmeshes, | |
Vector< IntVectSet > & | a_tags, | |||
const int | a_baseLevel, | |||
const int | a_topLevel, | |||
const Vector< Vector< Box > > & | a_oldMeshes | |||
) | [virtual] |
create hierarchy of grids from tags at all levels
This function creates a hierarchy of grids from tags at all refinement levels. It is possible that not all levels will return with grids, since there may not be tags at all levels. Returns the new finest level of grids.
If m_refineDirs != IntVect::Unit, then a_tags and a_oldMeshes must have ranges restricted to 0 in all dimensions d with m_refineDirs[d] == 0, and the output a_newmeshes will have this same restriction.
a_newmeshes | new set of grids at every level |
a_tags | tagged cells on each existing level |
a_baseLevel | index of base mesh level (finest unchanged level) |
a_topLevel | top level to refine (one less than finest possible level) |
a_oldMeshes | existing grids (if no previous grids, set to domains) |
const Vector<int>& MeshRefine::refRatios | ( | ) | const |
returns vector of refinement ratios
Real MeshRefine::fillRatio | ( | ) | const |
returns fillRatio
int MeshRefine::blockFactor | ( | ) | const |
returns blocking factor
int MeshRefine::bufferSize | ( | ) | const |
returns proper nesting buffer size
int MeshRefine::maxSize | ( | ) | const |
returns maximum box size in any dimension -- 0 means no limit
void MeshRefine::refRatios | ( | const Vector< int > & | a_nRefVect | ) |
sets vector of refinement ratios
virtual void MeshRefine::fillRatio | ( | const Real | a_fill_ratio | ) | [virtual] |
sets fillRatio
virtual void MeshRefine::blockFactor | ( | const int | a_block_factor | ) | [virtual] |
sets blocking factor
virtual void MeshRefine::bufferSize | ( | const int | a_buffer_size | ) | [virtual] |
sets proper nesting buffer size
virtual void MeshRefine::maxSize | ( | const int | a_max_size | ) | [virtual] |
sets maximum box size in any dimension -- 0 means no limit
bool MeshRefine::isDefined | ( | ) | const |
has this object been defined properly?
void MeshRefine::granularity | ( | int | a_granularity | ) |
sets proper nesting region granularity.
virtual void MeshRefine::makeBoxes | ( | Vector< Box > & | a_mesh, | |
const IntVectSet & | a_tags, | |||
const IntVectSet & | a_pnd, | |||
const ProblemDomain & | a_domain, | |||
const int | a_maxSize, | |||
const int | a_totalBufferSize | |||
) | const [pure virtual] |
constructs a set of boxes which covers a set of tagged cells
constructs a set of boxes which covers a set of tagged cells by using the algorithm of choice. Everything should be on the same level, and blocking factor is not applied. Boxes will be on the same refinement level as the tags. This would normally be a protected function, but it can be useful to call it on its own, so it has been left public.
a_mesh | output: refined boxes at each new level |
a_tags | input: set of tagged cells to cover |
a_pnd | input: proper nesting domain in which mesh boxes must live |
a_domain | input: physical domain |
a_maxSize | input: largest number of cells in any dimension for any box |
Implemented in BRMeshRefine.
void MeshRefine::setPNDMode | ( | int | a_mode | ) |
void MeshRefine::setRefineDirs | ( | const IntVect & | a_refineDirs | ) |
set each component to 1 or 0 according to whether or not we refine in that direction. Default IntVect::Unit.
IntVect MeshRefine::inRefineDirs | ( | int | a_val | ) | const |
returns IntVect with component d set to a_val if m_refineDirs[d] == 1; else 1.
void MeshRefine::restrictUnrefined | ( | Box & | a_box | ) | const |
void MeshRefine::restrictUnrefined | ( | IntVectSet & | a_ivs | ) | const |
virtual void MeshRefine::computeLocalBlockFactors | ( | ) | [protected, virtual] |
computes local blockFactors used internally to enforce the BlockFactor
This function computes values for m_local_blockfactors array, which is the amount that tags on a level are coarsened in order to guarantee that the grids on the next finer level are coarsenable by the BlockFactor.
virtual bool MeshRefine::properlyNested | ( | const Box & | a_box, | |
const ProblemDomain & | a_domain, | |||
const IntVectSet & | a_pnd, | |||
int | a_totalBuffer | |||
) | const [protected, virtual] |
virtual void MeshRefine::makePNDs | ( | Vector< IntVectSet > & | a_pnds, | |
Vector< int > & | a_totalBufferSize, | |||
const int | a_baseLevel, | |||
const int | a_topLevel, | |||
const Vector< ProblemDomain > & | a_domains, | |||
const IntVectSet & | a_baseMesh, | |||
const Vector< int > & | a_bufferSize | |||
) | const [protected, virtual] |
Computes proper nesting domains.
This should only be called by refine. it assumes that everything has already been coarsened by the local blocking factor
a_pnds | output: proper nesting domains at each level |
a_baseLevel | input: index of highest AMR level not to be refined |
a_topLevel | input: index of highest AMR level in output |
a_domains | input: (same as in meshRefine) |
a_baseMesh | input: boxes at mesh level BaseLevel |
a_bufferSize | input: (similar to meshRefine; but with level-dependent coarsening factors) |
virtual void MeshRefine::makePNDs | ( | Vector< IntVectSet > & | a_pnds, | |
Vector< int > & | a_totalBufferSize, | |||
const int | a_baseLevel, | |||
const int | a_topLevel, | |||
const Vector< ProblemDomain > & | a_domains, | |||
const Vector< Box > & | a_baseMesh, | |||
const Vector< int > & | a_bufferSize | |||
) | const [protected, virtual] |
a_pnds | output: proper nesting domains at each level |
a_baseLevel | input: index of highest AMR level not to be refined |
a_topLevel | input: index of highest AMR level in output |
a_domains | input: (same as in meshRefine) |
a_baseMesh | input: boxes at mesh level BaseLevel |
a_bufferSize | input: (similar to meshRefine; but with level-dependent coarsening factors) |
virtual void MeshRefine::buildSupport | ( | const ProblemDomain & | lvldomain, | |
Vector< Box > & | lvlboxes, | |||
IntVectSet & | modifiedTags | |||
) | [protected, virtual] |
virtual void MeshRefine::clipBox | ( | Box & | a_box, | |
const ProblemDomain & | a_domain | |||
) | const [protected, virtual] |
bool MeshRefine::m_isDefined [protected] |
Vector<ProblemDomain> MeshRefine::m_vectDomains [protected] |
Vector<IntVectSet> MeshRefine::m_pnds [protected] |
int MeshRefine::m_lastBase [protected] |
int MeshRefine::m_lastTop [protected] |
int MeshRefine::m_lastBuffer [protected] |
Vector<int> MeshRefine::m_nRefVect [protected] |
Real MeshRefine::m_fillRatio [protected] |
int MeshRefine::m_blockFactor [protected] |
Vector<int> MeshRefine::m_level_blockfactors [protected] |
int MeshRefine::m_bufferSize [protected] |
int MeshRefine::m_maxSize [protected] |
int MeshRefine::m_granularity [protected] |
int MeshRefine::m_PNDMode [protected] |
IntVect MeshRefine::m_refineDirs [protected] |
int MeshRefine::m_lowestRefineDir [protected] |