chombo-discharge
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes | List of all members
EBMultigridInterpolator Class Referenceabstract

Multigrid interpolator class. More...

#include <CD_EBMGLeastSquaresInterpolator.H>

Inheritance diagram for EBMultigridInterpolator:
Inheritance graph
[legend]

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.
 

Detailed Description

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.

Note
This class should work with data holders have exactly one component or SpaceDim components.

Constructor & Destructor Documentation

◆ EBMultigridInterpolator()

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.

Parameters
[in]a_eblgFineFine grids
[in]a_eblgCoarCoarse grids
[in]a_dataLocationInterpration 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_refRatRefinement ratio
[in]a_ghostCFWidth of the ghost region to be filled. Only relevant near the EBCF.
[in]a_orderInterpolation order
[in]a_weightingWeighting factor least squares.

Member Function Documentation

◆ coarseFineInterp() [1/2]

void EBMultigridInterpolator::coarseFineInterp ( LevelData< EBCellFAB > &  a_phiFine,
const LevelData< EBCellFAB > &  a_phiCoar,
const Interval  a_variables 
)

Do inhomogeneous interpolation.

Parameters
[in,out]a_phiFineFine phi
[in]a_phiCoarCoarse phi
[in]a_variablesVariables to interpolate

◆ coarseFineInterp() [2/2]

virtual void EBMultigridInterpolator::coarseFineInterp ( LevelData< EBCellFAB > &  a_phiFine,
const LevelData< EBCellFAB > &  a_phiCoar,
const Interval  a_variables 
) const
pure virtual

Do inhomogeneous interpolation.

Parameters
[in,out]a_phiFineFine phi
[in]a_phiCoarCoarse phi
[in]a_variablesVariables to interpolate

Implemented in EBLeastSquaresMultigridInterpolator.

◆ coarseFineInterpH() [1/4]

void EBMultigridInterpolator::coarseFineInterpH ( EBCellFAB &  a_phiFine,
const Interval  a_variables,
const DataIndex &  a_dit 
) const

Do homogeneous coarse-fine interpolation on a grid patch.

Parameters
[in]a_phiFineFine-level data
[in]a_variablesVariables to be interpolated
[in]a_ditData index
Note
This is the kernel version. The constructor guarantees that the fine-grid stencil will not out of the ghost region defined by a_ghostVector. However, this is the direct kernel version which is public because multigrid operators might need it for performance reasons. This routine does NOT warn against input data that do not contain enough ghost cells.

◆ coarseFineInterpH() [2/4]

virtual void EBMultigridInterpolator::coarseFineInterpH ( EBCellFAB &  a_phiFine,
const Interval  a_variables,
const DataIndex &  a_dit 
) const
pure virtual

Do homogeneous coarse-fine interpolation on a grid patch.

Parameters
[in]a_phiFineFine-level data
[in]a_variablesVariables to be interpolated
[in]a_ditData index
Note
This is the kernel version. The constructor guarantees that the fine-grid stencil will not out of the ghost region defined by a_ghostVector. However, this is the direct kernel version which is public because multigrid operators might need it for performance reasons. This routine does NOT warn against input data that do not contain enough ghost cells.

Implemented in EBLeastSquaresMultigridInterpolator.

◆ coarseFineInterpH() [3/4]

void EBMultigridInterpolator::coarseFineInterpH ( LevelData< EBCellFAB > &  a_phiFine,
const Interval  a_variables 
) const

Do homogeneous interpolation.

Parameters
[in]a_phiFineFine phi
[in]a_variablesVariables to interpolate

◆ coarseFineInterpH() [4/4]

virtual void EBMultigridInterpolator::coarseFineInterpH ( LevelData< EBCellFAB > &  a_phiFine,
const Interval  a_variables 
) const
pure virtual

Do homogeneous interpolation.

Parameters
[in]a_phiFineFine phi
[in]a_variablesVariables to interpolate

Implemented in EBLeastSquaresMultigridInterpolator.

◆ defineGrids()

void EBMultigridInterpolator::defineGrids ( const EBLevelGrid &  a_eblgFine,
const EBLevelGrid &  a_eblgCoar 
)
protected

Define grids.

Parameters
[in]a_eblgFineFine grid
[in]a_eblgCoarCoarse grid

◆ getStencil()

bool EBMultigridInterpolator::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 
)
protected

Build an interpolation stencil.

Parameters
[out]a_stencilFineFine-grid stencil
[out]a_stencilCoarCoarse-grid stencil
[in]a_dataLocationData location
[in]a_ghostVofFineGhost cell which is to be filled on the coarse grid.
[in]a_ghostVofCoarVof corresponding to a_ghostVofFine on the coarse grid
[in]a_ebisBoxFineFine grid EBISBox
[in]a_ebisBxoCoarCoarse grid EBISBox
[in]a_validFineCellsFine-grid region which we are allowed to use in the interpolation.
[in]a_validCoarCellsCoarse-grid region which we are allowed to use in the interpolation.
[in]a_dxFineGrid resolution on the fine level
[in]a_dxCoarGrid resolution on the coarse level
[in]a_orderInterpolation order
[in]a_weightEquation weighting for least squares reconstruction.
Returns
Returns true if a stencil was found, in which case it is defined in a_stencilFine and a_stencilCoar.

◆ slowCoarseFineInterp()

void EBMultigridInterpolator::slowCoarseFineInterp ( LevelData< EBCellFAB > &  a_phiFine,
const LevelData< EBCellFAB > &  a_phiCoar,
const Interval  a_variables 
)

Do inhomogeneous interpolation.

Parameters
[in,out]a_phiFineFine phi
[in]a_phiCoarCoarse phi
[in]a_variablesVariables to interpolate

This is the "slow" version which does not use the AggStencil performance optimization objects.

Note
This exists mostly for debugging, but this will be safe to use even if you input fine-grid data which does not have ghostCells == a_ghostVector.

◆ slowCoarseFineInterpH() [1/2]

void EBMultigridInterpolator::slowCoarseFineInterpH ( EBCellFAB &  a_phiFine,
const Interval  a_variables,
const DataIndex &  a_dit 
) const

Do homogeneous coarse-fine interpolation on a grid patch.

Parameters
[in]a_phiFineFine-level data
[in]a_variablesVariables to be interpolated
[in]a_ditData index

This is the "slow" version which does not use the AggStencil performance optimization objects.

Note
This is the kernel version. The constructor guarantees that the fine-grid stencil will not out of the ghost region defined by a_ghostVector. However, this is the direct kernel version which is public because multigrid operators might need it for performance reasons. This routine does NOT warn against input data that do not contain enough ghost cells.

◆ slowCoarseFineInterpH() [2/2]

void EBMultigridInterpolator::slowCoarseFineInterpH ( LevelData< EBCellFAB > &  a_phiFine,
const Interval  a_variables 
) const

Do homogeneous interpolation.

Parameters
[in]a_phiFineFine phi
[in]a_variablesVariables to interpolate

This is the "slow" version which does not use the AggStencil performance optimization objects.

Note
This exists mostly for debugging, but this will be safe to use even if you input fine-grid data which does not have ghostCells == a_ghostVector.

Member Data Documentation

◆ m_aggCoarStencils

LayoutData<RefCountedPtr<AggStencil<EBCellFAB, EBCellFAB> > > EBMultigridInterpolator::m_aggCoarStencils
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.

◆ m_aggFineStencils

LayoutData<RefCountedPtr<AggStencil<EBCellFAB, EBCellFAB> > > EBMultigridInterpolator::m_aggFineStencils
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.

◆ m_cfivs

LayoutData<std::map<std::pair<int, Side::LoHiSide>, Box> > EBMultigridInterpolator::m_cfivs
protected

Regular coarse-fine interface boxes.

Note
This is a map to the "regular" ghost cells that will be interpolated using a standard multigrid interpolation stencil (away from the EB).

◆ m_ghostCells

LayoutData<IntVectSet> EBMultigridInterpolator::m_ghostCells
protected

Ghost cells that will be interpolated near the cut-cells.

Note
This does not include the ghost cells on the refinement boundary away from the cut-cells.

◆ m_ghostCF

int EBMultigridInterpolator::m_ghostCF
protected

Number of ghost cells to fill across coarse-fine interface.

Note
Only applies the the cut-cells.

The documentation for this class was generated from the following files: