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 NamedComponentParticleContainer_H_
8 #define 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  w = 0,
27  ux, uy, uz,
28 #ifdef WARPX_DIM_RZ
30 #endif
31  nattribs
32  };
33 };
34 
46 template <template<class> class T_Allocator=amrex::DefaultAllocator>
48 public amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>
49 {
50 public:
53 
64  : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>(amr_pgdb) {
65  // build up the map of string names to particle component numbers
66  particle_comps["w"] = PIdx::w;
67  particle_comps["ux"] = PIdx::ux;
68  particle_comps["uy"] = PIdx::uy;
69  particle_comps["uz"] = PIdx::uz;
70 #ifdef WARPX_DIM_RZ
71  particle_comps["theta"] = PIdx::theta;
72 #endif
73  }
74 
76  ~NamedComponentParticleContainer() override = default;
77 
89  std::map<std::string, int> p_comps,
90  std::map<std::string, int> p_icomps,
91  std::map<std::string, int> p_rcomps,
92  std::map<std::string, int> p_ricomps)
93  : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>(std::move(pc)),
94  particle_comps(std::move(p_comps)),
95  particle_icomps(std::move(p_icomps)),
96  particle_runtime_comps(std::move(p_rcomps)),
97  particle_runtime_icomps(std::move(p_ricomps)) {}
98 
103 
108 
117  template <template<class> class NewAllocator=amrex::DefaultAllocator>
119  make_alike () const {
126 
127  return tmp;
128  }
129 
134 
140  void AddRealComp (const std::string& name, bool comm=true)
141  {
142  auto search = particle_comps.find(name);
143  if (search == particle_comps.end()) {
146  AddRealComp(comm);
147  } else {
149  name + " already exists in particle_comps, not adding.");
150  }
151  }
152 
158  void AddIntComp (const std::string& name, bool comm=true)
159  {
160  auto search = particle_icomps.find(name);
161  if (search == particle_icomps.end()) {
164  AddIntComp(comm);
165  } else {
167  name + " already exists in particle_icomps, not adding.");
168  }
169  }
170 
172  std::map<std::string, int> getParticleComps () const noexcept { return particle_comps;}
174  std::map<std::string, int> getParticleiComps () const noexcept { return particle_icomps;}
176  std::map<std::string, int> getParticleRuntimeComps () const noexcept { return particle_runtime_comps;}
178  std::map<std::string, int> getParticleRuntimeiComps () const noexcept { return particle_runtime_icomps;}
179 
180 protected:
181  std::map<std::string, int> particle_comps;
182  std::map<std::string, int> particle_icomps;
183  std::map<std::string, int> particle_runtime_comps;
184  std::map<std::string, int> particle_runtime_icomps;
185 };
186 
187 #endif
Definition: NamedComponentParticleContainer.H:49
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: NamedComponentParticleContainer.H:178
std::map< std::string, int > getParticleiComps() const noexcept
Definition: NamedComponentParticleContainer.H:174
NamedComponentParticleContainer(amrex::ParticleContainer< 0, 0, 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:87
void AddIntComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:158
@ nattribs
number of attributes
Definition: NamedComponentParticleContainer.H:31
void AddRealComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:140
std::map< std::string, int > getParticleRuntimeComps() const noexcept
Definition: NamedComponentParticleContainer.H:176
NamedComponentParticleContainer & operator=(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer()
Definition: NamedComponentParticleContainer.H:52
NamedComponentParticleContainer(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer< NewAllocator > make_alike() const
Definition: NamedComponentParticleContainer.H:119
~NamedComponentParticleContainer() override=default
NamedComponentParticleContainer(amrex::AmrParGDB *amr_pgdb)
Definition: NamedComponentParticleContainer.H:63
std::map< std::string, int > particle_comps
Definition: NamedComponentParticleContainer.H:181
std::map< std::string, int > particle_runtime_icomps
Definition: NamedComponentParticleContainer.H:184
std::map< std::string, int > getParticleComps() const noexcept
Definition: NamedComponentParticleContainer.H:172
std::map< std::string, int > particle_runtime_comps
Definition: NamedComponentParticleContainer.H:183
std::map< std::string, int > particle_icomps
Definition: NamedComponentParticleContainer.H:182
NamedComponentParticleContainer(NamedComponentParticleContainer &&)=default
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< Particle< T_NStructReal, T_NStructInt >, T_NArrayReal, T_NArrayInt, Allocator, CellAssignor > ParticleContainer
name
Definition: run_automated.py:229
Definition: NamedComponentParticleContainer.H:24
@ theta
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:29
@ nattribs
number of attributes
Definition: NamedComponentParticleContainer.H:31
@ uz
Definition: NamedComponentParticleContainer.H:27
@ w
weight
Definition: NamedComponentParticleContainer.H:26
@ uy
Definition: NamedComponentParticleContainer.H:27
@ ux
Definition: NamedComponentParticleContainer.H:27