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);}
65 void RegisterNewFab(amrex::Vector<amrex::MultiFab> &input);
66 void RegisterNewFab(amrex::Vector<std::unique_ptr<amrex::MultiFab> > &input);
67 const amrex::FArrayBox & GetFab(
const int num,
const int amrlev,
const int mglev,
const amrex::MFIter &mfi)
const;
73 virtual void Fapply (
int amrlev,
int mglev,MultiFab& out,
const MultiFab& in)
const override =0;
79 virtual void Diagonal (
bool recompute=
false);
80 virtual void Diagonal (
int amrlev,
int mglev, amrex::MultiFab& diag);
84 virtual void Fsmooth (
int amrlev,
int mglev, MultiFab& x,
const MultiFab& b)
const override;
85 virtual void normalize (
int amrlev,
int mglev, MultiFab& mf)
const override;
86 virtual void reflux (
int crse_amrlev, MultiFab& res,
const MultiFab& crse_sol,
const MultiFab& crse_rhs,
87 MultiFab& fine_res, MultiFab& fine_sol,
const MultiFab& fine_rhs)
const override;
92 virtual void restriction (
int amrlev,
int cmglev, MultiFab& crse, MultiFab& fine)
const final;
93 virtual void interpolation (
int amrlev,
int fmglev, MultiFab& fine,
const MultiFab& crse)
const override final;
94 virtual void averageDownSolutionRHS (
int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs,
const MultiFab& fine_sol,
const MultiFab& fine_rhs)
final;
95 virtual void prepareForSolve ()
override;
96 virtual bool isSingular (
int amrlev)
const final {
return (amrlev == 0) ? m_is_bottom_singular :
false; }
98 virtual void applyBC (
int amrlev,
int mglev, MultiFab& phi, BCMode bc_mode, amrex::MLLinOp::StateMode ,
bool skip_fillboundary=
false) const final;
99 virtual
void fixUpResidualMask (
int amrlev, iMultiFab& resmsk) final;
101 virtual
int getNGrow(
int =0,
int =0) const override final {
return 2;}
102 virtual void solutionResidual (
int amrlev, MultiFab& resid, MultiFab& x,
const MultiFab& b,
103 const MultiFab* crse_bcdata=
nullptr) override final;
104 virtual
void correctionResidual (
int amrlev,
int mglev, MultiFab& resid, MultiFab& x, const MultiFab& b,
105 BCMode bc_mode, const MultiFab* crse_bcdata=
nullptr) override final;
109 static
void realFillBoundary(MultiFab &phi, const Geometry &geom);
112 bool m_is_bottom_singular = false;
113 bool m_masks_built = false;
119 int m_num_a_fabs = 0;
120 bool m_diagonal_computed = false;
121 amrex::Vector<amrex::Vector<amrex::Vector<amrex::MultiFab> > > m_a_coeffs;
122 amrex::Vector<amrex::Vector<std::unique_ptr<amrex::MultiFab> > > m_diag;
123 Set::Scalar m_omega = 2./3.;
124 bool m_normalize_ddw = false;
142 friend class MLCGSolver;
152 void define (amrex::Vector<amrex::Geometry> a_geom,
153 const amrex::Vector<amrex::BoxArray>& a_grids,
154 const amrex::Vector<amrex::DistributionMapping>& a_dmap,
156 const amrex::LPInfo& a_info = amrex::LPInfo(),
157 const amrex::Vector<amrex::FabFactory<amrex::FArrayBox>
const*>& a_factory = {});
174 using RealTuple = std::array<amrex::Real,2*BL_SPACEDIM>;
175 using BCTuple = std::array<amrex::BoundCond,2*BL_SPACEDIM>;
179 BndryCondLoc (
const amrex::BoxArray& ba,
const amrex::DistributionMapping& dm);
180 void setLOBndryConds (
const amrex::Geometry& geom,
const amrex::Real* dx,
181 const amrex::Array<BCType,AMREX_SPACEDIM>& lobc,
182 const amrex::Array<BCType,AMREX_SPACEDIM>& hibc,
183 int ratio,
const amrex::RealVect& a_loc);
194 amrex::Vector<amrex::Vector<std::unique_ptr<BndryCondLoc> > >
m_bcondloc;
197 mutable amrex::Vector<amrex::Vector<amrex::BndryRegister> >
m_undrrelxr;
200 amrex::Vector<amrex::Vector<std::array<amrex::MultiMask,2*AMREX_SPACEDIM> > >
m_maskvals;
206 void updateSolBC (
int amrlev,
const amrex::MultiFab& crse_bcdata)
const;
207 void updateCorBC (
int amrlev,
const amrex::MultiFab& crse_bcdata)
const;
209 virtual void prepareForSolve ()
override;
214 virtual void Fapply (
int amrlev,
int mglev, amrex::MultiFab& out,
const amrex::MultiFab& in)
const override = 0;
215 virtual void Fsmooth (
int amrlev,
int mglev, amrex::MultiFab& sol,
const amrex::MultiFab& rsh,
int redblack)
const override = 0;
216 virtual void FFlux (
int amrlev,
const MFIter& mfi,
217 const Array<FArrayBox*,AMREX_SPACEDIM>& flux,
218 const FArrayBox& sol, Location loc,
const int face_only=0)
const override = 0;
220 void RegisterNewFab(amrex::Vector<amrex::MultiFab> &input);
221 void RegisterNewFab(amrex::Vector<std::unique_ptr<amrex::MultiFab> > &input);
222 const amrex::FArrayBox &
GetFab(
const int num,
const int amrlev,
const int mglev,
const amrex::MFIter &mfi) ;
227 virtual amrex::Real
getAScalar () const final {
return 0.0; }
228 virtual amrex::Real
getBScalar () const final {
return 0.0; }
230 virtual amrex::MultiFab
const*
getACoeffs (
int ,
int )
const final {
return nullptr;}
231 virtual std::array<amrex::MultiFab const*,AMREX_SPACEDIM>
getBCoeffs (
int ,
int )
const final {
232 std::array<amrex::MultiFab const*,AMREX_SPACEDIM> ret;
233 AMREX_D_TERM(ret[0] =
nullptr;, ret[1] =
nullptr;,ret[2] =
nullptr;);
236 virtual std::unique_ptr<amrex::MLLinOp>
makeNLinOp (
int )
const final {
237 Util::Abort(
"MLABecLaplacian::makeNLinOp: Not implmented");
238 return std::unique_ptr<MLLinOp>{};
241 void averageDownCoeffs ();
242 void averageDownCoeffsSameAmrLevel (amrex::Vector<amrex::MultiFab>&);
243 const amrex::FArrayBox & GetFab(
const int num,
const int amrlev,
const int mglev,
const amrex::MFIter &mfi)
const;
250 int m_num_a_fabs = 0;
251 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)
Operator(Operator &&)=delete
virtual bool isBottomSingular() const final
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.
void Abort(const char *msg)