chombo-discharge
|
Multigrid interpolator class. More...
#include <CD_EBMGLeastSquaresInterpolator.H>
Public Types | |
using | CellLocation = Location::Cell |
Specification of cell-center or cell-centroid type of interpolation. | |
Public Member Functions | |
EBMultigridInterpolator ()=delete | |
Disallowed constructor. | |
EBMultigridInterpolator (const EBMultigridInterpolator &a_other)=delete | |
Disallowed copy constructor. | |
EBMultigridInterpolator (const EBLevelGrid &a_eblgFine, const EBLevelGrid &a_eblgCoar, const CellLocation a_dataLocation, const IntVect &a_ghostVector, const int a_refRat, const int a_ghostCF, const int a_order, const int a_weighting=0) | |
Full constructor. More... | |
~EBMultigridInterpolator () | |
Destructor (does nothing) | |
int | getGhostCF () const |
Return number of ghost cells across CF interface. | |
void | coarseFineInterp (LevelData< EBCellFAB > &a_phiFine, const LevelData< EBCellFAB > &a_phiCoar, const Interval a_variables) |
Do inhomogeneous interpolation. More... | |
void | slowCoarseFineInterp (LevelData< EBCellFAB > &a_phiFine, const LevelData< EBCellFAB > &a_phiCoar, const Interval a_variables) |
Do inhomogeneous interpolation. More... | |
void | coarseFineInterpH (LevelData< EBCellFAB > &a_phiFine, const Interval a_variables) const |
Do homogeneous interpolation. More... | |
void | slowCoarseFineInterpH (LevelData< EBCellFAB > &a_phiFine, const Interval a_variables) const |
Do homogeneous interpolation. More... | |
void | coarseFineInterpH (EBCellFAB &a_phiFine, const Interval a_variables, const DataIndex &a_dit) const |
Do homogeneous coarse-fine interpolation on a grid patch. More... | |
void | slowCoarseFineInterpH (EBCellFAB &a_phiFine, const Interval a_variables, const DataIndex &a_dit) const |
Do homogeneous coarse-fine interpolation on a grid patch. More... | |
EBMultigridInterpolator () | |
Disallowed constructor. | |
EBMultigridInterpolator (const EBMultigridInterpolator &a_other)=delete | |
Disallowed copy constructor. | |
virtual | ~EBMultigridInterpolator () |
Destructor (does nothing) | |
virtual int | getGhostCF () const =0 |
Return number of ghost cells across CF interface. | |
virtual void | coarseFineInterp (LevelData< EBCellFAB > &a_phiFine, const LevelData< EBCellFAB > &a_phiCoar, const Interval a_variables) const =0 |
Do inhomogeneous interpolation. More... | |
virtual void | coarseFineInterpH (LevelData< EBCellFAB > &a_phiFine, const Interval a_variables) const =0 |
Do homogeneous interpolation. More... | |
virtual void | coarseFineInterpH (EBCellFAB &a_phiFine, const Interval a_variables, const DataIndex &a_dit) const =0 |
Do homogeneous coarse-fine interpolation on a grid patch. More... | |
Protected Member Functions | |
void | defineGhostRegions () |
Define ghost cells to be filled in range m_ghostCF from each cut-cell. | |
void | defineGrids (const EBLevelGrid &a_eblgFine, const EBLevelGrid &a_eblgCoar) |
Define grids. More... | |
void | defineBuffers () |
Define data holders. | |
void | defineStencilsEBCF () |
Define stencils for interpolation across the EBCF refinement boundary. | |
void | makeAggStencils () |
Build the AggStencil objects for faster stencil aggregation. | |
bool | getStencil (VoFStencil &a_stencilFine, VoFStencil &a_stencilCoar, const CellLocation &a_dataLocation, const VolIndex &a_ghostVofFine, const VolIndex &a_ghostVofCoar, const EBISBox &a_ebisboxFine, const EBISBox &a_ebisboxCoar, const DenseIntVectSet &a_validFineCells, const DenseIntVectSet &a_validCoarCells, const Real &a_dxFine, const Real &a_dxCoar, const int &a_order, const int &a_weight) |
Build an interpolation stencil. More... | |
Protected Attributes | |
RefCountedPtr< QuadCFInterp > | m_scalarInterpolator |
For regular interpolation of scalar quantities. | |
RefCountedPtr< QuadCFInterp > | m_vectorInterpolator |
For regular interpolation of vector quantities. | |
CellLocation | m_dataLocation |
How to interpret data locations. | |
EBLevelGrid | m_eblgFine |
Fine grids. | |
EBLevelGrid | m_eblgCoar |
Coarse grids. | |
EBLevelGrid | m_eblgCoFi |
Refined coarse grids. | |
BoxLayout | m_grownCoarBoxesLayout |
Grown box layout on the coarse level. | |
BoxLayoutData< EBCellFAB > | m_grownCoarData |
Coarsened data. | |
LayoutData< VoFIterator > | m_vofIterFine |
Iterator over ghost cells. | |
IntVect | m_ghostVector |
Minimum number of ghost cells in input data. | |
int | m_refRat |
Refinement factor between fine and coarse level. | |
int | m_ghostCF |
Number of ghost cells to fill across coarse-fine interface. More... | |
int | m_order |
Interpolation order. | |
int | m_weight |
Least squares weighting factor. | |
LayoutData< IntVectSet > | m_ghostCells |
Ghost cells that will be interpolated near the cut-cells. More... | |
LayoutData< BaseIVFAB< VoFStencil > > | m_fineStencils |
Fine-grid interpolation stencils. | |
LayoutData< BaseIVFAB< VoFStencil > > | m_coarStencils |
Coarse-grid interpolation stencils. | |
LayoutData< RefCountedPtr< AggStencil< EBCellFAB, EBCellFAB > > > | m_aggFineStencils |
Fine grid interpolation stencils. More... | |
LayoutData< RefCountedPtr< AggStencil< EBCellFAB, EBCellFAB > > > | m_aggCoarStencils |
Coarse-grid interpolation stencils. More... | |
LayoutData< std::map< std::pair< int, Side::LoHiSide >, Box > > | m_cfivs |
Regular coarse-fine interface boxes. More... | |
Static Protected Attributes | |
static constexpr int | m_stenComp = 0 |
Component that interpolation stencil is stored at. | |
static constexpr int | m_numStenComp = 1 |
Number of variables in stencil data layouts. | |
static constexpr int | m_comp = 0 |
Component number. Used for setting interval when data is copied into EBMultigridInterpolator's buffers. | |
Multigrid interpolator class.
Multigrid interpolator parent class. Virtual beause I want different implementations to do different things.
This interpolator class interpolates with classical multigrid-type interpolation where the interpolation stencils only reach into valid cells, ignoring the region underneath the fine level. Near regular refinement boundaries we use the conventional approach where we interpolate coarse data onto the line of cells that runs between the fine-grid cells and the ghost cell. This value is used together with the valid data on the fine-grid cells to interpolate the ghost cell to O(h^2). Near EBs this is much more complex since both the fine and coarse regions may be missing cells that make that interpolation possible. Worse, EB stencils may be much bigger than the 5/7-point Laplacian, requiring us to fill more ghost cells across the coarse-fine interface near the EB. We achieve this by switching to least-squares based interpolation here, again using only the valid fine and coarse-level cells. The way of achieving this consists of building dual-level stencils for each ghost cell; these stencils represent the part of the interpolation stencil that reach into the fine and coarse grids. For efficiency reasons, we copy the coarse grid data onto data layouts that may have more ghost cells than your regular data. Since the least squares stencils require a specified number of cells to reach specified order, this permits us to use fine-grid stencils that only reach into valid data without dropping order. This optimization is useful for pruning extra communications due homogeneous multigrid interpolation. This means that our interpolation, which is in the form
phiGhost = sum(vofCoar) w(vofCoar)*phi(vofCoar) + sum(vofFine)[w(vofFine)*phi(vofFine)]
will have a coarse and and a fine grid stencil, but the fine stencil does not reach out of the ghosted fine-grid patch. The fine-grid part of the stencil is thus allowed to use the ghost cells in the patch that are filled from neighboring patches.
EBMultigridInterpolator::EBMultigridInterpolator | ( | const EBLevelGrid & | a_eblgFine, |
const EBLevelGrid & | a_eblgCoar, | ||
const CellLocation | a_dataLocation, | ||
const IntVect & | a_ghostVector, | ||
const int | a_refRat, | ||
const int | a_ghostCF, | ||
const int | a_order, | ||
const int | a_weighting = 0 |
||
) |
Full constructor.
[in] | a_eblgFine | Fine grids |
[in] | a_eblgCoar | Coarse grids |
[in] | a_dataLocation | Interpration of data centering. Either on the cell center or the cell centroid. |
[in] | a_ghostVector | (Minimum) number of ghost cells in input/output data. |
[in] | a_refRat | Refinement ratio |
[in] | a_ghostCF | Width of the ghost region to be filled. Only relevant near the EBCF. |
[in] | a_order | Interpolation order |
[in] | a_weighting | Weighting factor least squares. |
void EBMultigridInterpolator::coarseFineInterp | ( | LevelData< EBCellFAB > & | a_phiFine, |
const LevelData< EBCellFAB > & | a_phiCoar, | ||
const Interval | a_variables | ||
) |
Do inhomogeneous interpolation.
[in,out] | a_phiFine | Fine phi |
[in] | a_phiCoar | Coarse phi |
[in] | a_variables | Variables to interpolate |
|
pure virtual |
Do inhomogeneous interpolation.
[in,out] | a_phiFine | Fine phi |
[in] | a_phiCoar | Coarse phi |
[in] | a_variables | Variables to interpolate |
Implemented in EBLeastSquaresMultigridInterpolator.
void EBMultigridInterpolator::coarseFineInterpH | ( | EBCellFAB & | a_phiFine, |
const Interval | a_variables, | ||
const DataIndex & | a_dit | ||
) | const |
Do homogeneous coarse-fine interpolation on a grid patch.
[in] | a_phiFine | Fine-level data |
[in] | a_variables | Variables to be interpolated |
[in] | a_dit | Data index |
|
pure virtual |
Do homogeneous coarse-fine interpolation on a grid patch.
[in] | a_phiFine | Fine-level data |
[in] | a_variables | Variables to be interpolated |
[in] | a_dit | Data index |
Implemented in EBLeastSquaresMultigridInterpolator.
void EBMultigridInterpolator::coarseFineInterpH | ( | LevelData< EBCellFAB > & | a_phiFine, |
const Interval | a_variables | ||
) | const |
Do homogeneous interpolation.
[in] | a_phiFine | Fine phi |
[in] | a_variables | Variables to interpolate |
|
pure virtual |
Do homogeneous interpolation.
[in] | a_phiFine | Fine phi |
[in] | a_variables | Variables to interpolate |
Implemented in EBLeastSquaresMultigridInterpolator.
|
protected |
Define grids.
[in] | a_eblgFine | Fine grid |
[in] | a_eblgCoar | Coarse grid |
|
protected |
Build an interpolation stencil.
[out] | a_stencilFine | Fine-grid stencil |
[out] | a_stencilCoar | Coarse-grid stencil |
[in] | a_dataLocation | Data location |
[in] | a_ghostVofFine | Ghost cell which is to be filled on the coarse grid. |
[in] | a_ghostVofCoar | Vof corresponding to a_ghostVofFine on the coarse grid |
[in] | a_ebisBoxFine | Fine grid EBISBox |
[in] | a_ebisBxoCoar | Coarse grid EBISBox |
[in] | a_validFineCells | Fine-grid region which we are allowed to use in the interpolation. |
[in] | a_validCoarCells | Coarse-grid region which we are allowed to use in the interpolation. |
[in] | a_dxFine | Grid resolution on the fine level |
[in] | a_dxCoar | Grid resolution on the coarse level |
[in] | a_order | Interpolation order |
[in] | a_weight | Equation weighting for least squares reconstruction. |
void EBMultigridInterpolator::slowCoarseFineInterp | ( | LevelData< EBCellFAB > & | a_phiFine, |
const LevelData< EBCellFAB > & | a_phiCoar, | ||
const Interval | a_variables | ||
) |
Do inhomogeneous interpolation.
[in,out] | a_phiFine | Fine phi |
[in] | a_phiCoar | Coarse phi |
[in] | a_variables | Variables to interpolate |
This is the "slow" version which does not use the AggStencil performance optimization objects.
void EBMultigridInterpolator::slowCoarseFineInterpH | ( | EBCellFAB & | a_phiFine, |
const Interval | a_variables, | ||
const DataIndex & | a_dit | ||
) | const |
Do homogeneous coarse-fine interpolation on a grid patch.
[in] | a_phiFine | Fine-level data |
[in] | a_variables | Variables to be interpolated |
[in] | a_dit | Data index |
This is the "slow" version which does not use the AggStencil performance optimization objects.
void EBMultigridInterpolator::slowCoarseFineInterpH | ( | LevelData< EBCellFAB > & | a_phiFine, |
const Interval | a_variables | ||
) | const |
Do homogeneous interpolation.
[in] | a_phiFine | Fine phi |
[in] | a_variables | Variables to interpolate |
This is the "slow" version which does not use the AggStencil performance optimization objects.
|
protected |
Coarse-grid interpolation stencils.
This is used for performance optimization. Note that m_aggCoarStencils will only reach into m_grownCoarData, which gives well-defined cache offsets.
|
protected |
Fine grid interpolation stencils.
This is used for performance optimization. Note that m_aggFineStencils will reach into whatever data is being interpolated, so the input data must have the same number of ghost cells as specified in the constructor.
|
protected |
Regular coarse-fine interface boxes.
|
protected |
Ghost cells that will be interpolated near the cut-cells.
|
protected |
Number of ghost cells to fill across coarse-fine interface.