ARTEMIS
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:
50  NamedComponentParticleContainer () : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>() {}
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 
110  template <template<class> class NewAllocator=amrex::DefaultAllocator>
112  make_alike () const {
119 
120  return tmp;
121  }
122 
124 
129 
135  void AddRealComp (const std::string& name, [[maybe_unused]] int communicate=1)
136  {
137  auto search = particle_comps.find(name);
138  if (search == particle_comps.end()) {
141  BaseContainer::AddRealComp(communicate);
142  } else {
144  name + " already exists in particle_comps, not adding.");
145  }
146  }
147 
153  void AddIntComp (const std::string& name, [[maybe_unused]] int communicate=1)
154  {
155  auto search = particle_icomps.find(name);
156  if (search == particle_icomps.end()) {
159  BaseContainer::AddIntComp(communicate);
160  } else {
162  name + " already exists in particle_icomps, not adding.");
163  }
164  }
165 
167  std::map<std::string, int> getParticleComps () const noexcept { return particle_comps;}
169  std::map<std::string, int> getParticleiComps () const noexcept { return particle_icomps;}
171  std::map<std::string, int> getParticleRuntimeComps () const noexcept { return particle_runtime_comps;}
173  std::map<std::string, int> getParticleRuntimeiComps () const noexcept { return particle_runtime_icomps;}
174 
175 protected:
176  std::map<std::string, int> particle_comps;
177  std::map<std::string, int> particle_icomps;
178  std::map<std::string, int> particle_runtime_comps;
179  std::map<std::string, int> particle_runtime_icomps;
180 };
181 
182 #endif
Definition: NamedComponentParticleContainer.H:47
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: NamedComponentParticleContainer.H:173
std::map< std::string, int > getParticleiComps() const noexcept
Definition: NamedComponentParticleContainer.H:169
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
NamedComponentParticleContainer & operator=(NamedComponentParticleContainer &&)=default
std::map< std::string, int > getParticleRuntimeComps() const noexcept
Definition: NamedComponentParticleContainer.H:171
NamedComponentParticleContainer()
Definition: NamedComponentParticleContainer.H:50
virtual ~NamedComponentParticleContainer()=default
NamedComponentParticleContainer< NewAllocator > make_alike() const
Definition: NamedComponentParticleContainer.H:112
NamedComponentParticleContainer(amrex::AmrParGDB *amr_pgdb)
Definition: NamedComponentParticleContainer.H:61
std::map< std::string, int > particle_comps
Definition: NamedComponentParticleContainer.H:176
std::map< std::string, int > particle_runtime_icomps
Definition: NamedComponentParticleContainer.H:179
void AddIntComp(const std::string &name, [[maybe_unused]] int communicate=1)
Definition: NamedComponentParticleContainer.H:153
std::map< std::string, int > getParticleComps() const noexcept
Definition: NamedComponentParticleContainer.H:167
void AddRealComp(const std::string &name, [[maybe_unused]] int communicate=1)
Definition: NamedComponentParticleContainer.H:135
std::map< std::string, int > particle_runtime_comps
Definition: NamedComponentParticleContainer.H:178
std::map< std::string, int > particle_icomps
Definition: NamedComponentParticleContainer.H:177
NamedComponentParticleContainer(NamedComponentParticleContainer &&)=default
void AddIntComp(std::string const &name, int communicate=1)
void AddRealComp(std::string const &name, int communicate=1)
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
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