46template <
class T,
class Ops>
51 using RT =
typename T::value_type;
72 void Define (const T&, Ops* const) override;
77 void Update (const T& a_U) override;
86 void Apply (T&, const T&) override;
129template <
class T,
class Ops>
132 using namespace amrex;
134 Print() << pc_name <<
" verbose: " << (
m_verbose?
"true":
"false") <<
"\n";
136 Print() << pc_name <<
" absolute tolerance: " <<
m_atol <<
"\n";
137 Print() << pc_name <<
" relative tolerance: " <<
m_rtol <<
"\n";
140template <
class T,
class Ops>
146 pp.query(
"absolute_tolerance",
m_atol);
147 pp.query(
"relative_tolerance",
m_rtol);
150template <
class T,
class Ops>
155 using namespace amrex;
159 "JacobiPC::Define() called on defined object" );
162 "JacobiPC::Define(): a_ops is nullptr" );
165 "JacobiPC::Define() must be called with Efield_fp type");
178template <
class T,
class Ops>
182 using namespace amrex;
186 "JacobiPC::Update() called on undefined object" );
193 <<
": theta*dt = " << this->
m_dt <<
"\n";
197template <
class T,
class Ops>
205 using namespace amrex;
209 "JacobiPC::Apply() called on undefined object" );
212 "JacobiPC::Apply() - a_x must be Efield_fp type");
215 "JacobiPC::Apply() - a_b must be Efield_fp type");
224 auto& b_mfarrvec = a_b.getArrayVec();
225 auto& x_mfarrvec = a_x.getArrayVec();
228 "Error in JacobiPC::Apply() - mismatch in number of levels." );
232 for (
int dim = 0; dim < 3; dim++) {
233 const auto& b_mf = *(b_mfarrvec[n][dim]);
234 const auto& a_mf = *((*m_bcoefs)[n][dim]);
235 auto& x_mf = *(x_mfarrvec[n][dim]);
238 Box bx = mfi.tilebox();
239 auto x_arr = x_mf.array(mfi);
240 auto b_arr = b_mf.const_array(mfi);
241 auto a_arr = a_mf.const_array(mfi);
245 x_arr(i,j,k) = b_arr(i,j,k) / a_arr(i,j,k);
@ pc_jacobi
Definition Preconditioner.H:22
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition TextMsg.H:13
amrex::IntVect m_gv
Definition JacobiPC.H:116
bool m_is_defined
Definition JacobiPC.H:102
JacobiPC(JacobiPC &&) noexcept=delete
void Define(const T &, Ops *const) override
Define the preconditioner.
Definition JacobiPC.H:151
void Apply(T &, const T &) override
Apply (solve) the preconditioner given a RHS.
Definition JacobiPC.H:198
void printParameters() const override
Print parameters.
Definition JacobiPC.H:130
~JacobiPC() override=default
Default destructor.
RT m_rtol
Definition JacobiPC.H:108
amrex::Array< amrex::MultiFab, 3 > MFArr
Definition JacobiPC.H:100
const amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > * m_bcoefs
Definition JacobiPC.H:118
amrex::Vector< amrex::Geometry > m_geom
Definition JacobiPC.H:113
Ops * m_ops
Definition JacobiPC.H:110
JacobiPC(const JacobiPC &)=delete
typename T::value_type RT
Definition JacobiPC.H:51
JacobiPC()=default
Default constructor.
void Update(const T &a_U) override
Update the preconditioner.
Definition JacobiPC.H:179
int m_num_amr_levels
Definition JacobiPC.H:112
void readParameters()
Read parameters.
Definition JacobiPC.H:141
int m_max_iter
Definition JacobiPC.H:105
RT m_atol
Definition JacobiPC.H:107
JacobiPC & operator=(const JacobiPC &)=delete
bool m_verbose
Definition JacobiPC.H:104
amrex::Vector< amrex::DistributionMapping > m_dmap
Definition JacobiPC.H:115
amrex::Vector< amrex::BoxArray > m_grids
Definition JacobiPC.H:114
bool IsDefined() const override
Check if the nonlinear solver has been defined.
Definition JacobiPC.H:96
RT m_dt
Definition Preconditioner.H:125
Preconditioner()=default
Default constructor.
__host__ __device__ void ignore_unused(const Ts &...)
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
std::string getEnumNameString(T const &v)
bool TilingIfNotGPU() noexcept
@ Efield_fp
Definition Fields.H:94