#include <AMReX_MLCellLinOp.H>
Classes | |
struct | BCTL |
class | BndryCondLoc |
Public Types | |
using | FAB = typename MF::fab_type |
using | RT = typename MF::value_type |
using | BCType = LinOpBCType |
using | BCMode = typename MLLinOpT< MF >::BCMode |
using | StateMode = typename MLLinOpT< MF >::StateMode |
using | Location = typename MLLinOpT< MF >::Location |
Public Types inherited from amrex::MLLinOpT< MF > | |
using | MFType = MF |
using | FAB = typename FabDataType< MF >::fab_type |
using | RT = typename FabDataType< MF >::value_type |
using | BCType = LinOpBCType |
using | BCMode = LinOpEnumType::BCMode |
using | StateMode = LinOpEnumType::StateMode |
using | Location = LinOpEnumType::Location |
Public Member Functions | |
MLCellLinOpT () | |
~MLCellLinOpT () override=default | |
MLCellLinOpT (const MLCellLinOpT< MF > &)=delete | |
MLCellLinOpT (MLCellLinOpT< MF > &&)=delete | |
MLCellLinOpT< MF > & | operator= (const MLCellLinOpT< MF > &)=delete |
MLCellLinOpT< MF > & | operator= (MLCellLinOpT< MF > &&)=delete |
void | define (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FAB > const * > &a_factory={}) |
void | setLevelBC (int amrlev, const MF *levelbcdata, const MF *robinbc_a=nullptr, const MF *robinbc_b=nullptr, const MF *robinbc_f=nullptr) final |
Set boundary conditions for given level. For cell-centered solves only. More... | |
bool | needsUpdate () const override |
Does it need update if it's reused? More... | |
void | update () override |
Update for reuse. More... | |
void | setGaussSeidel (bool flag) noexcept |
virtual bool | isCrossStencil () const |
virtual bool | isTensorOp () const |
void | updateSolBC (int amrlev, const MF &crse_bcdata) const |
void | updateCorBC (int amrlev, const MF &crse_bcdata) const |
virtual void | applyBC (int amrlev, int mglev, MF &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MF > *bndry=nullptr, bool skip_fillboundary=false) const |
BoxArray | makeNGrids (int grid_size) const |
void | restriction (int, int, MF &crse, MF &fine) const override |
Restriction onto coarse MG level. More... | |
void | interpolation (int amrlev, int fmglev, MF &fine, const MF &crse) const override |
Add interpolated coarse MG level data to fine MG level data. More... | |
void | interpAssign (int amrlev, int fmglev, MF &fine, MF &crse) const override |
Overwrite fine MG level data with interpolated coarse data. More... | |
void | interpolationAmr (int famrlev, MF &fine, const MF &crse, IntVect const &nghost) const override |
Interpolation between AMR levels. More... | |
void | averageDownSolutionRHS (int camrlev, MF &crse_sol, MF &crse_rhs, const MF &fine_sol, const MF &fine_rhs) override |
Average-down data from fine AMR level to coarse AMR level. More... | |
void | apply (int amrlev, int mglev, MF &out, MF &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MF > *bndry=nullptr) const override |
Apply the linear operator, out = L(in) More... | |
void | smooth (int amrlev, int mglev, MF &sol, const MF &rhs, bool skip_fillboundary=false) const final |
Smooth. More... | |
void | solutionResidual (int amrlev, MF &resid, MF &x, const MF &b, const MF *crse_bcdata=nullptr) override |
Compute residual for solution. More... | |
void | prepareForFluxes (int amrlev, const MF *crse_bcdata=nullptr) override |
void | correctionResidual (int amrlev, int mglev, MF &resid, MF &x, const MF &b, BCMode bc_mode, const MF *crse_bcdata=nullptr) final |
Compute residual for the residual-correction form, resid = b - L(x) More... | |
void | reflux (int crse_amrlev, MF &res, const MF &crse_sol, const MF &, MF &, MF &fine_sol, const MF &) const final |
Reflux at AMR coarse/fine boundary. More... | |
void | compFlux (int amrlev, const Array< MF *, AMREX_SPACEDIM > &fluxes, MF &sol, Location loc) const override |
Compute fluxes. More... | |
void | compGrad (int amrlev, const Array< MF *, AMREX_SPACEDIM > &grad, MF &sol, Location loc) const override |
Compute gradients of the solution. More... | |
void | applyMetricTerm (int amrlev, int mglev, MF &rhs) const final |
apply metric terms if there are any More... | |
void | unapplyMetricTerm (int amrlev, int mglev, MF &rhs) const final |
unapply metric terms if there are any More... | |
Vector< RT > | getSolvabilityOffset (int amrlev, int mglev, MF const &rhs) const override |
get offset for fixing solvability More... | |
void | fixSolvabilityByOffset (int amrlev, int mglev, MF &rhs, Vector< RT > const &offset) const override |
void | prepareForSolve () override |
RT | xdoty (int amrlev, int mglev, const MF &x, const MF &y, bool local) const final |
x dot y, used by the bottom solver More... | |
virtual void | Fapply (int amrlev, int mglev, MF &out, const MF &in) const =0 |
virtual void | Fsmooth (int amrlev, int mglev, MF &sol, const MF &rhs, int redblack) const =0 |
virtual void | FFlux (int amrlev, const MFIter &mfi, const Array< FAB *, AMREX_SPACEDIM > &flux, const FAB &sol, Location loc, int face_only=0) const =0 |
virtual void | addInhomogNeumannFlux (int, const Array< MF *, AMREX_SPACEDIM > &, MF const &, bool) const |
RT | normInf (int amrlev, MF const &mf, bool local) const override |
void | averageDownAndSync (Vector< MF > &sol) const override |
void | avgDownResAmr (int clev, MF &cres, MF const &fres) const override |
Public Member Functions inherited from amrex::MLLinOpT< MF > | |
MLLinOpT ()=default | |
virtual | ~MLLinOpT ()=default |
MLLinOpT (const MLLinOpT< MF > &)=delete | |
MLLinOpT (MLLinOpT< MF > &&)=delete | |
MLLinOpT< MF > & | operator= (const MLLinOpT< MF > &)=delete |
MLLinOpT< MF > & | operator= (MLLinOpT< MF > &&)=delete |
void | define (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info, const Vector< FabFactory< FAB > const * > &a_factory, bool eb_limit_coarsening=true) |
virtual std::string | name () const |
void | setDomainBC (const Array< BCType, AMREX_SPACEDIM > &lobc, const Array< BCType, AMREX_SPACEDIM > &hibc) noexcept |
Boundary of the whole domain. More... | |
void | setDomainBC (const Vector< Array< BCType, AMREX_SPACEDIM > > &lobc, const Vector< Array< BCType, AMREX_SPACEDIM > > &hibc) noexcept |
Boundary of the whole domain. More... | |
void | setDomainBCLoc (const Array< Real, AMREX_SPACEDIM > &lo_bcloc, const Array< Real, AMREX_SPACEDIM > &hi_bcloc) noexcept |
Set location of domain boundaries. More... | |
bool | needsCoarseDataForBC () const noexcept |
Needs coarse data for bc? More... | |
void | setCoarseFineBC (const MF *crse, int crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept |
Set coarse/fine boundary conditions. For cell-centered solves only. More... | |
void | setCoarseFineBC (const MF *crse, IntVect const &crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept |
template<typename AMF , std::enable_if_t<!std::is_same_v< MF, AMF >, int > = 0> | |
void | setCoarseFineBC (const AMF *crse, int crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept |
template<typename AMF , std::enable_if_t<!std::is_same_v< MF, AMF >, int > = 0> | |
void | setCoarseFineBC (const AMF *crse, IntVect const &crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept |
template<typename AMF , std::enable_if_t<!std::is_same_v< MF, AMF >, int > = 0> | |
void | setLevelBC (int amrlev, const AMF *levelbcdata, const AMF *robinbc_a=nullptr, const AMF *robinbc_b=nullptr, const AMF *robinbc_f=nullptr) |
void | setVerbose (int v) noexcept |
Set verbosity. More... | |
void | setMaxOrder (int o) noexcept |
Set order of interpolation at coarse/fine boundary. More... | |
int | getMaxOrder () const noexcept |
Get order of interpolation at coarse/fine boundary. More... | |
void | setEnforceSingularSolvable (bool o) noexcept |
bool | getEnforceSingularSolvable () const noexcept |
virtual BottomSolver | getDefaultBottomSolver () const |
virtual int | getNComp () const |
Return number of components. More... | |
virtual int | getNGrow (int=0, int=0) const |
virtual void | normalize (int amrlev, int mglev, MF &mf) const |
Divide mf by the diagonal component of the operator. Used by bicgstab. More... | |
virtual void | unimposeNeumannBC (int, MF &) const |
This is needed for our nodal projection solver. More... | |
virtual void | applyInhomogNeumannTerm (int, MF &) const |
Extra terms introduced when we treat inhomogeneous Nuemann BC as homogeneous. More... | |
virtual void | applyOverset (int, MF &) const |
for overset solver only More... | |
virtual void | scaleRHS (int, MF &) const |
scale RHS to fix solvability More... | |
virtual void | fixSolvabilityByOffset (int, int, MF &, Vector< RT > const &) const |
fix solvability by subtracting offset from RHS More... | |
virtual void | prepareForGMRES () |
virtual void | setDirichletNodesToZero (int, int, MF &) const |
virtual bool | isSingular (int amrlev) const =0 |
Is it singular on given AMR level? More... | |
virtual bool | isBottomSingular () const =0 |
Is the bottom of MG singular? More... | |
virtual std::unique_ptr< MLLinOpT< MF > > | makeNLinOp (int) const |
virtual void | getFluxes (const Vector< Array< MF *, AMREX_SPACEDIM > > &, const Vector< MF * > &, Location) const |
virtual void | getFluxes (const Vector< MF * > &, const Vector< MF * > &) const |
virtual bool | supportNSolve () const |
virtual void | copyNSolveSolution (MF &, MF const &) const |
virtual void | postSolve (Vector< MF > &) const |
virtual void | avgDownResMG (int clev, MF &cres, MF const &fres) const |
bool | isMFIterSafe (int amrlev, int mglev1, int mglev2) const |
int | NAMRLevels () const noexcept |
Return the number of AMR levels. More... | |
int | NMGLevels (int amrlev) const noexcept |
Return the number of MG levels at given AMR level. More... | |
const Geometry & | Geom (int amr_lev, int mglev=0) const noexcept |
Public Attributes | |
Vector< std::unique_ptr< MF > > | m_robin_bcval |
Public Attributes inherited from amrex::MLLinOpT< MF > | |
Vector< Array< BCType, AMREX_SPACEDIM > > | m_lobc |
Vector< Array< BCType, AMREX_SPACEDIM > > | m_hibc |
Vector< Array< BCType, AMREX_SPACEDIM > > | m_lobc_orig |
Vector< Array< BCType, AMREX_SPACEDIM > > | m_hibc_orig |
Protected Types | |
using | RealTuple = Array< RT, 2 *BL_SPACEDIM > |
using | BCTuple = Array< BoundCond, 2 *BL_SPACEDIM > |
Private Member Functions | |
void | defineAuxData () |
void | defineBC () |
void | computeVolInv () const |
Private Attributes | |
Vector< Vector< RT > > | m_volinv |
int | m_interpbndry_halfwidth = 2 |
Additional Inherited Members | |
Protected Member Functions inherited from amrex::MLLinOpT< MF > | |
const Vector< int > & | AMRRefRatio () const noexcept |
Return AMR refinement ratios. More... | |
int | AMRRefRatio (int amr_lev) const noexcept |
Return AMR refinement ratio at given AMR level. More... | |
FabFactory< FAB > const * | Factory (int amr_lev, int mglev=0) const noexcept |
GpuArray< BCType, AMREX_SPACEDIM > | LoBC (int icomp=0) const noexcept |
GpuArray< BCType, AMREX_SPACEDIM > | HiBC (int icomp=0) const noexcept |
bool | hasBC (BCType bct) const noexcept |
bool | hasInhomogNeumannBC () const noexcept |
bool | hasRobinBC () const noexcept |
virtual bool | supportRobinBC () const noexcept |
virtual bool | supportInhomogNeumannBC () const noexcept |
bool | isBottomActive () const noexcept |
MPI_Comm | BottomCommunicator () const noexcept |
MPI_Comm | Communicator () const noexcept |
void | setCoarseFineBCLocation (const RealVect &cloc) noexcept |
bool | doAgglomeration () const noexcept |
bool | doConsolidation () const noexcept |
bool | doSemicoarsening () const noexcept |
bool | isCellCentered () const noexcept |
virtual IntVect | getNGrowVectRestriction () const |
virtual void | make (Vector< Vector< MF > > &mf, IntVect const &ng) const |
virtual MF | make (int amrlev, int mglev, IntVect const &ng) const |
virtual MF | makeAlias (MF const &mf) const |
virtual MF | makeCoarseMG (int amrlev, int mglev, IntVect const &ng) const |
virtual MF | makeCoarseAmr (int famrlev, IntVect const &ng) const |
virtual std::unique_ptr< FabFactory< FAB > > | makeFactory (int, int) const |
virtual void | resizeMultiGrid (int new_size) |
bool | hasHiddenDimension () const noexcept |
int | hiddenDirection () const noexcept |
Box | compactify (Box const &b) const noexcept |
template<typename T > | |
Array4< T > | compactify (Array4< T > const &a) const noexcept |
template<typename T > | |
T | get_d0 (T const &dx, T const &dy, T const &) const noexcept |
template<typename T > | |
T | get_d1 (T const &, T const &dy, T const &dz) const noexcept |
Static Protected Attributes inherited from amrex::MLLinOpT< MF > | |
static constexpr int | mg_coarsen_ratio = 2 |
static constexpr int | mg_box_min_width = 2 |
using amrex::MLCellLinOpT< MF >::BCMode = typename MLLinOpT<MF>::BCMode |
|
protected |
using amrex::MLCellLinOpT< MF >::BCType = LinOpBCType |
using amrex::MLCellLinOpT< MF >::FAB = typename MF::fab_type |
using amrex::MLCellLinOpT< MF >::Location = typename MLLinOpT<MF>::Location |
|
protected |
using amrex::MLCellLinOpT< MF >::RT = typename MF::value_type |
using amrex::MLCellLinOpT< MF >::StateMode = typename MLLinOpT<MF>::StateMode |
amrex::MLCellLinOpT< MF >::MLCellLinOpT |
|
overridedefault |
|
delete |
|
delete |
|
inlinevirtual |
Reimplemented in amrex::MLCellABecLapT< MF >.
|
overridevirtual |
Apply the linear operator, out = L(in)
amrlev | AMR level |
mglev | MG level |
out | output |
in | input |
bc_mode | Is the BC homogeneous or inhomogeneous? |
s_mode | Are data data solution or correction? |
bndry | object for handling coarse/fine and physical boundaries |
Implements amrex::MLLinOpT< MF >.
|
virtual |
|
finalvirtual |
apply metric terms if there are any
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Implements amrex::MLLinOpT< MF >.
|
overridevirtual |
Average-down data from fine AMR level to coarse AMR level.
camrlev | coarse AMR level |
crse_sol | solutoin on coarse AMR level |
crse_rhs | RHS on coarse AMR level |
fine_sol | solution on fine AMR level |
fine_rhs | RHS on fine AMR level |
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Compute fluxes.
amrlev | AMR level |
fluxes | fluxes |
sol | solution |
loc | location of the fluxes |
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Compute gradients of the solution.
amrlev | AMR level |
grad | grad(sol) |
sol | solution |
loc | location of the gradients |
Reimplemented from amrex::MLLinOpT< MF >.
|
private |
|
finalvirtual |
Compute residual for the residual-correction form, resid = b - L(x)
amrlev | AMR level |
mglev | MG level |
resid | residual |
x | unknown in the residual-correction form |
b | RHS in the residual-correction form |
bc_mode | Is the BC homogeneous or inhomogeneous? |
crse_bc_data | optional argument providing BC at coarse/fine boundary. |
Implements amrex::MLLinOpT< MF >.
void amrex::MLCellLinOpT< MF >::define | ( | const Vector< Geometry > & | a_geom, |
const Vector< BoxArray > & | a_grids, | ||
const Vector< DistributionMapping > & | a_dmap, | ||
const LPInfo & | a_info = LPInfo() , |
||
const Vector< FabFactory< FAB > const * > & | a_factory = {} |
||
) |
|
private |
|
private |
|
pure virtual |
Implemented in amrex::MLPoissonT< MF >, amrex::MLALaplacianT< MF >, and amrex::MLABecLaplacianT< MF >.
|
pure virtual |
Implemented in amrex::MLALaplacianT< MF >, amrex::MLABecLaplacianT< MF >, and amrex::MLPoissonT< MF >.
|
override |
|
pure virtual |
Implemented in amrex::MLPoissonT< MF >, amrex::MLALaplacianT< MF >, and amrex::MLABecLaplacianT< MF >.
|
overridevirtual |
get offset for fixing solvability
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Overwrite fine MG level data with interpolated coarse data.
amrlev | AMR level |
fmglev | fine MG level |
fine | fine MG level data |
crse | coarse MG level data |
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Add interpolated coarse MG level data to fine MG level data.
amrlev | AMR level |
fmglev | fine MG level |
crse | coarse data. |
fine | fine data. |
Implements amrex::MLLinOpT< MF >.
|
overridevirtual |
Interpolation between AMR levels.
famrlev | fine AMR level |
fine | fine level data |
crse | coarse level data |
nghost | number of ghost cells |
Reimplemented from amrex::MLLinOpT< MF >.
|
inlinevirtual |
Reimplemented in amrex::MLEBABecLap, amrex::MLTensorOp, and amrex::MLEBTensorOp.
|
inlinevirtual |
Reimplemented in amrex::MLTensorOp, and amrex::MLEBTensorOp.
BoxArray amrex::MLCellLinOpT< MF >::makeNGrids | ( | int | grid_size | ) | const |
|
inlineoverridevirtual |
Does it need update if it's reused?
Reimplemented from amrex::MLLinOpT< MF >.
Reimplemented in amrex::MLEBABecLap, amrex::MLTensorOp, and amrex::MLEBTensorOp.
|
overridevirtual |
Implements amrex::MLLinOpT< MF >.
|
delete |
|
delete |
|
overridevirtual |
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Implements amrex::MLLinOpT< MF >.
Reimplemented in amrex::MLEBABecLap, amrex::MLTensorOp, amrex::MLPoissonT< MF >, and amrex::MLEBTensorOp.
|
finalvirtual |
Reflux at AMR coarse/fine boundary.
crse_amrlev | coarse AMR level |
res | coarse level residual |
crse_sol | coarse level solution |
crse_rhs | coarse level RHS |
fine_res | fine level residual |
fine_sol | fine level solution |
fine_rhs | fine level RHS |
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Restriction onto coarse MG level.
amrlev | AMR level |
cmglev | coarse MG level |
crse | coarse data. This is the output. |
fine | fine data. This is the input. Some operators might need to fill ghost cells. This is why it's not a const reference. |
Implements amrex::MLLinOpT< MF >.
|
inlinenoexcept |
|
finalvirtual |
Set boundary conditions for given level. For cell-centered solves only.
This must be called for each level. Argument levelbcdata
is used to supply Dirichlet or Neumann bc at the physical domain; if those data are homogeneous we can pass nullptr instead of levelbcdata. Regardless, this function must be called. If used, the MultiFab levelbcdata must have one ghost cell. Only the data outside the physical domain will be used. It is assumed that the data in those ghost cells outside the domain live exactly on the face of the physical domain. Argument amrlev
is relative level such that the lowest to the solver is always 0. The optional arguments robinbc_[a|b|f] provide Robin boundary condition a*phi + b*dphi/dn = f
. Note that d./dn
is d./dx
at the upper boundary and -d./dx
at the lower boundary, for Robin BC. However, for inhomogeneous Neumann BC, the value in leveldata is assumed to be d./dx
.
Implements amrex::MLLinOpT< MF >.
|
finalvirtual |
Smooth.
amrlev | AMR level |
mglev | MG level |
sol | unknowns |
rhs | RHS |
skip_fillboundary | flag controlling whether ghost cell filling can be skipped. |
Implements amrex::MLLinOpT< MF >.
|
overridevirtual |
Compute residual for solution.
amrlev | AMR level |
resid | residual |
x | solution |
b | RHS |
crse_bc_data | optional argument providing BC at coarse/fine boundary. |
Implements amrex::MLLinOpT< MF >.
|
finalvirtual |
unapply metric terms if there are any
Reimplemented from amrex::MLLinOpT< MF >.
|
overridevirtual |
Update for reuse.
Reimplemented from amrex::MLLinOpT< MF >.
Reimplemented in amrex::MLEBABecLap, amrex::MLTensorOp, and amrex::MLEBTensorOp.
void amrex::MLCellLinOpT< MF >::updateCorBC | ( | int | amrlev, |
const MF & | crse_bcdata | ||
) | const |
void amrex::MLCellLinOpT< MF >::updateSolBC | ( | int | amrlev, |
const MF & | crse_bcdata | ||
) | const |
|
finalvirtual |
x dot y, used by the bottom solver
Implements amrex::MLLinOpT< MF >.
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
mutableprotected |
|
protected |
|
private |
|
protected |
|
protected |
Vector<std::unique_ptr<MF> > amrex::MLCellLinOpT< MF >::m_robin_bcval |
|
mutableprotected |
|
protected |
|
mutableprivate |