1 #ifndef AMREX_PARTICLETILE_H_
2 #define AMREX_PARTICLETILE_H_
3 #include <AMReX_Config.H>
14 #include <type_traits>
19 template <
int NArrayReal,
int NArrayInt>
20 struct ConstSoAParticle;
21 template <
int NArrayReal,
int NArrayInt>
24 template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
25 struct ConstParticleTileData;
27 template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
30 static constexpr
int NAR = NArrayReal;
31 static constexpr
int NAI = NArrayInt;
46 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
60 ParticleReal&
pos (
const int dir,
const int index)
const &
62 if constexpr(!ParticleType::is_soa_particle) {
63 return this->m_aos[index].pos(dir);
65 return this->m_rdata[dir][index];
70 decltype(
auto)
id (const
int index) const &
72 if constexpr(!ParticleType::is_soa_particle) {
73 return this->m_aos[index].id();
80 decltype(
auto)
cpu (const
int index) const &
82 if constexpr(!ParticleType::is_soa_particle) {
83 return this->m_aos[index].cpu();
90 decltype(
auto)
idcpu (const
int index) const &
92 if constexpr(ParticleType::is_soa_particle) {
93 return this->m_idcpu[index];
100 ParticleReal *
rdata (
const int attribute_index)
const
102 return this->m_rdata[attribute_index];
106 int *
idata (
const int attribute_index)
const
108 return this->m_idata[attribute_index];
112 decltype(
auto) operator[] (const
int index)
const
114 if constexpr (!ParticleType::is_soa_particle) {
123 const int* comm_real,
const int * comm_int)
const noexcept
126 auto* dst = buffer + dst_offset;
127 if constexpr (!ParticleType::is_soa_particle) {
132 dst +=
sizeof(uint64_t);
134 int array_start_index = AMREX_SPACEDIM +
NStructReal;
135 for (
int i = 0; i <
NAR; ++i)
137 if (comm_real[array_start_index + i])
140 dst +=
sizeof(ParticleReal);
146 if (comm_real[runtime_start_index + i])
149 dst +=
sizeof(ParticleReal);
153 for (
int i = 0; i <
NAI; ++i)
155 if (comm_int[array_start_index + i])
164 if (comm_int[runtime_start_index + i])
174 const int* comm_real,
const int* comm_int)
const noexcept
177 const auto* src = buffer + src_offset;
178 if constexpr (!ParticleType::is_soa_particle) {
183 src +=
sizeof(uint64_t);
185 int array_start_index = AMREX_SPACEDIM +
NStructReal;
186 for (
int i = 0; i <
NAR; ++i)
188 if (comm_real[array_start_index + i])
191 src +=
sizeof(ParticleReal);
197 if (comm_real[runtime_start_index + i])
200 src +=
sizeof(ParticleReal);
204 for (
int i = 0; i <
NAI; ++i)
206 if (comm_int[array_start_index + i])
215 if (comm_int[runtime_start_index + i])
223 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
229 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
235 for (
int i = 0; i <
NAR; ++i) {
243 for (
int i = 0; i <
NAI; ++i) {
249 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
256 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
257 for (
int i = 0; i <
NAR; ++i) {
260 for (
int i = 0; i <
NAI; ++i) {
266 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
270 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
271 m_aos[index].pos(i) = sp.pos(i);
274 m_aos[index].rdata(i) = sp.rdata(i);
276 for (
int i = 0; i <
NAR; ++i) {
279 m_aos[index].id() = sp.id();
280 m_aos[index].cpu() = sp.cpu();
282 m_aos[index].idata(i) = sp.idata(i);
284 for (
int i = 0; i <
NAI; ++i) {
289 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
294 for (
int i = 0; i <
NAR; ++i) {
295 m_rdata[i][index] = sp.rdata(i);
297 for (
int i = 0; i <
NAI; ++i) {
298 m_idata[i][index] = sp.idata(i);
304 template <
int T_NArrayReal,
int T_NArrayInt>
366 template <
int T_NArrayReal,
int T_NArrayInt>
438 static void NextID (Long nextid);
451 template <
int NArrayReal,
int NArrayInt>
458 #if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
459 #pragma omp critical (amrex_particle_nextid)
460 #elif defined(AMREX_USE_OMP)
461 #pragma omp atomic capture
463 next = the_next_id++;
466 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
472 template <
int NArrayReal,
int NArrayInt>
476 Long next = the_next_id++;
478 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
483 template <
int NArrayReal,
int NArrayInt>
487 the_next_id = nextid;
490 template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
493 static constexpr
int NAR = NArrayReal;
494 static constexpr
int NAI = NArrayInt;
507 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
516 const ParticleReal&
pos (
const int dir,
const int index)
const &
518 if constexpr(!ParticleType::is_soa_particle) {
519 return this->m_aos[index].pos(dir);
521 return this->m_rdata[dir][index];
526 decltype(
auto)
id (const
int index) const &
528 if constexpr(!ParticleType::is_soa_particle) {
529 return this->m_aos[index].id();
536 decltype(
auto)
cpu (const
int index) const &
538 if constexpr(!ParticleType::is_soa_particle) {
539 return this->m_aos[index].cpu();
546 decltype(
auto)
idcpu (const
int index) const &
548 if constexpr(ParticleType::is_soa_particle) {
549 return this->m_idcpu[index];
556 const ParticleReal *
rdata (
const int attribute_index)
const
558 return this->m_rdata[attribute_index];
562 const int *
idata (
const int attribute_index)
const
564 return this->m_idata[attribute_index];
568 decltype(
auto) operator[] (const
int index)
const
570 if constexpr (!ParticleType::is_soa_particle) {
584 const int* comm_real,
const int * comm_int)
const noexcept
587 auto* dst = buffer + dst_offset;
588 if constexpr (!ParticleType::is_soa_particle) {
593 dst +=
sizeof(uint64_t);
595 int array_start_index = AMREX_SPACEDIM +
NStructReal;
596 for (
int i = 0; i < NArrayReal; ++i)
598 if (comm_real[array_start_index + i])
601 dst +=
sizeof(ParticleReal);
604 int runtime_start_index = AMREX_SPACEDIM +
NStructReal + NArrayReal;
607 if (comm_real[runtime_start_index + i])
610 dst +=
sizeof(ParticleReal);
614 for (
int i = 0; i < NArrayInt; ++i)
616 if (comm_int[array_start_index + i])
622 runtime_start_index = 2 +
NStructInt + NArrayInt;
625 if (comm_int[runtime_start_index + i])
633 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
639 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
645 if constexpr(NArrayReal > 0) {
646 for (
int i = 0; i < NArrayReal; ++i) {
655 if constexpr(NArrayInt > 0) {
656 for (
int i = 0; i < NArrayInt; ++i) {
663 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
669 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
671 for (
int i = 0; i <
NAR; ++i) {
674 for (
int i = 0; i <
NAI; ++i) {
687 template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt,
691 template <
typename T>
695 static constexpr
int NAR = NArrayReal;
696 static constexpr
int NAI = NArrayInt;
704 using AoS = std::conditional_t<
705 ParticleType::is_soa_particle,
710 using SoA = std::conditional_t<
711 ParticleType::is_soa_particle,
733 void define (
int a_num_runtime_real,
int a_num_runtime_int)
744 decltype(
auto)
id (
int index) & {
745 if constexpr (!ParticleType::is_soa_particle) {
753 decltype(
auto)
id (
int index) const & {
754 if constexpr (!ParticleType::is_soa_particle) {
762 decltype(
auto)
cpu (
int index) & {
763 if constexpr (!ParticleType::is_soa_particle) {
771 decltype(
auto)
cpu (
int index) const & {
772 if constexpr (!ParticleType::is_soa_particle) {
781 if constexpr (!ParticleType::is_soa_particle) {
784 static_assert(NArrayReal == ParticleType::PTD::NAR,
"ParticleTile mismatch in R");
785 static_assert(NArrayInt == ParticleType::PTD::NAI,
"ParticleTile mismatch in I");
786 static_assert(0 == ParticleType::StorageParticleType::NReal,
"ParticleTile 2 mismatch in R");
787 static_assert(0 == ParticleType::StorageParticleType::NInt,
"ParticleTile 2 mismatch in I");
789 return m_soa_tile.GetRealData(position_index)[index];
796 if constexpr (!ParticleType::is_soa_particle) {
799 return m_soa_tile.GetRealData(position_index)[index];
817 if constexpr (!ParticleType::is_soa_particle) {
830 if constexpr (!ParticleType::is_soa_particle) {
843 if constexpr (!ParticleType::is_soa_particle) {
856 if constexpr (!ParticleType::is_soa_particle) {
869 if constexpr (!ParticleType::is_soa_particle) {
878 if constexpr(!ParticleType::is_soa_particle) {
886 if constexpr (!ParticleType::is_soa_particle) {
896 if constexpr (!ParticleType::is_soa_particle) {
905 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
911 template <
int NR = NArrayReal,
int NI = NArrayInt,
912 std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
917 if constexpr (!ParticleType::is_soa_particle) {
919 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
933 if constexpr (ParticleType::is_soa_particle) {
938 for (
int i = 0; i < NArrayReal; ++i) {
941 for (
int i = 0; i < NArrayInt; ++i) {
959 for (
int i = 0; i < NArrayReal; ++i) {
994 auto new_size =
m_soa_tile.GetRealData(comp).size() + npar;
995 m_soa_tile.GetRealData(comp).resize(new_size, v);
1011 for (
int i = 0; i < NArrayInt; ++i) {
1046 auto new_size =
m_soa_tile.GetIntData(comp).size() + npar;
1047 m_soa_tile.GetIntData(comp).resize(new_size, v);
1060 if constexpr (ParticleType::is_soa_particle) {
1068 rdata.shrink_to_fit();
1074 idata.shrink_to_fit();
1081 if constexpr (ParticleType::is_soa_particle) {
1089 nbytes += rdata.capacity() *
sizeof(ParticleReal);
1095 nbytes += idata.capacity()*
sizeof(
int);
1102 if constexpr (ParticleType::is_soa_particle) {
1103 GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1105 m_aos_tile().swap(other.GetArrayOfStructs()());
1110 rdata.swap(other.GetStructOfArrays().GetRealData(j));
1116 idata.swap(other.GetStructOfArrays().GetIntData(j));
1124 #ifdef AMREX_USE_GPU
1125 bool copy_real =
false;
1138 bool copy_int =
false;
1161 if constexpr (!ParticleType::is_soa_particle) {
1164 ptd.
m_aos =
nullptr;
1166 if constexpr (ParticleType::is_soa_particle) {
1171 if constexpr(NArrayReal > 0) {
1172 for (
int i = 0; i < NArrayReal; ++i) {
1176 if constexpr(NArrayInt > 0) {
1177 for (
int i = 0; i < NArrayInt; ++i) {
1187 #ifdef AMREX_USE_GPU
1188 if (copy_real || copy_int) {
1200 #ifdef AMREX_USE_GPU
1201 bool copy_real =
false;
1214 bool copy_int =
false;
1237 if constexpr (!ParticleType::is_soa_particle) {
1240 ptd.
m_aos =
nullptr;
1242 if constexpr (ParticleType::is_soa_particle) {
1247 if constexpr(NArrayReal > 0) {
1248 for (
int i = 0; i < NArrayReal; ++i) {
1252 if constexpr(NArrayInt > 0) {
1253 for (
int i = 0; i < NArrayInt; ++i) {
1263 #ifdef AMREX_USE_GPU
1264 if (copy_real || copy_int) {
#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:37
#define AMREX_GPU_HOST_DEVICE
Definition: AMReX_GpuQualifiers.H:20
#define AMREX_D_DECL(a, b, c)
Definition: AMReX_SPACE.H:104
Definition: AMReX_GpuAllocators.H:114
Definition: AMReX_ArrayOfStructs.H:13
Definition: AMReX_PODVector.H:246
A Real vector in SpaceDim-dimensional space.
Definition: AMReX_RealVect.H:32
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition: AMReX_Vector.H:27
void streamSynchronize() noexcept
Definition: AMReX_GpuDevice.H:237
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void * memcpy(void *dest, const void *src, std::size_t count)
Definition: AMReX_GpuUtility.H:214
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition: AMReX_GpuDevice.H:251
constexpr Long LastParticleID
Definition: AMReX_Particle.H:20
Definition: AMReX_Amr.cpp:49
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Dim3 end(BoxND< dim > const &box) noexcept
Definition: AMReX_Box.H:1890
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition: AMReX.cpp:221
const int[]
Definition: AMReX_BLProfiler.cpp:1664
Definition: AMReX_Particle.H:222
Definition: AMReX_Particle.H:188
static constexpr bool is_particle_tile_data
Definition: AMReX_ParticleTile.H:503
static constexpr int NAI
Definition: AMReX_ParticleTile.H:494
GpuArray< const int *, NArrayInt > m_idata
Definition: AMReX_ParticleTile.H:513
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SuperParticleType getSuperParticle(int index) const noexcept
Definition: AMReX_ParticleTile.H:635
const ParticleReal *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_rdata
Definition: AMReX_ParticleTile.H:579
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE id(const int index) const &
Definition: AMReX_ParticleTile.H:526
const int *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_idata
Definition: AMReX_ParticleTile.H:580
Long m_size
Definition: AMReX_ParticleTile.H:505
T_ParticleType ParticleType
Definition: AMReX_ParticleTile.H:495
static constexpr int NStructReal
Definition: AMReX_ParticleTile.H:498
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const ParticleReal * rdata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:556
int m_num_runtime_real
Definition: AMReX_ParticleTile.H:577
static constexpr int NStructInt
Definition: AMReX_ParticleTile.H:499
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const int * idata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:562
int m_num_runtime_int
Definition: AMReX_ParticleTile.H:578
std::conditional_t< T_ParticleType::is_soa_particle, void const *AMREX_RESTRICT, ParticleType const *AMREX_RESTRICT > AOS_PTR
Definition: AMReX_ParticleTile.H:508
T_ParticleType const & ParticleRefType
Definition: AMReX_ParticleTile.H:496
static constexpr int NAR
Definition: AMReX_ParticleTile.H:493
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE idcpu(const int index) const &
Definition: AMReX_ParticleTile.H:546
AOS_PTR m_aos
Definition: AMReX_ParticleTile.H:509
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const ParticleReal & pos(const int dir, const int index) const &
Definition: AMReX_ParticleTile.H:516
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void packParticleData(char *buffer, int src_index, Long dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition: AMReX_ParticleTile.H:583
const uint64_t * m_idcpu
Definition: AMReX_ParticleTile.H:511
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE cpu(const int index) const &
Definition: AMReX_ParticleTile.H:536
GpuArray< const ParticleReal *, NArrayReal > m_rdata
Definition: AMReX_ParticleTile.H:512
Definition: AMReX_ParticleTile.H:306
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const RealType & pos(int position_index) const &
Definition: AMReX_ParticleTile.H:338
static constexpr int NArrayReal
Definition: AMReX_ParticleTile.H:307
ParticleReal RealType
Definition: AMReX_ParticleTile.H:314
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleCPUWrapper cpu() const
Definition: AMReX_ParticleTile.H:327
static constexpr int NArrayInt
Definition: AMReX_ParticleTile.H:308
ConstPTD m_constparticle_tile_data
Definition: AMReX_ParticleTile.H:360
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition: AMReX_ParticleTile.H:335
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleIDWrapper id() const
Definition: AMReX_ParticleTile.H:330
static void NextID(Long nextid)
Reset on restart.
int m_index
Definition: AMReX_ParticleTile.H:363
static constexpr bool is_constsoa_particle
Definition: AMReX_ParticleTile.H:312
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstSoAParticle(ConstPTD const &ptd, long i)
Definition: AMReX_ParticleTile.H:317
static Long UnprotectedNextID()
This version can only be used inside omp critical.
uint64_t m_idcpu
Definition: AMReX_Particle.H:252
Definition: AMReX_Particle.H:140
Definition: AMReX_Particle.H:37
Definition: AMReX_ParticleTile.H:29
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:173
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void setSuperParticle(const SuperParticleType &sp, int index) const noexcept
Definition: AMReX_ParticleTile.H:268
T_ParticleType & ParticleRefType
Definition: AMReX_ParticleTile.H:34
uint64_t * m_idcpu
Definition: AMReX_ParticleTile.H:50
GpuArray< ParticleReal *, NAR > m_rdata
Definition: AMReX_ParticleTile.H:51
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SuperParticleType getSuperParticle(int index) const noexcept
Definition: AMReX_ParticleTile.H:225
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE idcpu(const int index) const &
Definition: AMReX_ParticleTile.H:90
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleReal & pos(const int dir, const int index) const &
Definition: AMReX_ParticleTile.H:60
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleReal * rdata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:100
static constexpr int NStructInt
Definition: AMReX_ParticleTile.H:38
GpuArray< int *, NAI > m_idata
Definition: AMReX_ParticleTile.H:52
T_ParticleType ParticleType
Definition: AMReX_ParticleTile.H:33
std::conditional_t< T_ParticleType::is_soa_particle, void *AMREX_RESTRICT, ParticleType *AMREX_RESTRICT > AOS_PTR
Definition: AMReX_ParticleTile.H:47
int m_num_runtime_int
Definition: AMReX_ParticleTile.H:55
Long m_size
Definition: AMReX_ParticleTile.H:44
static constexpr int NAR
Definition: AMReX_ParticleTile.H:30
ParticleReal *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_rdata
Definition: AMReX_ParticleTile.H:56
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE 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:122
int m_num_runtime_real
Definition: AMReX_ParticleTile.H:54
static constexpr bool is_particle_tile_data
Definition: AMReX_ParticleTile.H:42
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE cpu(const int index) const &
Definition: AMReX_ParticleTile.H:80
AOS_PTR m_aos
Definition: AMReX_ParticleTile.H:48
int *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_idata
Definition: AMReX_ParticleTile.H:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int * idata(const int attribute_index) const
Definition: AMReX_ParticleTile.H:106
static constexpr int NAI
Definition: AMReX_ParticleTile.H:31
static constexpr int NStructReal
Definition: AMReX_ParticleTile.H:37
AMREX_GPU_HOST_DEVICEdecltype(auto) AMREX_FORCE_INLINE id(const int index) const &
Definition: AMReX_ParticleTile.H:70
Definition: AMReX_ParticleTile.H:690
typename ParticleType::StorageParticleType StorageParticleType
Definition: AMReX_ParticleTile.H:716
int NumRealComps() const noexcept
Definition: AMReX_ParticleTile.H:1050
const AoS & GetArrayOfStructs() const
Definition: AMReX_ParticleTile.H:804
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal > const &vec)
Definition: AMReX_ParticleTile.H:985
int NumIntComps() const noexcept
Definition: AMReX_ParticleTile.H:1052
typename ParticleType::RealType RealType
Definition: AMReX_ParticleTile.H:697
int getNumNeighbors() const
Definition: AMReX_ParticleTile.H:884
AoS & GetArrayOfStructs()
Definition: AMReX_ParticleTile.H:803
amrex::PODVector< const int *, Allocator< const int * > > m_runtime_i_cptrs
Definition: AMReX_ParticleTile.H:1283
void push_back(const ParticleType &p)
Definition: AMReX_ParticleTile.H:906
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:713
static constexpr int NAI
Definition: AMReX_ParticleTile.H:696
ParticleTile(ParticleTile &&) noexcept=default
void push_back_real(int comp, const ParticleReal *beg, const ParticleReal *end)
Definition: AMReX_ParticleTile.H:968
static constexpr int NStructInt
Definition: AMReX_ParticleTile.H:700
amrex::Gpu::HostVector< const ParticleReal * > m_h_runtime_r_cptrs
Definition: AMReX_ParticleTile.H:1288
void setNumNeighbors(int num_neighbors)
Definition: AMReX_ParticleTile.H:876
amrex::Gpu::HostVector< int * > m_h_runtime_i_ptrs
Definition: AMReX_ParticleTile.H:1286
Long capacity() const
Definition: AMReX_ParticleTile.H:1078
int numTotalParticles() const
Returns the total number of particles, real and neighbor.
Definition: AMReX_ParticleTile.H:867
AoS m_aos_tile
Definition: AMReX_ParticleTile.H:1274
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition: AMReX_ParticleTile.H:815
ParticleTileDataType getParticleTileData()
Definition: AMReX_ParticleTile.H:1120
void push_back(const SuperParticleType &sp)
Definition: AMReX_ParticleTile.H:913
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition: AMReX_ParticleTile.H:854
amrex::PODVector< ParticleReal *, Allocator< ParticleReal * > > m_runtime_r_ptrs
Definition: AMReX_ParticleTile.H:1279
static constexpr int NAR
Definition: AMReX_ParticleTile.H:695
ConstParticleTileDataType getConstParticleTileData() const
Definition: AMReX_ParticleTile.H:1196
void shrink_to_fit()
Definition: AMReX_ParticleTile.H:1058
T_ParticleType ParticleType
Definition: AMReX_ParticleTile.H:694
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition: AMReX_ParticleTile.H:828
void push_back_int(int comp, amrex::Vector< int > const &vec)
Definition: AMReX_ParticleTile.H:1037
amrex::Gpu::HostVector< ParticleReal * > m_h_runtime_r_ptrs
Definition: AMReX_ParticleTile.H:1285
const SoA & GetStructOfArrays() const
Definition: AMReX_ParticleTile.H:807
void swap(ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > &other) noexcept
Definition: AMReX_ParticleTile.H:1100
void push_back_int(int comp, amrex::Vector< int >::const_iterator beg, amrex::Vector< int >::const_iterator end)
Definition: AMReX_ParticleTile.H:1029
void push_back_real(const std::array< ParticleReal, NArrayReal > &v)
Definition: AMReX_ParticleTile.H:958
int NumRuntimeRealComps() const noexcept
Definition: AMReX_ParticleTile.H:1054
SoA & GetStructOfArrays()
Definition: AMReX_ParticleTile.H:806
amrex::Gpu::HostVector< const int * > m_h_runtime_i_cptrs
Definition: AMReX_ParticleTile.H:1289
amrex::PODVector< const ParticleReal *, Allocator< const ParticleReal * > > m_runtime_r_cptrs
Definition: AMReX_ParticleTile.H:1282
RealType & pos(int index, int position_index) &
Definition: AMReX_ParticleTile.H:780
void resize(std::size_t count)
Definition: AMReX_ParticleTile.H:894
typename SoA::IntVector IntVector
Definition: AMReX_ParticleTile.H:715
void push_back_int(const std::array< int, NArrayInt > &v)
Definition: AMReX_ParticleTile.H:1010
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal >::const_iterator beg, amrex::Vector< amrex::ParticleReal >::const_iterator end)
Definition: AMReX_ParticleTile.H:977
Allocator< T > AllocatorType
Definition: AMReX_ParticleTile.H:692
int NumRuntimeIntComps() const noexcept
Definition: AMReX_ParticleTile.H:1056
void define(int a_num_runtime_real, int a_num_runtime_int)
Definition: AMReX_ParticleTile.H:733
bool empty() const
Definition: AMReX_ParticleTile.H:809
void push_back_int(int comp, int v)
Definition: AMReX_ParticleTile.H:1002
RealType pos(int index, int position_index) const &
Definition: AMReX_ParticleTile.H:794
decltype(auto) cpu(int index) &
Definition: AMReX_ParticleTile.H:762
SoA m_soa_tile
Definition: AMReX_ParticleTile.H:1275
void push_back_int(int comp, std::size_t npar, int v)
Definition: AMReX_ParticleTile.H:1045
bool m_defined
Definition: AMReX_ParticleTile.H:1277
void push_back_real(int comp, std::size_t npar, ParticleReal v)
Definition: AMReX_ParticleTile.H:993
void push_back_int(int comp, const int *beg, const int *end)
Definition: AMReX_ParticleTile.H:1020
typename SoA::RealVector RealVector
Definition: AMReX_ParticleTile.H:714
amrex::PODVector< int *, Allocator< int * > > m_runtime_i_ptrs
Definition: AMReX_ParticleTile.H:1280
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition: AMReX_ParticleTile.H:841
std::conditional_t< ParticleType::is_soa_particle, ThisParticleTileHasNoAoS, ArrayOfStructs< ParticleType, Allocator > > AoS
Definition: AMReX_ParticleTile.H:707
decltype(auto) id(int index) &
Definition: AMReX_ParticleTile.H:744
static constexpr int NStructReal
Definition: AMReX_ParticleTile.H:699
void push_back_real(int comp, ParticleReal v)
Definition: AMReX_ParticleTile.H:950
The struct used to store particles.
Definition: AMReX_Particle.H:295
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleIDWrapper id() &
Definition: AMReX_Particle.H:315
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition: AMReX_Particle.H:338
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType & rdata(int index) &
Definition: AMReX_Particle.H:356
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int & idata(int index) &
Definition: AMReX_Particle.H:427
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleCPUWrapper cpu() &
Definition: AMReX_Particle.H:312
Definition: AMReX_Particle.H:281
Definition: AMReX_ParticleTile.H:368
static constexpr int NArrayReal
Definition: AMReX_ParticleTile.H:369
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition: AMReX_ParticleTile.H:474
PTD m_particle_tile_data
Definition: AMReX_ParticleTile.H:442
static Long the_next_id
Definition: AMReX_ParticleTile.H:385
static constexpr int NArrayInt
Definition: AMReX_ParticleTile.H:370
int m_index
Definition: AMReX_ParticleTile.H:445
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleCPUWrapper cpu() &
Definition: AMReX_ParticleTile.H:390
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const uint64_t & idcpu() const &
Definition: AMReX_ParticleTile.H:405
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleCPUWrapper cpu() const &
Definition: AMReX_ParticleTile.H:399
ParticleReal RealType
Definition: AMReX_ParticleTile.H:377
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType pos(int position_index) const &
Definition: AMReX_ParticleTile.H:420
static constexpr bool is_constsoa_particle
Definition: AMReX_ParticleTile.H:374
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleIDWrapper id() &
Definition: AMReX_ParticleTile.H:393
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SoAParticle(PTD const &ptd, long i)
Definition: AMReX_ParticleTile.H:380
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition: AMReX_ParticleTile.H:410
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType & pos(int position_index) &
Definition: AMReX_ParticleTile.H:413
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleIDWrapper id() const &
Definition: AMReX_ParticleTile.H:402
static Long NextID()
Definition: AMReX_ParticleTile.H:453
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE uint64_t & idcpu() &
Definition: AMReX_ParticleTile.H:396
Definition: AMReX_StructOfArrays.H:16
Definition: AMReX_ParticleTile.H:683
Definition: AMReX_ParticleTile.H:681
Definition: AMReX_MakeParticle.H:11