Block-Structured AMR Software Framework
AMReX_StructOfArrays.H
Go to the documentation of this file.
1 #ifndef AMREX_STRUCTOFARRAYS_H_
2 #define AMREX_STRUCTOFARRAYS_H_
3 #include <AMReX_Config.H>
4 
5 #include <AMReX_REAL.H>
6 #include <AMReX_Vector.H>
7 #include <AMReX_GpuContainers.H>
8 
9 #include <array>
10 
11 namespace amrex {
12 
13 template <int NReal, int NInt,
14  template<class> class Allocator=DefaultAllocator,
15  bool use64BitIdCpu=false>
17 
21 
22  void define (int a_num_runtime_real, int a_num_runtime_int)
23  {
24  m_defined = true;
25  m_runtime_rdata.resize(a_num_runtime_real);
26  m_runtime_idata.resize(a_num_runtime_int );
27  }
28 
29  [[nodiscard]] int NumRealComps () const noexcept { return NReal + m_runtime_rdata.size(); }
30 
31  [[nodiscard]] int NumIntComps () const noexcept { return NInt + m_runtime_idata.size(); }
32 
33  [[nodiscard]] IdCPU& GetIdCPUData () { return m_idcpu; }
34  [[nodiscard]] std::array<RealVector, NReal>& GetRealData () { return m_rdata; }
35  [[nodiscard]] std::array< IntVector, NInt>& GetIntData () { return m_idata; }
36 
38  [[nodiscard]] const IdCPU& GetIdCPUData () const { return m_idcpu; }
40  [[nodiscard]] const std::array<RealVector, NReal>& GetRealData () const { return m_rdata; }
42  [[nodiscard]] const std::array< IntVector, NInt>& GetIntData () const { return m_idata; }
43 
48  [[nodiscard]] RealVector& GetRealData (const int index) {
49  AMREX_ASSERT(index >= 0 && index < NReal + static_cast<int>(m_runtime_rdata.size()));
50  if constexpr (NReal == 0) {
52  return m_runtime_rdata[index];
53  } else {
54  if (index < NReal) {
55  return m_rdata[index];
56  } else {
58  return m_runtime_rdata[index - NReal];
59  }
60  }
61  }
62 
67  [[nodiscard]] const RealVector& GetRealData (const int index) const {
68  AMREX_ASSERT(index >= 0 && index < NReal + static_cast<int>(m_runtime_rdata.size()));
69  if constexpr (NReal == 0) {
71  return m_runtime_rdata[index];
72  } else {
73  if (index < NReal) {
74  return m_rdata[index];
75  } else {
77  return m_runtime_rdata[index - NReal];
78  }
79  }
80  }
81 
86  [[nodiscard]] IntVector& GetIntData (const int index) {
87  AMREX_ASSERT(index >= 0 && index < NInt + static_cast<int>(m_runtime_idata.size()));
88  if constexpr (NInt == 0) {
90  return m_runtime_idata[index];
91  } else {
92  if (index < NInt) {
93  return m_idata[index];
94  } else {
96  return m_runtime_idata[index - NInt];
97  }
98  }
99  }
100 
106  [[nodiscard]] const IntVector& GetIntData (const int index) const {
107  AMREX_ASSERT(index >= 0 && index < NInt + static_cast<int>(m_runtime_idata.size()));
108  if constexpr (NInt == 0) {
110  return m_runtime_idata[index];
111  } else {
112  if (index < NInt) {
113  return m_idata[index];
114  } else {
116  return m_runtime_idata[index - NInt];
117  }
118  }
119  }
120 
125  [[nodiscard]] std::size_t size () const
126  {
127  if constexpr (use64BitIdCpu == true) {
128  return m_idcpu.size();
129  } else if constexpr (NReal > 0) {
130  return m_rdata[0].size();
131  } else if constexpr (NInt > 0) {
132  return m_idata[0].size();
133  } else {
134  if (!m_runtime_rdata.empty()) {
135  return m_runtime_rdata[0].size();
136  } else if (!m_runtime_idata.empty()) {
137  return m_runtime_idata[0].size();
138  } else {
139  return 0;
140  }
141  }
142  }
143 
148  [[nodiscard]] bool empty () const { return this->size() == 0; }
149 
154  [[nodiscard]] int numParticles () const { return numRealParticles(); }
155 
160  [[nodiscard]] int numRealParticles () const { return numTotalParticles()-m_num_neighbor_particles; }
161 
166  [[nodiscard]] int numNeighborParticles () const { return m_num_neighbor_particles; }
167 
172  [[nodiscard]] int numTotalParticles () const { return size(); }
173 
174  void setNumNeighbors (int num_neighbors)
175  {
176  auto nrp = numRealParticles();
177  m_num_neighbor_particles = num_neighbors;
178  resize(nrp + num_neighbors);
179  }
180 
181  [[nodiscard]] int getNumNeighbors () const { return m_num_neighbor_particles; }
182 
183  void resize (size_t count)
184  {
185  if constexpr (use64BitIdCpu == true) {
186  m_idcpu.resize(count);
187  }
188  if constexpr (NReal > 0) {
189  for (int i = 0; i < NReal; ++i) { m_rdata[i].resize(count); }
190  }
191  if constexpr (NInt > 0) {
192  for (int i = 0; i < NInt; ++i) { m_idata[i].resize(count); }
193  }
194  for (int i = 0; i < int(m_runtime_rdata.size()); ++i) { m_runtime_rdata[i].resize(count); }
195  for (int i = 0; i < int(m_runtime_idata.size()); ++i) { m_runtime_idata[i].resize(count); }
196  }
197 
198  [[nodiscard]] uint64_t* idcpuarray () {
199  if constexpr (use64BitIdCpu == true) {
200  return m_idcpu.dataPtr();
201  } else {
202  return nullptr;
203  }
204  }
205 
207  {
209  for (int i = 0; i < NReal; ++i)
210  {
211  arr[i] = m_rdata[i].dataPtr();
212  }
213  return arr;
214  }
215 
217  {
219  for (int i = 0; i < NInt; ++i)
220  {
221  arr[i] = m_idata[i].dataPtr();
222  }
223  return arr;
224  }
225 
227 
228 private:
230  std::array<RealVector, NReal> m_rdata;
231  std::array< IntVector, NInt> m_idata;
232 
233  std::vector<RealVector> m_runtime_rdata;
234  std::vector<IntVector > m_runtime_idata;
235 
236  bool m_defined{false};
237 };
238 
239 } // namespace amrex
240 
241 #endif // AMREX_STRUCTOFARRAYS_H_
#define AMREX_ASSERT(EX)
Definition: AMReX_BLassert.H:38
Definition: AMReX_PODVector.H:246
size_type size() const noexcept
Definition: AMReX_PODVector.H:575
void resize(size_type a_new_size)
Definition: AMReX_PODVector.H:625
T * dataPtr() noexcept
Definition: AMReX_PODVector.H:597
Definition: AMReX_Amr.cpp:49
amrex::ArenaAllocator< T > DefaultAllocator
Definition: AMReX_GpuAllocators.H:194
const int[]
Definition: AMReX_BLProfiler.cpp:1664
Definition: AMReX_Array.H:33
Definition: AMReX_StructOfArrays.H:16
std::array< IntVector, NInt > m_idata
Definition: AMReX_StructOfArrays.H:231
void setNumNeighbors(int num_neighbors)
Definition: AMReX_StructOfArrays.H:174
int getNumNeighbors() const
Definition: AMReX_StructOfArrays.H:181
IdCPU & GetIdCPUData()
Definition: AMReX_StructOfArrays.H:33
std::vector< IntVector > m_runtime_idata
Definition: AMReX_StructOfArrays.H:234
int numTotalParticles() const
Returns the total number of particles (real and neighbor)
Definition: AMReX_StructOfArrays.H:172
const IntVector & GetIntData(const int index) const
Definition: AMReX_StructOfArrays.H:106
std::vector< RealVector > m_runtime_rdata
Definition: AMReX_StructOfArrays.H:233
bool empty() const
Returns whether the SoA is empty (i.e. has size() == 0)
Definition: AMReX_StructOfArrays.H:148
std::array< IntVector, NInt > & GetIntData()
Definition: AMReX_StructOfArrays.H:35
bool m_defined
Definition: AMReX_StructOfArrays.H:236
const std::array< IntVector, NInt > & GetIntData() const
Definition: AMReX_StructOfArrays.H:42
std::array< RealVector, NReal > & GetRealData()
Definition: AMReX_StructOfArrays.H:34
void resize(size_t count)
Definition: AMReX_StructOfArrays.H:183
uint64_t * idcpuarray()
Definition: AMReX_StructOfArrays.H:198
GpuArray< ParticleReal *, NReal > realarray()
Definition: AMReX_StructOfArrays.H:206
IdCPU m_idcpu
Definition: AMReX_StructOfArrays.H:229
int NumRealComps() const noexcept
Definition: AMReX_StructOfArrays.H:29
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition: AMReX_StructOfArrays.H:154
const std::array< RealVector, NReal > & GetRealData() const
Definition: AMReX_StructOfArrays.H:40
int m_num_neighbor_particles
Definition: AMReX_StructOfArrays.H:226
GpuArray< int *, NInt > intarray()
Definition: AMReX_StructOfArrays.H:216
void define(int a_num_runtime_real, int a_num_runtime_int)
Definition: AMReX_StructOfArrays.H:22
const IdCPU & GetIdCPUData() const
Definition: AMReX_StructOfArrays.H:38
std::array< RealVector, NReal > m_rdata
Definition: AMReX_StructOfArrays.H:230
IntVector & GetIntData(const int index)
Definition: AMReX_StructOfArrays.H:86
RealVector & GetRealData(const int index)
Definition: AMReX_StructOfArrays.H:48
const RealVector & GetRealData(const int index) const
Definition: AMReX_StructOfArrays.H:67
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition: AMReX_StructOfArrays.H:160
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition: AMReX_StructOfArrays.H:125
int NumIntComps() const noexcept
Definition: AMReX_StructOfArrays.H:31
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition: AMReX_StructOfArrays.H:166