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 {
38  struct RealAoS
39  {
40  enum
41  {
42  x,
43  y,
44  t,
45  nattribs
46  };
47 
48  // at fixed t, the third component represents the position z
49  enum {
50  z = t
51  };
52 
54  static constexpr auto names_s = { "position_x", "position_y", "position_t" };
56  static constexpr auto names_t = { "position_x", "position_y", "position_z" };
57  static_assert(names_s.size() == nattribs);
58  static_assert(names_t.size() == nattribs);
59  };
60 
64  struct RealSoA
65  {
66  enum
67  {
68  px,
69  py,
70  pt,
71  qm,
72  w,
73  nattribs
74  };
75 
76  // at fixed t, the third component represents the momentum in z
77  enum {
78  pz = pt
79  };
80 
82  static constexpr auto names_s = { "momentum_x", "momentum_y", "momentum_t", "qm", "weighting" };
84  static constexpr auto names_t = { "momentum_x", "momentum_y", "momentum_z", "qm", "weighting" };
85  static_assert(names_s.size() == nattribs);
86  static_assert(names_t.size() == nattribs);
87  };
88 
92  struct IntSoA
93  {
94  enum
95  {
96  nattribs
97  };
98  };
99 
105  class ParIter
106  : public amrex::ParIter<0, 0, RealSoA::nattribs, IntSoA::nattribs>
107  {
108  public:
110 
111  ParIter (ContainerType& pc, int level);
112 
113  ParIter (ContainerType& pc, int level, amrex::MFItInfo& info);
114  };
115 
122  : public amrex::ParConstIter<0, 0, RealSoA::nattribs, IntSoA::nattribs>
123  {
124  public:
126 
127  ParConstIter (ContainerType& pc, int level);
128 
129  ParConstIter (ContainerType& pc, int level, amrex::MFItInfo& info);
130  };
131 
137  : public amrex::ParticleContainer<0, 0, RealSoA::nattribs, IntSoA::nattribs>
138  {
139  public:
142 
145 
148 
150  virtual ~ImpactXParticleContainer() = default;
151 
169  void
170  AddNParticles (int lev,
177  amrex::ParticleReal const & qm,
178  amrex::ParticleReal const & bchchg);
179 
184  void
186 
189 
194  void
195  SetRefParticle (RefPart const & refpart);
196 
201  RefPart &
202  GetRefParticle ();
203 
208  RefPart const &
209  GetRefParticle () const;
210 
214  void SetRefParticleEdge ();
215 
218  int
219  GetParticleShape () const { return m_particle_shape.value(); }
220 
227  void SetParticleShape ();
228 
237  void SetParticleShape (int order);
238 
243  std::tuple<
244  amrex::ParticleReal, amrex::ParticleReal,
245  amrex::ParticleReal, amrex::ParticleReal,
246  amrex::ParticleReal, amrex::ParticleReal>
248 
253  std::tuple<
254  amrex::ParticleReal, amrex::ParticleReal,
255  amrex::ParticleReal, amrex::ParticleReal,
256  amrex::ParticleReal, amrex::ParticleReal>
258 
268  void
269  DepositCharge (std::unordered_map<int, amrex::MultiFab> & rho,
270  amrex::Vector<amrex::IntVect> const & ref_ratio);
271 
273  std::vector<std::string>
274  RealAoS_names () const;
275 
277  std::vector<std::string>
278  RealSoA_names () const;
279 
280  private:
281 
284 
286  std::optional<int> m_particle_shape;
287 
290 
291  }; // ImpactXParticleContainer
292 
294  std::vector<std::string>
296 
302  std::vector<std::string>
303  get_RealSoA_names (int num_real_comps);
304 
305 } // namespace impactx
306 
307 #endif // IMPACTX_PARTICLE_CONTAINER_H
Definition: ImpactXParticleContainer.H:138
virtual ~ImpactXParticleContainer()=default
Destruct a particle container.
void AddNParticles(int lev, amrex::Vector< amrex::ParticleReal > const &x, amrex::Vector< amrex::ParticleReal > const &y, amrex::Vector< amrex::ParticleReal > const &t, amrex::Vector< amrex::ParticleReal > const &px, amrex::Vector< amrex::ParticleReal > const &py, amrex::Vector< amrex::ParticleReal > const &pt, amrex::ParticleReal const &qm, amrex::ParticleReal const &bchchg)
Definition: ImpactXParticleContainer.cpp:103
int GetParticleShape() const
Definition: ImpactXParticleContainer.H:219
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:25
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MinAndMaxPositions()
Definition: ImpactXParticleContainer.cpp:198
void SetRefParticle(RefPart const &refpart)
Definition: ImpactXParticleContainer.cpp:171
std::vector< std::string > RealAoS_names() const
Definition: ImpactXParticleContainer.cpp:217
std::vector< std::string > RealSoA_names() const
Definition: ImpactXParticleContainer.cpp:223
ImpactXParticleContainer(amrex::AmrCore *amr_core)
Construct a new particle container.
Definition: ImpactXParticleContainer.cpp:54
void SetRefParticleEdge()
Definition: ImpactXParticleContainer.cpp:189
ImpactXParticleContainer * m_particles_lost
a non-owning reference to lost particles, i.e., due to apertures
Definition: ImpactXParticleContainer.H:289
void SetParticleShape()
Definition: ImpactXParticleContainer.cpp:92
ImpactXParticleContainer * GetLostParticleContainer()
Definition: ImpactXParticleContainer.cpp:67
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MeanAndStdPositions()
Definition: ImpactXParticleContainer.cpp:208
RefPart m_refpart
the reference particle for the beam in the particle container
Definition: ImpactXParticleContainer.H:283
std::optional< int > m_particle_shape
the particle shape
Definition: ImpactXParticleContainer.H:286
RefPart & GetRefParticle()
Definition: ImpactXParticleContainer.cpp:177
Definition: ImpactXParticleContainer.H:123
ParConstIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:46
Definition: ImpactXParticleContainer.H:107
ParIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:38
Definition: ImpactX.cpp:34
std::vector< std::string > get_RealSoA_names(int num_real_comps)
Definition: ImpactXParticleContainer.cpp:240
std::vector< std::string > get_RealAoS_names()
Definition: ImpactXParticleContainer.cpp:229
Definition: ImpactXParticleContainer.H:93
@ nattribs
the number of particles above (always last)
Definition: ImpactXParticleContainer.H:96
Definition: ImpactXParticleContainer.H:39
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:45
@ x
position in x [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:42
@ y
position in y [m] (at fixed s OR fixed t)
Definition: ImpactXParticleContainer.H:43
@ t
c * time-of-flight [m] (at fixed s)
Definition: ImpactXParticleContainer.H:44
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:56
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:54
@ z
position in z [m] (at fixed t)
Definition: ImpactXParticleContainer.H:50
Definition: ImpactXParticleContainer.H:65
static constexpr auto names_s
named labels for fixed s
Definition: ImpactXParticleContainer.H:82
static constexpr auto names_t
named labels for fixed t
Definition: ImpactXParticleContainer.H:84
@ pz
momentum in z, scaled by the magnitude of the reference momentum [unitless] (at fixed t)
Definition: ImpactXParticleContainer.H:78
@ pt
energy deviation, scaled by speed of light * the magnitude of the reference momentum [unitless] (at f...
Definition: ImpactXParticleContainer.H:70
@ w
particle weight, number of real particles represented by this macroparticle [unitless]
Definition: ImpactXParticleContainer.H:72
@ px
momentum in x, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:68
@ nattribs
the number of attributes above (always last)
Definition: ImpactXParticleContainer.H:73
@ py
momentum in y, scaled by the magnitude of the reference momentum [unitless] (at fixed s or t)
Definition: ImpactXParticleContainer.H:69
@ qm
charge to mass ratio, in q_e/m_e [q_e/eV]
Definition: ImpactXParticleContainer.H:71
Definition: ReferenceParticle.H:30