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 
17 #include "Utils/WarpXConst.H"
19 #include "WarpX.H"
20 
21 #include <AMReX_Array.H>
22 #include <AMReX_REAL.H>
23 
24 
30 {
31 public:
32  HybridPICModel (int nlevs_max); // constructor
33 
35  void ReadParameters ();
36 
38  void AllocateMFs (int nlevs_max);
39  void AllocateLevelMFs (int lev, const amrex::BoxArray& ba, const amrex::DistributionMapping& dm,
40  const int ncomps, const amrex::IntVect& ngJ, const amrex::IntVect& ngRho,
41  const amrex::IntVect& jx_nodal_flag, const amrex::IntVect& jy_nodal_flag,
42  const amrex::IntVect& jz_nodal_flag, const amrex::IntVect& rho_nodal_flag);
43 
45  void ClearLevel (int lev);
46 
47  void InitData ();
48 
59  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Bfield,
60  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths
61  );
63  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Bfield,
64  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
65  const int lev
66  );
67 
72  void HybridPICSolveE (
73  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>& Efield,
74  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Jfield,
75  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& Bfield,
76  amrex::Vector<std::unique_ptr<amrex::MultiFab>> const& rhofield,
77  amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>> const& edge_lengths,
78  const bool include_resistivity_term);
79  void HybridPICSolveE (
80  std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
81  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Jfield,
82  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Bfield,
83  std::unique_ptr<amrex::MultiFab> const& rhofield,
84  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
85  const int lev, const bool include_resistivity_term);
86  void HybridPICSolveE (
87  std::array< std::unique_ptr<amrex::MultiFab>, 3>& Efield,
88  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Jfield,
89  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& Bfield,
90  std::unique_ptr<amrex::MultiFab> const& rhofield,
91  std::array< std::unique_ptr<amrex::MultiFab>, 3> const& edge_lengths,
92  const int lev, PatchType patch_type, const bool include_resistivity_term);
93 
100  void CalculateElectronPressure ( DtType a_dt_type);
101  void CalculateElectronPressure (const int lev, DtType a_dt_type);
102 
112  std::unique_ptr<amrex::MultiFab> const& Pe,
113  amrex::MultiFab* const& rhofield );
114 
115  // Declare variables to hold hybrid-PIC model parameters
117  int m_substeps = 100;
118 
120  amrex::Real m_elec_temp;
122  amrex::Real m_n0_ref = 1.0;
124  amrex::Real m_gamma = 5.0/3.0;
125 
127  amrex::Real m_n_floor = 1.0;
128 
130  std::string m_eta_expression = "0.0";
131  std::unique_ptr<amrex::Parser> m_resistivity_parser;
133 
134  // Declare multifabs specifically needed for the hybrid-PIC model
139 
140  // Helper functions to retrieve hybrid-PIC multifabs
143 
162 };
163 
171 
173  static amrex::Real get_pressure (amrex::Real const n0,
174  amrex::Real const T0,
175  amrex::Real const gamma,
176  amrex::Real const rho) {
177  return n0 * T0 * pow((rho/PhysConst::q_e)/n0, gamma);
178  }
179 };
180 
181 #endif // WARPX_HYBRIDPICMODEL_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
PatchType
Definition: WarpX.H:73
DtType
Definition: WarpXDtType.H:11
This class contains the parameters needed to evaluate hybrid field solutions (kinetic ions with fluid...
Definition: HybridPICModel.H:30
void ReadParameters()
Definition: HybridPICModel.cpp:20
amrex::GpuArray< int, 3 > Bz_IndexType
Definition: HybridPICModel.H:155
amrex::GpuArray< int, 3 > Bx_IndexType
Definition: HybridPICModel.H:151
amrex::Real m_n0_ref
Definition: HybridPICModel.H:122
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:180
amrex::GpuArray< int, 3 > Ez_IndexType
Definition: HybridPICModel.H:161
amrex::MultiFab * get_pointer_electron_pressure_fp(int lev) const
Definition: HybridPICModel.H:142
amrex::Real m_elec_temp
Definition: HybridPICModel.H:120
void AllocateLevelMFs(int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, const 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:55
amrex::GpuArray< int, 3 > Jx_IndexType
Definition: HybridPICModel.H:145
void ClearLevel(int lev)
Definition: HybridPICModel.cpp:91
amrex::GpuArray< int, 3 > Jz_IndexType
Definition: HybridPICModel.H:149
std::unique_ptr< amrex::Parser > m_resistivity_parser
Definition: HybridPICModel.H:131
HybridPICModel(int nlevs_max)
Definition: HybridPICModel.cpp:14
std::string m_eta_expression
Definition: HybridPICModel.H:130
void AllocateMFs(int nlevs_max)
Definition: HybridPICModel.cpp:47
amrex::Vector< std::unique_ptr< amrex::MultiFab > > electron_pressure_fp
Definition: HybridPICModel.H:138
amrex::ParserExecutor< 1 > m_eta
Definition: HybridPICModel.H:132
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_ampere
Definition: HybridPICModel.H:137
amrex::Real m_gamma
Definition: HybridPICModel.H:124
amrex::Vector< std::unique_ptr< amrex::MultiFab > > rho_fp_temp
Definition: HybridPICModel.H:135
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, const bool include_resistivity_term)
Function to update the E-field using Ohm's law (hybrid-PIC model).
Definition: HybridPICModel.cpp:210
int m_substeps
Definition: HybridPICModel.H:117
amrex::GpuArray< int, 3 > Ex_IndexType
Definition: HybridPICModel.H:157
amrex::Real m_n_floor
Definition: HybridPICModel.H:127
void InitData()
Definition: HybridPICModel.cpp:101
void FillElectronPressureMF(std::unique_ptr< amrex::MultiFab > const &Pe, amrex::MultiFab *const &rhofield)
Fill the electron pressure multifab given the kinetic particle charge density (and assumption of quas...
Definition: HybridPICModel.cpp:298
amrex::MultiFab * get_pointer_current_fp_ampere(int lev, int direction) const
Definition: HybridPICModel.H:141
amrex::Vector< std::array< std::unique_ptr< amrex::MultiFab >, 3 > > current_fp_temp
Definition: HybridPICModel.H:136
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:269
amrex::GpuArray< int, 3 > Jy_IndexType
Definition: HybridPICModel.H:147
amrex::GpuArray< int, 3 > By_IndexType
Definition: HybridPICModel.H:153
amrex::GpuArray< int, 3 > Ey_IndexType
Definition: HybridPICModel.H:159
direction
Definition: AnyFFT.H:75
static constexpr auto q_e
elementary charge [C]
Definition: constant.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > pow(const GpuComplex< T > &a_z, const T &a_y) noexcept
int gamma
boosted frame
Definition: stencil.py:429
This struct contains only static functions to compute the electron pressure using the particle densit...
Definition: HybridPICModel.H:170
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:173