ImpactX
ImpactXParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2022-2023 The Regents of the University of California, through Lawrence
2  * Berkeley National Laboratory (subject to receipt of any required
3  * approvals from the U.S. Dept. of Energy). All rights reserved.
4  *
5  * This file is part of ImpactX.
6  *
7  * Authors: Axel Huebl
8  * License: BSD-3-Clause-LBNL
9  */
10 #ifndef IMPACTX_PARTICLE_CONTAINER_H
11 #define IMPACTX_PARTICLE_CONTAINER_H
12 
13 #include "ReferenceParticle.H"
15 
16 #include <AMReX_AmrCoreFwd.H>
17 #include <AMReX_BaseFwd.H>
18 #include <AMReX_MultiFab.H>
19 #include <AMReX_ParIter.H>
20 #include <AMReX_Particles.H>
21 
22 #include <AMReX_IntVect.H>
23 #include <AMReX_Vector.H>
24 
25 #include <optional>
26 #include <tuple>
27 #include <unordered_map>
28 
29 
30 namespace impactx
31 {
32  enum class CoordSystem
33  {
34  s,
35  t
36  };
37 
45  struct RealAoS
46  {
47  enum
48  {
49  x,
50  y,
51  t,
52  nattribs
53  };
54 
55  // at fixed t, the third component represents the position z
56  enum {
57  z = t
58  };
59 
61  static constexpr auto names_s = { "position_x", "position_y", "position_t" };
63  static constexpr auto names_t = { "position_x", "position_y", "position_z" };
64  static_assert(names_s.size() == nattribs);
65  static_assert(names_t.size() == nattribs);
66  };
67 
71  struct RealSoA
72  {
73  enum
74  {
75  px,
76  py,
77  pt,
78  qm,
79  w,
80  nattribs
81  };
82 
83  // at fixed t, the third component represents the momentum in z
84  enum {
85  pz = pt
86  };
87 
89  static constexpr auto names_s = { "momentum_x", "momentum_y", "momentum_t", "qm", "weighting" };
91  static constexpr auto names_t = { "momentum_x", "momentum_y", "momentum_z", "qm", "weighting" };
92  static_assert(names_s.size() == nattribs);
93  static_assert(names_t.size() == nattribs);
94  };
95 
99  struct IntSoA
100  {
101  enum
102  {
103  nattribs
104  };
105  };
106 
112  class ParIter
113  : public amrex::ParIter<0, 0, RealSoA::nattribs, IntSoA::nattribs>
114  {
115  public:
117 
118  ParIter (ContainerType& pc, int level);
119 
120  ParIter (ContainerType& pc, int level, amrex::MFItInfo& info);
121  };
122 
129  : public amrex::ParConstIter<0, 0, RealSoA::nattribs, IntSoA::nattribs>
130  {
131  public:
133 
134  ParConstIter (ContainerType& pc, int level);
135 
136  ParConstIter (ContainerType& pc, int level, amrex::MFItInfo& info);
137  };
138 
144  : public amrex::ParticleContainer<0, 0, RealSoA::nattribs, IntSoA::nattribs>
145  {
146  public:
149 
152 
155 
157  virtual ~ImpactXParticleContainer() = default;
158 
175  void
176  AddNParticles (
183  amrex::ParticleReal qm,
184  amrex::ParticleReal bchchg
185  );
186 
191  void
193 
196 
201  void
202  SetRefParticle (RefPart const & refpart);
203 
208  RefPart &
209  GetRefParticle ();
210 
215  RefPart const &
216  GetRefParticle () const;
217 
221  void SetRefParticleEdge ();
222 
225  int
226  GetParticleShape () const { return m_particle_shape.value(); }
227 
234  void SetParticleShape ();
235 
244  void SetParticleShape (int order);
245 
250  std::tuple<
251  amrex::ParticleReal, amrex::ParticleReal,
252  amrex::ParticleReal, amrex::ParticleReal,
253  amrex::ParticleReal, amrex::ParticleReal>
255 
260  std::tuple<
261  amrex::ParticleReal, amrex::ParticleReal,
262  amrex::ParticleReal, amrex::ParticleReal,
263  amrex::ParticleReal, amrex::ParticleReal>
265 
275  void
276  DepositCharge (std::unordered_map<int, amrex::MultiFab> & rho,
277  amrex::Vector<amrex::IntVect> const & ref_ratio);
278 
280  std::vector<std::string>
281  RealAoS_names () const;
282 
284  std::vector<std::string>
285  RealSoA_names () const;
286 
289  GetCoordSystem () const;
290 
295  void
296  SetCoordSystem (CoordSystem coord_system);
297 
298  private:
299 
302 
304  std::optional<int> m_particle_shape;
305 
308 
311 
312  }; // ImpactXParticleContainer
313 
315  std::vector<std::string>
317 
323  std::vector<std::string>
324  get_RealSoA_names (int num_real_comps);
325 
326 } // namespace impactx
327 
328 #endif // IMPACTX_PARTICLE_CONTAINER_H
Definition: ImpactXParticleContainer.H:145
virtual ~ImpactXParticleContainer()=default
Destruct a particle container.
int GetParticleShape() const
Definition: ImpactXParticleContainer.H:226
void SetLostParticleContainer(ImpactXParticleContainer *lost_pc)
Definition: ImpactXParticleContainer.cpp:64
void DepositCharge(std::unordered_map< int, amrex::MultiFab > &rho, amrex::Vector< amrex::IntVect > const &ref_ratio)
Definition: ChargeDeposition.cpp:27
void AddNParticles(amrex::Gpu::DeviceVector< amrex::ParticleReal > const &x, amrex::Gpu::DeviceVector< amrex::ParticleReal > const &y, amrex::Gpu::DeviceVector< amrex::ParticleReal > const &t, amrex::Gpu::DeviceVector< amrex::ParticleReal > const &px, amrex::Gpu::DeviceVector< amrex::ParticleReal > const &py, amrex::Gpu::DeviceVector< amrex::ParticleReal > const &pt, amrex::ParticleReal qm, amrex::ParticleReal bchchg)
Definition: ImpactXParticleContainer.cpp:106
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MinAndMaxPositions()
Definition: ImpactXParticleContainer.cpp:225
void SetRefParticle(RefPart const &refpart)
Definition: ImpactXParticleContainer.cpp:198
std::vector< std::string > RealAoS_names() const
Definition: ImpactXParticleContainer.cpp:244
std::vector< std::string > RealSoA_names() const
Definition: ImpactXParticleContainer.cpp:250
CoordSystem GetCoordSystem() const
Definition: ImpactXParticleContainer.cpp:256
void SetRefParticleEdge()
Definition: ImpactXParticleContainer.cpp:216
ImpactXParticleContainer * m_particles_lost
a non-owning reference to lost particles, i.e., due to apertures
Definition: ImpactXParticleContainer.H:307
ImpactXParticleContainer(initialization::AmrCoreData *amr_core)
Construct a new particle container.
Definition: ImpactXParticleContainer.cpp:57
void SetParticleShape()
Definition: ImpactXParticleContainer.cpp:95
void SetCoordSystem(CoordSystem coord_system)
Definition: ImpactXParticleContainer.cpp:262
ImpactXParticleContainer * GetLostParticleContainer()
Definition: ImpactXParticleContainer.cpp:70
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MeanAndStdPositions()
Definition: ImpactXParticleContainer.cpp:235
RefPart m_refpart
the reference particle for the beam in the particle container
Definition: ImpactXParticleContainer.H:301
std::optional< int > m_particle_shape
the particle shape
Definition: ImpactXParticleContainer.H:304
CoordSystem m_coordsystem
the current coordinate system of particles in this container
Definition: ImpactXParticleContainer.H:310
RefPart & GetRefParticle()
Definition: ImpactXParticleContainer.cpp:204
Definition: ImpactXParticleContainer.H:130
ParConstIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:49
Definition: ImpactXParticleContainer.H:114
ParIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:41
Definition: AmrCoreData.H:42
Definition: ImpactX.cpp:35
std::vector< std::string > get_RealSoA_names(int num_real_comps)
Definition: ImpactXParticleContainer.cpp:279
std::vector< std::string > get_RealAoS_names()
Definition: ImpactXParticleContainer.cpp:268
CoordSystem
Definition: ImpactXParticleContainer.H:33
@ s
fixed s as the independent variable
@ t
fixed t as the independent variable
Definition: ImpactXParticleContainer.H:100
@ nattribs
the number of particles above (always last)
Definition: ImpactXParticleContainer.H:103
Definition: ImpactXParticleContainer.H:46
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:52
@ x
position in x [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:49
@ y
position in y [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:50
@ t
c * time-of-flight [m] (at fixed s)
Definition: ImpactXParticleContainer.H:51
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:63
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:61
@ z
position in z [m] (at fixed t)
Definition: ImpactXParticleContainer.H:57
Definition: ImpactXParticleContainer.H:72
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:89
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:91
@ pz
momentum in z, scaled by the magnitude of the reference momentum [unitless] (at fixed t)
Definition: ImpactXParticleContainer.H:85
@ pt
energy deviation, scaled by speed of light * the magnitude of the reference momentum [unitless] (at f...
Definition: ImpactXParticleContainer.H:77
@ w
particle weight, number of real particles represented by this macroparticle [unitless]
Definition: ImpactXParticleContainer.H:79
@ px
momentum in x, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:75
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:80
@ py
momentum in y, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:76
@ qm
charge to mass ratio, in q_e/m_e [q_e/eV]
Definition: ImpactXParticleContainer.H:78
Definition: ReferenceParticle.H:30