Hipace
PlasmaParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2020-2022
2  *
3  * This file is part of HiPACE++.
4  *
5  * Authors: AlexanderSinn, Andrew Myers, Axel Huebl, MaxThevenet
6  * Severin Diederichs, atmyers, Angel Ferran Pousa
7  * License: BSD-3-Clause-LBNL
8  */
9 #ifndef HIPACE_PlasmaParticleContainer_H_
10 #define HIPACE_PlasmaParticleContainer_H_
11 
12 #include "fields/Fields.H"
13 #include "utils/Parser.H"
14 #include "utils/GPUUtil.H"
15 #include <AMReX_AmrParticles.H>
16 #include <AMReX_Particles.H>
17 #include <AMReX_AmrCore.H>
18 #include <map>
19 
21 struct PlasmaIdx
22 {
23  enum {
24  x=0, y, // position
25  w, // weight, this will be returned by pos(2)
26  ux, uy, // momentum
27  psi, // pseudo-potential at the particle position. ATTENTION what is stored is actually normalized psi+1
28  x_prev, y_prev, // positions on the last non-temp slice
29 
30  ux_half_step, // momentum half a step behind the current slice for leapfrog pusher
31  uy_half_step, // at the same step for AB5 pusher
32  psi_half_step, // never effected by temp slice
33 #ifdef HIPACE_USE_AB5_PUSH
34  Fx1, Fx2, Fx3, Fx4, Fx5, // AB5 force terms
35  Fy1, Fy2, Fy3, Fy4, Fy5, //
36  Fux1, Fux2, Fux3, Fux4, Fux5, //
37  Fuy1, Fuy2, Fuy3, Fuy4, Fuy5, //
38  Fpsi1, Fpsi2, Fpsi3, Fpsi4, Fpsi5, //
39 #endif
41  };
42  enum {
43  ion_lev, // ionization level
45  };
46 };
47 
50  : public amrex::ParticleContainerPureSoA<PlasmaIdx::real_nattribs, PlasmaIdx::int_nattribs>
51 {
52 public:
54  explicit PlasmaParticleContainer (std::string name) :
55  amrex::ParticleContainerPureSoA<PlasmaIdx::real_nattribs,PlasmaIdx::int_nattribs>(),
56  m_name(name)
57  {
59  }
60 
63  void ReadParameters ();
64 
68  void InitData (const amrex::Geometry& geom);
69 
78  void InitParticles (
79  const amrex::RealVect& a_thermal_momentum_std,
80  const amrex::RealVect& a_thermal_momentum_mean,
81  const amrex::Real a_radius,
82  const amrex::Real a_hollow_core_radius);
83 
90  void InitIonizationModule (const amrex::Geometry& geom, PlasmaParticleContainer* product_pc,
91  const amrex::Real background_density_SI);
92 
100  void IonizationModule (const int lev,
101  const amrex::Geometry& geom,
102  const Fields& fields,
103  const amrex::Real background_density_SI);
104 
108  void ReorderParticles (const int islice);
109 
113  void UpdateDensityFunction (const amrex::Real pos_z);
114 
120  void TagByLevel (const int current_N_level, amrex::Vector<amrex::Geometry> const& geom3D,
121  const bool to_prev=false);
122 
124  amrex::RealVect GetUMean () const {return m_u_mean;}
125 
127  amrex::RealVect GetUStd () const {return m_u_std;}
128 
133  amrex::Real GetCharge () const {return m_charge;}
134 
136  amrex::Real GetMass () const {return m_mass;}
137 
139  const std::string& GetName () const {return m_name;}
140 
144  void InSituComputeDiags (int islice);
150  void InSituWriteToFile (int step, amrex::Real time, const amrex::Geometry& geom);
151 
154  amrex::Real m_min_density {0.};
157  std::map<amrex::Real, std::string> m_density_table;
158  bool m_do_symmetrize = false;
161  amrex::Real m_max_qsa_weighting_factor {35.};
162  amrex::Real m_radius {std::numeric_limits<amrex::Real>::infinity()};
164  amrex::Real m_insitu_radius {std::numeric_limits<amrex::Real>::infinity()};
165  amrex::Real m_hollow_core_radius {0.};
166  bool m_use_fine_patch = false;
174  amrex::Real m_temperature_in_ev {0.};
177  amrex::Real m_mass = 0;
178  amrex::Real m_charge = 0;
179  int m_init_ion_lev = -1;
180  int m_n_subcycles = 1;
181  bool m_can_ionize = false;
182  std::string m_product_name = "";
197 private:
198  std::string m_name;
199  int m_nslices;
201  static constexpr int m_insitu_nrp = 14;
203  static constexpr int m_insitu_nip = 1;
213  std::string m_insitu_file_prefix = "diags/plasma_insitu";
214 };
215 
217 class PlasmaParticleIterator : public amrex::ParIterSoA<PlasmaIdx::real_nattribs,PlasmaIdx::int_nattribs>
218 {
219 public:
222  : amrex::ParIterSoA<PlasmaIdx::real_nattribs,PlasmaIdx::int_nattribs>(pc, 0, DfltMfi) {}
223 };
224 
225 #endif
amrex::MFItInfo DfltMfi
Definition: GPUUtil.H:183
Main class handling all field data structures and operations.
Definition: Fields.H:85
Container for particles of 1 plasma species.
Definition: PlasmaParticleContainer.H:51
amrex::RealVect GetUStd() const
Definition: PlasmaParticleContainer.H:127
amrex::Real m_mass
Definition: PlasmaParticleContainer.H:177
amrex::Gpu::DeviceVector< amrex::Real > m_adk_exp_prefactor
Definition: PlasmaParticleContainer.H:187
amrex::Real m_charge
Definition: PlasmaParticleContainer.H:178
amrex::IntVect m_reorder_idx_type
Definition: PlasmaParticleContainer.H:193
amrex::Array< int, 2 > m_ppc
Definition: PlasmaParticleContainer.H:170
void InSituComputeDiags(int islice)
Definition: PlasmaParticleContainer.cpp:453
amrex::Vector< amrex::Real > m_insitu_rdata
Definition: PlasmaParticleContainer.H:205
amrex::Array< int, 2 > m_ppc_fine
Definition: PlasmaParticleContainer.H:171
amrex::RealVect GetUMean() const
Definition: PlasmaParticleContainer.H:124
amrex::Real m_temperature_in_ev
Definition: PlasmaParticleContainer.H:174
amrex::Real m_min_density
Definition: PlasmaParticleContainer.H:154
PlasmaParticleContainer(std::string name)
Definition: PlasmaParticleContainer.H:54
std::map< amrex::Real, std::string > m_density_table
Definition: PlasmaParticleContainer.H:157
amrex::ParserExecutor< 3 > m_density_func
Definition: PlasmaParticleContainer.H:153
int m_reorder_period
Definition: PlasmaParticleContainer.H:191
void InitParticles(const amrex::RealVect &a_thermal_momentum_std, const amrex::RealVect &a_thermal_momentum_mean, const amrex::Real a_radius, const amrex::Real a_hollow_core_radius)
Definition: PlasmaParticleContainerInit.cpp:19
bool m_do_symmetrize
Definition: PlasmaParticleContainer.H:158
int m_insitu_period
Definition: PlasmaParticleContainer.H:196
amrex::Gpu::DeviceVector< amrex::Real > m_adk_prefactor
Definition: PlasmaParticleContainer.H:185
amrex::Vector< amrex::Real > m_insitu_sum_rdata
Definition: PlasmaParticleContainer.H:209
void InSituWriteToFile(int step, amrex::Real time, const amrex::Geometry &geom)
Definition: PlasmaParticleContainer.cpp:539
bool m_use_fine_patch
Definition: PlasmaParticleContainer.H:166
int m_nslices
Definition: PlasmaParticleContainer.H:199
std::string m_name
Definition: PlasmaParticleContainer.H:198
amrex::Real m_radius
Definition: PlasmaParticleContainer.H:162
bool m_use_density_table
Definition: PlasmaParticleContainer.H:155
std::string m_product_name
Definition: PlasmaParticleContainer.H:182
amrex::Real m_insitu_radius
Definition: PlasmaParticleContainer.H:164
amrex::RealVect m_u_std
Definition: PlasmaParticleContainer.H:173
PlasmaParticleContainer * m_product_pc
Definition: PlasmaParticleContainer.H:183
static constexpr int m_insitu_nip
Definition: PlasmaParticleContainer.H:203
void InitData(const amrex::Geometry &geom)
Definition: PlasmaParticleContainer.cpp:173
bool m_can_ionize
Definition: PlasmaParticleContainer.H:181
void InitIonizationModule(const amrex::Geometry &geom, PlasmaParticleContainer *product_pc, const amrex::Real background_density_SI)
Definition: PlasmaParticleContainerInit.cpp:396
int m_n_subcycles
Definition: PlasmaParticleContainer.H:180
amrex::RealVect m_u_mean
Definition: PlasmaParticleContainer.H:172
int m_init_ion_lev
Definition: PlasmaParticleContainer.H:179
amrex::Vector< int > m_insitu_idata
Definition: PlasmaParticleContainer.H:207
amrex::Vector< int > m_insitu_sum_idata
Definition: PlasmaParticleContainer.H:211
amrex::Real m_hollow_core_radius
Definition: PlasmaParticleContainer.H:165
int m_fine_transition_cells
Definition: PlasmaParticleContainer.H:167
const std::string & GetName() const
Definition: PlasmaParticleContainer.H:139
void TagByLevel(const int current_N_level, amrex::Vector< amrex::Geometry > const &geom3D, const bool to_prev=false)
Store the finest level of every plasma particle in the cpu() attribute.
Definition: PlasmaParticleContainer.cpp:214
amrex::Parser m_parser
Definition: PlasmaParticleContainer.H:152
amrex::Real m_max_qsa_weighting_factor
Definition: PlasmaParticleContainer.H:161
void ReadParameters()
Definition: PlasmaParticleContainer.cpp:28
amrex::Parser m_parser_fine_patch
Definition: PlasmaParticleContainer.H:168
bool m_neutralize_background
Definition: PlasmaParticleContainer.H:176
static constexpr int m_insitu_nrp
Definition: PlasmaParticleContainer.H:201
amrex::Real GetCharge() const
Definition: PlasmaParticleContainer.H:133
void IonizationModule(const int lev, const amrex::Geometry &geom, const Fields &fields, const amrex::Real background_density_SI)
Definition: PlasmaParticleContainer.cpp:270
amrex::ParserExecutor< 2 > m_fine_patch_func
Definition: PlasmaParticleContainer.H:169
std::string m_insitu_file_prefix
Definition: PlasmaParticleContainer.H:213
void UpdateDensityFunction(const amrex::Real pos_z)
Definition: PlasmaParticleContainer.cpp:205
amrex::Gpu::DeviceVector< amrex::Real > m_adk_power
Definition: PlasmaParticleContainer.H:189
amrex::Real GetMass() const
Definition: PlasmaParticleContainer.H:136
void ReorderParticles(const int islice)
Definition: PlasmaParticleContainer.cpp:196
Iterator over boxes in a particle container.
Definition: PlasmaParticleContainer.H:218
PlasmaParticleIterator(ContainerType &pc)
Definition: PlasmaParticleContainer.H:221
ParIter_impl< SoAParticle< T_NArrayReal, T_NArrayInt >, T_NArrayReal, T_NArrayInt, Allocator, CellAssignor > ParIterSoA
ParticleContainer_impl< SoAParticle< T_NArrayReal, T_NArrayInt >, T_NArrayReal, T_NArrayInt, Allocator, CellAssignor > ParticleContainerPureSoA
std::array< T, N > Array
Map names and indices for plasma particles attributes (SoA data)
Definition: PlasmaParticleContainer.H:22
@ int_nattribs
Definition: PlasmaParticleContainer.H:44
@ ion_lev
Definition: PlasmaParticleContainer.H:43
@ y
Definition: PlasmaParticleContainer.H:24
@ x_prev
Definition: PlasmaParticleContainer.H:28
@ ux_half_step
Definition: PlasmaParticleContainer.H:30
@ w
Definition: PlasmaParticleContainer.H:25
@ psi_half_step
Definition: PlasmaParticleContainer.H:32
@ real_nattribs
Definition: PlasmaParticleContainer.H:40
@ uy_half_step
Definition: PlasmaParticleContainer.H:31
@ y_prev
Definition: PlasmaParticleContainer.H:28
@ ux
Definition: PlasmaParticleContainer.H:26
@ x
Definition: PlasmaParticleContainer.H:24
@ psi
Definition: PlasmaParticleContainer.H:27
@ uy
Definition: PlasmaParticleContainer.H:26