10 #ifndef WARPX_HYBRIDPICMODEL_H_
11 #define WARPX_HYBRIDPICMODEL_H_
58 amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3>>
const& edge_lengths
61 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& edge_lengths,
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
79 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& Bfield,
80 std::array< std::unique_ptr<amrex::MultiFab>, 3>
const& edge_lengths,
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);
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);
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);
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,
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,
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,
157 std::unique_ptr<amrex::MultiFab>
const& Pe_field,
247 amrex::Real
const T0,
248 amrex::Real
const gamma,
249 amrex::Real
const rho) {
#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