1#ifndef AMREX_ML_CURL_CURL_H_
2#define AMREX_ML_CURL_CURL_H_
3#include <AMReX_Config.H>
6#include <AMReX_MLCurlCurl_K.H>
25 :
public MLLinOpT<Array<MultiFab,3> >
59 [[nodiscard]] std::string
name ()
const override {
60 return std::string(
"curl of curl");
63 bool setUsePCG (
bool flag) {
return std::exchange(m_use_pcg, flag); }
66 const MF* robinbc_a =
nullptr,
67 const MF* robinbc_b =
nullptr,
68 const MF* robinbc_f =
nullptr)
override;
77 void smooth (
int amrlev,
int mglev,
MF& sol,
const MF& rhs,
78 bool skip_fillboundary,
int niter)
const override;
81 const MF* crse_bcdata=
nullptr)
override;
85 const MF* crse_bcdata=
nullptr)
override;
96 [[nodiscard]]
bool isSingular (
int )
const override {
return false; }
99 RT xdoty (
int amrlev,
int mglev,
const MF&
x,
const MF&
y,
bool local)
const override;
101 [[nodiscard]]
RT normInf (
int amrlev,
MF const& mf,
bool local)
const override;
111 [[nodiscard]]
MF make (
int amrlev,
int mglev,
IntVect const& ng)
const override;
121#if (AMREX_SPACEDIM > 1)
122 void smooth4 (
int amrlev,
int mglev,
MF& sol,
MF const& rhs,
int color)
const;
124 void smooth1D (
int amrlev,
int mglev,
MF& sol,
MF const& rhs,
int color)
const;
127 void compresid (
int amrlev,
int mglev,
MF& resid,
MF const& b)
const;
133 void applyBC (
int amrlev,
int mglev,
MF& in, CurlCurlStateType type)
const;
135 [[nodiscard]]
iMultiFab const& getDotMask (
int amrlev,
int mglev,
int idim)
const;
137 [[nodiscard]] CurlCurlDirichletInfo getDirichletInfo (
int amrlev,
int mglev)
const;
138 [[nodiscard]] CurlCurlSymmetryInfo getSymmetryInfo (
int amrlev,
int mglev)
const;
140 void update_lusolver ();
142 void set_curvilinear_domain_bc ();
146 RT m_alpha = std::numeric_limits<RT>::lowest();
147 RT m_beta = std::numeric_limits<RT>::lowest();
150#if (AMREX_SPACEDIM == 3)
152#elif (AMREX_SPACEDIM == 2)
158 mutable Vector<Vector<Array<std::unique_ptr<iMultiFab>,3>>> m_dotmask;
159 static constexpr int m_ncomp = 1;
160 Vector<Vector<std::unique_ptr<Gpu::DeviceScalar
161 <LUSolver<AMREX_SPACEDIM*2,RT>>>>> m_lusolver;
162 Vector<Vector<Array<std::unique_ptr<MultiFab>,3>>> m_bcoefs;
163 bool m_use_pcg =
false;
164 bool m_needs_update =
true;
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
curl (alpha curl E) + beta E = rhs
Definition AMReX_MLCurlCurl.H:26
void setLevelBC(int amrlev, const MF *levelbcdata, const MF *robinbc_a=nullptr, const MF *robinbc_b=nullptr, const MF *robinbc_f=nullptr) override
Definition AMReX_MLCurlCurl.cpp:185
void preparePrecond() override
Definition AMReX_MLCurlCurl.cpp:661
void restriction(int amrlev, int cmglev, MF &crse, MF &fine) const override
Definition AMReX_MLCurlCurl.cpp:192
void setDirichletNodesToZero(int amrlev, int mglev, MF &a_mf) const override
Definition AMReX_MLCurlCurl.cpp:127
void interpolation(int amrlev, int fmglev, MF &fine, const MF &crse) const override
Definition AMReX_MLCurlCurl.cpp:225
bool isSingular(int) const override
Is it singular on given AMR level?
Definition AMReX_MLCurlCurl.H:96
void update() override
Update for reuse.
Definition AMReX_MLCurlCurl.cpp:1012
typename MLLinOpT< MF >::BCType BCType
Definition AMReX_MLCurlCurl.H:30
typename MLLinOpT< MF >::RT RT
Definition AMReX_MLCurlCurl.H:29
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), int a_coord=0)
Definition AMReX_MLCurlCurl.cpp:13
void smooth(int amrlev, int mglev, MF &sol, const MF &rhs, bool skip_fillboundary, int niter) const override
Definition AMReX_MLCurlCurl.cpp:360
RT normInf(int amrlev, MF const &mf, bool local) const override
Definition AMReX_MLCurlCurl.cpp:692
void prepareForSolve() override
Definition AMReX_MLCurlCurl.cpp:655
void averageDownAndSync(Vector< MF > &sol) const override
Definition AMReX_MLCurlCurl.cpp:697
void solutionResidual(int amrlev, MF &resid, MF &x, const MF &b, const MF *crse_bcdata=nullptr) override
Definition AMReX_MLCurlCurl.cpp:502
void setScalars(RT a_alpha, RT a_beta) noexcept
Definition AMReX_MLCurlCurl.cpp:48
void make(Vector< Vector< MF > > &mf, IntVect const &ng) const override
Definition AMReX_MLCurlCurl.cpp:709
void smooth4(int amrlev, int mglev, MF &sol, MF const &rhs, int color) const
Definition AMReX_MLCurlCurl.cpp:439
IntVect getNGrowVectRestriction() const override
Definition AMReX_MLCurlCurl.H:105
void setBeta(const Vector< Array< MultiFab const *, 3 > > &a_bcoefs)
This is needed only if there is variable beta coefficient.
Definition AMReX_MLCurlCurl.cpp:56
std::string name() const override
Definition AMReX_MLCurlCurl.H:59
typename MLLinOpT< MF >::Location Location
Definition AMReX_MLCurlCurl.H:33
void correctionResidual(int amrlev, int mglev, MF &resid, MF &x, const MF &b, BCMode bc_mode, const MF *crse_bcdata=nullptr) override
Definition AMReX_MLCurlCurl.cpp:511
typename MLLinOpT< MF >::StateMode StateMode
Definition AMReX_MLCurlCurl.H:32
void compresid(int amrlev, int mglev, MF &resid, MF const &b) const
Definition AMReX_MLCurlCurl.cpp:520
void apply(int amrlev, int mglev, MF &out, MF &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MF > *bndry=nullptr) const override
Definition AMReX_MLCurlCurl.cpp:256
MF makeAlias(MF const &mf) const override
Definition AMReX_MLCurlCurl.cpp:727
RT xdoty(int amrlev, int mglev, const MF &x, const MF &y, bool local) const override
Definition AMReX_MLCurlCurl.cpp:677
bool setUsePCG(bool flag)
Definition AMReX_MLCurlCurl.H:63
MF makeCoarseMG(int amrlev, int mglev, IntVect const &ng) const override
Definition AMReX_MLCurlCurl.cpp:737
bool needsUpdate() const override
Does it need update if it's reused?
Definition AMReX_MLCurlCurl.H:87
typename MLLinOpT< MF >::BCMode BCMode
Definition AMReX_MLCurlCurl.H:31
void prepareRHS(Vector< MF * > const &rhs) const
Definition AMReX_MLCurlCurl.cpp:118
Array< MultiFab, 3 > MF
Definition AMReX_MLCurlCurl.H:28
void applyPhysBC(int amrlev, int mglev, MultiFab &mf, CurlCurlStateType type) const
Definition AMReX_MLCurlCurl.cpp:788
MF makeCoarseAmr(int famrlev, IntVect const &ng) const override
Definition AMReX_MLCurlCurl.cpp:752
bool isBottomSingular() const override
Is the bottom of MG singular?
Definition AMReX_MLCurlCurl.H:97
Definition AMReX_MLLinOp.H:102
typename FabDataType< MF >::value_type RT
Definition AMReX_MLLinOp.H:113
Definition AMReX_MLMGBndry.H:12
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
A Collection of IArrayBoxes.
Definition AMReX_iMultiFab.H:34
std::array< T, N > Array
Definition AMReX_Array.H:26
Definition AMReX_Amr.cpp:49
LinOpBCType
Definition AMReX_LO_BCTYPES.H:22
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
Definition AMReX_MLLinOp.H:36
StateMode
Definition AMReX_MLLinOp.H:89
BCMode
Definition AMReX_MLLinOp.H:88
Location
Definition AMReX_MLLinOp.H:90