WarpX
Loading...
Searching...
No Matches
ImplicitSolver.H
Go to the documentation of this file.
1/* Copyright 2024 Justin Angus, Debojyoti Ghosh
2 *
3 * This file is part of WarpX.
4 *
5 * License: BSD-3-Clause-LBNL
6 */
7#ifndef Implicit_Solver_H_
8#define Implicit_Solver_H_
9
11
14
15#include <AMReX_Array.H>
16#include <AMReX_REAL.H>
17#include <AMReX_LO_BCTYPES.H>
18
24
25class WarpX;
26enum class FieldBoundaryType;
28{
29public:
30
31 ImplicitSolver() = default;
32
33 virtual ~ImplicitSolver() = default;
34
35 // Prohibit Move and Copy operations
40
41 //
42 // the following routines are called by WarpX
43 //
44
49 virtual void Define ( WarpX* a_WarpX ) = 0;
50
51 [[nodiscard]] bool IsDefined () const { return m_is_defined; }
52
53 virtual void PrintParameters () const = 0;
54
55 void CreateParticleAttributes () const;
56
58
62 virtual void OneStep ( amrex::Real a_time,
63 amrex::Real a_dt,
64 int a_step ) = 0;
65
66 //
67 // the following routines are called by the linear and nonlinear solvers
68 //
69
82 virtual void ComputeRHS ( WarpXSolverVec& a_RHS,
83 const WarpXSolverVec& a_E,
84 amrex::Real a_time,
85 int a_nl_iter,
86 bool a_from_jacobian ) = 0;
87
88 [[nodiscard]] int numAMRLevels () const { return m_num_amr_levels; }
89
90 [[nodiscard]] const amrex::Geometry& GetGeometry (int) const;
95
101 else { return nullptr; }
102 }
103
107 [[nodiscard]] virtual const amrex::MultiFab* GetCurl2BCmask (const int lev, const int dir) const
108 {
109 amrex::ignore_unused(lev,dir);
110 return nullptr;
111 }
112
113 // This parameter is used for the time-step fraction in the PC for implicit
114 // treatment of light waves in the curl-curl MLMG solver.
115 // This function should return zero if light waves are not treated implicitly
116 [[nodiscard]] virtual amrex::Real GetThetaForPC () const = 0;
117
118 void ComputeJfromMassMatrices (const bool a_J_from_MM_only);
119
120protected:
121
126
127 bool m_is_defined = false;
128
133
137 mutable amrex::Real m_dt = 0.0;
138
143
148 std::unique_ptr<NonlinearSolver<WarpXSolverVec,ImplicitSolver>> m_nlsolver;
149
155
161
167
173
178
183
188
193
206
211
216
221
223
227 void PreRHSOp ( const amrex::Real a_cur_time,
228 const int a_nl_iter,
229 const bool a_from_jacobian );
230
235
239 void SetMassMatricesForPC ( const amrex::Real a_theta_dt );
240
244 void CumulateJ ();
245
249 void SaveE ();
250
255
256};
257
258#endif
amrex::ParmParse pp
NonlinearSolverType
struct to select the nonlinear solver for implicit schemes
Definition NonlinearSolverLibrary.H:17
FieldBoundaryType
Definition WarpXAlgorithmSelection.H:138
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryLo() const
Definition ImplicitSolver.cpp:43
amrex::ParticleReal m_particle_tolerance
tolerance used by the iterative method used to obtain a self-consistent update of the particle positi...
Definition ImplicitSolver.H:154
amrex::IntVect m_ncomp_zz
Definition ImplicitSolver.H:205
amrex::Real m_theta
Time-biasing parameter for fields used on RHS to advance system.
Definition ImplicitSolver.H:142
bool m_print_unconverged_particle_details
whether the details of unconverged particles are printed out during the particle evolve loops
Definition ImplicitSolver.H:172
int m_max_particle_iterations
maximum iterations for the iterative method used to obtain a self-consistent update of the particle p...
Definition ImplicitSolver.H:160
amrex::Real m_dt
Time step.
Definition ImplicitSolver.H:137
virtual void OneStep(amrex::Real a_time, amrex::Real a_dt, int a_step)=0
Advance fields and particles by one time step using the specified implicit algorithm.
bool m_use_mass_matrices_pc
Whether to use mass matrices in the preconditioner.
Definition ImplicitSolver.H:192
virtual amrex::Real GetThetaForPC() const =0
bool m_use_mass_matrices_jacobian
Whether to use mass matrices to compute J during linear stage of JFNK.
Definition ImplicitSolver.H:187
void PrintBaseImplicitSolverParameters() const
Definition ImplicitSolver.cpp:864
amrex::IntVect m_ncomp_zx
Definition ImplicitSolver.H:203
amrex::Array< amrex::LinOpBCType, 3 > convertFieldBCToLinOpBC(const amrex::Array< FieldBoundaryType, 3 > &, const int bdry_side) const
Convert from WarpX FieldBoundaryType to amrex::LinOpBCType.
Definition ImplicitSolver.cpp:63
bool m_is_defined
Definition ImplicitSolver.H:127
amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > m_mmpc_mfarrvec
Array of multifab pointers to mass matrix preconditioner.
Definition ImplicitSolver.H:210
void CreateParticleAttributes() const
Definition ImplicitSolver.cpp:10
void ComputeJfromMassMatrices(const bool a_J_from_MM_only)
Definition ImplicitSolver.cpp:144
void parseNonlinearSolverParams(const amrex::ParmParse &pp)
parse nonlinear solver parameters (if one is used)
Definition ImplicitSolver.cpp:448
virtual const amrex::MultiFab * GetCurl2BCmask(const int lev, const int dir) const
Return reference to the multifabs for curl curl mask.
Definition ImplicitSolver.H:107
amrex::IntVect m_ncomp_yy
Definition ImplicitSolver.H:201
ImplicitSolver()=default
int m_num_amr_levels
Number of AMR levels.
Definition ImplicitSolver.H:132
bool m_use_mass_matrices
Whether to use mass matrices for the implicit solver.
Definition ImplicitSolver.H:182
void SetMassMatricesForPC(const amrex::Real a_theta_dt)
Scale mass matrices used for PC by c^2*mu0*theta*dt and add 1 to diagonal terms.
Definition ImplicitSolver.cpp:837
WarpX * m_WarpX
Pointer back to main WarpX class.
Definition ImplicitSolver.H:125
amrex::Array< amrex::LinOpBCType, 3 > GetLinOpBCHi() const
Definition ImplicitSolver.cpp:58
void SyncMassMatricesPCAndApplyBCs()
Communicate Mass Matrices used for PC and apply boundary conditions.
Definition ImplicitSolver.cpp:802
amrex::IntVect m_ncomp_zy
Definition ImplicitSolver.H:204
ImplicitSolver & operator=(ImplicitSolver &&)=delete
NonlinearSolverType m_nlsolver_type
Nonlinear solver type and object.
Definition ImplicitSolver.H:147
amrex::IntVect m_ncomp_xy
Definition ImplicitSolver.H:198
void InitializeMassMatrices()
Initialize the Mass Matrices used for plasma response in nonlinear Newton solver.
Definition ImplicitSolver.cpp:526
amrex::IntVect m_ncomp_xz
Definition ImplicitSolver.H:199
void SaveE()
Save E at start of each Newton step.
Definition ImplicitSolver.cpp:128
virtual void Define(WarpX *a_WarpX)=0
Read user-provided parameters that control the implicit solver. Allocate internal arrays for intermed...
void PreRHSOp(const amrex::Real a_cur_time, const int a_nl_iter, const bool a_from_jacobian)
Perform operations needed before computing the Right Hand Side.
Definition ImplicitSolver.cpp:736
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryHi() const
Definition ImplicitSolver.cpp:48
amrex::IntVect m_ncomp_yx
Definition ImplicitSolver.H:200
amrex::IntVect m_ncomp_xx
Direction-dependent component number of mass matrices elements.
Definition ImplicitSolver.H:197
bool IsDefined() const
Definition ImplicitSolver.H:51
bool m_skip_particle_picard_init
whether to skip the full Picard update of particles on the initial newton step
Definition ImplicitSolver.H:177
bool m_particle_suborbits
whether to use suborbits for particles that fail to converge in m_max_particle_iterations iterations
Definition ImplicitSolver.H:166
virtual void PrintParameters() const =0
bool DoParticleSuborbits()
Definition ImplicitSolver.H:57
ImplicitSolver(ImplicitSolver &&)=delete
virtual void ComputeRHS(WarpXSolverVec &a_RHS, const WarpXSolverVec &a_E, amrex::Real a_time, int a_nl_iter, bool a_from_jacobian)=0
Computes the RHS of the equation corresponding to the specified implicit algorithm....
ImplicitSolver(const ImplicitSolver &)=delete
const amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > * GetMassMatricesCoeff() const
Return pointer to MultiFab array for mass matrix.
Definition ImplicitSolver.H:99
amrex::IntVect m_ncomp_yz
Definition ImplicitSolver.H:202
amrex::Array< amrex::LinOpBCType, 3 > GetLinOpBCLo() const
Definition ImplicitSolver.cpp:53
void CumulateJ()
Add J from particles included in mass matrices at start of each Newton step.
Definition ImplicitSolver.cpp:105
ImplicitSolver & operator=(const ImplicitSolver &)=delete
int numAMRLevels() const
Definition ImplicitSolver.H:88
std::unique_ptr< NonlinearSolver< WarpXSolverVec, ImplicitSolver > > m_nlsolver
Definition ImplicitSolver.H:148
const amrex::Geometry & GetGeometry(int) const
Definition ImplicitSolver.cpp:37
virtual ~ImplicitSolver()=default
Definition WarpX.H:85
This is a wrapper class around a Vector of pointers to MultiFabs that contains basic math operators a...
Definition WarpXSolverVec.H:58
amrex_real Real
amrex_particle_real ParticleReal
std::array< T, N > Array
__host__ __device__ void ignore_unused(const Ts &...)
IntVectND< 3 > IntVect