WarpX
Loading...
Searching...
No Matches
HybridPICModel.H
Go to the documentation of this file.
1/* Copyright 2023-2024 The WarpX Community
2 *
3 * This file is part of WarpX.
4 *
5 * Authors: Roelof Groenewald (TAE Technologies)
6 * S. Eric Clark (Helion Energy)
7 *
8 * License: BSD-3-Clause-LBNL
9 */
10
11#ifndef WARPX_HYBRIDPICMODEL_H_
12#define WARPX_HYBRIDPICMODEL_H_
13
14#include "HybridPICModel_fwd.H"
15
16#include "Fields.H"
17
20
23#include "Utils/WarpXConst.H"
24
28
29#include <AMReX_Array.H>
30#include <AMReX_REAL.H>
31#include <AMReX_BoxArray.H>
32#include <AMReX_IntVect.H>
34
35#include <optional>
36
42{
43public:
45
47 void ReadParameters ();
48
50 void AllocateLevelMFs (
52 int lev,
53 const amrex::BoxArray& ba,
55 int ncomps,
56 const amrex::IntVect& ngJ,
57 const amrex::IntVect& ngRho,
58 const amrex::IntVect& ngEB,
59 const amrex::IntVect& jx_nodal_flag,
60 const amrex::IntVect& jy_nodal_flag,
61 const amrex::IntVect& jz_nodal_flag,
62 const amrex::IntVect& rho_nodal_flag,
63 const amrex::IntVect& Ex_nodal_flag,
64 const amrex::IntVect& Ey_nodal_flag,
65 const amrex::IntVect& Ez_nodal_flag,
66 const amrex::IntVect& Bx_nodal_flag,
67 const amrex::IntVect& By_nodal_flag,
68 const amrex::IntVect& Bz_nodal_flag
69 ) const;
70
72
79 void GetCurrentExternal ();
80
92 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E
93 ) const;
95 ablastr::fields::VectorField const& Bfield,
96 std::array< std::unique_ptr<amrex::iMultiFab>,3 >& eb_update_E,
97 int lev
98 ) const;
99
104 void HybridPICSolveE (
109 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E,
110 bool solve_for_Faraday) const;
111
112 void HybridPICSolveE (
113 ablastr::fields::VectorField const& Efield,
114 ablastr::fields::VectorField const& Jfield,
115 ablastr::fields::VectorField const& Bfield,
116 amrex::MultiFab const& rhofield,
117 std::array< std::unique_ptr<amrex::iMultiFab>,3 >& eb_update_E,
118 int lev, bool solve_for_Faraday) const;
119
120 void HybridPICSolveE (
121 ablastr::fields::VectorField const& Efield,
122 ablastr::fields::VectorField const& Jfield,
123 ablastr::fields::VectorField const& Bfield,
124 amrex::MultiFab const& rhofield,
125 std::array< std::unique_ptr<amrex::iMultiFab>,3 >& eb_update_E,
126 int lev, PatchType patch_type, bool solve_for_Faraday) const;
127
128 void BfieldEvolve (
133 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E,
134 int step, amrex::Real dt_half, SubcyclingHalf subcycling_half,
135 amrex::IntVect ng, std::optional<bool> nodal_sync);
136
137 void BfieldEvolve (
142 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E,
143 int step, amrex::Real dt_half, int lev, SubcyclingHalf subcycling_half,
144 amrex::IntVect ng, std::optional<bool> nodal_sync);
145
146 void BfieldEvolveRK4 (
151 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E,
152 std::array<amrex::MultiFab, 3>& B_old,
153 amrex::Real dt, int lev, SubcyclingHalf subcycling_half,
154 amrex::IntVect ng, std::optional<bool> nodal_sync);
155
161 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E,
162 std::array<amrex::MultiFab, 3>& B_old,
163 amrex::Real dt, int lev, SubcyclingHalf subcycling_half,
164 amrex::IntVect ng, std::optional<bool> nodal_sync);
165
166 void FieldPush (
171 amrex::Vector<std::array< std::unique_ptr<amrex::iMultiFab>,3 > >& eb_update_E,
172 amrex::Real dt, SubcyclingHalf subcycling_half,
173 amrex::IntVect ng, std::optional<bool> nodal_sync);
174
180 void CalculateElectronPressure () const;
181 void CalculateElectronPressure (int lev) const;
182
192 amrex::MultiFab& Pe_field,
193 amrex::MultiFab const& rho_field ) const;
194
196 [[nodiscard]] bool DoRKF45(int step) const { return m_rkf45_intervals.contains(step); }
197
198 // Declare variables to hold hybrid-PIC model parameters
201 int m_substeps = 10;
202
215
217
224
227
229 std::string m_eta_expression = "0.0";
230 std::unique_ptr<amrex::Parser> m_resistivity_parser;
233
235 std::string m_eta_h_expression = "0.0";
236 std::unique_ptr<amrex::Parser> m_hyper_resistivity_parser;
240
242 std::string m_Jx_ext_grid_function = "0.0";
243 std::string m_Jy_ext_grid_function = "0.0";
244 std::string m_Jz_ext_grid_function = "0.0";
245 std::array< std::unique_ptr<amrex::Parser>, 3> m_J_external_parser;
246 std::array< amrex::ParserExecutor<4>, 3> m_J_external;
249
252 std::unique_ptr<ExternalVectorPotential> m_external_vector_potential;
253
272};
273
281
284 amrex::Real const T0,
285 amrex::Real const gamma,
286 amrex::Real const rho) {
287 return n0 * T0 * std::pow((rho/PhysConst::q_e)/n0, gamma);
288 }
289};
290
291#endif // WARPX_HYBRIDPICMODEL_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
SubcyclingHalf
Subcycling half selector.
Definition WarpXAlgorithmSelection.H:165
amrex::ParserExecutor< 2 > m_eta_h
Definition HybridPICModel.H:237
void ReadParameters()
Definition HybridPICModel.cpp:31
amrex::GpuArray< int, 3 > Bz_IndexType
Definition HybridPICModel.H:265
amrex::GpuArray< int, 3 > Bx_IndexType
Definition HybridPICModel.H:261
ablastr::utils::text::IntervalsParser m_rkf45_intervals
Definition HybridPICModel.H:204
amrex::Real m_n0_ref
Definition HybridPICModel.H:221
std::string m_Jz_ext_grid_function
Definition HybridPICModel.H:244
void BfieldEvolveRK4(ablastr::fields::MultiLevelVectorField const &Bfield, ablastr::fields::MultiLevelVectorField const &Efield, ablastr::fields::MultiLevelVectorField const &Jfield, ablastr::fields::MultiLevelScalarField const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > &eb_update_E, std::array< amrex::MultiFab, 3 > &B_old, amrex::Real dt, int lev, SubcyclingHalf subcycling_half, amrex::IntVect ng, std::optional< bool > nodal_sync)
Definition HybridPICModel.cpp:608
amrex::GpuArray< int, 3 > Ez_IndexType
Definition HybridPICModel.H:271
bool m_external_current_has_time_dependence
Definition HybridPICModel.H:248
amrex::Real m_substep_safety
Definition HybridPICModel.H:210
amrex::ParserExecutor< 3 > m_eta
Definition HybridPICModel.H:231
void GetCurrentExternal()
Function to evaluate the external current expressions and populate the external current multifab....
Definition HybridPICModel.cpp:294
std::array< amrex::ParserExecutor< 4 >, 3 > m_J_external
Definition HybridPICModel.H:246
void BfieldEvolve(ablastr::fields::MultiLevelVectorField const &Bfield, ablastr::fields::MultiLevelVectorField const &Efield, ablastr::fields::MultiLevelVectorField const &Jfield, ablastr::fields::MultiLevelScalarField const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > &eb_update_E, int step, amrex::Real dt_half, SubcyclingHalf subcycling_half, amrex::IntVect ng, std::optional< bool > nodal_sync)
Definition HybridPICModel.cpp:470
amrex::Real m_elec_temp
Definition HybridPICModel.H:219
HybridPICModel()
Definition HybridPICModel.cpp:26
std::unique_ptr< ExternalVectorPotential > m_external_vector_potential
Definition HybridPICModel.H:252
bool DoRKF45(int step) const
Definition HybridPICModel.H:196
void InitData(const ablastr::fields::MultiFabRegister &fields)
Definition HybridPICModel.cpp:187
amrex::GpuArray< int, 3 > Jx_IndexType
Definition HybridPICModel.H:255
bool m_add_external_fields
Definition HybridPICModel.H:251
amrex::GpuArray< int, 3 > Jz_IndexType
Definition HybridPICModel.H:259
std::string m_Jy_ext_grid_function
Definition HybridPICModel.H:243
std::unique_ptr< amrex::Parser > m_hyper_resistivity_parser
Definition HybridPICModel.H:236
bool m_hyper_resistivity_has_B_dependence
Definition HybridPICModel.H:239
std::unique_ptr< amrex::Parser > m_resistivity_parser
Definition HybridPICModel.H:230
std::string m_eta_expression
Definition HybridPICModel.H:229
void AllocateLevelMFs(ablastr::fields::MultiFabRegister &fields, int lev, const amrex::BoxArray &ba, const amrex::DistributionMapping &dm, int ncomps, const amrex::IntVect &ngJ, const amrex::IntVect &ngRho, const amrex::IntVect &ngEB, const amrex::IntVect &jx_nodal_flag, const amrex::IntVect &jy_nodal_flag, const amrex::IntVect &jz_nodal_flag, const amrex::IntVect &rho_nodal_flag, const amrex::IntVect &Ex_nodal_flag, const amrex::IntVect &Ey_nodal_flag, const amrex::IntVect &Ez_nodal_flag, const amrex::IntVect &Bx_nodal_flag, const amrex::IntVect &By_nodal_flag, const amrex::IntVect &Bz_nodal_flag) const
Definition HybridPICModel.cpp:101
bool m_holmstrom_vacuum_region
Definition HybridPICModel.H:216
void FillElectronPressureMF(amrex::MultiFab &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:440
amrex::Real m_substep_atol
Definition HybridPICModel.H:208
amrex::Real m_gamma
Definition HybridPICModel.H:223
std::array< std::unique_ptr< amrex::Parser >, 3 > m_J_external_parser
Definition HybridPICModel.H:245
amrex::Real m_substep_max_growth
Definition HybridPICModel.H:212
std::string m_Jx_ext_grid_function
Definition HybridPICModel.H:242
std::string m_eta_h_expression
Definition HybridPICModel.H:235
bool m_include_hyper_resistivity_term
Definition HybridPICModel.H:238
int m_max_substep_attempts
Definition HybridPICModel.H:214
int m_substeps
Definition HybridPICModel.H:201
bool m_resistivity_has_J_dependence
Definition HybridPICModel.H:232
amrex::GpuArray< int, 3 > Ex_IndexType
Definition HybridPICModel.H:267
amrex::Real m_n_floor
Definition HybridPICModel.H:226
void HybridPICSolveE(ablastr::fields::MultiLevelVectorField const &Efield, ablastr::fields::MultiLevelVectorField const &Jfield, ablastr::fields::MultiLevelVectorField const &Bfield, ablastr::fields::MultiLevelScalarField const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > &eb_update_E, bool solve_for_Faraday) const
Function to update the E-field using Ohm's law (hybrid-PIC model).
Definition HybridPICModel.cpp:346
amrex::Real m_substep_rtol
Definition HybridPICModel.H:206
void FieldPush(ablastr::fields::MultiLevelVectorField const &Bfield, ablastr::fields::MultiLevelVectorField const &Efield, ablastr::fields::MultiLevelVectorField const &Jfield, ablastr::fields::MultiLevelScalarField const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > &eb_update_E, amrex::Real dt, SubcyclingHalf subcycling_half, amrex::IntVect ng, std::optional< bool > nodal_sync)
Definition HybridPICModel.cpp:1139
void CalculatePlasmaCurrent(ablastr::fields::MultiLevelVectorField const &Bfield, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > &eb_update_E) const
Function to calculate the total plasma current based on Ampere's law while neglecting displacement cu...
Definition HybridPICModel.cpp:311
bool m_has_external_current
Definition HybridPICModel.H:247
void CalculateElectronPressure() const
Function to calculate the electron pressure using the simulation charge density. Used in the Ohm's la...
Definition HybridPICModel.cpp:410
amrex::GpuArray< int, 3 > Jy_IndexType
Definition HybridPICModel.H:257
amrex::Real BfieldEvolveRKF45(ablastr::fields::MultiLevelVectorField const &Bfield, ablastr::fields::MultiLevelVectorField const &Efield, ablastr::fields::MultiLevelVectorField const &Jfield, ablastr::fields::MultiLevelScalarField const &rhofield, amrex::Vector< std::array< std::unique_ptr< amrex::iMultiFab >, 3 > > &eb_update_E, std::array< amrex::MultiFab, 3 > &B_old, amrex::Real dt, int lev, SubcyclingHalf subcycling_half, amrex::IntVect ng, std::optional< bool > nodal_sync)
Definition HybridPICModel.cpp:779
amrex::GpuArray< int, 3 > By_IndexType
Definition HybridPICModel.H:263
amrex::GpuArray< int, 3 > Ey_IndexType
Definition HybridPICModel.H:269
This class is a parser for multiple slices of the form x,y,z,... where x, y and z are slices of the f...
Definition IntervalsParser.H:105
amrex_real Real
constexpr auto q_e
elementary charge [C]
Definition constant.H:169
Definition EffectivePotentialPoissonSolver.H:63
std::array< amrex::MultiFab *, 3 > VectorField
Definition MultiFabRegister.H:201
amrex::Vector< ScalarField > MultiLevelScalarField
Definition MultiFabRegister.H:210
amrex::Vector< VectorField > MultiLevelVectorField
Definition MultiFabRegister.H:218
PatchType
Definition Enums.H:30
IntVectND< 3 > IntVect
This struct contains only static functions to compute the electron pressure using the particle densit...
Definition HybridPICModel.H:280
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:283
Definition MultiFabRegister.H:272