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;
30template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
33 static constexpr int NAR = NArrayReal;
34 static constexpr int NAI = NArrayInt;
51 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
65 decltype(
auto)
pos (
const int dir,
const int index)
const &
67 if constexpr(!ParticleType::is_soa_particle) {
68 return this->m_aos[index].pos(dir);
70 return this->m_rdata[dir][index];
75 decltype(
auto)
id (
const int index)
const &
77 if constexpr(!ParticleType::is_soa_particle) {
78 return this->m_aos[index].id();
85 decltype(
auto)
cpu (
const int index)
const &
87 if constexpr(!ParticleType::is_soa_particle) {
88 return this->m_aos[index].cpu();
95 decltype(
auto)
idcpu (
const int index)
const &
97 if constexpr(ParticleType::is_soa_particle) {
98 return this->m_idcpu[index];
100 return this->m_aos[index].idcpu();
105 ParticleReal *
rdata (
const int attribute_index)
const
107 return this->m_rdata[attribute_index];
111 int *
idata (
const int attribute_index)
const
113 return this->m_idata[attribute_index];
117 decltype(
auto)
operator[] (
const int index)
const
119 if constexpr (!ParticleType::is_soa_particle) {
128 const int* comm_real,
const int * comm_int)
const noexcept
131 auto* dst = buffer + dst_offset;
132 if constexpr (!ParticleType::is_soa_particle) {
136 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
137 dst +=
sizeof(uint64_t);
139 int array_start_index = 0;
140 if constexpr (!ParticleType::is_soa_particle) {
143 for (
int i = 0; i <
NAR; ++i)
145 if (comm_real[array_start_index + i])
147 memcpy(dst,
m_rdata[i] + src_index,
sizeof(ParticleReal));
148 dst +=
sizeof(ParticleReal);
151 int runtime_start_index = array_start_index +
NAR;
154 if (comm_real[runtime_start_index + i])
157 dst +=
sizeof(ParticleReal);
161 for (
int i = 0; i <
NAI; ++i)
163 if (comm_int[array_start_index + i])
165 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
172 if (comm_int[runtime_start_index + i])
182 const int* comm_real,
const int* comm_int)
const noexcept
185 const auto* src = buffer + src_offset;
186 if constexpr (!ParticleType::is_soa_particle) {
190 memcpy(
m_idcpu + dst_index, src,
sizeof(uint64_t));
191 src +=
sizeof(uint64_t);
193 int array_start_index = 0;
194 if constexpr (!ParticleType::is_soa_particle) {
197 if constexpr (
NAR > 0) {
198 for (
int i = 0; i <
NAR; ++i)
200 if (comm_real[array_start_index + i])
202 memcpy(
m_rdata[i] + dst_index, src,
sizeof(ParticleReal));
203 src +=
sizeof(ParticleReal);
207 int runtime_start_index = array_start_index +
NAR;
210 if (comm_real[runtime_start_index + i])
213 src +=
sizeof(ParticleReal);
217 if constexpr (
NAI > 0) {
218 for (
int i = 0; i <
NAI; ++i)
220 if (comm_int[array_start_index + i])
222 memcpy(
m_idata[i] + dst_index, src,
sizeof(
int));
230 if (comm_int[runtime_start_index + i])
238 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
244 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
250 if constexpr (
NAR >0) {
251 for (
int i = 0; i <
NAR; ++i) {
260 if constexpr (
NAI > 0) {
261 for (
int i = 0; i <
NAI; ++i) {
268 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
275 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
276 for (
int i = 0; i <
NAR; ++i) {
279 for (
int i = 0; i <
NAI; ++i) {
285 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
289 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
290 m_aos[index].pos(i) = sp.pos(i);
293 m_aos[index].rdata(i) = sp.rdata(i);
295 for (
int i = 0; i <
NAR; ++i) {
298 m_aos[index].id() = sp.id();
299 m_aos[index].cpu() = sp.cpu();
301 m_aos[index].idata(i) = sp.idata(i);
303 for (
int i = 0; i <
NAI; ++i) {
308 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
313 for (
int i = 0; i <
NAR; ++i) {
314 m_rdata[i][index] = sp.rdata(i);
316 for (
int i = 0; i <
NAI; ++i) {
317 m_idata[i][index] = sp.idata(i);
323template <
int T_NArrayReal,
int T_NArrayInt>
380 static_assert(std::is_trivially_copyable<ConstPTD>(),
"ParticleTileData is not trivially copyable");
386template <
int T_NArrayReal,
int T_NArrayInt>
459 static void NextID (Long nextid);
463 static_assert(std::is_trivially_copyable<PTD>(),
"ParticleTileData is not trivially copyable");
472template <
int NArrayReal,
int NArrayInt>
479#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
480#pragma omp critical (amrex_particle_nextid)
481#elif defined(AMREX_USE_OMP)
482#pragma omp atomic capture
484 next = the_next_id++;
487 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
493template <
int NArrayReal,
int NArrayInt>
497 Long next = the_next_id++;
499 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
504template <
int NArrayReal,
int NArrayInt>
508 the_next_id = nextid;
511template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
514 static constexpr int NAR = NArrayReal;
515 static constexpr int NAI = NArrayInt;
530 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
539 decltype(
auto)
pos (
const int dir,
const int index)
const &
541 if constexpr(!ParticleType::is_soa_particle) {
542 return this->m_aos[index].pos(dir);
544 return this->m_rdata[dir][index];
549 decltype(
auto)
id (
const int index)
const &
551 if constexpr(!ParticleType::is_soa_particle) {
552 return this->m_aos[index].id();
559 decltype(
auto)
cpu (
const int index)
const &
561 if constexpr(!ParticleType::is_soa_particle) {
562 return this->m_aos[index].cpu();
569 decltype(
auto)
idcpu (
const int index)
const &
571 if constexpr(ParticleType::is_soa_particle) {
572 return this->m_idcpu[index];
574 return this->m_aos[index].idcpu();
579 const ParticleReal *
rdata (
const int attribute_index)
const
581 return this->m_rdata[attribute_index];
585 const int *
idata (
const int attribute_index)
const
587 return this->m_idata[attribute_index];
591 decltype(
auto)
operator[] (
const int index)
const
593 if constexpr (!ParticleType::is_soa_particle) {
607 const int* comm_real,
const int * comm_int)
const noexcept
610 auto* dst = buffer + dst_offset;
611 if constexpr (!ParticleType::is_soa_particle) {
615 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
616 dst +=
sizeof(uint64_t);
618 int array_start_index = 0;
619 if constexpr (!ParticleType::is_soa_particle) {
622 if constexpr (NArrayReal > 0) {
623 for (
int i = 0; i < NArrayReal; ++i)
625 if (comm_real[array_start_index + i])
627 memcpy(dst,
m_rdata[i] + src_index,
sizeof(ParticleReal));
628 dst +=
sizeof(ParticleReal);
632 int runtime_start_index = array_start_index + NArrayReal;
635 if (comm_real[runtime_start_index + i])
638 dst +=
sizeof(ParticleReal);
642 if constexpr (NArrayInt > 0) {
643 for (
int i = 0; i < NArrayInt; ++i)
645 if (comm_int[array_start_index + i])
647 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
652 runtime_start_index = 2 +
NStructInt + NArrayInt;
655 if (comm_int[runtime_start_index + 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) {
675 if constexpr(NArrayReal > 0) {
676 for (
int i = 0; i < NArrayReal; ++i) {
685 if constexpr(NArrayInt > 0) {
686 for (
int i = 0; i < NArrayInt; ++i) {
693 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
699 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
701 for (
int i = 0; i <
NAR; ++i) {
704 for (
int i = 0; i <
NAI; ++i) {
717template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt,
721 template <
typename T>
725 static constexpr int NAR = NArrayReal;
726 static constexpr int NAI = NArrayInt;
734 using AoS = std::conditional_t<
735 ParticleType::is_soa_particle,
740 using SoA = std::conditional_t<
741 ParticleType::is_soa_particle,
767 int a_num_runtime_real,
768 int a_num_runtime_int,
769 std::vector<std::string>* soa_rdata_names=
nullptr,
770 std::vector<std::string>* soa_idata_names=
nullptr,
771 Arena* a_arena=
nullptr
774 GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int, soa_rdata_names, soa_idata_names);
783 if constexpr (ParticleType::is_soa_particle) {
786 "ParticleTile with PolymorphicArenaAllocator redefined with "
787 "different memory arena");
791 "ParticleTile with PolymorphicArenaAllocator redefined with "
792 "different memory arena");
797 "ParticleTile with PolymorphicArenaAllocator defined with no memory arena! "
798 "Make sure to call setArena() on the ParticleContainer before initialization or "
799 "to pass an Arena to ParticleTile::define()");
801 if constexpr (ParticleType::is_soa_particle) {
818 decltype(
auto)
id (
int index) & {
819 if constexpr (!ParticleType::is_soa_particle) {
827 decltype(
auto)
id (
int index)
const & {
828 if constexpr (!ParticleType::is_soa_particle) {
836 decltype(
auto)
cpu (
int index) & {
837 if constexpr (!ParticleType::is_soa_particle) {
845 decltype(
auto)
cpu (
int index)
const & {
846 if constexpr (!ParticleType::is_soa_particle) {
855 if constexpr (!ParticleType::is_soa_particle) {
858 static_assert(NArrayReal == ParticleType::PTD::NAR,
"ParticleTile mismatch in R");
859 static_assert(NArrayInt == ParticleType::PTD::NAI,
"ParticleTile mismatch in I");
860 static_assert(0 == ParticleType::StorageParticleType::NReal,
"ParticleTile 2 mismatch in R");
861 static_assert(0 == ParticleType::StorageParticleType::NInt,
"ParticleTile 2 mismatch in I");
863 return m_soa_tile.GetRealData(position_index)[index];
870 if constexpr (!ParticleType::is_soa_particle) {
873 return m_soa_tile.GetRealData(position_index)[index];
891 if constexpr (!ParticleType::is_soa_particle) {
904 if constexpr (!ParticleType::is_soa_particle) {
917 if constexpr (!ParticleType::is_soa_particle) {
930 if constexpr (!ParticleType::is_soa_particle) {
943 if constexpr (!ParticleType::is_soa_particle) {
952 if constexpr(!ParticleType::is_soa_particle) {
960 if constexpr (!ParticleType::is_soa_particle) {
970 if constexpr (!ParticleType::is_soa_particle) {
978 if constexpr (!ParticleType::is_soa_particle) {
987 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
993 template <
int NR = NArrayReal,
int NI = NArrayInt,
994 std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
999 if constexpr (!ParticleType::is_soa_particle) {
1001 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
1015 if constexpr (ParticleType::is_soa_particle) {
1020 for (
int i = 0; i < NArrayReal; ++i) {
1023 for (
int i = 0; i < NArrayInt; ++i) {
1041 for (
int i = 0; i < NArrayReal; ++i) {
1051 auto it =
m_soa_tile.GetRealData(comp).end();
1076 auto new_size =
m_soa_tile.GetRealData(comp).size() + npar;
1077 m_soa_tile.GetRealData(comp).resize(new_size, v);
1093 for (
int i = 0; i < NArrayInt; ++i) {
1128 auto new_size =
m_soa_tile.GetIntData(comp).size() + npar;
1129 m_soa_tile.GetIntData(comp).resize(new_size, v);
1142 if constexpr (ParticleType::is_soa_particle) {
1150 rdata.shrink_to_fit();
1156 idata.shrink_to_fit();
1163 if constexpr (ParticleType::is_soa_particle) {
1171 nbytes += rdata.capacity() *
sizeof(ParticleReal);
1177 nbytes += idata.capacity()*
sizeof(int);
1184 if constexpr (ParticleType::is_soa_particle) {
1185 GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1187 m_aos_tile().swap(other.GetArrayOfStructs()());
1192 rdata.swap(other.GetStructOfArrays().GetRealData(j));
1198 idata.swap(other.GetStructOfArrays().GetIntData(j));
1207 bool copy_real =
false;
1220 bool copy_int =
false;
1243 if constexpr (!ParticleType::is_soa_particle) {
1246 ptd.
m_aos =
nullptr;
1248 if constexpr (ParticleType::is_soa_particle) {
1253 if constexpr(NArrayReal > 0) {
1254 for (
int i = 0; i < NArrayReal; ++i) {
1258 if constexpr(NArrayInt > 0) {
1259 for (
int i = 0; i < NArrayInt; ++i) {
1270 if (copy_real || copy_int) {
1283 bool copy_real =
false;
1296 bool copy_int =
false;
1319 if constexpr (!ParticleType::is_soa_particle) {
1322 ptd.
m_aos =
nullptr;
1324 if constexpr (ParticleType::is_soa_particle) {
1329 if constexpr(NArrayReal > 0) {
1330 for (
int i = 0; i < NArrayReal; ++i) {
1334 if constexpr(NArrayInt > 0) {
1335 for (
int i = 0; i < NArrayInt; ++i) {
1346 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:37
#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
Definition AMReX_PODVector.H:297
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:260
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:289
constexpr Long LastParticleID
Definition AMReX_Particle.H:21
Definition AMReX_Amr.cpp:49
GrowthStrategy
Definition AMReX_PODVector.H:248
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:1908
Definition AMReX_Particle.H:327
Definition AMReX_Particle.H:301
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:526
static constexpr int NAI
Definition AMReX_ParticleTile.H:515
int IntType
Definition AMReX_ParticleTile.H:519
GpuArray< const int *, NArrayInt > m_idata
Definition AMReX_ParticleTile.H:536
__host__ __device__ decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:569
__host__ __device__ const int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:585
Long m_size
Definition AMReX_ParticleTile.H:528
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:516
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:521
const int *restrict *restrict m_runtime_idata
Definition AMReX_ParticleTile.H:603
__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:606
int m_num_runtime_real
Definition AMReX_ParticleTile.H:600
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:522
ParticleReal RealType
Definition AMReX_ParticleTile.H:518
__host__ __device__ decltype(auto) pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:539
__host__ __device__ decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:559
int m_num_runtime_int
Definition AMReX_ParticleTile.H:601
T_ParticleType const & ParticleRefType
Definition AMReX_ParticleTile.H:517
static constexpr int NAR
Definition AMReX_ParticleTile.H:514
const ParticleReal *restrict *restrict m_runtime_rdata
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:531
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:532
const uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:534
__host__ __device__ SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:665
__host__ __device__ const ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:579
GpuArray< const ParticleReal *, NArrayReal > m_rdata
Definition AMReX_ParticleTile.H:535
Definition AMReX_ParticleTile.H:325
__host__ __device__ ConstParticleIDWrapper id() const
Definition AMReX_ParticleTile.H:350
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:326
ParticleReal RealType
Definition AMReX_ParticleTile.H:333
__host__ __device__ ConstSoAParticle(ConstPTD const &ptd, long i)
Definition AMReX_ParticleTile.H:337
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:327
ConstPTD m_constparticle_tile_data
Definition AMReX_ParticleTile.H:382
static void NextID(Long nextid)
Reset on restart.
int m_index
Definition AMReX_ParticleTile.H:383
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:331
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:358
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTile.H:355
__host__ __device__ ConstParticleCPUWrapper cpu() const
Definition AMReX_ParticleTile.H:347
int IntType
Definition AMReX_ParticleTile.H:334
Definition AMReX_Array.H:34
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:32
int *restrict *restrict m_runtime_idata
Definition AMReX_ParticleTile.H:62
__host__ __device__ SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:240
T_ParticleType & ParticleRefType
Definition AMReX_ParticleTile.H:37
__host__ __device__ decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:85
uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:55
GpuArray< ParticleReal *, NAR > m_rdata
Definition AMReX_ParticleTile.H:56
__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:181
__host__ __device__ decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:95
__host__ __device__ ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:105
__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:127
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:43
GpuArray< int *, NAI > m_idata
Definition AMReX_ParticleTile.H:57
ParticleReal RealType
Definition AMReX_ParticleTile.H:39
__host__ __device__ decltype(auto) pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:65
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:36
std::conditional_t< T_ParticleType::is_soa_particle, void *restrict, ParticleType *restrict > AOS_PTR
Definition AMReX_ParticleTile.H:52
int m_num_runtime_int
Definition AMReX_ParticleTile.H:60
Long m_size
Definition AMReX_ParticleTile.H:49
static constexpr int NAR
Definition AMReX_ParticleTile.H:33
int IntType
Definition AMReX_ParticleTile.H:40
int m_num_runtime_real
Definition AMReX_ParticleTile.H:59
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:47
ParticleReal *restrict *restrict m_runtime_rdata
Definition AMReX_ParticleTile.H:61
__host__ __device__ int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:111
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:53
static constexpr int NAI
Definition AMReX_ParticleTile.H:34
__host__ __device__ void setSuperParticle(const SuperParticleType &sp, int index) const noexcept
Definition AMReX_ParticleTile.H:287
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:42
Definition AMReX_ParticleTile.H:720
typename ParticleType::StorageParticleType StorageParticleType
Definition AMReX_ParticleTile.H:746
int NumRealComps() const noexcept
Definition AMReX_ParticleTile.H:1132
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal > const &vec)
Definition AMReX_ParticleTile.H:1067
int NumIntComps() const noexcept
Definition AMReX_ParticleTile.H:1134
typename ParticleType::RealType RealType
Definition AMReX_ParticleTile.H:727
int getNumNeighbors() const
Definition AMReX_ParticleTile.H:958
amrex::PODVector< const int *, Allocator< const int * > > m_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1365
void push_back(const ParticleType &p)
Definition AMReX_ParticleTile.H:988
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:743
const SoA & GetStructOfArrays() const
Definition AMReX_ParticleTile.H:881
static constexpr int NAI
Definition AMReX_ParticleTile.H:726
ParticleTile(ParticleTile &&) noexcept=default
void push_back_real(int comp, const ParticleReal *beg, const ParticleReal *end)
Definition AMReX_ParticleTile.H:1050
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:730
amrex::Gpu::HostVector< const ParticleReal * > m_h_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1370
void setNumNeighbors(int num_neighbors)
Definition AMReX_ParticleTile.H:950
amrex::Gpu::HostVector< int * > m_h_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1368
Long capacity() const
Definition AMReX_ParticleTile.H:1160
int numTotalParticles() const
Returns the total number of particles, real and neighbor.
Definition AMReX_ParticleTile.H:941
AoS m_aos_tile
Definition AMReX_ParticleTile.H:1356
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition AMReX_ParticleTile.H:889
static constexpr bool has_polymorphic_allocator
Definition AMReX_ParticleTile.H:751
ParticleTileDataType getParticleTileData()
Definition AMReX_ParticleTile.H:1202
void reserve(std::size_t capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTile.H:976
void push_back(const SuperParticleType &sp)
Definition AMReX_ParticleTile.H:995
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition AMReX_ParticleTile.H:928
amrex::PODVector< ParticleReal *, Allocator< ParticleReal * > > m_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1361
const AoS & GetArrayOfStructs() const
Definition AMReX_ParticleTile.H:878
static constexpr int NAR
Definition AMReX_ParticleTile.H:725
ConstParticleTileDataType getConstParticleTileData() const
Definition AMReX_ParticleTile.H:1278
void shrink_to_fit()
Definition AMReX_ParticleTile.H:1140
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:724
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:902
void push_back_int(int comp, amrex::Vector< int > const &vec)
Definition AMReX_ParticleTile.H:1119
amrex::Gpu::HostVector< ParticleReal * > m_h_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1367
void resize(std::size_t count, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTile.H:968
void swap(ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > &other) noexcept
Definition AMReX_ParticleTile.H:1182
void push_back_int(int comp, amrex::Vector< int >::const_iterator beg, amrex::Vector< int >::const_iterator end)
Definition AMReX_ParticleTile.H:1111
void push_back_real(const std::array< ParticleReal, NArrayReal > &v)
Definition AMReX_ParticleTile.H:1040
int NumRuntimeRealComps() const noexcept
Definition AMReX_ParticleTile.H:1136
amrex::Gpu::HostVector< const int * > m_h_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1371
amrex::PODVector< const ParticleReal *, Allocator< const ParticleReal * > > m_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1364
AoS & GetArrayOfStructs()
Definition AMReX_ParticleTile.H:877
RealType & pos(int index, int position_index) &
Definition AMReX_ParticleTile.H:854
typename SoA::IntVector IntVector
Definition AMReX_ParticleTile.H:745
void push_back_int(const std::array< int, NArrayInt > &v)
Definition AMReX_ParticleTile.H:1092
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal >::const_iterator beg, amrex::Vector< amrex::ParticleReal >::const_iterator end)
Definition AMReX_ParticleTile.H:1059
Allocator< T > AllocatorType
Definition AMReX_ParticleTile.H:722
int NumRuntimeIntComps() const noexcept
Definition AMReX_ParticleTile.H:1138
bool empty() const
Definition AMReX_ParticleTile.H:883
void push_back_int(int comp, int v)
Definition AMReX_ParticleTile.H:1084
RealType pos(int index, int position_index) const &
Definition AMReX_ParticleTile.H:868
decltype(auto) cpu(int index) &
Definition AMReX_ParticleTile.H:836
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:766
SoA m_soa_tile
Definition AMReX_ParticleTile.H:1357
SoA & GetStructOfArrays()
Definition AMReX_ParticleTile.H:880
void push_back_int(int comp, std::size_t npar, int v)
Definition AMReX_ParticleTile.H:1127
bool m_defined
Definition AMReX_ParticleTile.H:1359
void push_back_real(int comp, std::size_t npar, ParticleReal v)
Definition AMReX_ParticleTile.H:1075
void push_back_int(int comp, const int *beg, const int *end)
Definition AMReX_ParticleTile.H:1102
typename SoA::RealVector RealVector
Definition AMReX_ParticleTile.H:744
amrex::PODVector< int *, Allocator< int * > > m_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1362
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:915
std::conditional_t< ParticleType::is_soa_particle, ThisParticleTileHasNoAoS, ArrayOfStructs< ParticleType, Allocator > > AoS
Definition AMReX_ParticleTile.H:737
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:729
void push_back_real(int comp, ParticleReal v)
Definition AMReX_ParticleTile.H:1032
The struct used to store particles.
Definition AMReX_Particle.H:402
__host__ __device__ RealVect pos() const &
Definition AMReX_Particle.H:452
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:541
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:420
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:423
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:470
Definition AMReX_Particle.H:388
Definition AMReX_ParticleTile.H:388
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:389
__host__ __device__ uint64_t & idcpu() &
Definition AMReX_ParticleTile.H:417
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_ParticleTile.H:495
__host__ __device__ ConstParticleCPUWrapper cpu() const &
Definition AMReX_ParticleTile.H:420
PTD m_particle_tile_data
Definition AMReX_ParticleTile.H:465
static Long the_next_id
Definition AMReX_ParticleTile.H:406
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:390
__host__ __device__ const uint64_t & idcpu() const &
Definition AMReX_ParticleTile.H:426
int m_index
Definition AMReX_ParticleTile.H:466
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTile.H:431
ParticleReal RealType
Definition AMReX_ParticleTile.H:397
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_ParticleTile.H:411
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_ParticleTile.H:414
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:394
__host__ __device__ RealType & pos(int position_index) &
Definition AMReX_ParticleTile.H:434
int IntType
Definition AMReX_ParticleTile.H:398
__host__ __device__ SoAParticle(PTD const &ptd, long i)
Definition AMReX_ParticleTile.H:401
__host__ __device__ ConstParticleIDWrapper id() const &
Definition AMReX_ParticleTile.H:423
static Long NextID()
Definition AMReX_ParticleTile.H:474
__host__ __device__ RealType pos(int position_index) const &
Definition AMReX_ParticleTile.H:441
Definition AMReX_StructOfArrays.H:20
Definition AMReX_ParticleTile.H:713
Definition AMReX_ParticleTile.H:711
Definition AMReX_MakeParticle.H:13