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
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 {
115  particle_comps,
116  particle_icomps,
117  particle_runtime_comps,
118  particle_runtime_icomps);
119 
120  return tmp;
121  }
122 
127 
133  void AddRealComp (const std::string& name, bool comm=true)
134  {
135  auto search = particle_comps.find(name);
136  if (search == particle_comps.end()) {
137  particle_comps[name] = NumRealComps();
138  particle_runtime_comps[name] = NumRealComps() - PIdx::nattribs;
139  AddRealComp(comm);
140  } else {
142  name + " already exists in particle_comps, not adding.");
143  }
144  }
145 
151  void AddIntComp (const std::string& name, bool comm=true)
152  {
153  auto search = particle_icomps.find(name);
154  if (search == particle_icomps.end()) {
155  particle_icomps[name] = NumIntComps();
156  particle_runtime_icomps[name] = NumIntComps() - 0;
157  AddIntComp(comm);
158  } else {
160  name + " already exists in particle_icomps, not adding.");
161  }
162  }
163 
165  std::map<std::string, int> getParticleComps () const noexcept { return particle_comps;}
167  std::map<std::string, int> getParticleiComps () const noexcept { return particle_icomps;}
169  std::map<std::string, int> getParticleRuntimeComps () const noexcept { return particle_runtime_comps;}
171  std::map<std::string, int> getParticleRuntimeiComps () const noexcept { return particle_runtime_icomps;}
172 
173 protected:
174  std::map<std::string, int> particle_comps;
175  std::map<std::string, int> particle_icomps;
176  std::map<std::string, int> particle_runtime_comps;
177  std::map<std::string, int> particle_runtime_icomps;
178 };
179 
180 #endif
NamedComponentParticleContainer()
Definition: NamedComponentParticleContainer.H:50
Definition: NamedComponentParticleContainer.H:21
void AddIntComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:151
NamedComponentParticleContainer(amrex::AmrParGDB *amr_pgdb)
Definition: NamedComponentParticleContainer.H:61
std::map< std::string, int > particle_runtime_comps
Definition: NamedComponentParticleContainer.H:176
std::map< std::string, int > getParticleiComps() const noexcept
Definition: NamedComponentParticleContainer.H:167
std::map< std::string, int > getParticleComps() const noexcept
Definition: NamedComponentParticleContainer.H:165
STL namespace.
void AddRealComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:133
std::map< std::string, int > particle_runtime_icomps
Definition: NamedComponentParticleContainer.H:177
Definition: NamedComponentParticleContainer.H:25
std::map< std::string, int > particle_icomps
Definition: NamedComponentParticleContainer.H:175
Definition: NamedComponentParticleContainer.H:45
Definition: NamedComponentParticleContainer.H:25
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 &#39;### INFO: &#39; prefix and (by defau...
Definition: TextMsg.cpp:61
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: NamedComponentParticleContainer.H:171
std::map< std::string, int > particle_comps
Definition: NamedComponentParticleContainer.H:174
NamedComponentParticleContainer< NewAllocator > make_alike() const
Definition: NamedComponentParticleContainer.H:112
Definition: NamedComponentParticleContainer.H:25
weight
Definition: NamedComponentParticleContainer.H:24
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:27
number of attributes
Definition: NamedComponentParticleContainer.H:29
string name
Definition: Stencil.py:485
std::map< std::string, int > getParticleRuntimeComps() 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