4 #include <AMReX_MLNodeLinOp.H>
5 #include <AMReX_MLCellLinOp.H>
6 #include <AMReX_MultiFabUtil.H>
7 #include <AMReX_BaseFab.H>
11 using namespace amrex;
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;
74 virtual void averageDownCoeffs () = 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;
122 amrex::
Vector<amrex::
Vector<std::unique_ptr<amrex::MultiFab> > > m_diag;
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;