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 #include <AMReX_ParticleTile.H>
22 
23 #include <AMReX_IntVect.H>
24 #include <AMReX_Vector.H>
25 
26 #include <optional>
27 #include <tuple>
28 #include <unordered_map>
29 
30 
31 namespace impactx
32 {
33  enum class CoordSystem
34  {
35  s,
36  t
37  };
38 
42  struct RealSoA
43  {
44  enum
45  {
46  x,
47  y,
48  t,
49  px,
50  py,
51  pt,
52  qm,
53  w,
54  nattribs
55  };
56 
57  // at fixed t, the third component represents the position z, the 6th component represents the momentum in z
58  enum {
59  z = t,
60  pz = pt
61  };
62 
64  static constexpr auto names_s = { "position_x", "position_y", "position_t", "momentum_x", "momentum_y", "momentum_t", "qm", "weighting" };
66  static constexpr auto names_t = { "position_x", "position_y", "position_z", "momentum_x", "momentum_y", "momentum_z", "qm", "weighting" };
67  static_assert(names_s.size() == nattribs);
68  static_assert(names_t.size() == nattribs);
69  };
70 
74  struct IntSoA
75  {
76  enum
77  {
78  nattribs
79  };
80 
82  static constexpr std::initializer_list<char const *> names_s = {};
84  static constexpr std::initializer_list<char const *> names_t = {};
85  static_assert(names_s.size() == nattribs);
86  static_assert(names_t.size() == nattribs);
87  };
88 
94  class ParIterSoA
95  : public amrex::ParIterSoA<RealSoA::nattribs, IntSoA::nattribs>
96  {
97  public:
99 
100  ParIterSoA (ContainerType& pc, int level);
101 
102  ParIterSoA (ContainerType& pc, int level, amrex::MFItInfo& info);
103 
104  ContainerType * pc () { return m_pc; }
105  };
106 
113  : public amrex::ParConstIterSoA<RealSoA::nattribs, IntSoA::nattribs>
114  {
115  public:
117 
118  ParConstIterSoA (ContainerType& pc, int level);
119 
120  ParConstIterSoA (ContainerType& pc, int level, amrex::MFItInfo& info);
121 
122  ContainerType const * pc () const { return m_pc; }
123  };
124 
130  : public amrex::ParticleContainerPureSoA<RealSoA::nattribs, IntSoA::nattribs>
131  {
132  public:
135 
138 
141 
143  virtual ~ImpactXParticleContainer() = default;
144 
150  bool HasRealComp (std::string const & name);
151 
157  bool HasIntComp (std::string const & name);
158 
166  int GetRealCompIndex (std::string const & name);
167 
175  int GetIntCompIndex (std::string const & name);
176 
182  void AddRealComp (std::string const & name, bool communicate=true);
183 
189  void AddIntComp (std::string const & name, bool communicate=true);
190 
207  void
208  AddNParticles (
215  amrex::ParticleReal qm,
216  amrex::ParticleReal bchchg
217  );
218 
223  void
225 
228 
233  void
234  SetRefParticle (RefPart const & refpart);
235 
240  RefPart &
241  GetRefParticle ();
242 
247  RefPart const &
248  GetRefParticle () const;
249 
253  void SetRefParticleEdge ();
254 
257  int
258  GetParticleShape () const { return m_particle_shape.value(); }
259 
266  void SetParticleShape ();
267 
276  void SetParticleShape (int order);
277 
282  std::tuple<
283  amrex::ParticleReal, amrex::ParticleReal,
284  amrex::ParticleReal, amrex::ParticleReal,
285  amrex::ParticleReal, amrex::ParticleReal>
287 
292  std::tuple<
293  amrex::ParticleReal, amrex::ParticleReal,
294  amrex::ParticleReal, amrex::ParticleReal,
295  amrex::ParticleReal, amrex::ParticleReal>
297 
307  void
308  DepositCharge (std::unordered_map<int, amrex::MultiFab> & rho,
309  amrex::Vector<amrex::IntVect> const & ref_ratio);
310 
312  std::vector<std::string>
313  RealSoA_names () const;
314 
316  std::vector<std::string>
317  intSoA_names () const;
318 
321  GetCoordSystem () const;
322 
327  void
328  SetCoordSystem (CoordSystem coord_system);
329 
330  private:
331 
334 
336  std::optional<int> m_particle_shape;
337 
340 
343 
345  std::vector<std::string> m_real_soa_names;
346 
348  std::vector<std::string> m_int_soa_names;
349 
350  }; // ImpactXParticleContainer
351 
352 } // namespace impactx
353 
354 #endif // IMPACTX_PARTICLE_CONTAINER_H
Definition: ImpactXParticleContainer.H:131
virtual ~ImpactXParticleContainer()=default
Destruct a particle container.
int GetRealCompIndex(std::string const &name)
Definition: ImpactXParticleContainer.cpp:80
int GetParticleShape() const
Definition: ImpactXParticleContainer.H:258
void SetLostParticleContainer(ImpactXParticleContainer *lost_pc)
Definition: ImpactXParticleContainer.cpp:121
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:163
int GetIntCompIndex(std::string const &name)
Definition: ImpactXParticleContainer.cpp:90
std::vector< std::string > intSoA_names() const
Definition: ImpactXParticleContainer.cpp:310
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MinAndMaxPositions()
Definition: ImpactXParticleContainer.cpp:285
void SetRefParticle(RefPart const &refpart)
Definition: ImpactXParticleContainer.cpp:258
void AddIntComp(std::string const &name, bool communicate=true)
Definition: ImpactXParticleContainer.cpp:111
std::vector< std::string > m_int_soa_names
Int component names.
Definition: ImpactXParticleContainer.H:348
void AddRealComp(std::string const &name, bool communicate=true)
Definition: ImpactXParticleContainer.cpp:101
std::vector< std::string > RealSoA_names() const
Definition: ImpactXParticleContainer.cpp:304
CoordSystem GetCoordSystem() const
Definition: ImpactXParticleContainer.cpp:316
void SetRefParticleEdge()
Definition: ImpactXParticleContainer.cpp:276
ImpactXParticleContainer * m_particles_lost
a non-owning reference to lost particles, i.e., due to apertures
Definition: ImpactXParticleContainer.H:339
ImpactXParticleContainer(initialization::AmrCoreData *amr_core)
Construct a new particle container.
Definition: ImpactXParticleContainer.cpp:58
void SetParticleShape()
Definition: ImpactXParticleContainer.cpp:152
void SetCoordSystem(CoordSystem coord_system)
Definition: ImpactXParticleContainer.cpp:322
ImpactXParticleContainer * GetLostParticleContainer()
Definition: ImpactXParticleContainer.cpp:127
bool HasIntComp(std::string const &name)
Definition: ImpactXParticleContainer.cpp:75
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MeanAndStdPositions()
Definition: ImpactXParticleContainer.cpp:295
RefPart m_refpart
the reference particle for the beam in the particle container
Definition: ImpactXParticleContainer.H:333
bool HasRealComp(std::string const &name)
Definition: ImpactXParticleContainer.cpp:70
std::vector< std::string > m_real_soa_names
ParticleReal component names.
Definition: ImpactXParticleContainer.H:345
std::optional< int > m_particle_shape
the particle shape
Definition: ImpactXParticleContainer.H:336
CoordSystem m_coordsystem
the current coordinate system of particles in this container
Definition: ImpactXParticleContainer.H:342
RefPart & GetRefParticle()
Definition: ImpactXParticleContainer.cpp:264
Definition: ImpactXParticleContainer.H:114
ContainerType const * pc() const
Definition: ImpactXParticleContainer.H:122
ParConstIterSoA(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:50
Definition: ImpactXParticleContainer.H:96
ContainerType * pc()
Definition: ImpactXParticleContainer.H:104
ParIterSoA(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:42
Definition: AmrCoreData.H:42
Definition: ImpactX.cpp:33
CoordSystem
Definition: ImpactXParticleContainer.H:34
@ s
fixed s as the independent variable
@ t
fixed t as the independent variable
Definition: ImpactXParticleContainer.H:75
static constexpr std::initializer_list< char const * > names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:82
static constexpr std::initializer_list< char const * > names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:84
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:78
Definition: ImpactXParticleContainer.H:43
@ pt
energy deviation, scaled by speed of light * the magnitude of the reference momentum [unitless] (at f...
Definition: ImpactXParticleContainer.H:51
@ y
position in y [m] (at fixed s or t)
Definition: ImpactXParticleContainer.H:47
@ t
time-of-flight ct [m] (at fixed s)
Definition: ImpactXParticleContainer.H:48
@ w
particle weight, number of real particles represented by this macroparticle [unitless]
Definition: ImpactXParticleContainer.H:53
@ px
momentum in x, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:49
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:54
@ py
momentum in y, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:50
@ x
position in x [m] (at fixed s or t)
Definition: ImpactXParticleContainer.H:46
@ qm
charge to mass ratio, in q_e/m_e [q_e/eV]
Definition: ImpactXParticleContainer.H:52
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:64
@ z
position in z [m] (at fixed t)
Definition: ImpactXParticleContainer.H:59
@ pz
momentum in z, scaled by the magnitude of the reference momentum [unitless] (at fixed t)
Definition: ImpactXParticleContainer.H:60
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:66
Definition: ReferenceParticle.H:30