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 
22 struct PIdx
23 {
24  enum {
25  w = 0,
26  ux, uy, uz,
27 #ifdef WARPX_DIM_RZ
29 #endif
30  nattribs
31  };
32 };
33 
45 template <template<class> class T_Allocator=amrex::DefaultAllocator>
47 public amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>
48 {
49 public:
52 
63  : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>(amr_pgdb) {
64  // build up the map of string names to particle component numbers
65  particle_comps["w"] = PIdx::w;
66  particle_comps["ux"] = PIdx::ux;
67  particle_comps["uy"] = PIdx::uy;
68  particle_comps["uz"] = PIdx::uz;
69 #ifdef WARPX_DIM_RZ
70  particle_comps["theta"] = PIdx::theta;
71 #endif
72  }
73 
75  virtual ~NamedComponentParticleContainer() = default;
76 
88  std::map<std::string, int> p_comps,
89  std::map<std::string, int> p_icomps,
90  std::map<std::string, int> p_rcomps,
91  std::map<std::string, int> p_ricomps)
92  : amrex::ParticleContainer<0,0,PIdx::nattribs,0,T_Allocator>(std::move(pc)),
93  particle_comps(std::move(p_comps)),
94  particle_icomps(std::move(p_icomps)),
95  particle_runtime_comps(std::move(p_rcomps)),
96  particle_runtime_icomps(std::move(p_ricomps)) {}
97 
102 
107 
116  template <template<class> class NewAllocator=amrex::DefaultAllocator>
118  make_alike () const {
125 
126  return tmp;
127  }
128 
133 
139  void AddRealComp (const std::string& name, bool comm=true)
140  {
141  auto search = particle_comps.find(name);
142  if (search == particle_comps.end()) {
145  AddRealComp(comm);
146  } else {
148  name + " already exists in particle_comps, not adding.");
149  }
150  }
151 
157  void AddIntComp (const std::string& name, bool comm=true)
158  {
159  auto search = particle_icomps.find(name);
160  if (search == particle_icomps.end()) {
163  AddIntComp(comm);
164  } else {
166  name + " already exists in particle_icomps, not adding.");
167  }
168  }
169 
171  std::map<std::string, int> getParticleComps () const noexcept { return particle_comps;}
173  std::map<std::string, int> getParticleiComps () const noexcept { return particle_icomps;}
175  std::map<std::string, int> getParticleRuntimeComps () const noexcept { return particle_runtime_comps;}
177  std::map<std::string, int> getParticleRuntimeiComps () const noexcept { return particle_runtime_icomps;}
178 
179 protected:
180  std::map<std::string, int> particle_comps;
181  std::map<std::string, int> particle_icomps;
182  std::map<std::string, int> particle_runtime_comps;
183  std::map<std::string, int> particle_runtime_icomps;
184 };
185 
186 #endif
Definition: NamedComponentParticleContainer.H:48
std::map< std::string, int > getParticleRuntimeiComps() const noexcept
Definition: NamedComponentParticleContainer.H:177
std::map< std::string, int > getParticleiComps() const noexcept
Definition: NamedComponentParticleContainer.H:173
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:86
void AddIntComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:157
@ nattribs
number of attributes
Definition: NamedComponentParticleContainer.H:30
void AddRealComp(const std::string &name, bool comm=true)
Definition: NamedComponentParticleContainer.H:139
std::map< std::string, int > getParticleRuntimeComps() const noexcept
Definition: NamedComponentParticleContainer.H:175
NamedComponentParticleContainer & operator=(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer()
Definition: NamedComponentParticleContainer.H:51
virtual ~NamedComponentParticleContainer()=default
NamedComponentParticleContainer(const NamedComponentParticleContainer &)=delete
NamedComponentParticleContainer< NewAllocator > make_alike() const
Definition: NamedComponentParticleContainer.H:118
NamedComponentParticleContainer(amrex::AmrParGDB *amr_pgdb)
Definition: NamedComponentParticleContainer.H:62
std::map< std::string, int > particle_comps
Definition: NamedComponentParticleContainer.H:180
std::map< std::string, int > particle_runtime_icomps
Definition: NamedComponentParticleContainer.H:183
std::map< std::string, int > getParticleComps() const noexcept
Definition: NamedComponentParticleContainer.H:171
std::map< std::string, int > particle_runtime_comps
Definition: NamedComponentParticleContainer.H:182
std::map< std::string, int > particle_icomps
Definition: NamedComponentParticleContainer.H:181
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
name
Definition: run_automated.py:229
Definition: NamedComponentParticleContainer.H:23
@ theta
RZ needs all three position components.
Definition: NamedComponentParticleContainer.H:28
@ nattribs
number of attributes
Definition: NamedComponentParticleContainer.H:30
@ uz
Definition: NamedComponentParticleContainer.H:26
@ w
weight
Definition: NamedComponentParticleContainer.H:25
@ uy
Definition: NamedComponentParticleContainer.H:26
@ ux
Definition: NamedComponentParticleContainer.H:26