4#include <AMReX_MLNodeLinOp.H>
5#include <AMReX_MLCellLinOp.H>
6#include <AMReX_MultiFabUtil.H>
7#include <AMReX_BaseFab.H>
35 Operator (
const amrex::Vector<amrex::Geometry>& a_geom,
36 const amrex::Vector<amrex::BoxArray>& a_grids,
37 const Vector<DistributionMapping>& a_dmap,
38 const LPInfo& a_info = LPInfo(),
39 const Vector<FabFactory<FArrayBox>
const*>& a_factory = {});
45 void define (
const Vector<Geometry>& a_geom,
const Vector<BoxArray>& a_grids,
46 const Vector<DistributionMapping>& a_dmap,
47 const LPInfo& a_info = LPInfo(),
48 const Vector<FabFactory<FArrayBox>
const*>& a_factory = {});
49 const Geometry&
Geom (
int amr_lev,
int mglev=0) const noexcept {
return m_geom[amr_lev][mglev]; }
52 MultiFab& res,
const MultiFab& crse_sol,
const MultiFab& crse_rhs,
53 MultiFab& fine_res, MultiFab& fine_sol,
const MultiFab& fine_rhs)
54 {reflux(crse_amrlev, res, crse_sol, crse_rhs,fine_res, fine_sol, fine_rhs);}
55 void Apply (
int amrlev,
int mglev, MultiFab& out,
const MultiFab& in)
const { Fapply(amrlev,mglev,out,in);}
68 void RegisterNewFab(amrex::Vector<amrex::MultiFab> &input);
69 void RegisterNewFab(amrex::Vector<std::unique_ptr<amrex::MultiFab> > &input);
70 const amrex::FArrayBox & GetFab(
const int num,
const int amrlev,
const int mglev,
const amrex::MFIter &mfi)
const;
76 virtual void Fapply (
int amrlev,
int mglev,MultiFab& out,
const MultiFab& in)
const override =0;
84 virtual void Diagonal (
bool recompute=
false);
85 virtual void Diagonal (
int amrlev,
int mglev, amrex::MultiFab& diag);
89 virtual void Fsmooth (
int amrlev,
int mglev, MultiFab& x,
const MultiFab& b)
const override;
90 virtual void normalize (
int amrlev,
int mglev, MultiFab& mf)
const override;
91 virtual void reflux (
int crse_amrlev, MultiFab& res,
const MultiFab& crse_sol,
const MultiFab& crse_rhs,
92 MultiFab& fine_res, MultiFab& fine_sol,
const MultiFab& fine_rhs)
const override;
97 virtual void restriction (
int amrlev,
int cmglev, MultiFab& crse, MultiFab& fine)
const final;
98 virtual void interpolation (
int amrlev,
int fmglev, MultiFab& fine,
const MultiFab& crse)
const override final;
99 virtual void interpolationAmr (
int famrlev, MultiFab& fine,
100 const MultiFab& crse, IntVect
const& nghost)
const override final;
101 virtual void averageDownSolutionRHS (
int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs,
const MultiFab& fine_sol,
const MultiFab& fine_rhs)
final;
102 virtual void prepareForSolve ()
override;
103 virtual bool isSingular (
int amrlev)
const final {
return (amrlev == 0) ? m_is_bottom_singular :
false; }
105 virtual void applyBC (
int amrlev,
int mglev, MultiFab& phi, BCMode bc_mode, amrex::MLLinOp::StateMode ,
bool skip_fillboundary=
false) const final;
106 virtual
void fixUpResidualMask (
int amrlev, iMultiFab& resmsk) final;
108 virtual
int getNGrow(
int =0,
int =0) const override final {
return 2;}
109 virtual void solutionResidual (
int amrlev, MultiFab& resid, MultiFab& x,
const MultiFab& b,
110 const MultiFab* crse_bcdata=
nullptr) override final;
111 virtual
void correctionResidual (
int amrlev,
int mglev, MultiFab& resid, MultiFab& x, const MultiFab& b,
112 BCMode bc_mode, const MultiFab* crse_bcdata=
nullptr) override final;
116 static
void realFillBoundary(MultiFab &phi, const Geometry &geom);
119 bool m_is_bottom_singular = false;
120 bool m_masks_built = false;
126 int m_num_a_fabs = 0;
127 bool m_diagonal_computed = false;
128 amrex::Vector<amrex::Vector<amrex::Vector<amrex::MultiFab> > > m_a_coeffs;
129 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab> > > m_diag;
130 Set::Scalar m_omega = 2./3.;
131 bool m_normalize_ddw = false;
149 friend class MLCGSolver;
159 void define (amrex::Vector<amrex::Geometry> a_geom,
160 const amrex::Vector<amrex::BoxArray>& a_grids,
161 const amrex::Vector<amrex::DistributionMapping>& a_dmap,
163 const amrex::LPInfo& a_info = amrex::LPInfo(),
164 const amrex::Vector<amrex::FabFactory<amrex::FArrayBox>
const*>& a_factory = {});
181 using RealTuple = std::array<amrex::Real,2*BL_SPACEDIM>;
182 using BCTuple = std::array<amrex::BoundCond,2*BL_SPACEDIM>;
186 BndryCondLoc (
const amrex::BoxArray& ba,
const amrex::DistributionMapping& dm);
187 void setLOBndryConds (
const amrex::Geometry& geom,
const amrex::Real* dx,
188 const amrex::Array<BCType,AMREX_SPACEDIM>& lobc,
189 const amrex::Array<BCType,AMREX_SPACEDIM>& hibc,
190 int ratio,
const amrex::RealVect& a_loc);
201 amrex::Vector<amrex::Vector<std::unique_ptr<BndryCondLoc> > >
m_bcondloc;
204 mutable amrex::Vector<amrex::Vector<amrex::BndryRegister> >
m_undrrelxr;
207 amrex::Vector<amrex::Vector<std::array<amrex::MultiMask,2*AMREX_SPACEDIM> > >
m_maskvals;
213 void updateSolBC (
int amrlev,
const amrex::MultiFab& crse_bcdata)
const;
214 void updateCorBC (
int amrlev,
const amrex::MultiFab& crse_bcdata)
const;
216 virtual void prepareForSolve ()
override;
221 virtual void Fapply (
int amrlev,
int mglev, amrex::MultiFab& out,
const amrex::MultiFab& in)
const override = 0;
222 virtual void Fsmooth (
int amrlev,
int mglev, amrex::MultiFab& sol,
const amrex::MultiFab& rsh,
int redblack)
const override = 0;
223 virtual void FFlux (
int amrlev,
const MFIter& mfi,
224 const Array<FArrayBox*,AMREX_SPACEDIM>& flux,
225 const FArrayBox& sol, Location loc,
const int face_only=0)
const override = 0;
227 void RegisterNewFab(amrex::Vector<amrex::MultiFab> &input);
228 void RegisterNewFab(amrex::Vector<std::unique_ptr<amrex::MultiFab> > &input);
229 const amrex::FArrayBox &
GetFab(
const int num,
const int amrlev,
const int mglev,
const amrex::MFIter &mfi) ;
234 virtual amrex::Real
getAScalar () const final {
return 0.0; }
235 virtual amrex::Real
getBScalar () const final {
return 0.0; }
237 virtual amrex::MultiFab
const*
getACoeffs (
int ,
int )
const final {
return nullptr;}
238 virtual std::array<amrex::MultiFab const*,AMREX_SPACEDIM>
getBCoeffs (
int ,
int )
const final {
239 std::array<amrex::MultiFab const*,AMREX_SPACEDIM> ret;
240 AMREX_D_TERM(ret[0] =
nullptr;, ret[1] =
nullptr;,ret[2] =
nullptr;);
243 virtual std::unique_ptr<amrex::MLLinOp>
makeNLinOp (
int )
const final {
244 Util::Abort(
"MLABecLaplacian::makeNLinOp: Not implmented");
245 return std::unique_ptr<MLLinOp>{};
248 void averageDownCoeffs ();
249 void averageDownCoeffsSameAmrLevel (amrex::Vector<amrex::MultiFab>&);
250 const amrex::FArrayBox & GetFab(
const int num,
const int amrlev,
const int mglev,
const amrex::MFIter &mfi)
const;
257 int m_num_a_fabs = 0;
258 amrex::Vector<amrex::Vector<amrex::Vector<amrex::MultiFab> > >
m_a_coeffs;
const RealTuple & bndryLocs(const amrex::MFIter &mfi) const
amrex::LayoutData< RealTuple > bcloc
const BCTuple & bndryConds(const amrex::MFIter &mfi) const
amrex::LayoutData< BCTuple > bcond
amrex::Vector< amrex::Vector< std::unique_ptr< BndryCondLoc > > > m_bcondloc
void updateSolBC(int amrlev, const amrex::MultiFab &crse_bcdata) const
std::array< amrex::BoundCond, 2 *BL_SPACEDIM > BCTuple
virtual std::unique_ptr< amrex::MLLinOp > makeNLinOp(int) const final
amrex::Vector< amrex::Vector< amrex::BndryRegister > > m_undrrelxr
virtual bool isBottomSingular() const final
amrex::Vector< std::unique_ptr< amrex::MLMGBndry > > m_bndry_cor
static constexpr amrex::IntVect AMREX_D_DECL(dx={AMREX_D_DECL(1, 0, 0)}, dy={AMREX_D_DECL(0, 1, 0)}, dz={AMREX_D_DECL(0, 0, 1)})
void updateCorBC(int amrlev, const amrex::MultiFab &crse_bcdata) const
Operator(Operator &&)=delete
amrex::Vector< amrex::Vector< amrex::Vector< amrex::MultiFab > > > m_a_coeffs
virtual amrex::Real getAScalar() const final
virtual void Fsmooth(int amrlev, int mglev, amrex::MultiFab &sol, const amrex::MultiFab &rsh, int redblack) const override=0
Operator(const Operator &)=delete
amrex::Vector< std::unique_ptr< amrex::BndryRegister > > m_crse_cor_br
amrex::Vector< std::unique_ptr< amrex::MLMGBndry > > m_bndry_sol
virtual bool isSingular(int) const final
amrex::Vector< std::unique_ptr< amrex::BndryRegister > > m_crse_sol_br
amrex::Vector< amrex::Vector< std::array< amrex::MultiMask, 2 *AMREX_SPACEDIM > > > m_maskvals
virtual void Fapply(int amrlev, int mglev, amrex::MultiFab &out, const amrex::MultiFab &in) const override=0
virtual void FFlux(int amrlev, const MFIter &mfi, const Array< FArrayBox *, AMREX_SPACEDIM > &flux, const FArrayBox &sol, Location loc, const int face_only=0) const override=0
virtual std::array< amrex::MultiFab const *, AMREX_SPACEDIM > getBCoeffs(int, int) const final
std::array< amrex::Real, 2 *BL_SPACEDIM > RealTuple
virtual amrex::MultiFab const * getACoeffs(int, int) const final
BC::BC< Set::Scalar > * m_bc
const amrex::FArrayBox & GetFab(const int num, const int amrlev, const int mglev, const amrex::MFIter &mfi)
virtual amrex::Real getBScalar() const final
virtual bool isSingular(int amrlev) const final
void Reflux(int crse_amrlev, MultiFab &res, const MultiFab &crse_sol, const MultiFab &crse_rhs, MultiFab &fine_res, MultiFab &fine_sol, const MultiFab &fine_rhs)
const Geometry & Geom(int amr_lev, int mglev=0) const noexcept
void SetNormalizeDDW(bool a_normalize_ddw)
virtual void SetHomogeneous(bool)
void Apply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const
virtual void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const override=0
void SetOmega(Set::Scalar a_omega)
virtual bool relaxCoarseFineGhostRows() const
Operator(Operator &&)=delete
virtual bool isBottomSingular() const final
virtual bool useQuadraticAmrInterpolation() const
Operator(const amrex::Vector< amrex::Geometry > &a_geom, const amrex::Vector< amrex::BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FArrayBox > const * > &a_factory={})
virtual void averageDownCoeffs()=0
virtual void SetAverageDownCoeffs(bool)
Operator(const Operator &)=delete
Documentation for operator namespace.
constexpr amrex::IntVect AMREX_D_DECL(Operator< Grid::Cell >::dx, Operator< Grid::Cell >::dy, Operator< Grid::Cell >::dz)
A collection of data types and symmetry-reduced data structures.
AMREX_GPU_HOST_DEVICE void Abort(const char *msg)