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"
14 
15 #include <AMReX_AmrCoreFwd.H>
16 #include <AMReX_BaseFwd.H>
17 #include <AMReX_MultiFab.H>
18 #include <AMReX_ParIter.H>
19 #include <AMReX_Particles.H>
20 
21 #include <AMReX_IntVect.H>
22 #include <AMReX_Vector.H>
23 
24 #include <optional>
25 #include <tuple>
26 #include <unordered_map>
27 
28 
29 namespace impactx
30 {
31  enum class CoordSystem
32  {
33  s,
34  t
35  };
36 
44  struct RealAoS
45  {
46  enum
47  {
48  x,
49  y,
50  t,
51  nattribs
52  };
53 
54  // at fixed t, the third component represents the position z
55  enum {
56  z = t
57  };
58 
60  static constexpr auto names_s = { "position_x", "position_y", "position_t" };
62  static constexpr auto names_t = { "position_x", "position_y", "position_z" };
63  static_assert(names_s.size() == nattribs);
64  static_assert(names_t.size() == nattribs);
65  };
66 
70  struct RealSoA
71  {
72  enum
73  {
74  px,
75  py,
76  pt,
77  qm,
78  w,
79  nattribs
80  };
81 
82  // at fixed t, the third component represents the momentum in z
83  enum {
84  pz = pt
85  };
86 
88  static constexpr auto names_s = { "momentum_x", "momentum_y", "momentum_t", "qm", "weighting" };
90  static constexpr auto names_t = { "momentum_x", "momentum_y", "momentum_z", "qm", "weighting" };
91  static_assert(names_s.size() == nattribs);
92  static_assert(names_t.size() == nattribs);
93  };
94 
98  struct IntSoA
99  {
100  enum
101  {
102  nattribs
103  };
104  };
105 
111  class ParIter
112  : public amrex::ParIter<0, 0, RealSoA::nattribs, IntSoA::nattribs>
113  {
114  public:
116 
117  ParIter (ContainerType& pc, int level);
118 
119  ParIter (ContainerType& pc, int level, amrex::MFItInfo& info);
120  };
121 
128  : public amrex::ParConstIter<0, 0, RealSoA::nattribs, IntSoA::nattribs>
129  {
130  public:
132 
133  ParConstIter (ContainerType& pc, int level);
134 
135  ParConstIter (ContainerType& pc, int level, amrex::MFItInfo& info);
136  };
137 
143  : public amrex::ParticleContainer<0, 0, RealSoA::nattribs, IntSoA::nattribs>
144  {
145  public:
148 
151 
154 
156  virtual ~ImpactXParticleContainer() = default;
157 
174  void
175  AddNParticles (
182  amrex::ParticleReal qm,
183  amrex::ParticleReal bchchg
184  );
185 
190  void
192 
195 
200  void
201  SetRefParticle (RefPart const & refpart);
202 
207  RefPart &
208  GetRefParticle ();
209 
214  RefPart const &
215  GetRefParticle () const;
216 
220  void SetRefParticleEdge ();
221 
224  int
225  GetParticleShape () const { return m_particle_shape.value(); }
226 
233  void SetParticleShape ();
234 
243  void SetParticleShape (int order);
244 
249  std::tuple<
250  amrex::ParticleReal, amrex::ParticleReal,
251  amrex::ParticleReal, amrex::ParticleReal,
252  amrex::ParticleReal, amrex::ParticleReal>
254 
259  std::tuple<
260  amrex::ParticleReal, amrex::ParticleReal,
261  amrex::ParticleReal, amrex::ParticleReal,
262  amrex::ParticleReal, amrex::ParticleReal>
264 
274  void
275  DepositCharge (std::unordered_map<int, amrex::MultiFab> & rho,
276  amrex::Vector<amrex::IntVect> const & ref_ratio);
277 
279  std::vector<std::string>
280  RealAoS_names () const;
281 
283  std::vector<std::string>
284  RealSoA_names () const;
285 
288  GetCoordSystem () const;
289 
294  void
295  SetCoordSystem (CoordSystem coord_system);
296 
297  private:
298 
301 
303  std::optional<int> m_particle_shape;
304 
307 
310 
311  }; // ImpactXParticleContainer
312 
314  std::vector<std::string>
316 
322  std::vector<std::string>
323  get_RealSoA_names (int num_real_comps);
324 
325 } // namespace impactx
326 
327 #endif // IMPACTX_PARTICLE_CONTAINER_H
Definition: ImpactXParticleContainer.H:144
virtual ~ImpactXParticleContainer()=default
Destruct a particle container.
int GetParticleShape() const
Definition: ImpactXParticleContainer.H:225
void SetLostParticleContainer(ImpactXParticleContainer *lost_pc)
Definition: ImpactXParticleContainer.cpp:61
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:103
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MinAndMaxPositions()
Definition: ImpactXParticleContainer.cpp:210
void SetRefParticle(RefPart const &refpart)
Definition: ImpactXParticleContainer.cpp:183
std::vector< std::string > RealAoS_names() const
Definition: ImpactXParticleContainer.cpp:229
std::vector< std::string > RealSoA_names() const
Definition: ImpactXParticleContainer.cpp:235
ImpactXParticleContainer(amrex::AmrCore *amr_core)
Construct a new particle container.
Definition: ImpactXParticleContainer.cpp:54
CoordSystem GetCoordSystem() const
Definition: ImpactXParticleContainer.cpp:241
void SetRefParticleEdge()
Definition: ImpactXParticleContainer.cpp:201
ImpactXParticleContainer * m_particles_lost
a non-owning reference to lost particles, i.e., due to apertures
Definition: ImpactXParticleContainer.H:306
void SetParticleShape()
Definition: ImpactXParticleContainer.cpp:92
void SetCoordSystem(CoordSystem coord_system)
Definition: ImpactXParticleContainer.cpp:247
ImpactXParticleContainer * GetLostParticleContainer()
Definition: ImpactXParticleContainer.cpp:67
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MeanAndStdPositions()
Definition: ImpactXParticleContainer.cpp:220
RefPart m_refpart
the reference particle for the beam in the particle container
Definition: ImpactXParticleContainer.H:300
std::optional< int > m_particle_shape
the particle shape
Definition: ImpactXParticleContainer.H:303
CoordSystem m_coordsystem
the current coordinate system of particles in this container
Definition: ImpactXParticleContainer.H:309
RefPart & GetRefParticle()
Definition: ImpactXParticleContainer.cpp:189
Definition: ImpactXParticleContainer.H:129
ParConstIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:46
Definition: ImpactXParticleContainer.H:113
ParIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:38
Definition: ImpactX.cpp:36
std::vector< std::string > get_RealSoA_names(int num_real_comps)
Definition: ImpactXParticleContainer.cpp:264
std::vector< std::string > get_RealAoS_names()
Definition: ImpactXParticleContainer.cpp:253
CoordSystem
Definition: ImpactXParticleContainer.H:32
@ s
fixed s as the independent variable
@ t
fixed t as the independent variable
Definition: ImpactXParticleContainer.H:99
@ nattribs
the number of particles above (always last)
Definition: ImpactXParticleContainer.H:102
Definition: ImpactXParticleContainer.H:45
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:51
@ x
position in x [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:48
@ y
position in y [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:49
@ t
c * time-of-flight [m] (at fixed s)
Definition: ImpactXParticleContainer.H:50
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:62
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:60
@ z
position in z [m] (at fixed t)
Definition: ImpactXParticleContainer.H:56
Definition: ImpactXParticleContainer.H:71
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:88
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:90
@ pz
momentum in z, scaled by the magnitude of the reference momentum [unitless] (at fixed t)
Definition: ImpactXParticleContainer.H:84
@ pt
energy deviation, scaled by speed of light * the magnitude of the reference momentum [unitless] (at f...
Definition: ImpactXParticleContainer.H:76
@ w
particle weight, number of real particles represented by this macroparticle [unitless]
Definition: ImpactXParticleContainer.H:78
@ px
momentum in x, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:74
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:79
@ py
momentum in y, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:75
@ qm
charge to mass ratio, in q_e/m_e [q_e/eV]
Definition: ImpactXParticleContainer.H:77
Definition: ReferenceParticle.H:30