1#ifndef AMREX_PARTICLETILE_H_
2#define AMREX_PARTICLETILE_H_
3#include <AMReX_Config.H>
22template <
int NArrayReal,
int NArrayInt>
23struct ConstSoAParticle;
24template <
int NArrayReal,
int NArrayInt>
27template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
28struct ConstParticleTileData;
31template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
34 static constexpr int NAR = NArrayReal;
35 static constexpr int NAI = NArrayInt;
52 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
66 decltype(
auto)
pos (
const int dir,
const int index)
const &
68 if constexpr(!ParticleType::is_soa_particle) {
69 return this->m_aos[index].pos(dir);
71 return this->m_rdata[dir][index];
76 decltype(
auto)
id (
const int index)
const &
78 if constexpr(!ParticleType::is_soa_particle) {
79 return this->m_aos[index].id();
86 decltype(
auto)
cpu (
const int index)
const &
88 if constexpr(!ParticleType::is_soa_particle) {
89 return this->m_aos[index].cpu();
96 decltype(
auto)
idcpu (
const int index)
const &
98 if constexpr(ParticleType::is_soa_particle) {
99 return this->m_idcpu[index];
101 return this->m_aos[index].idcpu();
108 return this->m_rdata[attribute_index];
112 int *
idata (
const int attribute_index)
const
114 return this->m_idata[attribute_index];
118 decltype(
auto)
operator[] (
const int index)
const
120 if constexpr (!ParticleType::is_soa_particle) {
129 const int* comm_real,
const int * comm_int)
const noexcept
132 auto* dst = buffer + dst_offset;
133 if constexpr (!ParticleType::is_soa_particle) {
137 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
138 dst +=
sizeof(uint64_t);
140 int array_start_index = 0;
141 if constexpr (!ParticleType::is_soa_particle) {
144 for (
int i = 0; i <
NAR; ++i)
146 if (comm_real[array_start_index + i])
152 int runtime_start_index = array_start_index +
NAR;
155 if (comm_real[runtime_start_index + i])
162 for (
int i = 0; i <
NAI; ++i)
164 if (comm_int[array_start_index + i])
166 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
173 if (comm_int[runtime_start_index + i])
183 const int* comm_real,
const int* comm_int)
const noexcept
186 const auto* src = buffer + src_offset;
187 if constexpr (!ParticleType::is_soa_particle) {
191 memcpy(
m_idcpu + dst_index, src,
sizeof(uint64_t));
192 src +=
sizeof(uint64_t);
194 int array_start_index = 0;
195 if constexpr (!ParticleType::is_soa_particle) {
198 if constexpr (
NAR > 0) {
199 for (
int i = 0; i <
NAR; ++i)
201 if (comm_real[array_start_index + i])
208 int runtime_start_index = array_start_index +
NAR;
211 if (comm_real[runtime_start_index + i])
218 if constexpr (
NAI > 0) {
219 for (
int i = 0; i <
NAI; ++i)
221 if (comm_int[array_start_index + i])
223 memcpy(
m_idata[i] + dst_index, src,
sizeof(
int));
231 if (comm_int[runtime_start_index + i])
239 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
245 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
251 if constexpr (
NAR >0) {
252 for (
int i = 0; i <
NAR; ++i) {
261 if constexpr (
NAI > 0) {
262 for (
int i = 0; i <
NAI; ++i) {
269 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
276 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
277 for (
int i = 0; i <
NAR; ++i) {
280 for (
int i = 0; i <
NAI; ++i) {
286 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
290 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
291 m_aos[index].pos(i) = sp.pos(i);
294 m_aos[index].rdata(i) = sp.rdata(i);
296 for (
int i = 0; i <
NAR; ++i) {
299 m_aos[index].id() = sp.id();
300 m_aos[index].cpu() = sp.cpu();
302 m_aos[index].idata(i) = sp.idata(i);
304 for (
int i = 0; i <
NAI; ++i) {
309 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
314 for (
int i = 0; i <
NAR; ++i) {
315 m_rdata[i][index] = sp.rdata(i);
317 for (
int i = 0; i <
NAI; ++i) {
318 m_idata[i][index] = sp.idata(i);
324template <
int T_NArrayReal,
int T_NArrayInt>
381 static_assert(std::is_trivially_copyable<ConstPTD>(),
"ParticleTileData is not trivially copyable");
387template <
int T_NArrayReal,
int T_NArrayInt>
464 static_assert(std::is_trivially_copyable<PTD>(),
"ParticleTileData is not trivially copyable");
473template <
int NArrayReal,
int NArrayInt>
480#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
481#pragma omp critical (amrex_particle_nextid)
482#elif defined(AMREX_USE_OMP)
483#pragma omp atomic capture
485 next = the_next_id++;
488 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
494template <
int NArrayReal,
int NArrayInt>
498 Long next = the_next_id++;
500 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
505template <
int NArrayReal,
int NArrayInt>
509 the_next_id = nextid;
512template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
515 static constexpr int NAR = NArrayReal;
516 static constexpr int NAI = NArrayInt;
531 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
540 decltype(
auto)
pos (
const int dir,
const int index)
const &
542 if constexpr(!ParticleType::is_soa_particle) {
543 return this->m_aos[index].pos(dir);
545 return this->m_rdata[dir][index];
550 decltype(
auto)
id (
const int index)
const &
552 if constexpr(!ParticleType::is_soa_particle) {
553 return this->m_aos[index].id();
560 decltype(
auto)
cpu (
const int index)
const &
562 if constexpr(!ParticleType::is_soa_particle) {
563 return this->m_aos[index].cpu();
570 decltype(
auto)
idcpu (
const int index)
const &
572 if constexpr(ParticleType::is_soa_particle) {
573 return this->m_idcpu[index];
575 return this->m_aos[index].idcpu();
582 return this->m_rdata[attribute_index];
586 const int *
idata (
const int attribute_index)
const
588 return this->m_idata[attribute_index];
592 decltype(
auto)
operator[] (
const int index)
const
594 if constexpr (!ParticleType::is_soa_particle) {
608 const int* comm_real,
const int * comm_int)
const noexcept
611 auto* dst = buffer + dst_offset;
612 if constexpr (!ParticleType::is_soa_particle) {
616 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
617 dst +=
sizeof(uint64_t);
619 int array_start_index = 0;
620 if constexpr (!ParticleType::is_soa_particle) {
623 if constexpr (NArrayReal > 0) {
624 for (
int i = 0; i < NArrayReal; ++i)
626 if (comm_real[array_start_index + i])
633 int runtime_start_index = array_start_index + NArrayReal;
636 if (comm_real[runtime_start_index + i])
643 if constexpr (NArrayInt > 0) {
644 for (
int i = 0; i < NArrayInt; ++i)
646 if (comm_int[array_start_index + i])
648 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
653 runtime_start_index = 2 +
NStructInt + NArrayInt;
656 if (comm_int[runtime_start_index + i])
664 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
670 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
676 if constexpr(NArrayReal > 0) {
677 for (
int i = 0; i < NArrayReal; ++i) {
686 if constexpr(NArrayInt > 0) {
687 for (
int i = 0; i < NArrayInt; ++i) {
694 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
700 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
702 for (
int i = 0; i <
NAR; ++i) {
705 for (
int i = 0; i <
NAI; ++i) {
718template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt,
722 template <
typename T>
726 static constexpr int NAR = NArrayReal;
727 static constexpr int NAI = NArrayInt;
735 using AoS = std::conditional_t<
736 ParticleType::is_soa_particle,
741 using SoA = std::conditional_t<
742 ParticleType::is_soa_particle,
768 int a_num_runtime_real,
769 int a_num_runtime_int,
770 std::vector<std::string>* soa_rdata_names=
nullptr,
771 std::vector<std::string>* soa_idata_names=
nullptr,
772 Arena* a_arena=
nullptr
775 GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int, soa_rdata_names, soa_idata_names);
784 if constexpr (ParticleType::is_soa_particle) {
787 "ParticleTile with PolymorphicArenaAllocator redefined with "
788 "different memory arena");
792 "ParticleTile with PolymorphicArenaAllocator redefined with "
793 "different memory arena");
798 "ParticleTile with PolymorphicArenaAllocator defined with no memory arena! "
799 "Make sure to call setArena() on the ParticleContainer before initialization or "
800 "to pass an Arena to ParticleTile::define()");
802 if constexpr (ParticleType::is_soa_particle) {
819 decltype(
auto)
id (
int index) & {
820 if constexpr (!ParticleType::is_soa_particle) {
828 decltype(
auto)
id (
int index)
const & {
829 if constexpr (!ParticleType::is_soa_particle) {
837 decltype(
auto)
cpu (
int index) & {
838 if constexpr (!ParticleType::is_soa_particle) {
846 decltype(
auto)
cpu (
int index)
const & {
847 if constexpr (!ParticleType::is_soa_particle) {
856 if constexpr (!ParticleType::is_soa_particle) {
859 static_assert(NArrayReal == ParticleType::PTD::NAR,
"ParticleTile mismatch in R");
860 static_assert(NArrayInt == ParticleType::PTD::NAI,
"ParticleTile mismatch in I");
861 static_assert(0 == ParticleType::StorageParticleType::NReal,
"ParticleTile 2 mismatch in R");
862 static_assert(0 == ParticleType::StorageParticleType::NInt,
"ParticleTile 2 mismatch in I");
864 return m_soa_tile.GetRealData(position_index)[index];
871 if constexpr (!ParticleType::is_soa_particle) {
874 return m_soa_tile.GetRealData(position_index)[index];
892 if constexpr (!ParticleType::is_soa_particle) {
905 if constexpr (!ParticleType::is_soa_particle) {
918 if constexpr (!ParticleType::is_soa_particle) {
931 if constexpr (!ParticleType::is_soa_particle) {
944 if constexpr (!ParticleType::is_soa_particle) {
953 if constexpr(!ParticleType::is_soa_particle) {
961 if constexpr (!ParticleType::is_soa_particle) {
971 if constexpr (!ParticleType::is_soa_particle) {
979 if constexpr (!ParticleType::is_soa_particle) {
988 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
994 template <
int NR = NArrayReal,
int NI = NArrayInt,
995 std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
1000 if constexpr (!ParticleType::is_soa_particle) {
1002 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
1016 if constexpr (ParticleType::is_soa_particle) {
1021 for (
int i = 0; i < NArrayReal; ++i) {
1024 for (
int i = 0; i < NArrayInt; ++i) {
1042 for (
int i = 0; i < NArrayReal; ++i) {
1052 auto it =
m_soa_tile.GetRealData(comp).end();
1077 auto new_size =
m_soa_tile.GetRealData(comp).size() + npar;
1078 m_soa_tile.GetRealData(comp).resize(new_size, v);
1094 for (
int i = 0; i < NArrayInt; ++i) {
1129 auto new_size =
m_soa_tile.GetIntData(comp).size() + npar;
1130 m_soa_tile.GetIntData(comp).resize(new_size, v);
1143 if constexpr (ParticleType::is_soa_particle) {
1151 rdata.shrink_to_fit();
1157 idata.shrink_to_fit();
1164 if constexpr (ParticleType::is_soa_particle) {
1178 nbytes += idata.capacity()*
sizeof(int);
1185 if constexpr (ParticleType::is_soa_particle) {
1186 GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1188 m_aos_tile().swap(other.GetArrayOfStructs()());
1193 rdata.swap(other.GetStructOfArrays().GetRealData(j));
1199 idata.swap(other.GetStructOfArrays().GetIntData(j));
1208 bool copy_real =
false;
1221 bool copy_int =
false;
1244 if constexpr (!ParticleType::is_soa_particle) {
1247 ptd.
m_aos =
nullptr;
1249 if constexpr (ParticleType::is_soa_particle) {
1254 if constexpr(NArrayReal > 0) {
1255 for (
int i = 0; i < NArrayReal; ++i) {
1259 if constexpr(NArrayInt > 0) {
1260 for (
int i = 0; i < NArrayInt; ++i) {
1271 if (copy_real || copy_int) {
1284 bool copy_real =
false;
1297 bool copy_int =
false;
1320 if constexpr (!ParticleType::is_soa_particle) {
1323 ptd.
m_aos =
nullptr;
1325 if constexpr (ParticleType::is_soa_particle) {
1330 if constexpr(NArrayReal > 0) {
1331 for (
int i = 0; i < NArrayReal; ++i) {
1335 if constexpr(NArrayInt > 0) {
1336 for (
int i = 0; i < NArrayInt; ++i) {
1347 if (copy_real || copy_int) {
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition AMReX_Extension.H:32
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
Definition AMReX_GpuAllocators.H:114
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:105
Definition AMReX_ArrayOfStructs.H:13
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
amrex_particle_real ParticleReal
Floating Point Type for Particles.
Definition AMReX_REAL.H:90
amrex_long Long
Definition AMReX_INT.H:30
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:263
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:301
constexpr Long LastParticleID
Definition AMReX_Particle.H:21
Definition AMReX_Amr.cpp:49
GrowthStrategy
Definition AMReX_PODVector.H:250
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:35
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
__host__ __device__ Dim3 end(BoxND< dim > const &box) noexcept
Definition AMReX_Box.H:2015
Definition AMReX_Particle.H:327
Definition AMReX_Particle.H:301
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:527
static constexpr int NAI
Definition AMReX_ParticleTile.H:516
int IntType
Definition AMReX_ParticleTile.H:520
GpuArray< const int *, NArrayInt > m_idata
Definition AMReX_ParticleTile.H:537
__host__ __device__ decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:570
__host__ __device__ const int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:586
Long m_size
Definition AMReX_ParticleTile.H:529
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:517
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:522
__host__ __device__ void packParticleData(char *buffer, int src_index, Long dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition AMReX_ParticleTile.H:607
int m_num_runtime_real
Definition AMReX_ParticleTile.H:601
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:523
const int *__restrict__ *__restrict__ m_runtime_idata
Definition AMReX_ParticleTile.H:604
ParticleReal RealType
Definition AMReX_ParticleTile.H:519
__host__ __device__ decltype(auto) pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:540
__host__ __device__ decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:560
int m_num_runtime_int
Definition AMReX_ParticleTile.H:602
std::conditional_t< T_ParticleType::is_soa_particle, void const *__restrict__, ParticleType const *__restrict__ > AOS_PTR
Definition AMReX_ParticleTile.H:532
T_ParticleType const & ParticleRefType
Definition AMReX_ParticleTile.H:518
static constexpr int NAR
Definition AMReX_ParticleTile.H:515
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:533
const uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:535
__host__ __device__ SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:666
__host__ __device__ const ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:580
GpuArray< const ParticleReal *, NArrayReal > m_rdata
Definition AMReX_ParticleTile.H:536
const ParticleReal *__restrict__ *__restrict__ m_runtime_rdata
Definition AMReX_ParticleTile.H:603
Definition AMReX_ParticleTile.H:326
__host__ __device__ ConstParticleIDWrapper id() const
Definition AMReX_ParticleTile.H:351
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:327
ParticleReal RealType
Definition AMReX_ParticleTile.H:334
__host__ __device__ ConstSoAParticle(ConstPTD const &ptd, long i)
Definition AMReX_ParticleTile.H:338
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:328
ConstPTD m_constparticle_tile_data
Definition AMReX_ParticleTile.H:383
static void NextID(Long nextid)
Reset on restart.
int m_index
Definition AMReX_ParticleTile.H:384
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:332
static Long UnprotectedNextID()
This version can only be used inside omp critical.
__host__ __device__ const RealType & pos(int position_index) const &
Definition AMReX_ParticleTile.H:359
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTile.H:356
__host__ __device__ ConstParticleCPUWrapper cpu() const
Definition AMReX_ParticleTile.H:348
int IntType
Definition AMReX_ParticleTile.H:335
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:40
Definition AMReX_GpuAllocators.H:172
uint64_t m_idcpu
Definition AMReX_Particle.H:359
Definition AMReX_Particle.H:259
Definition AMReX_Particle.H:154
Definition AMReX_ParticleTile.H:33
__host__ __device__ SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:241
T_ParticleType & ParticleRefType
Definition AMReX_ParticleTile.H:38
__host__ __device__ decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:86
uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:56
GpuArray< ParticleReal *, NAR > m_rdata
Definition AMReX_ParticleTile.H:57
__host__ __device__ void unpackParticleData(const char *buffer, Long src_offset, int dst_index, const int *comm_real, const int *comm_int) const noexcept
Definition AMReX_ParticleTile.H:182
__host__ __device__ decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:96
__host__ __device__ ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:106
__host__ __device__ void packParticleData(char *buffer, int src_index, std::size_t dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition AMReX_ParticleTile.H:128
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:44
GpuArray< int *, NAI > m_idata
Definition AMReX_ParticleTile.H:58
ParticleReal RealType
Definition AMReX_ParticleTile.H:40
__host__ __device__ decltype(auto) pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:66
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:37
std::conditional_t< T_ParticleType::is_soa_particle, void *__restrict__, ParticleType *__restrict__ > AOS_PTR
Definition AMReX_ParticleTile.H:53
int m_num_runtime_int
Definition AMReX_ParticleTile.H:61
Long m_size
Definition AMReX_ParticleTile.H:50
static constexpr int NAR
Definition AMReX_ParticleTile.H:34
int IntType
Definition AMReX_ParticleTile.H:41
ParticleReal *__restrict__ *__restrict__ m_runtime_rdata
Definition AMReX_ParticleTile.H:62
int m_num_runtime_real
Definition AMReX_ParticleTile.H:60
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:48
__host__ __device__ int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:112
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:54
static constexpr int NAI
Definition AMReX_ParticleTile.H:35
int *__restrict__ *__restrict__ m_runtime_idata
Definition AMReX_ParticleTile.H:63
__host__ __device__ void setSuperParticle(const SuperParticleType &sp, int index) const noexcept
Definition AMReX_ParticleTile.H:288
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:43
Definition AMReX_ParticleTile.H:721
typename ParticleType::StorageParticleType StorageParticleType
Definition AMReX_ParticleTile.H:747
int NumRealComps() const noexcept
Definition AMReX_ParticleTile.H:1133
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal > const &vec)
Definition AMReX_ParticleTile.H:1068
int NumIntComps() const noexcept
Definition AMReX_ParticleTile.H:1135
typename ParticleType::RealType RealType
Definition AMReX_ParticleTile.H:728
int getNumNeighbors() const
Definition AMReX_ParticleTile.H:959
amrex::PODVector< const int *, Allocator< const int * > > m_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1366
void push_back(const ParticleType &p)
Definition AMReX_ParticleTile.H:989
ParticleTile(ParticleTile const &)=delete
std::conditional_t< ParticleType::is_soa_particle, StructOfArrays< NArrayReal, NArrayInt, Allocator, true >, StructOfArrays< NArrayReal, NArrayInt, Allocator, false > > SoA
Definition AMReX_ParticleTile.H:744
const SoA & GetStructOfArrays() const
Definition AMReX_ParticleTile.H:882
static constexpr int NAI
Definition AMReX_ParticleTile.H:727
ParticleTile(ParticleTile &&) noexcept=default
void push_back_real(int comp, const ParticleReal *beg, const ParticleReal *end)
Definition AMReX_ParticleTile.H:1051
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:731
amrex::Gpu::HostVector< const ParticleReal * > m_h_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1371
void setNumNeighbors(int num_neighbors)
Definition AMReX_ParticleTile.H:951
amrex::Gpu::HostVector< int * > m_h_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1369
Long capacity() const
Definition AMReX_ParticleTile.H:1161
int numTotalParticles() const
Returns the total number of particles, real and neighbor.
Definition AMReX_ParticleTile.H:942
AoS m_aos_tile
Definition AMReX_ParticleTile.H:1357
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition AMReX_ParticleTile.H:890
static constexpr bool has_polymorphic_allocator
Definition AMReX_ParticleTile.H:752
ParticleTileDataType getParticleTileData()
Definition AMReX_ParticleTile.H:1203
void reserve(std::size_t capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTile.H:977
void push_back(const SuperParticleType &sp)
Definition AMReX_ParticleTile.H:996
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition AMReX_ParticleTile.H:929
amrex::PODVector< ParticleReal *, Allocator< ParticleReal * > > m_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1362
const AoS & GetArrayOfStructs() const
Definition AMReX_ParticleTile.H:879
static constexpr int NAR
Definition AMReX_ParticleTile.H:726
ConstParticleTileDataType getConstParticleTileData() const
Definition AMReX_ParticleTile.H:1279
void shrink_to_fit()
Definition AMReX_ParticleTile.H:1141
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:725
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:903
void push_back_int(int comp, amrex::Vector< int > const &vec)
Definition AMReX_ParticleTile.H:1120
amrex::Gpu::HostVector< ParticleReal * > m_h_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1368
void resize(std::size_t count, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTile.H:969
void swap(ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > &other) noexcept
Definition AMReX_ParticleTile.H:1183
void push_back_int(int comp, amrex::Vector< int >::const_iterator beg, amrex::Vector< int >::const_iterator end)
Definition AMReX_ParticleTile.H:1112
void push_back_real(const std::array< ParticleReal, NArrayReal > &v)
Definition AMReX_ParticleTile.H:1041
int NumRuntimeRealComps() const noexcept
Definition AMReX_ParticleTile.H:1137
amrex::Gpu::HostVector< const int * > m_h_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1372
amrex::PODVector< const ParticleReal *, Allocator< const ParticleReal * > > m_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1365
AoS & GetArrayOfStructs()
Definition AMReX_ParticleTile.H:878
RealType & pos(int index, int position_index) &
Definition AMReX_ParticleTile.H:855
typename SoA::IntVector IntVector
Definition AMReX_ParticleTile.H:746
void push_back_int(const std::array< int, NArrayInt > &v)
Definition AMReX_ParticleTile.H:1093
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal >::const_iterator beg, amrex::Vector< amrex::ParticleReal >::const_iterator end)
Definition AMReX_ParticleTile.H:1060
Allocator< T > AllocatorType
Definition AMReX_ParticleTile.H:723
int NumRuntimeIntComps() const noexcept
Definition AMReX_ParticleTile.H:1139
bool empty() const
Definition AMReX_ParticleTile.H:884
void push_back_int(int comp, int v)
Definition AMReX_ParticleTile.H:1085
RealType pos(int index, int position_index) const &
Definition AMReX_ParticleTile.H:869
decltype(auto) cpu(int index) &
Definition AMReX_ParticleTile.H:837
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, Arena *a_arena=nullptr)
Definition AMReX_ParticleTile.H:767
SoA m_soa_tile
Definition AMReX_ParticleTile.H:1358
SoA & GetStructOfArrays()
Definition AMReX_ParticleTile.H:881
void push_back_int(int comp, std::size_t npar, int v)
Definition AMReX_ParticleTile.H:1128
bool m_defined
Definition AMReX_ParticleTile.H:1360
void push_back_real(int comp, std::size_t npar, ParticleReal v)
Definition AMReX_ParticleTile.H:1076
void push_back_int(int comp, const int *beg, const int *end)
Definition AMReX_ParticleTile.H:1103
typename SoA::RealVector RealVector
Definition AMReX_ParticleTile.H:745
amrex::PODVector< int *, Allocator< int * > > m_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1363
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:916
std::conditional_t< ParticleType::is_soa_particle, ThisParticleTileHasNoAoS, ArrayOfStructs< ParticleType, Allocator > > AoS
Definition AMReX_ParticleTile.H:738
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:730
void push_back_real(int comp, ParticleReal v)
Definition AMReX_ParticleTile.H:1033
The struct used to store particles.
Definition AMReX_Particle.H:404
__host__ __device__ RealVect pos() const &
Definition AMReX_Particle.H:454
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:543
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:422
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:425
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:472
Definition AMReX_Particle.H:388
Definition AMReX_ParticleTile.H:389
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:390
__host__ __device__ uint64_t & idcpu() &
Definition AMReX_ParticleTile.H:418
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_ParticleTile.H:496
__host__ __device__ ConstParticleCPUWrapper cpu() const &
Definition AMReX_ParticleTile.H:421
PTD m_particle_tile_data
Definition AMReX_ParticleTile.H:466
static Long the_next_id
Definition AMReX_ParticleTile.H:407
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:391
__host__ __device__ const uint64_t & idcpu() const &
Definition AMReX_ParticleTile.H:427
int m_index
Definition AMReX_ParticleTile.H:467
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTile.H:432
ParticleReal RealType
Definition AMReX_ParticleTile.H:398
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_ParticleTile.H:412
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_ParticleTile.H:415
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:395
__host__ __device__ RealType & pos(int position_index) &
Definition AMReX_ParticleTile.H:435
int IntType
Definition AMReX_ParticleTile.H:399
__host__ __device__ SoAParticle(PTD const &ptd, long i)
Definition AMReX_ParticleTile.H:402
__host__ __device__ ConstParticleIDWrapper id() const &
Definition AMReX_ParticleTile.H:424
static Long NextID()
Definition AMReX_ParticleTile.H:475
__host__ __device__ RealType pos(int position_index) const &
Definition AMReX_ParticleTile.H:442
Definition AMReX_StructOfArrays.H:20
Definition AMReX_ParticleTile.H:714
Definition AMReX_ParticleTile.H:712
Definition AMReX_MakeParticle.H:13