1#ifndef AMREX_STRUCTOFARRAYS_H_
2#define AMREX_STRUCTOFARRAYS_H_
3#include <AMReX_Config.H>
17template <
int NReal,
int NInt,
19 bool use64BitIdCpu=
false>
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
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;
40 [[nodiscard]]
int NumRealComps () const noexcept {
return NReal + m_runtime_rdata.size(); }
42 [[nodiscard]]
int NumIntComps () const noexcept {
return NInt + m_runtime_idata.size(); }
45 [[nodiscard]] std::array<RealVector, NReal>&
GetRealData () {
return m_rdata; }
46 [[nodiscard]] std::array< IntVector, NInt>&
GetIntData () {
return m_idata; }
51 [[nodiscard]]
const std::array<RealVector, NReal>&
GetRealData ()
const {
return m_rdata; }
53 [[nodiscard]]
const std::array< IntVector, NInt>&
GetIntData ()
const {
return m_idata; }
59 return *m_rdata_names;
62 return std::vector<std::string>();
70 return *m_idata_names;
73 return std::vector<std::string>();
82 AMREX_ASSERT(index >= 0 && index < NReal +
static_cast<int>(m_runtime_rdata.size()));
83 if constexpr (NReal == 0) {
85 return m_runtime_rdata[index];
88 return m_rdata[index];
91 return m_runtime_rdata[index - NReal];
101 AMREX_ASSERT(index >= 0 && index < NReal +
static_cast<int>(m_runtime_rdata.size()));
102 if constexpr (NReal == 0) {
104 return m_runtime_rdata[index];
107 return m_rdata[index];
110 return m_runtime_rdata[index - NReal];
121 auto const pos = std::find(m_rdata_names->begin(), m_rdata_names->end(), name);
124 int const index = std::distance(m_rdata_names->begin(), pos);
134 auto const pos = std::find(m_rdata_names->begin(), m_rdata_names->end(), name);
137 int const index = std::distance(m_rdata_names->begin(), pos);
146 AMREX_ASSERT(index >= 0 && index < NInt +
static_cast<int>(m_runtime_idata.size()));
147 if constexpr (NInt == 0) {
149 return m_runtime_idata[index];
152 return m_idata[index];
155 return m_runtime_idata[index - NInt];
166 AMREX_ASSERT(index >= 0 && index < NInt +
static_cast<int>(m_runtime_idata.size()));
167 if constexpr (NInt == 0) {
169 return m_runtime_idata[index];
172 return m_idata[index];
175 return m_runtime_idata[index - NInt];
187 auto const pos = std::find(m_idata_names->begin(), m_idata_names->end(), name);
190 int const index = std::distance(m_idata_names->begin(), pos);
201 auto const pos = std::find(m_idata_names->begin(), m_idata_names->end(), name);
204 int const index = std::distance(m_idata_names->begin(), pos);
212 [[nodiscard]] std::size_t
size ()
const
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();
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();
235 [[nodiscard]]
bool empty ()
const {
return this->
size() == 0; }
265 resize(nrp + num_neighbors);
272 if constexpr (use64BitIdCpu ==
true) {
273 m_idcpu.
resize(count, strategy);
275 if constexpr (NReal > 0) {
276 for (
int i = 0; i < NReal; ++i) { m_rdata[i].resize(count, strategy); }
278 if constexpr (NInt > 0) {
279 for (
int i = 0; i < NInt; ++i) { m_idata[i].resize(count, strategy); }
281 for (
int i = 0; i <
int(m_runtime_rdata.size()); ++i) {
282 m_runtime_rdata[i].resize(count, strategy);
284 for (
int i = 0; i <
int(m_runtime_idata.size()); ++i) {
285 m_runtime_idata[i].resize(count, strategy);
291 if constexpr (use64BitIdCpu ==
true) {
292 m_idcpu.
reserve(capacity, strategy);
294 if constexpr (NReal > 0) {
295 for (
int i = 0; i < NReal; ++i) { m_rdata[i].reserve(capacity, strategy); }
297 if constexpr (NInt > 0) {
298 for (
int i = 0; i < NInt; ++i) { m_idata[i].reserve(capacity, strategy); }
300 for (
int i = 0; i <
int(m_runtime_rdata.size()); ++i) {
301 m_runtime_rdata[i].reserve(capacity, strategy);
303 for (
int i = 0; i <
int(m_runtime_idata.size()); ++i) {
304 m_runtime_idata[i].reserve(capacity, strategy);
309 if constexpr (use64BitIdCpu ==
true) {
319 for (
int i = 0; i < NReal; ++i)
321 arr[i] = m_rdata[i].dataPtr();
329 for (
int i = 0; i < NInt; ++i)
331 arr[i] = m_idata[i].dataPtr();
340 if constexpr (use64BitIdCpu ==
true) {
341 idcpuv.push_back(&m_idcpu);
345 if constexpr (NReal > 0) {
346 for (
int i = 0; i < NReal; ++i) { rv.push_back(&(m_rdata[i])); }
348 if constexpr (NInt > 0) {
349 for (
int i = 0; i < NInt; ++i) { iv.push_back(&(m_idata[i])); }
351 for (
int i = 0; i <
int(m_runtime_rdata.size()); ++i) {
352 rv.push_back(&(m_runtime_rdata[i]));
354 for (
int i = 0; i <
int(m_runtime_idata.size()); ++i) {
355 iv.push_back(&(m_runtime_idata[i]));
364 std::array<RealVector, NReal> m_rdata;
365 std::array< IntVector, NInt> m_idata;
368 std::vector<RealVector> m_runtime_rdata;
369 std::vector<IntVector > m_runtime_idata;
372 std::vector<std::string>* m_rdata_names =
nullptr;
373 std::vector<std::string>* m_idata_names =
nullptr;
376 bool m_defined{
false};
#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