XGCa
solver_ampere_cv.hpp
Go to the documentation of this file.
1 #ifndef SOLVER_AMPERE_CV_HPP
2 #define SOLVER_AMPERE_CV_HPP
3 
4 #include "solver.hpp"
5 
6 class SolverAmpereCV : public Solver{
7 
8  double skin_norm;
9 
10  public:
11 
12  SolverAmpereCV(NLReader::NamelistReader& nlr, bool is_XGCa, bool is_em, const MagneticField<DeviceType>& magnetic_field, const Grid<DeviceType>& grid, std::string label_in, bool spectral_in, bool use_pade_in, bool update_solver, int update_solver_nstep)
13  : Solver(label_in, A_CV, A_CV_SPEC, spectral_in, 2, grid.ntriangle, use_pade_in, update_solver, update_solver_nstep)
14  {
15  TIMER("EXTEND_BOUNDARY",
16  setup_boundaries(nlr, is_XGCa, is_em, magnetic_field, grid) );
17 
18 
19  // skin term correction (finite sphere)
20  // note sml_flat_marker_cutoff1 (para) can in principle be different
21  // from sml_flat_marker_cutoff2 (perp)
22  nlr.use_namelist("sml_param");
23  double v_para_cutoff = nlr.get<double>("sml_flat_marker_cutoff1", 4.0);
24  skin_norm = std::erf(v_para_cutoff) - (1.0 + v_para_cutoff*v_para_cutoff*2.0/3.0)*2.0/sqrt(PI)*v_para_cutoff*exp(-v_para_cutoff*v_para_cutoff);
25  }
26 
27  void lhs_set_alpha_beta(const SolverInitData<HostType>& solver_data, const View<double*,CLayout,HostType>& alpha, const View<double*,CLayout,HostType>& beta, double& scale) override;
28  void rhs2_set_alpha_beta(const SolverInitData<HostType>& solver_data, double scale, const View<double*,CLayout,HostType>& alpha, const View<double*,CLayout,HostType>& beta) override;
29 
30  void setup_boundaries(NLReader::NamelistReader& nlr, bool is_XGCa, bool explicit_electromagnetic, const MagneticField<DeviceType>& magnetic_field, const Grid<DeviceType>& grid);
31 };
32 
33 #endif
Definition: magnetic_field.hpp:12
Definition: NamelistReader.hpp:199
T get(const string &param, const T default_val, int val_ind=0)
Definition: NamelistReader.hpp:392
void use_namelist(const string &namelist, Options required=Required)
Definition: NamelistReader.hpp:366
Definition: solver_ampere_cv.hpp:6
void setup_boundaries(NLReader::NamelistReader &nlr, bool is_XGCa, bool explicit_electromagnetic, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid)
Definition: solver_ampere_cv.cpp:47
SolverAmpereCV(NLReader::NamelistReader &nlr, bool is_XGCa, bool is_em, const MagneticField< DeviceType > &magnetic_field, const Grid< DeviceType > &grid, std::string label_in, bool spectral_in, bool use_pade_in, bool update_solver, int update_solver_nstep)
Definition: solver_ampere_cv.hpp:12
void rhs2_set_alpha_beta(const SolverInitData< HostType > &solver_data, double scale, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta) override
Definition: solver_ampere_cv.cpp:34
void lhs_set_alpha_beta(const SolverInitData< HostType > &solver_data, const View< double *, CLayout, HostType > &alpha, const View< double *, CLayout, HostType > &beta, double &scale) override
Definition: solver_ampere_cv.cpp:6
double skin_norm
Definition: solver_ampere_cv.hpp:8
Definition: solver.hpp:17
@ A_CV_SPEC
Definition: solver.hpp:21
@ A_CV
Definition: solver.hpp:21
constexpr double PI
Definition: constants.hpp:9
Definition: magnetic_field.F90:1
Definition: solver_init_data.hpp:9
#define TIMER(N, F)
Definition: timer_macro.hpp:24