Hipace
BeamParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2020-2021
2  *
3  * This file is part of HiPACE++.
4  *
5  * Authors: AlexanderSinn, Andrew Myers, Axel Huebl, MaxThevenet
6  * Remi Lehe, Severin Diederichs, atmyers
7  * License: BSD-3-Clause-LBNL
8  */
9 #ifndef HIPACE_BeamParticleContainer_H_
10 #define HIPACE_BeamParticleContainer_H_
11 
14 #include "utils/Parser.H"
16 #include <AMReX_AmrParticles.H>
17 #include <AMReX_Particles.H>
18 #include <AMReX_AmrCore.H>
19 
20 class AdaptiveTimeStep;
21 
23 struct BeamIdx
24 {
25  enum {
26  x=0, y, z, // position
27  w, // weight
28  ux, uy, uz, // momentum
31  };
32  enum {
33  // no extra components stored in MultiBuffer, besides 64bit idcpu
35  // nsubcycles: by how many subcycles was this particle pushed already
36  // nsubcycles is not stored or communicated in MultiBuffer
39  };
40 };
41 
43  enum beam_slice : int { Next=0, This, N };
44 };
45 
50  >,
53  >;
54 
59  >,
62  // use PolymorphicArenaAllocator to either use Pinned or Device memory at runtime
64  >;
65 
68 {
69 public:
71  explicit BeamParticleContainer (std::string name) :
72  m_name(name)
73  {
75  }
76 
78  void ReadParameters ();
79 
84  amrex::Real InitData (const amrex::Geometry& geom);
85 
87  void InitBeamFixedPPC3D ();
88  void InitBeamFixedPPCSlice (const int islice, const int which_beam_slice);
89 
91  void InitBeamFixedWeight3D ();
92  void InitBeamFixedWeightSlice (const int islice, const int which_beam_slice);
93 
97  void InitBeamFixedWeightPDFSlice (int slice, int which_slice);
98 
99 #ifdef HIPACE_USE_OPENPMD
103  amrex::Real InitBeamFromFileHelper (const std::string input_file,
104  const bool coordinates_specified,
105  const amrex::Array<std::string, AMREX_SPACEDIM> file_coordinates_xyz,
106  const amrex::Geometry& geom,
107  amrex::Real n_0,
108  const int num_iteration,
109  const std::string species_name,
110  const bool species_specified);
111 
115  template<typename input_type>
116  amrex::Real InitBeamFromFile (const std::string input_file,
117  const bool coordinates_specified,
118  const amrex::Array<std::string, AMREX_SPACEDIM> file_coordinates_xyz,
119  const amrex::Geometry& geom,
120  amrex::Real n_0,
121  const int num_iteration,
122  const std::string species_name,
123  const bool species_specified);
124 #endif
125 
129  void InSituComputeDiags (int islice);
130 
136  void InSituWriteToFile (int step, amrex::Real time, const amrex::Geometry& geom);
137 
143  void TagByLevel (const int current_N_level, amrex::Vector<amrex::Geometry> const& geom3D,
144  const int which_slice);
145 
151  void ReorderParticles (int beam_slice, int step, amrex::Geometry& slice_geom);
152 
154  amrex::Real GetCharge () const {return m_charge;}
155 
157  amrex::Real GetMass () const {return m_mass;}
158 
159  std::string get_name () const {return m_name;}
160 
161  void shiftBeamSlices () {
164  }
165 
166  BeamTile& getBeamSlice (int which_slice) {
167  return m_slices[(which_slice + m_slice_permutation) % WhichBeamSlice::N];
168  }
169 
170  const BeamTile& getBeamSlice (int which_slice) const {
171  return m_slices[(which_slice + m_slice_permutation) % WhichBeamSlice::N];
172  }
173 
174  int getNumParticles (int which_slice) const {
176  }
177 
178  int getNumParticlesIncludingSlipped (int which_slice) const {
180  }
181 
182  void resize (int which_slice, int num_particles, int num_slipped_particles);
183 
185  return m_init_slice;
186  }
187 
188  void intializeSlice(int slice, int which_slice);
189 
190  uint64_t getTotalNumParticles () const {
191  return m_total_num_particles;
192  }
193 
194  int numRealComponents () const { return BeamIdx::real_nattribs; }
195  int numIntComponents () const { return BeamIdx::int_nattribs; }
196 
197  bool communicateIdCpuComponent () const { return true; }
198  bool communicateRealComponent (int rcomp) const { return rcomp < BeamIdx::real_nattribs_in_buffer; }
199  bool communicateIntComponent (int icomp) const { return icomp < BeamIdx::int_nattribs_in_buffer; }
200 
201 private:
203  std::array<BeamTile, WhichBeamSlice::N> m_slices {};
204  std::array<int, WhichBeamSlice::N> m_num_particles_without_slipped {};
205  std::array<int, WhichBeamSlice::N> m_num_particles_with_slipped {};
208  uint64_t m_total_num_particles = 0;
209 public:
210  amrex::Real m_charge;
211  amrex::Real m_mass;
212  bool m_do_z_push {true};
213  int m_n_subcycles {10};
214  bool m_do_radiation_reaction {false};
216  bool m_do_salame = false;
218  bool m_do_reset_id_init {false};
219  bool m_initialize_on_cpu {false};
224  bool m_use_external_fields = false;
230  bool m_do_spin_tracking = false;
231 private:
232  std::string m_name;
234  std::string m_injection_type;
235  uint64_t m_id64 = 1;
237  amrex::Real m_zmin = -std::numeric_limits<amrex::Real>::infinity();
239  amrex::Real m_zmax = std::numeric_limits<amrex::Real>::infinity();
240  amrex::Real m_radius {std::numeric_limits<amrex::Real>::infinity()};
242  amrex::Real m_insitu_radius {std::numeric_limits<amrex::Real>::infinity()};
248 
249  // fixed_ppc:
250 
251  amrex::IntVect m_ppc {1, 1, 1};
253  amrex::Real m_min_density {0.};
258 
259  // fixed_weight:
260 
261  bool m_can_profile = false;
268  /* Average y position of the fixed-weight beam depending on z */
270  /* Average z position of the fixed-weight beam depending on z */
271  amrex::Real m_pos_mean_z = 0;
275  amrex::Real m_z_foc {0.};
276  amrex::Real m_duz_per_uz0_dzeta {0.};
277  amrex::Long m_num_particles;
278  amrex::Real m_total_charge;
279  amrex::Real m_density;
280  bool m_do_symmetrize {0};
283 
284  // fixed_weight_pdf:
285 
287  int m_pdf_ref_ratio = 4;
288  amrex::Real m_total_weight = 0;
298 
299  // from_file:
300 
302  amrex::Real m_plasma_density = 0;
303  std::string m_input_file;
306  int m_num_iteration {0};
307  std::string m_species_name;
309  // insitu:
310 
311  int m_nslices;
313  static constexpr int m_insitu_nrp = 22;
315  static constexpr int m_insitu_nip = 1;
325  std::string m_insitu_file_prefix = "diags/insitu";
326 
327  // to estimate min uz
329 };
330 
331 #endif
class handling the adaptive time step
Definition: AdaptiveTimeStep.H:18
Container for particles of 1 beam species.
Definition: BeamParticleContainer.H:68
bool m_do_symmetrize
Definition: BeamParticleContainer.H:280
std::string get_name() const
Definition: BeamParticleContainer.H:159
int numIntComponents() const
Definition: BeamParticleContainer.H:195
amrex::Parser m_pos_mean_x_parser
Definition: BeamParticleContainer.H:263
amrex::IntVect m_reorder_idx_type
Definition: BeamParticleContainer.H:247
void InitBeamFixedPPC3D()
Definition: BeamParticleContainerInit.cpp:103
std::array< BeamTile, WhichBeamSlice::N > m_slices
Definition: BeamParticleContainer.H:203
void TagByLevel(const int current_N_level, amrex::Vector< amrex::Geometry > const &geom3D, const int which_slice)
Store the finest level of every beam particle on which_slice in the cpu() attribute.
Definition: BeamParticleContainer.cpp:301
int m_reorder_period
Definition: BeamParticleContainer.H:245
std::array< int, WhichBeamSlice::N > m_num_particles_without_slipped
Definition: BeamParticleContainer.H:204
amrex::Real m_density
Definition: BeamParticleContainer.H:279
amrex::ParserExecutor< 1 > m_pos_mean_y_func
Definition: BeamParticleContainer.H:269
amrex::RealVect m_position_std
Definition: BeamParticleContainer.H:273
bool communicateRealComponent(int rcomp) const
Definition: BeamParticleContainer.H:198
amrex::RealVect m_position_mean
Definition: BeamParticleContainer.H:252
amrex::Real m_plasma_density
Definition: BeamParticleContainer.H:302
amrex::Array< std::string, AMREX_SPACEDIM > m_file_coordinates_xyz
Definition: BeamParticleContainer.H:305
amrex::Array< amrex::ParserExecutor< 1 >, 6 > m_pdf_u_func
Definition: BeamParticleContainer.H:295
amrex::Real m_radius
Definition: BeamParticleContainer.H:240
amrex::Real m_total_weight
Definition: BeamParticleContainer.H:288
const BeamTile & getBeamSlice(int which_slice) const
Definition: BeamParticleContainer.H:170
amrex::ParserExecutor< 1 > m_pdf_func
Definition: BeamParticleContainer.H:289
void ReadParameters()
Definition: BeamParticleContainer.cpp:42
bool communicateIdCpuComponent() const
Definition: BeamParticleContainer.H:197
amrex::Parser m_density_parser
Definition: BeamParticleContainer.H:257
BeamTileInit & getBeamInitSlice()
Definition: BeamParticleContainer.H:184
amrex::Vector< amrex::Real > m_insitu_rdata
Definition: BeamParticleContainer.H:317
amrex::Vector< unsigned int > m_num_particles_slice
Definition: BeamParticleContainer.H:291
void InitBeamFixedWeightSlice(const int islice, const int which_beam_slice)
Definition: BeamParticleContainerInit.cpp:364
bool m_initialize_on_cpu
Definition: BeamParticleContainer.H:219
std::string m_input_file
Definition: BeamParticleContainer.H:303
int m_pdf_ref_ratio
Definition: BeamParticleContainer.H:287
uint64_t m_total_num_particles
Definition: BeamParticleContainer.H:208
std::string m_species_name
Definition: BeamParticleContainer.H:307
amrex::Array< amrex::ParserExecutor< 1 >, 4 > m_pdf_pos_func
Definition: BeamParticleContainer.H:293
int m_num_iteration
Definition: BeamParticleContainer.H:306
GetInitialMomentum m_get_momentum
Definition: BeamParticleContainer.H:243
amrex::Real m_zmin
Definition: BeamParticleContainer.H:237
friend AdaptiveTimeStep
Definition: BeamParticleContainer.H:328
int m_insitu_period
Definition: BeamParticleContainer.H:222
amrex::ParserExecutor< 1 > m_pos_mean_x_func
Definition: BeamParticleContainer.H:265
bool m_use_external_fields
Definition: BeamParticleContainer.H:224
uint64_t getTotalNumParticles() const
Definition: BeamParticleContainer.H:190
static constexpr int m_insitu_nip
Definition: BeamParticleContainer.H:315
amrex::Real m_z_foc
Definition: BeamParticleContainer.H:275
void InSituComputeDiags(int islice)
Definition: BeamParticleContainer.cpp:444
static constexpr int m_insitu_nrp
Definition: BeamParticleContainer.H:313
void ReorderParticles(int beam_slice, int step, amrex::Geometry &slice_geom)
Reorder beam particles to speed-up push and current deposition.
Definition: BeamParticleContainer.cpp:400
amrex::Real m_pos_mean_z
Definition: BeamParticleContainer.H:271
void InitBeamFixedWeightPDF3D()
Definition: BeamParticleContainerInit.cpp:458
amrex::GpuArray< amrex::ParserExecutor< 4 >, 6 > m_external_fields
Definition: BeamParticleContainer.H:226
void InitBeamFixedPPCSlice(const int islice, const int which_beam_slice)
Definition: BeamParticleContainerInit.cpp:182
amrex::Vector< amrex::Parser > m_pdf_parsers
Definition: BeamParticleContainer.H:297
amrex::Real m_min_density
Definition: BeamParticleContainer.H:253
bool communicateIntComponent(int icomp) const
Definition: BeamParticleContainer.H:199
uint64_t m_id64
Definition: BeamParticleContainer.H:235
std::array< int, WhichBeamSlice::N > m_num_particles_with_slipped
Definition: BeamParticleContainer.H:205
amrex::Real m_duz_per_uz0_dzeta
Definition: BeamParticleContainer.H:276
int getNumParticles(int which_slice) const
Definition: BeamParticleContainer.H:174
void intializeSlice(int slice, int which_slice)
Definition: BeamParticleContainer.cpp:350
void InitBeamFixedWeightPDFSlice(int slice, int which_slice)
Definition: BeamParticleContainerInit.cpp:563
amrex::Real m_mass
Definition: BeamParticleContainer.H:211
bool m_do_reset_id_init
Definition: BeamParticleContainer.H:218
std::string m_name
Definition: BeamParticleContainer.H:232
amrex::Parser m_pos_mean_y_parser
Definition: BeamParticleContainer.H:267
bool m_peak_density_is_specified
Definition: BeamParticleContainer.H:286
bool m_do_salame
Definition: BeamParticleContainer.H:216
amrex::Vector< int > m_insitu_sum_idata
Definition: BeamParticleContainer.H:323
amrex::IntVect m_random_ppc
Definition: BeamParticleContainer.H:254
bool m_do_spin_tracking
Definition: BeamParticleContainer.H:230
amrex::Long m_num_particles
Definition: BeamParticleContainer.H:277
std::string m_insitu_file_prefix
Definition: BeamParticleContainer.H:325
amrex::Real m_charge
Definition: BeamParticleContainer.H:210
amrex::PODVector< amrex::Real, amrex::PolymorphicArenaAllocator< amrex::Real > > m_z_array
Definition: BeamParticleContainer.H:282
BeamParticleContainer(std::string name)
Definition: BeamParticleContainer.H:71
int m_n_subcycles
Definition: BeamParticleContainer.H:213
amrex::Real GetCharge() const
Definition: BeamParticleContainer.H:154
bool m_can_profile
Definition: BeamParticleContainer.H:261
int m_slice_permutation
Definition: BeamParticleContainer.H:202
int numRealComponents() const
Definition: BeamParticleContainer.H:194
void shiftBeamSlices()
Definition: BeamParticleContainer.H:161
BeamTile & getBeamSlice(int which_slice)
Definition: BeamParticleContainer.H:166
amrex::Real m_insitu_radius
Definition: BeamParticleContainer.H:242
bool m_do_radiation_reaction
Definition: BeamParticleContainer.H:214
amrex::Vector< amrex::Real > m_insitu_sum_rdata
Definition: BeamParticleContainer.H:321
amrex::Array< amrex::Parser, 6 > m_external_fields_parser
Definition: BeamParticleContainer.H:228
void InitBeamFixedWeight3D()
Definition: BeamParticleContainerInit.cpp:330
GetInitialDensity m_get_density
Definition: BeamParticleContainer.H:255
amrex::Real InitData(const amrex::Geometry &geom)
Allocate beam particle data and initialize particles with requested beam profile.
Definition: BeamParticleContainer.cpp:109
int m_nslices
Definition: BeamParticleContainer.H:311
void resize(int which_slice, int num_particles, int num_slipped_particles)
Definition: BeamParticleContainer.cpp:389
amrex::Real m_zmax
Definition: BeamParticleContainer.H:239
amrex::Real m_total_charge
Definition: BeamParticleContainer.H:278
void InSituWriteToFile(int step, amrex::Real time, const amrex::Geometry &geom)
Definition: BeamParticleContainer.cpp:527
bool m_do_z_push
Definition: BeamParticleContainer.H:212
std::string m_injection_type
Definition: BeamParticleContainer.H:234
BoxSorter m_init_sorter
Definition: BeamParticleContainer.H:207
BeamTileInit m_init_slice
Definition: BeamParticleContainer.H:206
amrex::Vector< int > m_insitu_idata
Definition: BeamParticleContainer.H:319
int getNumParticlesIncludingSlipped(int which_slice) const
Definition: BeamParticleContainer.H:178
amrex::IntVect m_ppc
Definition: BeamParticleContainer.H:251
amrex::Real GetMass() const
Definition: BeamParticleContainer.H:157
Definition: BoxSort.H:19
slice
Definition: MultiLaser.H:73
std::array< T, N > Array
Map names and indices for beam particles attributes (SoA data)
Definition: BeamParticleContainer.H:24
@ int_nattribs
Definition: BeamParticleContainer.H:38
@ nsubcycles
Definition: BeamParticleContainer.H:37
@ int_nattribs_in_buffer
Definition: BeamParticleContainer.H:34
@ z
Definition: BeamParticleContainer.H:26
@ ux
Definition: BeamParticleContainer.H:28
@ real_nattribs_in_buffer
Definition: BeamParticleContainer.H:29
@ uz
Definition: BeamParticleContainer.H:28
@ uy
Definition: BeamParticleContainer.H:28
@ x
Definition: BeamParticleContainer.H:26
@ w
Definition: BeamParticleContainer.H:27
@ y
Definition: BeamParticleContainer.H:26
@ real_nattribs
Definition: BeamParticleContainer.H:30
Functor gets the initial density for beam particles for a given position.
Definition: GetInitialDensity.H:22
Functor gets the initial momentum for beam particles.
Definition: GetInitialMomentum.H:22
Definition: BeamParticleContainer.H:42
beam_slice
Definition: BeamParticleContainer.H:43
@ This
Definition: BeamParticleContainer.H:43
@ Next
Definition: BeamParticleContainer.H:43
@ N
Definition: BeamParticleContainer.H:43