XGCa
solver.hpp
Go to the documentation of this file.
1 #ifndef SOLVER_HPP
2 #define SOLVER_HPP
3 
4 #include "plasma.hpp"
5 #include "electric_field.hpp"
6 #include "perturbed_B_field.hpp"
7 #include "charge.hpp"
8 #include "sml.hpp"
9 #include "solver_settings.hpp"
10 #include "step_trigger.hpp"
11 #include "simple00_solver.hpp"
12 #include "bias_potential.hpp"
14 #include "solver_init_data.hpp"
15 
16 // Base class for solvers
17 class Solver{
18 
19  public:
20 
21  enum SOLVER_INT : int {A=0, A_SPEC, A_CV, A_CV_SPEC, P0, H, H_SPEC};
22 
23  std::string label;
26 
27  int solver_index; // Used for fortran accesses
28  int spec_solver_index; // Used for fortran accesses (spectral)
29 
30  bool spectral;
31  int n_rhs;
32 
34 
35  Boundary bd_rhs; // Boundary for input (charge, current)
36  Boundary bd; // Boundary for solution (potential)
37 
38  bool use_pade;
39 
40  Solver(std::string label_in, int solver_index_in, int spec_solver_index_in, bool spectral_in, int n_rhs_in, int n_triangle_in, bool use_pade_in, bool update_solver, int update_solver_nstep);
41 
42  bool update_is_triggered(int gstep) const;
43 
44  void update_helm_solver(int isolver, const SolverInitData<HostType>& solver_data, const View<int*,CLayout,HostType>& bd,
45  const View<double*,CLayout,HostType>& alpha,
46  const View<double*,CLayout,HostType>& beta);
47 
48  void update(const SolverInitData<HostType>& solver_data, const View<int*,CLayout,DeviceType>& bd_d);
49 
50  // Virtual functions: Default exists but can be overridden
51  virtual void rhs1_set_alpha_beta(const SolverInitData<HostType>& solver_data, double scale, const View<double*,CLayout,HostType>& alpha, const View<double*,CLayout,HostType>& beta);
52  virtual void rhs2_set_alpha_beta(const SolverInitData<HostType>& solver_data, double scale, const View<double*,CLayout,HostType>& alpha, const View<double*,CLayout,HostType>& beta);
53  virtual void iter_solver_set_alpha_beta(const SolverInitData<HostType>& solver_data, const View<double*,CLayout,HostType>& alpha, const View<double*,CLayout,HostType>& beta);
54 
55  virtual ~Solver() = default;
56 
57  // Pure virtual functions: Must be defined for each solver
58  virtual void lhs_set_alpha_beta(const SolverInitData<HostType>& solver_data, const View<double*,CLayout,HostType>& alpha, const View<double*,CLayout,HostType>& beta, double& scale) = 0;
59  virtual void setup_boundaries(NLReader::NamelistReader& nlr, bool is_XGCa, bool explicit_electromagnetic, const MagneticField<DeviceType>& magnetic_field, const Grid<DeviceType>& grid) = 0;
60 };
61 
62 #endif
Definition: boundary.hpp:83
Definition: magnetic_field.hpp:12
Definition: NamelistReader.hpp:199
Definition: solver.hpp:17
std::string label
Definition: solver.hpp:23
virtual void iter_solver_set_alpha_beta(const SolverInitData< HostType > &solver_data, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta)
Definition: solver.cpp:34
virtual void rhs2_set_alpha_beta(const SolverInitData< HostType > &solver_data, double scale, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta)
Definition: solver.cpp:29
int spec_solver_index
Definition: solver.hpp:28
int n_triangle
Definition: solver.hpp:33
virtual void lhs_set_alpha_beta(const SolverInitData< HostType > &solver_data, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta, double &scale)=0
Solver(std::string label_in, int solver_index_in, int spec_solver_index_in, bool spectral_in, int n_rhs_in, int n_triangle_in, bool use_pade_in, bool update_solver, int update_solver_nstep)
Definition: solver.cpp:53
int solver_index
Definition: solver.hpp:27
bool use_pade
Definition: solver.hpp:38
bool update_is_triggered(int gstep) const
Definition: solver.cpp:71
Boundary bd
Definition: solver.hpp:36
virtual ~Solver()=default
void update_helm_solver(int isolver, const SolverInitData< HostType > &solver_data, const View< int *, CLayout, HostType > &bd, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta)
Definition: solver.cpp:78
bool spectral
Definition: solver.hpp:30
SOLVER_INT
Definition: solver.hpp:21
@ A
Definition: solver.hpp:21
@ A_CV_SPEC
Definition: solver.hpp:21
@ A_CV
Definition: solver.hpp:21
@ H_SPEC
Definition: solver.hpp:21
@ P0
Definition: solver.hpp:21
@ A_SPEC
Definition: solver.hpp:21
@ H
Definition: solver.hpp:21
virtual void rhs1_set_alpha_beta(const SolverInitData< HostType > &solver_data, double scale, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta)
Definition: solver.cpp:15
void update(const SolverInitData< HostType > &solver_data, const View< int *, CLayout, DeviceType > &bd_d)
Definition: solver.cpp:150
int n_rhs
Definition: solver.hpp:31
virtual void setup_boundaries(NLReader::NamelistReader &nlr, bool is_XGCa, bool explicit_electromagnetic, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid)=0
StepTrigger update_trigger
Definition: solver.hpp:24
bool initialized
Definition: solver.hpp:25
Boundary bd_rhs
Definition: solver.hpp:35
Definition: step_trigger.hpp:4
Definition: magnetic_field.F90:1
Definition: solver_init_data.hpp:9