Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
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>
8
9#include <algorithm>
10#include <array>
11#include <string>
12#include <vector>
13
14
15namespace amrex {
16
17template <int NReal, int NInt,
18 template<class> class Allocator=DefaultAllocator,
19 bool use64BitIdCpu=false>
21
25
26 void define (
27 int a_num_runtime_real,
28 int a_num_runtime_int,
29 std::vector<std::string>* soa_rdata_names=nullptr,
30 std::vector<std::string>* soa_idata_names=nullptr
31 )
32 {
33 m_defined = true;
34 m_runtime_rdata.resize(a_num_runtime_real);
35 m_runtime_idata.resize(a_num_runtime_int );
36 m_rdata_names = soa_rdata_names;
37 m_idata_names = soa_idata_names;
38 }
39
40 [[nodiscard]] int NumRealComps () const noexcept { return NReal + m_runtime_rdata.size(); }
41
42 [[nodiscard]] int NumIntComps () const noexcept { return NInt + m_runtime_idata.size(); }
43
44 [[nodiscard]] IdCPU& GetIdCPUData () { return m_idcpu; }
45 [[nodiscard]] std::array<RealVector, NReal>& GetRealData () { return m_rdata; }
46 [[nodiscard]] std::array< IntVector, NInt>& GetIntData () { return m_idata; }
47
49 [[nodiscard]] const IdCPU& GetIdCPUData () const { return m_idcpu; }
51 [[nodiscard]] const std::array<RealVector, NReal>& GetRealData () const { return m_rdata; }
53 [[nodiscard]] const std::array< IntVector, NInt>& GetIntData () const { return m_idata; }
54
56 [[nodiscard]] std::vector<std::string> GetRealNames () const
57 {
58 if (m_rdata_names) {
59 return *m_rdata_names;
60 }
61 else {
62 return std::vector<std::string>();
63 }
64 }
65
67 [[nodiscard]] std::vector<std::string> GetIntNames () const
68 {
69 if (m_idata_names) {
70 return *m_idata_names;
71 }
72 else {
73 return std::vector<std::string>();
74 }
75 }
76
81 [[nodiscard]] RealVector& GetRealData (const int index) {
82 AMREX_ASSERT(index >= 0 && index < NReal + static_cast<int>(m_runtime_rdata.size()));
83 if constexpr (NReal == 0) {
84 AMREX_ASSERT(m_defined);
85 return m_runtime_rdata[index];
86 } else {
87 if (index < NReal) {
88 return m_rdata[index];
89 } else {
90 AMREX_ASSERT(m_defined);
91 return m_runtime_rdata[index - NReal];
92 }
93 }
94 }
95
100 [[nodiscard]] const RealVector& GetRealData (const int index) const {
101 AMREX_ASSERT(index >= 0 && index < NReal + static_cast<int>(m_runtime_rdata.size()));
102 if constexpr (NReal == 0) {
103 AMREX_ASSERT(m_defined);
104 return m_runtime_rdata[index];
105 } else {
106 if (index < NReal) {
107 return m_rdata[index];
108 } else {
109 AMREX_ASSERT(m_defined);
110 return m_runtime_rdata[index - NReal];
111 }
112 }
113 }
114
119 [[nodiscard]] RealVector& GetRealData (std::string const & name) {
120 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_rdata_names != nullptr, "SoA Real names were not defined.");
121 auto const pos = std::find(m_rdata_names->begin(), m_rdata_names->end(), name);
122 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_rdata_names->end(), "Soa Real name='" + name + "' was not found components");
123
124 int const index = std::distance(m_rdata_names->begin(), pos);
125 return GetRealData(index);
126 }
127
132 [[nodiscard]] const RealVector& GetRealData (std::string const & name) const {
133 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_rdata_names != nullptr, "SoA Real names were not defined.");
134 auto const pos = std::find(m_rdata_names->begin(), m_rdata_names->end(), name);
135 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_rdata_names->end(), "Soa Real name='" + name + "' was not found components");
136
137 int const index = std::distance(m_rdata_names->begin(), pos);
138 return GetRealData(index);
139 }
140
145 [[nodiscard]] IntVector& GetIntData (const int index) {
146 AMREX_ASSERT(index >= 0 && index < NInt + static_cast<int>(m_runtime_idata.size()));
147 if constexpr (NInt == 0) {
148 AMREX_ASSERT(m_defined);
149 return m_runtime_idata[index];
150 } else {
151 if (index < NInt) {
152 return m_idata[index];
153 } else {
154 AMREX_ASSERT(m_defined);
155 return m_runtime_idata[index - NInt];
156 }
157 }
158 }
159
165 [[nodiscard]] const IntVector& GetIntData (const int index) const {
166 AMREX_ASSERT(index >= 0 && index < NInt + static_cast<int>(m_runtime_idata.size()));
167 if constexpr (NInt == 0) {
168 AMREX_ASSERT(m_defined);
169 return m_runtime_idata[index];
170 } else {
171 if (index < NInt) {
172 return m_idata[index];
173 } else {
174 AMREX_ASSERT(m_defined);
175 return m_runtime_idata[index - NInt];
176 }
177 }
178 }
179
185 [[nodiscard]] IntVector& GetIntData (std::string const & name) {
186 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_idata_names != nullptr, "SoA Int names were not defined.");
187 auto const pos = std::find(m_idata_names->begin(), m_idata_names->end(), name);
188 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_idata_names->end(), "Soa Int name='" + name + "' was not found components");
189
190 int const index = std::distance(m_idata_names->begin(), pos);
191 return GetIntData(index);
192 }
193
199 [[nodiscard]] const IntVector& GetIntData (std::string const & name) const {
200 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_idata_names != nullptr, "SoA Int names were not defined.");
201 auto const pos = std::find(m_idata_names->begin(), m_idata_names->end(), name);
202 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_idata_names->end(), "Soa Int name='" + name + "' was not found components");
203
204 int const index = std::distance(m_idata_names->begin(), pos);
205 return GetIntData(index);
206 }
207
212 [[nodiscard]] std::size_t size () const
213 {
214 if constexpr (use64BitIdCpu == true) {
215 return m_idcpu.size();
216 } else if constexpr (NReal > 0) {
217 return m_rdata[0].size();
218 } else if constexpr (NInt > 0) {
219 return m_idata[0].size();
220 } else {
221 if (!m_runtime_rdata.empty()) {
222 return m_runtime_rdata[0].size();
223 } else if (!m_runtime_idata.empty()) {
224 return m_runtime_idata[0].size();
225 } else {
226 return 0;
227 }
228 }
229 }
230
235 [[nodiscard]] bool empty () const { return this->size() == 0; }
236
241 [[nodiscard]] int numParticles () const { return numRealParticles(); }
242
247 [[nodiscard]] int numRealParticles () const { return numTotalParticles()-m_num_neighbor_particles; }
248
253 [[nodiscard]] int numNeighborParticles () const { return m_num_neighbor_particles; }
254
259 [[nodiscard]] int numTotalParticles () const { return size(); }
260
261 void setNumNeighbors (int num_neighbors)
262 {
263 auto nrp = numRealParticles();
264 m_num_neighbor_particles = num_neighbors;
265 resize(nrp + num_neighbors);
266 }
267
268 [[nodiscard]] int getNumNeighbors () const { return m_num_neighbor_particles; }
269
270 void resize (size_t count, GrowthStrategy strategy = GrowthStrategy::Poisson)
271 {
272 if constexpr (use64BitIdCpu == true) {
273 m_idcpu.resize(count, strategy);
274 }
275 if constexpr (NReal > 0) {
276 for (int i = 0; i < NReal; ++i) { m_rdata[i].resize(count, strategy); }
277 }
278 if constexpr (NInt > 0) {
279 for (int i = 0; i < NInt; ++i) { m_idata[i].resize(count, strategy); }
280 }
281 for (int i = 0; i < int(m_runtime_rdata.size()); ++i) {
282 m_runtime_rdata[i].resize(count, strategy);
283 }
284 for (int i = 0; i < int(m_runtime_idata.size()); ++i) {
285 m_runtime_idata[i].resize(count, strategy);
286 }
287 }
288
289 void reserve (size_t capacity, GrowthStrategy strategy = GrowthStrategy::Poisson)
290 {
291 if constexpr (use64BitIdCpu == true) {
292 m_idcpu.reserve(capacity, strategy);
293 }
294 if constexpr (NReal > 0) {
295 for (int i = 0; i < NReal; ++i) { m_rdata[i].reserve(capacity, strategy); }
296 }
297 if constexpr (NInt > 0) {
298 for (int i = 0; i < NInt; ++i) { m_idata[i].reserve(capacity, strategy); }
299 }
300 for (int i = 0; i < int(m_runtime_rdata.size()); ++i) {
301 m_runtime_rdata[i].reserve(capacity, strategy);
302 }
303 for (int i = 0; i < int(m_runtime_idata.size()); ++i) {
304 m_runtime_idata[i].reserve(capacity, strategy);
305 }
306 }
307
308 [[nodiscard]] uint64_t* idcpuarray () {
309 if constexpr (use64BitIdCpu == true) {
310 return m_idcpu.dataPtr();
311 } else {
312 return nullptr;
313 }
314 }
315
317 {
319 for (int i = 0; i < NReal; ++i)
320 {
321 arr[i] = m_rdata[i].dataPtr();
322 }
323 return arr;
324 }
325
327 {
329 for (int i = 0; i < NInt; ++i)
330 {
331 arr[i] = m_idata[i].dataPtr();
332 }
333 return arr;
334 }
335
338
339 {
340 if constexpr (use64BitIdCpu == true) {
341 idcpuv.push_back(&m_idcpu);
342 } else {
343 amrex::ignore_unused(idcpuv);
344 }
345 if constexpr (NReal > 0) {
346 for (int i = 0; i < NReal; ++i) { rv.push_back(&(m_rdata[i])); }
347 }
348 if constexpr (NInt > 0) {
349 for (int i = 0; i < NInt; ++i) { iv.push_back(&(m_idata[i])); }
350 }
351 for (int i = 0; i < int(m_runtime_rdata.size()); ++i) {
352 rv.push_back(&(m_runtime_rdata[i]));
353 }
354 for (int i = 0; i < int(m_runtime_idata.size()); ++i) {
355 iv.push_back(&(m_runtime_idata[i]));
356 }
357 }
358
360
361private:
362 // compile-time data
363 IdCPU m_idcpu;
364 std::array<RealVector, NReal> m_rdata;
365 std::array< IntVector, NInt> m_idata;
366
367 // runtime data
368 std::vector<RealVector> m_runtime_rdata;
369 std::vector<IntVector > m_runtime_idata;
370
371 // names of both compile-time and runtime Real and Int data
372 std::vector<std::string>* m_rdata_names = nullptr;
373 std::vector<std::string>* m_idata_names = nullptr;
374
376 bool m_defined{false};
377};
378
379} // namespace amrex
380
381#endif // AMREX_STRUCTOFARRAYS_H_
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
void reserve(size_type a_capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_PODVector.H:811
size_type size() const noexcept
Definition AMReX_PODVector.H:648
void resize(size_type a_new_size, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_PODVector.H:728
T * dataPtr() noexcept
Definition AMReX_PODVector.H:670
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Definition AMReX_Amr.cpp:49
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
amrex::ArenaAllocator< T > DefaultAllocator
Definition AMReX_GpuAllocators.H:199
GrowthStrategy
Definition AMReX_PODVector.H:250
const int[]
Definition AMReX_BLProfiler.cpp:1664
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:41
Definition AMReX_StructOfArrays.H:20
void setNumNeighbors(int num_neighbors)
Definition AMReX_StructOfArrays.H:261
int getNumNeighbors() const
Definition AMReX_StructOfArrays.H:268
int numTotalParticles() const
Returns the total number of particles (real and neighbor)
Definition AMReX_StructOfArrays.H:259
bool empty() const
Returns whether the SoA is empty (i.e. has size() == 0)
Definition AMReX_StructOfArrays.H:235
const RealVector & GetRealData(const int index) const
Definition AMReX_StructOfArrays.H:100
const IdCPU & GetIdCPUData() const
Definition AMReX_StructOfArrays.H:49
IntVector & GetIntData(const int index)
Definition AMReX_StructOfArrays.H:145
void collectVectors(Vector< IdCPU * > &idcpuv, Vector< RealVector * > &rv, Vector< IntVector * > &iv)
Definition AMReX_StructOfArrays.H:336
IdCPU & GetIdCPUData()
Definition AMReX_StructOfArrays.H:44
IntVector & GetIntData(std::string const &name)
Definition AMReX_StructOfArrays.H:185
void resize(size_t count, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_StructOfArrays.H:270
uint64_t * idcpuarray()
Definition AMReX_StructOfArrays.H:308
GpuArray< int *, NInt > intarray()
Definition AMReX_StructOfArrays.H:326
std::array< IntVector, NInt > & GetIntData()
Definition AMReX_StructOfArrays.H:46
std::vector< std::string > GetRealNames() const
Definition AMReX_StructOfArrays.H:56
int NumRealComps() const noexcept
Definition AMReX_StructOfArrays.H:40
const IntVector & GetIntData(const int index) const
Definition AMReX_StructOfArrays.H:165
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_StructOfArrays.H:241
GpuArray< ParticleReal *, NReal > realarray()
Definition AMReX_StructOfArrays.H:316
int m_num_neighbor_particles
Definition AMReX_StructOfArrays.H:359
const IntVector & GetIntData(std::string const &name) const
Definition AMReX_StructOfArrays.H:199
RealVector & GetRealData(std::string const &name)
Definition AMReX_StructOfArrays.H:119
std::vector< std::string > GetIntNames() const
Definition AMReX_StructOfArrays.H:67
const RealVector & GetRealData(std::string const &name) const
Definition AMReX_StructOfArrays.H:132
const std::array< RealVector, NReal > & GetRealData() const
Definition AMReX_StructOfArrays.H:51
void reserve(size_t capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_StructOfArrays.H:289
void define(int a_num_runtime_real, int a_num_runtime_int, std::vector< std::string > *soa_rdata_names=nullptr, std::vector< std::string > *soa_idata_names=nullptr)
Definition AMReX_StructOfArrays.H:26
std::array< RealVector, NReal > & GetRealData()
Definition AMReX_StructOfArrays.H:45
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_StructOfArrays.H:247
const std::array< IntVector, NInt > & GetIntData() const
Definition AMReX_StructOfArrays.H:53
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition AMReX_StructOfArrays.H:212
RealVector & GetRealData(const int index)
Definition AMReX_StructOfArrays.H:81
amrex::PODVector< uint64_t, Allocator< uint64_t > > IdCPU
Definition AMReX_StructOfArrays.H:22
int NumIntComps() const noexcept
Definition AMReX_StructOfArrays.H:42
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition AMReX_StructOfArrays.H:253