WarpX
HybridPICModel.H
Go to the documentation of this file.
1 /* Copyright 2023 The WarpX Community
2  *
3  * This file is part of WarpX.
4  *
5  * Authors: Roelof Groenewald (TAE Technologies)
6  *
7  * License: BSD-3-Clause-LBNL
8  */
9 
10 #ifndef WARPX_HYBRIDPICMODEL_H_
11 #define WARPX_HYBRIDPICMODEL_H_
12 
13 #include "HybridPICModel_fwd.H"
14 
16 
19 #include "Utils/WarpXConst.H"
21 
22 #include <AMReX_Array.H>
23 #include <AMReX_REAL.H>
24 
25 #include <optional>
26 
32 {
33 public:
34  HybridPICModel (int nlevs_max); // constructor
35 
37  void ReadParameters ();
38 
40  void AllocateMFs (int nlevs_max);
41  void AllocateLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
42  int ncomps, const amrex::IntVect& ngJ, const amrex::IntVect& ngRho,
43  const amrex::IntVect& jx_nodal_flag, const amrex::IntVect& jy_nodal_flag,
44  const amrex::IntVect& jz_nodal_flag, const amrex::IntVect& rho_nodal_flag);
45 
47  void ClearLevel (int lev);
48 
49  void InitData ();
50 
57  void GetCurrentExternal (
58  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths
59  );
60  void GetCurrentExternal (
61  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
62  int lev
63  );
64 
75  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Bfield,
76  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths
77  );
79  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Bfield,
80  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
81  int lev
82  );
83 
88  void HybridPICSolveE (
89  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Efield,
90  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Jfield,
91  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Bfield,
92  amrex::Vector<std::unique_ptr<amrex::MultiFab>> const& rhofield,
93  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths,
94  bool include_resistivity_term);
95 
96  void HybridPICSolveE (
97  std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
98  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Jfield,
99  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Bfield,
100  std::unique_ptr<amrex::MultiFab> const& rhofield,
101  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
102  int lev, bool include_resistivity_term);
103 
104  void HybridPICSolveE (
105  std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
106  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Jfield,
107  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Bfield,
108  std::unique_ptr<amrex::MultiFab> const& rhofield,
109  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
110  int lev, PatchType patch_type, bool include_resistivity_term);
111 
112  void BfieldEvolveRK (
113  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Bfield,
114  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Efield,
115  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Jfield,
116  amrex::Vector<std::unique_ptr<amrex::MultiFab>> const& rhofield,
117  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths,
118  amrex::Real dt, DtType a_dt_type,
119  amrex::IntVect ng, std::optional<bool> nodal_sync);
120 
121  void BfieldEvolveRK (
122  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Bfield,
123  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Efield,
124  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Jfield,
125  amrex::Vector<std::unique_ptr<amrex::MultiFab>> const& rhofield,
126  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths,
127  amrex::Real dt, int lev, DtType dt_type,
128  amrex::IntVect ng, std::optional<bool> nodal_sync);
129 
130  void FieldPush (
131  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Bfield,
132  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Efield,
133  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Jfield,
134  amrex::Vector<std::unique_ptr<amrex::MultiFab>> const& rhofield,
135  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths,
136  amrex::Real dt, DtType dt_type,
137  amrex::IntVect ng, std::optional<bool> nodal_sync);
138 
145  void CalculateElectronPressure ( DtType a_dt_type);
146  void CalculateElectronPressure (int lev, DtType a_dt_type);
147 
157  std::unique_ptr<amrex::MultiFab> const& Pe_field,
158  amrex::MultiFab* const& rho_field ) const;
159 
160  // Declare variables to hold hybrid-PIC model parameters
162  int m_substeps = 10;
163 
165  amrex::Real m_elec_temp;
167  amrex::Real m_n0_ref = 1.0;
169  amrex::Real m_gamma = 5.0/3.0;
170 
172  amrex::Real m_n_floor = 1.0;
173 
175  std::string m_eta_expression = "0.0";
176  std::unique_ptr<amrex::Parser> m_resistivity_parser;
179 
181  amrex::Real m_eta_h = 0.0;
182 
184  std::string m_Jx_ext_grid_function = "0.0";
185  std::string m_Jy_ext_grid_function = "0.0";
186  std::string m_Jz_ext_grid_function = "0.0";
187  std::array< std::unique_ptr<amrex::Parser>, 3> m_J_external_parser;
188  std::array< amrex::ParserExecutor<4>, 3> m_J_external;
190 
191  // Declare multifabs specifically needed for the hybrid-PIC model
197 
198  // Helper functions to retrieve hybrid-PIC multifabs
199  [[nodiscard]] amrex::MultiFab*
200  get_pointer_current_fp_ampere (int lev, int direction) const
201  {
202  return current_fp_ampere[lev][direction].get();
203  }
204 
205  [[nodiscard]] amrex::MultiFab*
206  get_pointer_current_fp_external (int lev, int direction) const
207  {
208  return current_fp_external[lev][direction].get();
209  }
210 
211  [[nodiscard]] amrex::MultiFab*
213  {
214  return electron_pressure_fp[lev].get();
215  }
216 
235 };
236 
244 
246  static amrex::Real get_pressure (amrex::Real const n0,
247  amrex::Real const T0,
248  amrex::Real const gamma,
249  amrex::Real const rho) {
250  return n0 * T0 * std::pow((rho/PhysConst::q_e)/n0, gamma);
251  }
252 };
253 
254 #endif // WARPX_HYBRIDPICMODEL_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
DtType
Definition: WarpXDtType.H:11
This class contains the parameters needed to evaluate hybrid field solutions (kinetic ions with fluid...
Definition: HybridPICModel.H:32
void ReadParameters()
Definition: HybridPICModel.cpp:24
amrex::GpuArray< int, 3 > Bz_IndexType
Definition: HybridPICModel.H:228
amrex::GpuArray< int, 3 > Bx_IndexType
Definition: HybridPICModel.H:224
void FillElectronPressureMF(std::unique_ptr< amrex::MultiFab > const &Pe_field, amrex::MultiFab *const &rho_field) const
Fill the electron pressure multifab given the kinetic particle charge density (and assumption of quas...
Definition: HybridPICModel.cpp:518
void HybridPICSolveE(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &Efield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &Jfield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &Bfield, amrex::Vector< std::unique_ptr< amrex::MultiFab >> const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &edge_lengths, bool include_resistivity_term)
Function to update the E-field using Ohm's law (hybrid-PIC model).
Definition: HybridPICModel.cpp:429
void FieldPush(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &Bfield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &Efield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &Jfield, amrex::Vector< std::unique_ptr< amrex::MultiFab >> const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &edge_lengths, amrex::Real dt, DtType dt_type, amrex::IntVect ng, std::optional< bool > nodal_sync)
Definition: HybridPICModel.cpp:679
amrex::Real m_n0_ref
Definition: HybridPICModel.H:167
void CalculateCurrentAmpere(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &Bfield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &edge_lengths)
Function to calculate the total current based on Ampere's law while neglecting displacement current (...
Definition: HybridPICModel.cpp:399
std::string m_Jz_ext_grid_function
Definition: HybridPICModel.H:186
amrex::GpuArray< int, 3 > Ez_IndexType
Definition: HybridPICModel.H:234
void BfieldEvolveRK(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &Bfield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> &Efield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &Jfield, amrex::Vector< std::unique_ptr< amrex::MultiFab >> const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &edge_lengths, amrex::Real dt, DtType a_dt_type, amrex::IntVect ng, std::optional< bool > nodal_sync)
Definition: HybridPICModel.cpp:547
amrex::MultiFab * get_pointer_electron_pressure_fp(int lev) const
Definition: HybridPICModel.H:212
amrex::MultiFab * get_pointer_current_fp_external(int lev, int direction) const
Definition: HybridPICModel.H:206
std::array< amrex::ParserExecutor< 4 >, 3 > m_J_external
Definition: HybridPICModel.H:188
amrex::Real m_elec_temp
Definition: HybridPICModel.H:165
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_external
Definition: HybridPICModel.H:195
amrex::GpuArray< int, 3 > Jx_IndexType
Definition: HybridPICModel.H:218
void ClearLevel(int lev)
Definition: HybridPICModel.cpp:119
amrex::GpuArray< int, 3 > Jz_IndexType
Definition: HybridPICModel.H:222
std::string m_Jy_ext_grid_function
Definition: HybridPICModel.H:185
std::unique_ptr< amrex::Parser > m_resistivity_parser
Definition: HybridPICModel.H:176
HybridPICModel(int nlevs_max)
Definition: HybridPICModel.cpp:18
std::string m_eta_expression
Definition: HybridPICModel.H:175
void AllocateMFs(int nlevs_max)
Definition: HybridPICModel.cpp:58
void AllocateLevelMFs(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, int ncomps, const amrex::IntVect &ngJ, const amrex::IntVect &ngRho, const amrex::IntVect &jx_nodal_flag, const amrex::IntVect &jy_nodal_flag, const amrex::IntVect &jz_nodal_flag, const amrex::IntVect &rho_nodal_flag)
Definition: HybridPICModel.cpp:67
amrex::Vector< std::unique_ptr< amrex::MultiFab > > electron_pressure_fp
Definition: HybridPICModel.H:196
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_ampere
Definition: HybridPICModel.H:194
amrex::Real m_gamma
Definition: HybridPICModel.H:169
std::array< std::unique_ptr< amrex::Parser >, 3 > m_J_external_parser
Definition: HybridPICModel.H:187
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp_temp
Definition: HybridPICModel.H:192
std::string m_Jx_ext_grid_function
Definition: HybridPICModel.H:184
int m_substeps
Definition: HybridPICModel.H:162
bool m_resistivity_has_J_dependence
Definition: HybridPICModel.H:178
amrex::GpuArray< int, 3 > Ex_IndexType
Definition: HybridPICModel.H:230
amrex::Real m_n_floor
Definition: HybridPICModel.H:172
bool m_external_field_has_time_dependence
Definition: HybridPICModel.H:189
void GetCurrentExternal(amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 >> const &edge_lengths)
Function to evaluate the external current expressions and populate the external current multifab....
Definition: HybridPICModel.cpp:251
void InitData()
Definition: HybridPICModel.cpp:130
amrex::ParserExecutor< 2 > m_eta
Definition: HybridPICModel.H:177
amrex::MultiFab * get_pointer_current_fp_ampere(int lev, int direction) const
Definition: HybridPICModel.H:200
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_temp
Definition: HybridPICModel.H:193
void CalculateElectronPressure(DtType a_dt_type)
Function to calculate the electron pressure at a given timestep type using the simulation charge dens...
Definition: HybridPICModel.cpp:489
amrex::GpuArray< int, 3 > Jy_IndexType
Definition: HybridPICModel.H:220
amrex::Real m_eta_h
Definition: HybridPICModel.H:181
amrex::GpuArray< int, 3 > By_IndexType
Definition: HybridPICModel.H:226
amrex::GpuArray< int, 3 > Ey_IndexType
Definition: HybridPICModel.H:232
static constexpr auto q_e
elementary charge [C]
Definition: constant.H:50
PatchType
Definition: Enums.H:28
float dt
Definition: stencil.py:442
int gamma
boosted frame
Definition: stencil.py:431
This struct contains only static functions to compute the electron pressure using the particle densit...
Definition: HybridPICModel.H:243
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real get_pressure(amrex::Real const n0, amrex::Real const T0, amrex::Real const gamma, amrex::Real const rho)
Definition: HybridPICModel.H:246