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 
21 struct PIdx
22 {
23  enum {
24  w = 0,
25  ux, uy, uz,
26 #ifdef WARPX_DIM_RZ
28 #endif
29  nattribs
30  };
31 };
32 
44 template <template<class> class T_Allocator=amrex::DefaultAllocator>
46 public amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>
47 {
48 public:
51 
62  : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>(amr_pgdb) {
63  // build up the map of string names to particle component numbers
64  particle_comps["w"] = PIdx::w;
65  particle_comps["ux"] = PIdx::ux;
66  particle_comps["uy"] = PIdx::uy;
67  particle_comps["uz"] = PIdx::uz;
68 #ifdef WARPX_DIM_RZ
69  particle_comps["theta"] = PIdx::theta;
70 #endif
71  }
72 
74  virtual ~NamedComponentParticleContainer() = default;
75 
87  std::map<std::string, int> p_comps,
88  std::map<std::string, int> p_icomps,
89  std::map<std::string, int> p_rcomps,
90  std::map<std::string, int> p_ricomps)
91  : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>(std::move(pc)),
92  particle_comps(p_comps),
93  particle_icomps(p_icomps),
94  particle_runtime_comps(p_rcomps),
95  particle_runtime_icomps(p_ricomps) {}
96 
101 
106 
115  template <template<class> class NewAllocator=amrex::DefaultAllocator>
117  make_alike () const {
124 
125  return tmp;
126  }
127 
132 
138  void AddRealComp (const std::string& name, bool comm=true)
139  {
140  auto search = particle_comps.find(name);
141  if (search == particle_comps.end()) {
144  AddRealComp(comm);
145  } else {
147  name + " already exists in particle_comps, not adding.");
148  }
149  }
150 
156  void AddIntComp (const std::string& name, bool comm=true)
157  {
158  auto search = particle_icomps.find(name);
159  if (search == particle_icomps.end()) {
162  AddIntComp(comm);
163  } else {
165  name + " already exists in particle_icomps, not adding.");
166  }
167  }
168 
170  std::map<std::string, int> getParticleComps () const noexcept { return particle_comps;}
172  std::map<std::string, int> getParticleiComps () const noexcept { return particle_icomps;}
174  std::map<std::string, int> getParticleRuntimeComps () const noexcept { return particle_runtime_comps;}
176  std::map<std::string, int> getParticleRuntimeiComps () const noexcept { return particle_runtime_icomps;}
177 
178 protected:
179  std::map<std::string, int> particle_comps;
180  std::map<std::string, int> particle_icomps;
181  std::map<std::string, int> particle_runtime_comps;
182  std::map<std::string, int> particle_runtime_icomps;
183 };
184 
185 #endif
Definition: NamedComponentParticleContainer.H:47
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: NamedComponentParticleContainer.H:176
std::map< std::string, int > getParticleiComps() const noexcept
Definition: NamedComponentParticleContainer.H:172
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:85
void AddIntComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:156
@ nattribs
number of attributes
Definition: NamedComponentParticleContainer.H:29
void AddRealComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:138
std::map< std::string, int > getParticleRuntimeComps() const noexcept
Definition: NamedComponentParticleContainer.H:174
NamedComponentParticleContainer & operator=(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer()
Definition: NamedComponentParticleContainer.H:50
virtual ~NamedComponentParticleContainer()=default
NamedComponentParticleContainer(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer< NewAllocator > make_alike() const
Definition: NamedComponentParticleContainer.H:117
NamedComponentParticleContainer(amrex::AmrParGDB *amr_pgdb)
Definition: NamedComponentParticleContainer.H:61
std::map< std::string, int > particle_comps
Definition: NamedComponentParticleContainer.H:179
std::map< std::string, int > particle_runtime_icomps
Definition: NamedComponentParticleContainer.H:182
std::map< std::string, int > getParticleComps() const noexcept
Definition: NamedComponentParticleContainer.H:170
std::map< std::string, int > particle_runtime_comps
Definition: NamedComponentParticleContainer.H:181
std::map< std::string, int > particle_icomps
Definition: NamedComponentParticleContainer.H:180
NamedComponentParticleContainer(NamedComponentParticleContainer &&)=default
std::string Info(const std::string &msg, const 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
string name
Definition: stencil.py:452
Definition: NamedComponentParticleContainer.H:22
@ theta
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:27
@ nattribs
number of attributes
Definition: NamedComponentParticleContainer.H:29
@ uz
Definition: NamedComponentParticleContainer.H:25
@ w
weight
Definition: NamedComponentParticleContainer.H:24
@ uy
Definition: NamedComponentParticleContainer.H:25
@ ux
Definition: NamedComponentParticleContainer.H:25