WarpX
Loading...
Searching...
No Matches
ThetaImplicitEM Class Reference

#include <ThetaImplicitEM.H>

Inheritance diagram for ThetaImplicitEM:
ImplicitSolver

Public Member Functions

 ThetaImplicitEM ()=default
 
 ~ThetaImplicitEM () override=default
 
 ThetaImplicitEM (const ThetaImplicitEM &)=delete
 
ThetaImplicitEMoperator= (const ThetaImplicitEM &)=delete
 
 ThetaImplicitEM (ThetaImplicitEM &&)=delete
 
ThetaImplicitEMoperator= (ThetaImplicitEM &&)=delete
 
void Define (WarpX *a_WarpX) override
 Read user-provided parameters that control the implicit solver. Allocate internal arrays for intermediate field values needed by the solver.
 
void PrintParameters () const override
 
void OneStep (amrex::Real start_time, amrex::Real a_dt, int a_step) override
 Advances the simulation one time step.
 
void ComputeRHS (WarpXSolverVec &a_RHS, const WarpXSolverVec &a_E, amrex::Real start_time, int a_nl_iter, bool a_from_jacobian) override
 Computes the RHS of the equation corresponding to the specified implicit algorithm. The discrete equations corresponding to numerical integration of ODEs are often written in the form U = b + RHS(U), where U is the variable to be solved for (e.g., the solution at the next time step), b is a constant (i.e., the solution from the previous time step), and RHS(U) is the right-hand-side of the equation. Iterative solvers, such as Picard and Newton, and higher-order Runge-Kutta methods, need to compute RHS(U) multiple times for different values of U. Thus, a routine that returns this value is needed. e.g., Ebar - E^n = cvac^2*0.5*dt*(curl(Bbar) - mu0*Jbar(Ebar,Bbar)) Here, U = Ebar, b = E^n, and the expression on the right is RHS(U).
 
virtual amrex::Real GetThetaForPC () const override
 
- Public Member Functions inherited from ImplicitSolver
 ImplicitSolver ()=default
 
virtual ~ImplicitSolver ()=default
 
 ImplicitSolver (const ImplicitSolver &)=delete
 
ImplicitSolveroperator= (const ImplicitSolver &)=delete
 
 ImplicitSolver (ImplicitSolver &&)=delete
 
ImplicitSolveroperator= (ImplicitSolver &&)=delete
 
bool IsDefined () const
 
void CreateParticleAttributes () const
 
bool DoParticleSuborbits ()
 
int numAMRLevels () const
 
const amrex::GeometryGetGeometry (int) const
 
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryLo () const
 
const amrex::Array< FieldBoundaryType, 3 > & GetFieldBoundaryHi () const
 
amrex::Array< amrex::LinOpBCType, 3 > GetLinOpBCLo () const
 
amrex::Array< amrex::LinOpBCType, 3 > GetLinOpBCHi () const
 
const amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > * GetMassMatricesCoeff () const
 Return pointer to MultiFab array for mass matrix.
 
void ComputeJfromMassMatrices (const bool a_J_from_MM_only)
 

Private Member Functions

void UpdateWarpXFields (const WarpXSolverVec &a_E, amrex::Real start_time)
 Update the E and B fields owned by WarpX.
 
void FinishFieldUpdate (amrex::Real end_time)
 Nonlinear solver is for the time-centered values of E. After the solver, need to use m_E and m_Eold to compute E^{n+1}.
 

Private Attributes

WarpXSolverVec m_E
 Solver vectors to be used in the nonlinear solver to solve for the electric field E. The main logic for determining which variables should be WarpXSolverVec type is that it must have the same size and have the same centering of the data as the variable being solved for, which is E here. For example, if using a Yee grid then a container for curlB could be a WarpXSovlerVec, but magnetic field B should not be.
 
WarpXSolverVec m_Eold
 

Additional Inherited Members

- Protected Member Functions inherited from ImplicitSolver
void parseNonlinearSolverParams (const amrex::ParmParse &pp)
 parse nonlinear solver parameters (if one is used)
 
void InitializeMassMatrices ()
 Initialize the Mass Matrices used for plasma response in nonlinear Newton solver.
 
void PrintBaseImplicitSolverParameters () const
 
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.
 
void SyncMassMatricesPCAndApplyBCs ()
 Communicate Mass Matrices used for PC and apply boundary conditions.
 
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.
 
void CumulateJ ()
 Add J from particles included in mass matrices at start of each Newton step.
 
void SaveE ()
 Save E at start of each Newton step.
 
amrex::Array< amrex::LinOpBCType, 3 > convertFieldBCToLinOpBC (const amrex::Array< FieldBoundaryType, 3 > &) const
 Convert from WarpX FieldBoundaryType to amrex::LinOpBCType.
 
- Protected Attributes inherited from ImplicitSolver
WarpXm_WarpX
 Pointer back to main WarpX class.
 
bool m_is_defined = false
 
int m_num_amr_levels = 1
 Number of AMR levels.
 
amrex::Real m_dt = 0.0
 Time step.
 
amrex::Real m_theta = 0.5
 Time-biasing parameter for fields used on RHS to advance system.
 
NonlinearSolverType m_nlsolver_type
 Nonlinear solver type and object.
 
std::unique_ptr< NonlinearSolver< WarpXSolverVec, ImplicitSolver > > m_nlsolver
 
amrex::ParticleReal m_particle_tolerance = amrex::ParticleReal(1.0e-10)
 tolerance used by the iterative method used to obtain a self-consistent update of the particle positions and velocities for given E and B on the grid
 
int m_max_particle_iterations = 21
 maximum iterations for the iterative method used to obtain a self-consistent update of the particle positions and velocities for given E and B on the grid
 
bool m_particle_suborbits = false
 whether to use suborbits for particles that fail to converge in m_max_particle_iterations iterations
 
bool m_print_unconverged_particle_details = false
 whether the details of unconverged particles are printed out during the particle evolve loops
 
bool m_skip_particle_picard_init = false
 whether to skip the full Picard update of particles on the initial newton step
 
bool m_use_mass_matrices = false
 Whether to use mass matrices for the implicit solver.
 
bool m_use_mass_matrices_jacobian = false
 Whether to use mass matrices to compute J during linear stage of JFNK.
 
bool m_use_mass_matrices_pc = false
 Whether to use mass matrices in the preconditioner.
 
amrex::IntVect m_ncomp_xx = amrex::IntVect{0}
 Direction-dependent component number of mass matrices elements.
 
amrex::IntVect m_ncomp_xy = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_xz = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_yx = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_yy = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_yz = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_zx = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_zy = amrex::IntVect{0}
 
amrex::IntVect m_ncomp_zz = amrex::IntVect{0}
 
amrex::Vector< amrex::Array< amrex::MultiFab *, 3 > > m_mmpc_mfarrvec
 Array of multifab pointers to mass matrix preconditioner.
 

Constructor & Destructor Documentation

◆ ThetaImplicitEM() [1/3]

ThetaImplicitEM::ThetaImplicitEM ( )
default

◆ ~ThetaImplicitEM()

ThetaImplicitEM::~ThetaImplicitEM ( )
overridedefault

◆ ThetaImplicitEM() [2/3]

ThetaImplicitEM::ThetaImplicitEM ( const ThetaImplicitEM & )
delete

◆ ThetaImplicitEM() [3/3]

ThetaImplicitEM::ThetaImplicitEM ( ThetaImplicitEM && )
delete

Member Function Documentation

◆ ComputeRHS()

void ThetaImplicitEM::ComputeRHS ( WarpXSolverVec & a_RHS,
const WarpXSolverVec & a_E,
amrex::Real a_time,
int a_nl_iter,
bool a_from_jacobian )
overridevirtual

Computes the RHS of the equation corresponding to the specified implicit algorithm. The discrete equations corresponding to numerical integration of ODEs are often written in the form U = b + RHS(U), where U is the variable to be solved for (e.g., the solution at the next time step), b is a constant (i.e., the solution from the previous time step), and RHS(U) is the right-hand-side of the equation. Iterative solvers, such as Picard and Newton, and higher-order Runge-Kutta methods, need to compute RHS(U) multiple times for different values of U. Thus, a routine that returns this value is needed. e.g., Ebar - E^n = cvac^2*0.5*dt*(curl(Bbar) - mu0*Jbar(Ebar,Bbar)) Here, U = Ebar, b = E^n, and the expression on the right is RHS(U).

Implements ImplicitSolver.

◆ Define()

void ThetaImplicitEM::Define ( WarpX * a_WarpX)
overridevirtual

Read user-provided parameters that control the implicit solver. Allocate internal arrays for intermediate field values needed by the solver.

Implements ImplicitSolver.

◆ FinishFieldUpdate()

void ThetaImplicitEM::FinishFieldUpdate ( amrex::Real end_time)
private

Nonlinear solver is for the time-centered values of E. After the solver, need to use m_E and m_Eold to compute E^{n+1}.

◆ GetThetaForPC()

virtual amrex::Real ThetaImplicitEM::GetThetaForPC ( ) const
inlinenodiscardoverridevirtual

Implements ImplicitSolver.

◆ OneStep()

void ThetaImplicitEM::OneStep ( amrex::Real start_time,
amrex::Real a_dt,
int a_step )
overridevirtual

Advances the simulation one time step.

Parameters
[in]start_timeThe time at the start of the time step
[in]a_dtThe time step size
[in]a_stepThe time step number

Implements ImplicitSolver.

◆ operator=() [1/2]

ThetaImplicitEM & ThetaImplicitEM::operator= ( const ThetaImplicitEM & )
delete

◆ operator=() [2/2]

ThetaImplicitEM & ThetaImplicitEM::operator= ( ThetaImplicitEM && )
delete

◆ PrintParameters()

void ThetaImplicitEM::PrintParameters ( ) const
overridevirtual

Implements ImplicitSolver.

◆ UpdateWarpXFields()

void ThetaImplicitEM::UpdateWarpXFields ( const WarpXSolverVec & a_E,
amrex::Real start_time )
private

Update the E and B fields owned by WarpX.

Member Data Documentation

◆ m_E

WarpXSolverVec ThetaImplicitEM::m_E
private

Solver vectors to be used in the nonlinear solver to solve for the electric field E. The main logic for determining which variables should be WarpXSolverVec type is that it must have the same size and have the same centering of the data as the variable being solved for, which is E here. For example, if using a Yee grid then a container for curlB could be a WarpXSovlerVec, but magnetic field B should not be.

◆ m_Eold

WarpXSolverVec ThetaImplicitEM::m_Eold
private

The documentation for this class was generated from the following files: