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
185  SetRefParticle (RefPart const refpart);
186 
191  RefPart &
192  GetRefParticle ();
193 
198  RefPart const
199  GetRefParticle () const;
200 
204  void SetRefParticleEdge ();
205 
208  int
209  GetParticleShape () const { return m_particle_shape.value(); }
210 
217  void SetParticleShape ();
218 
227  void SetParticleShape (int const order);
228 
233  std::tuple<
234  amrex::ParticleReal, amrex::ParticleReal,
235  amrex::ParticleReal, amrex::ParticleReal,
236  amrex::ParticleReal, amrex::ParticleReal>
238 
243  std::tuple<
244  amrex::ParticleReal, amrex::ParticleReal,
245  amrex::ParticleReal, amrex::ParticleReal,
246  amrex::ParticleReal, amrex::ParticleReal>
248 
258  void
259  DepositCharge (std::unordered_map<int, amrex::MultiFab> & rho,
260  amrex::Vector<amrex::IntVect> const & ref_ratio);
261 
262  private:
263 
266 
268  std::optional<int> m_particle_shape;
269 
270  }; // ImpactXParticleContainer
271 
272 } // namespace impactx
273 
274 #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:81
int GetParticleShape() const
Definition: ImpactXParticleContainer.H:209
void SetRefParticle(RefPart const refpart)
Definition: ImpactXParticleContainer.cpp:154
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:179
ImpactXParticleContainer(amrex::AmrCore *amr_core)
Construct a new particle container.
Definition: ImpactXParticleContainer.cpp:50
void SetRefParticleEdge()
Definition: ImpactXParticleContainer.cpp:170
void SetParticleShape()
Definition: ImpactXParticleContainer.cpp:70
std::tuple< amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal, amrex::ParticleReal > MeanAndStdPositions()
Definition: ImpactXParticleContainer.cpp:189
RefPart m_refpart
the reference particle for the beam in the particle container
Definition: ImpactXParticleContainer.H:265
std::optional< int > m_particle_shape
the particle shape
Definition: ImpactXParticleContainer.H:268
RefPart & GetRefParticle()
Definition: ImpactXParticleContainer.cpp:158
Definition: ImpactXParticleContainer.H:123
ParConstIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:42
Definition: ImpactXParticleContainer.H:107
ParIter(ContainerType &pc, int level)
Definition: ImpactXParticleContainer.cpp:34
Definition: ImpactX.cpp:32
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