WarpX
NamedComponentParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2022 Remi Lehe
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_NamedComponentParticleContainer_H_
8 #define WARPX_NamedComponentParticleContainer_H_
9 
10 #include "Utils/TextMsg.H"
11 
12 #include <AMReX.H>
13 #include <AMReX_AmrParGDB.H>
14 #include <AMReX_Particles.H>
15 
16 #include <map>
17 #include <string>
18 #include <utility>
19 
20 
23 struct PIdx
24 {
25  enum {
26 #if !defined (WARPX_DIM_1D_Z)
27  x,
28 #endif
29 #if defined (WARPX_DIM_3D)
30  y,
31 #endif
32  z,
33  w,
34  ux, uy, uz,
35 #ifdef WARPX_DIM_RZ
37 #endif
38  nattribs
39  };
40 };
41 
44 struct PIdxInt
45 {
46  enum {
47  nattribs
48  };
49 };
50 
61 template <template<class> class T_Allocator=amrex::DefaultAllocator>
63 public amrex::ParticleContainerPureSoA<PIdx::nattribs, 0, T_Allocator>
64 {
65 public:
68 
79  : amrex::ParticleContainerPureSoA<PIdx::nattribs, 0, T_Allocator>(amr_pgdb) {
80  // build up the map of string names to particle component numbers
81 #if !defined (WARPX_DIM_1D_Z)
82  particle_comps["x"] = PIdx::x;
83 #endif
84 #if defined (WARPX_DIM_3D)
85  particle_comps["y"] = PIdx::y;
86 #endif
87  particle_comps["z"] = PIdx::z;
88  particle_comps["w"] = PIdx::w;
89  particle_comps["ux"] = PIdx::ux;
90  particle_comps["uy"] = PIdx::uy;
91  particle_comps["uz"] = PIdx::uz;
92 #ifdef WARPX_DIM_RZ
93  particle_comps["theta"] = PIdx::theta;
94 #endif
95  }
96 
98  ~NamedComponentParticleContainer() override = default;
99 
111  std::map<std::string, int> p_comps,
112  std::map<std::string, int> p_icomps,
113  std::map<std::string, int> p_rcomps,
114  std::map<std::string, int> p_ricomps)
115  : amrex::ParticleContainerPureSoA<PIdx::nattribs, 0, T_Allocator>(std::move(pc)),
116  particle_comps(std::move(p_comps)),
117  particle_icomps(std::move(p_icomps)),
118  particle_runtime_comps(std::move(p_rcomps)),
119  particle_runtime_icomps(std::move(p_ricomps)) {}
120 
125 
130 
139  template <template<class> class NewAllocator=amrex::DefaultAllocator>
140  NamedComponentParticleContainer<NewAllocator>
141  make_alike () const {
148 
149  return tmp;
150  }
151 
156 
162  void AddRealComp (const std::string& name, bool comm=true)
163  {
164  auto search = particle_comps.find(name);
165  if (search == particle_comps.end()) {
168  AddRealComp(comm);
169  } else {
171  name + " already exists in particle_comps, not adding.");
172  }
173  }
174 
180  void AddIntComp (const std::string& name, bool comm=true)
181  {
182  auto search = particle_icomps.find(name);
183  if (search == particle_icomps.end()) {
186  AddIntComp(comm);
187  } else {
189  name + " already exists in particle_icomps, not adding.");
190  }
191  }
192 
193  void defineAllParticleTiles () noexcept
194  {
195  for (int lev = 0; lev <= amrex::ParticleContainerPureSoA<PIdx::nattribs,0,T_Allocator>::finestLevel(); ++lev)
196  {
197  for (auto mfi = amrex::ParticleContainerPureSoA<PIdx::nattribs,0,T_Allocator>::MakeMFIter(lev); mfi.isValid(); ++mfi)
198  {
199  const int grid_id = mfi.index();
200  const int tile_id = mfi.LocalTileIndex();
202  }
203  }
204  }
205 
207  [[nodiscard]] std::map<std::string, int> getParticleComps () const noexcept { return particle_comps;}
209  [[nodiscard]] std::map<std::string, int> getParticleiComps () const noexcept { return particle_icomps;}
211  [[nodiscard]] std::map<std::string, int> getParticleRuntimeComps () const noexcept { return particle_runtime_comps;}
213  [[nodiscard]] std::map<std::string, int> getParticleRuntimeiComps () const noexcept { return particle_runtime_icomps;}
214 
215 protected:
216  std::map<std::string, int> particle_comps;
217  std::map<std::string, int> particle_icomps;
218  std::map<std::string, int> particle_runtime_comps;
219  std::map<std::string, int> particle_runtime_icomps;
220 };
221 
222 #endif //WARPX_NamedComponentParticleContainer_H_
Definition: NamedComponentParticleContainer.H:64
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: NamedComponentParticleContainer.H:213
std::map< std::string, int > getParticleiComps() const noexcept
Definition: NamedComponentParticleContainer.H:209
void AddIntComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:180
@ nattribs
number of compile-time attributes
Definition: NamedComponentParticleContainer.H:38
void AddRealComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:162
std::map< std::string, int > getParticleRuntimeComps() const noexcept
Definition: NamedComponentParticleContainer.H:211
NamedComponentParticleContainer & operator=(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer()
Definition: NamedComponentParticleContainer.H:67
NamedComponentParticleContainer(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer< NewAllocator > make_alike() const
Definition: NamedComponentParticleContainer.H:141
~NamedComponentParticleContainer() override=default
NamedComponentParticleContainer(amrex::AmrParGDB *amr_pgdb)
Definition: NamedComponentParticleContainer.H:78
std::map< std::string, int > particle_comps
Definition: NamedComponentParticleContainer.H:216
std::map< std::string, int > particle_runtime_icomps
Definition: NamedComponentParticleContainer.H:219
void defineAllParticleTiles() noexcept
Definition: NamedComponentParticleContainer.H:193
std::map< std::string, int > getParticleComps() const noexcept
Definition: NamedComponentParticleContainer.H:207
std::map< std::string, int > particle_runtime_comps
Definition: NamedComponentParticleContainer.H:218
std::map< std::string, int > particle_icomps
Definition: NamedComponentParticleContainer.H:217
NamedComponentParticleContainer(NamedComponentParticleContainer &&) noexcept=default
NamedComponentParticleContainer(amrex::ParticleContainerPureSoA< PIdx::nattribs, 0, T_Allocator > &&pc, std::map< std::string, int > p_comps, std::map< std::string, int > p_icomps, std::map< std::string, int > p_rcomps, std::map< std::string, int > p_ricomps)
Definition: NamedComponentParticleContainer.H:109
ParticleTileType & DefineAndReturnParticleTile(int lev, int grid, int tile)
std::string Info(const std::string &msg, bool do_text_wrapping=true)
This function formats a text message as an info message, adding the '### INFO: ' prefix and (by defau...
Definition: TextMsg.cpp:63
ParticleContainer_impl< SoAParticle< T_NArrayReal, T_NArrayInt >, T_NArrayReal, T_NArrayInt, Allocator, CellAssignor > ParticleContainerPureSoA
default
Definition: run_alltests.py:113
name
Definition: run_automated.py:229
Definition: NamedComponentParticleContainer.H:24
@ theta
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:36
@ nattribs
number of compile-time attributes
Definition: NamedComponentParticleContainer.H:38
@ x
Definition: NamedComponentParticleContainer.H:27
@ uz
Definition: NamedComponentParticleContainer.H:34
@ w
weight
Definition: NamedComponentParticleContainer.H:33
@ uy
Definition: NamedComponentParticleContainer.H:34
@ z
Definition: NamedComponentParticleContainer.H:32
@ ux
Definition: NamedComponentParticleContainer.H:34
Definition: NamedComponentParticleContainer.H:45
@ nattribs
number of compile-time attributes
Definition: NamedComponentParticleContainer.H:47