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;
49 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
63 ParticleReal&
pos (
const int dir,
const int index)
const &
65 if constexpr(!ParticleType::is_soa_particle) {
66 return this->m_aos[index].pos(dir);
68 return this->m_rdata[dir][index];
73 decltype(
auto)
id (
const int index)
const &
75 if constexpr(!ParticleType::is_soa_particle) {
76 return this->m_aos[index].id();
83 decltype(
auto)
cpu (
const int index)
const &
85 if constexpr(!ParticleType::is_soa_particle) {
86 return this->m_aos[index].cpu();
93 decltype(
auto)
idcpu (
const int index)
const &
95 if constexpr(ParticleType::is_soa_particle) {
96 return this->m_idcpu[index];
103 ParticleReal *
rdata (
const int attribute_index)
const
105 return this->m_rdata[attribute_index];
109 int *
idata (
const int attribute_index)
const
111 return this->m_idata[attribute_index];
115 decltype(
auto)
operator[] (
const int index)
const
117 if constexpr (!ParticleType::is_soa_particle) {
126 const int* comm_real,
const int * comm_int)
const noexcept
129 auto* dst = buffer + dst_offset;
130 if constexpr (!ParticleType::is_soa_particle) {
134 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
135 dst +=
sizeof(uint64_t);
137 int array_start_index = 0;
138 if constexpr (!ParticleType::is_soa_particle) {
141 for (
int i = 0; i <
NAR; ++i)
143 if (comm_real[array_start_index + i])
145 memcpy(dst,
m_rdata[i] + src_index,
sizeof(ParticleReal));
146 dst +=
sizeof(ParticleReal);
149 int runtime_start_index = array_start_index +
NAR;
152 if (comm_real[runtime_start_index + i])
155 dst +=
sizeof(ParticleReal);
159 for (
int i = 0; i <
NAI; ++i)
161 if (comm_int[array_start_index + i])
163 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
170 if (comm_int[runtime_start_index + i])
180 const int* comm_real,
const int* comm_int)
const noexcept
183 const auto* src = buffer + src_offset;
184 if constexpr (!ParticleType::is_soa_particle) {
188 memcpy(
m_idcpu + dst_index, src,
sizeof(uint64_t));
189 src +=
sizeof(uint64_t);
191 int array_start_index = 0;
192 if constexpr (!ParticleType::is_soa_particle) {
195 for (
int i = 0; i <
NAR; ++i)
197 if (comm_real[array_start_index + i])
199 memcpy(
m_rdata[i] + dst_index, src,
sizeof(ParticleReal));
200 src +=
sizeof(ParticleReal);
203 int runtime_start_index = array_start_index +
NAR;
206 if (comm_real[runtime_start_index + i])
209 src +=
sizeof(ParticleReal);
213 for (
int i = 0; i <
NAI; ++i)
215 if (comm_int[array_start_index + i])
217 memcpy(
m_idata[i] + dst_index, src,
sizeof(
int));
224 if (comm_int[runtime_start_index + i])
232 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
238 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
244 for (
int i = 0; i <
NAR; ++i) {
252 for (
int i = 0; i <
NAI; ++i) {
258 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
265 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
266 for (
int i = 0; i <
NAR; ++i) {
269 for (
int i = 0; i <
NAI; ++i) {
275 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
279 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
280 m_aos[index].pos(i) = sp.pos(i);
283 m_aos[index].rdata(i) = sp.rdata(i);
285 for (
int i = 0; i <
NAR; ++i) {
288 m_aos[index].id() = sp.id();
289 m_aos[index].cpu() = sp.cpu();
291 m_aos[index].idata(i) = sp.idata(i);
293 for (
int i = 0; i <
NAI; ++i) {
298 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
303 for (
int i = 0; i <
NAR; ++i) {
304 m_rdata[i][index] = sp.rdata(i);
306 for (
int i = 0; i <
NAI; ++i) {
307 m_idata[i][index] = sp.idata(i);
313template <
int T_NArrayReal,
int T_NArrayInt>
369 static_assert(std::is_trivially_copyable<ParticleTileData<SoAParticleBase, NArrayReal, NArrayInt>>(),
"ParticleTileData is not trivially copyable");
375template <
int T_NArrayReal,
int T_NArrayInt>
447 static void NextID (Long nextid);
451 static_assert(std::is_trivially_copyable<ParticleTileData<SoAParticleBase, NArrayReal, NArrayInt>>(),
"ParticleTileData is not trivially copyable");
460template <
int NArrayReal,
int NArrayInt>
467#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
468#pragma omp critical (amrex_particle_nextid)
469#elif defined(AMREX_USE_OMP)
470#pragma omp atomic capture
472 next = the_next_id++;
475 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
481template <
int NArrayReal,
int NArrayInt>
485 Long next = the_next_id++;
487 amrex::Abort(
"SoAParticle<NArrayReal, NArrayInt>::NextID() -- too many particles");
492template <
int NArrayReal,
int NArrayInt>
496 the_next_id = nextid;
499template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt>
502 static constexpr int NAR = NArrayReal;
503 static constexpr int NAI = NArrayInt;
516 using AOS_PTR = std::conditional_t<T_ParticleType::is_soa_particle,
525 const ParticleReal&
pos (
const int dir,
const int index)
const &
527 if constexpr(!ParticleType::is_soa_particle) {
528 return this->m_aos[index].pos(dir);
530 return this->m_rdata[dir][index];
535 decltype(
auto)
id (
const int index)
const &
537 if constexpr(!ParticleType::is_soa_particle) {
538 return this->m_aos[index].id();
545 decltype(
auto)
cpu (
const int index)
const &
547 if constexpr(!ParticleType::is_soa_particle) {
548 return this->m_aos[index].cpu();
555 decltype(
auto)
idcpu (
const int index)
const &
557 if constexpr(ParticleType::is_soa_particle) {
558 return this->m_idcpu[index];
565 const ParticleReal *
rdata (
const int attribute_index)
const
567 return this->m_rdata[attribute_index];
571 const int *
idata (
const int attribute_index)
const
573 return this->m_idata[attribute_index];
577 decltype(
auto)
operator[] (
const int index)
const
579 if constexpr (!ParticleType::is_soa_particle) {
593 const int* comm_real,
const int * comm_int)
const noexcept
596 auto* dst = buffer + dst_offset;
597 if constexpr (!ParticleType::is_soa_particle) {
601 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
602 dst +=
sizeof(uint64_t);
604 int array_start_index = 0;
605 if constexpr (!ParticleType::is_soa_particle) {
608 for (
int i = 0; i < NArrayReal; ++i)
610 if (comm_real[array_start_index + i])
612 memcpy(dst,
m_rdata[i] + src_index,
sizeof(ParticleReal));
613 dst +=
sizeof(ParticleReal);
616 int runtime_start_index = array_start_index + NArrayReal;
619 if (comm_real[runtime_start_index + i])
622 dst +=
sizeof(ParticleReal);
626 for (
int i = 0; i < NArrayInt; ++i)
628 if (comm_int[array_start_index + i])
630 memcpy(dst,
m_idata[i] + src_index,
sizeof(
int));
634 runtime_start_index = 2 +
NStructInt + NArrayInt;
637 if (comm_int[runtime_start_index + i])
645 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
651 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
657 if constexpr(NArrayReal > 0) {
658 for (
int i = 0; i < NArrayReal; ++i) {
667 if constexpr(NArrayInt > 0) {
668 for (
int i = 0; i < NArrayInt; ++i) {
675 template <
typename T = ParticleType, std::enable_if_t<T::is_soa_particle,
int> = 0>
681 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {sp.
pos(i) =
m_rdata[i][index];}
683 for (
int i = 0; i <
NAR; ++i) {
686 for (
int i = 0; i <
NAI; ++i) {
699template <
typename T_ParticleType,
int NArrayReal,
int NArrayInt,
703 template <
typename T>
707 static constexpr int NAR = NArrayReal;
708 static constexpr int NAI = NArrayInt;
716 using AoS = std::conditional_t<
717 ParticleType::is_soa_particle,
722 using SoA = std::conditional_t<
723 ParticleType::is_soa_particle,
746 int a_num_runtime_real,
747 int a_num_runtime_int,
748 std::vector<std::string>* soa_rdata_names=
nullptr,
749 std::vector<std::string>* soa_idata_names=
nullptr
753 GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int, soa_rdata_names, soa_idata_names);
761 decltype(
auto)
id (
int index) & {
762 if constexpr (!ParticleType::is_soa_particle) {
770 decltype(
auto)
id (
int index)
const & {
771 if constexpr (!ParticleType::is_soa_particle) {
779 decltype(
auto)
cpu (
int index) & {
780 if constexpr (!ParticleType::is_soa_particle) {
788 decltype(
auto)
cpu (
int index)
const & {
789 if constexpr (!ParticleType::is_soa_particle) {
798 if constexpr (!ParticleType::is_soa_particle) {
801 static_assert(NArrayReal == ParticleType::PTD::NAR,
"ParticleTile mismatch in R");
802 static_assert(NArrayInt == ParticleType::PTD::NAI,
"ParticleTile mismatch in I");
803 static_assert(0 == ParticleType::StorageParticleType::NReal,
"ParticleTile 2 mismatch in R");
804 static_assert(0 == ParticleType::StorageParticleType::NInt,
"ParticleTile 2 mismatch in I");
806 return m_soa_tile.GetRealData(position_index)[index];
813 if constexpr (!ParticleType::is_soa_particle) {
816 return m_soa_tile.GetRealData(position_index)[index];
834 if constexpr (!ParticleType::is_soa_particle) {
847 if constexpr (!ParticleType::is_soa_particle) {
860 if constexpr (!ParticleType::is_soa_particle) {
873 if constexpr (!ParticleType::is_soa_particle) {
886 if constexpr (!ParticleType::is_soa_particle) {
895 if constexpr(!ParticleType::is_soa_particle) {
903 if constexpr (!ParticleType::is_soa_particle) {
913 if constexpr (!ParticleType::is_soa_particle) {
922 template <
typename T = ParticleType, std::enable_if_t<!T::is_soa_particle,
int> = 0>
928 template <
int NR = NArrayReal,
int NI = NArrayInt,
929 std::enable_if_t<NR != 0 || NI != 0, int> foo = 0>
934 if constexpr (!ParticleType::is_soa_particle) {
936 for (
int i = 0; i < AMREX_SPACEDIM; ++i) {
950 if constexpr (ParticleType::is_soa_particle) {
955 for (
int i = 0; i < NArrayReal; ++i) {
958 for (
int i = 0; i < NArrayInt; ++i) {
976 for (
int i = 0; i < NArrayReal; ++i) {
1011 auto new_size =
m_soa_tile.GetRealData(comp).size() + npar;
1012 m_soa_tile.GetRealData(comp).resize(new_size, v);
1028 for (
int i = 0; i < NArrayInt; ++i) {
1063 auto new_size =
m_soa_tile.GetIntData(comp).size() + npar;
1064 m_soa_tile.GetIntData(comp).resize(new_size, v);
1077 if constexpr (ParticleType::is_soa_particle) {
1085 rdata.shrink_to_fit();
1091 idata.shrink_to_fit();
1098 if constexpr (ParticleType::is_soa_particle) {
1106 nbytes += rdata.capacity() *
sizeof(ParticleReal);
1112 nbytes += idata.capacity()*
sizeof(
int);
1119 if constexpr (ParticleType::is_soa_particle) {
1120 GetStructOfArrays().GetIdCPUData().swap(other.GetStructOfArrays().GetIdCPUData());
1122 m_aos_tile().swap(other.GetArrayOfStructs()());
1127 rdata.swap(other.GetStructOfArrays().GetRealData(j));
1133 idata.swap(other.GetStructOfArrays().GetIntData(j));
1142 bool copy_real =
false;
1155 bool copy_int =
false;
1178 if constexpr (!ParticleType::is_soa_particle) {
1181 ptd.
m_aos =
nullptr;
1183 if constexpr (ParticleType::is_soa_particle) {
1188 if constexpr(NArrayReal > 0) {
1189 for (
int i = 0; i < NArrayReal; ++i) {
1193 if constexpr(NArrayInt > 0) {
1194 for (
int i = 0; i < NArrayInt; ++i) {
1205 if (copy_real || copy_int) {
1218 bool copy_real =
false;
1231 bool copy_int =
false;
1254 if constexpr (!ParticleType::is_soa_particle) {
1257 ptd.
m_aos =
nullptr;
1259 if constexpr (ParticleType::is_soa_particle) {
1264 if constexpr(NArrayReal > 0) {
1265 for (
int i = 0; i < NArrayReal; ++i) {
1269 if constexpr(NArrayInt > 0) {
1270 for (
int i = 0; i < NArrayInt; ++i) {
1281 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
Definition AMReX_GpuAllocators.H:114
Definition AMReX_ArrayOfStructs.H:13
Definition AMReX_PODVector.H:262
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
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:230
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:512
static constexpr int NAI
Definition AMReX_ParticleTile.H:503
GpuArray< const int *, NArrayInt > m_idata
Definition AMReX_ParticleTile.H:522
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:647
const ParticleReal *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_rdata
Definition AMReX_ParticleTile.H:588
const int *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_idata
Definition AMReX_ParticleTile.H:589
Long m_size
Definition AMReX_ParticleTile.H:514
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:504
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:507
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const ParticleReal & pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:525
int m_num_runtime_real
Definition AMReX_ParticleTile.H:586
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:571
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:508
int m_num_runtime_int
Definition AMReX_ParticleTile.H:587
std::conditional_t< T_ParticleType::is_soa_particle, void const *AMREX_RESTRICT, ParticleType const *AMREX_RESTRICT > AOS_PTR
Definition AMReX_ParticleTile.H:517
T_ParticleType const & ParticleRefType
Definition AMReX_ParticleTile.H:505
static constexpr int NAR
Definition AMReX_ParticleTile.H:502
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:555
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:518
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:592
const uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:520
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:545
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:565
GpuArray< const ParticleReal *, NArrayReal > m_rdata
Definition AMReX_ParticleTile.H:521
Definition AMReX_ParticleTile.H:315
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:316
ParticleReal RealType
Definition AMReX_ParticleTile.H:323
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleCPUWrapper cpu() const
Definition AMReX_ParticleTile.H:336
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:317
ConstPTD m_constparticle_tile_data
Definition AMReX_ParticleTile.H:371
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition AMReX_ParticleTile.H:344
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleIDWrapper id() const
Definition AMReX_ParticleTile.H:339
static void NextID(Long nextid)
Reset on restart.
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const RealType & pos(int position_index) const &
Definition AMReX_ParticleTile.H:347
int m_index
Definition AMReX_ParticleTile.H:372
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:321
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstSoAParticle(ConstPTD const &ptd, long i)
Definition AMReX_ParticleTile.H:326
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_Array.H:34
uint64_t m_idcpu
Definition AMReX_Particle.H:252
Definition AMReX_Particle.H:140
Definition AMReX_Particle.H:37
Definition AMReX_ParticleTile.H:32
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:179
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void setSuperParticle(const SuperParticleType &sp, int index) const noexcept
Definition AMReX_ParticleTile.H:277
T_ParticleType & ParticleRefType
Definition AMReX_ParticleTile.H:37
uint64_t * m_idcpu
Definition AMReX_ParticleTile.H:53
GpuArray< ParticleReal *, NAR > m_rdata
Definition AMReX_ParticleTile.H:54
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE decltype(auto) cpu(const int index) const &
Definition AMReX_ParticleTile.H:83
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SuperParticleType getSuperParticle(int index) const noexcept
Definition AMReX_ParticleTile.H:234
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE decltype(auto) idcpu(const int index) const &
Definition AMReX_ParticleTile.H:93
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleReal * rdata(const int attribute_index) const
Definition AMReX_ParticleTile.H:103
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:41
GpuArray< int *, NAI > m_idata
Definition AMReX_ParticleTile.H:55
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:36
std::conditional_t< T_ParticleType::is_soa_particle, void *AMREX_RESTRICT, ParticleType *AMREX_RESTRICT > AOS_PTR
Definition AMReX_ParticleTile.H:50
int m_num_runtime_int
Definition AMReX_ParticleTile.H:58
Long m_size
Definition AMReX_ParticleTile.H:47
static constexpr int NAR
Definition AMReX_ParticleTile.H:33
ParticleReal *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_rdata
Definition AMReX_ParticleTile.H:59
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:125
int m_num_runtime_real
Definition AMReX_ParticleTile.H:57
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTile.H:45
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int * idata(const int attribute_index) const
Definition AMReX_ParticleTile.H:109
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleReal & pos(const int dir, const int index) const &
Definition AMReX_ParticleTile.H:63
AOS_PTR m_aos
Definition AMReX_ParticleTile.H:51
int *AMREX_RESTRICT *AMREX_RESTRICT m_runtime_idata
Definition AMReX_ParticleTile.H:60
static constexpr int NAI
Definition AMReX_ParticleTile.H:34
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:40
Definition AMReX_ParticleTile.H:702
typename ParticleType::StorageParticleType StorageParticleType
Definition AMReX_ParticleTile.H:728
int NumRealComps() const noexcept
Definition AMReX_ParticleTile.H:1067
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal > const &vec)
Definition AMReX_ParticleTile.H:1002
int NumIntComps() const noexcept
Definition AMReX_ParticleTile.H:1069
typename ParticleType::RealType RealType
Definition AMReX_ParticleTile.H:709
int getNumNeighbors() const
Definition AMReX_ParticleTile.H:901
amrex::PODVector< const int *, Allocator< const int * > > m_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1300
void push_back(const ParticleType &p)
Definition AMReX_ParticleTile.H:923
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:725
const SoA & GetStructOfArrays() const
Definition AMReX_ParticleTile.H:824
static constexpr int NAI
Definition AMReX_ParticleTile.H:708
ParticleTile(ParticleTile &&) noexcept=default
void push_back_real(int comp, const ParticleReal *beg, const ParticleReal *end)
Definition AMReX_ParticleTile.H:985
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_ParticleTile.H:745
static constexpr int NStructInt
Definition AMReX_ParticleTile.H:712
amrex::Gpu::HostVector< const ParticleReal * > m_h_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1305
void setNumNeighbors(int num_neighbors)
Definition AMReX_ParticleTile.H:893
amrex::Gpu::HostVector< int * > m_h_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1303
Long capacity() const
Definition AMReX_ParticleTile.H:1095
int numTotalParticles() const
Returns the total number of particles, real and neighbor.
Definition AMReX_ParticleTile.H:884
AoS m_aos_tile
Definition AMReX_ParticleTile.H:1291
std::size_t size() const
Returns the total number of particles (real and neighbor)
Definition AMReX_ParticleTile.H:832
ParticleTileDataType getParticleTileData()
Definition AMReX_ParticleTile.H:1137
void push_back(const SuperParticleType &sp)
Definition AMReX_ParticleTile.H:930
int numNeighborParticles() const
Returns the number of neighbor particles (excluding reals)
Definition AMReX_ParticleTile.H:871
amrex::PODVector< ParticleReal *, Allocator< ParticleReal * > > m_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1296
const AoS & GetArrayOfStructs() const
Definition AMReX_ParticleTile.H:821
static constexpr int NAR
Definition AMReX_ParticleTile.H:707
ConstParticleTileDataType getConstParticleTileData() const
Definition AMReX_ParticleTile.H:1213
void shrink_to_fit()
Definition AMReX_ParticleTile.H:1075
T_ParticleType ParticleType
Definition AMReX_ParticleTile.H:706
int numParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:845
void push_back_int(int comp, amrex::Vector< int > const &vec)
Definition AMReX_ParticleTile.H:1054
amrex::Gpu::HostVector< ParticleReal * > m_h_runtime_r_ptrs
Definition AMReX_ParticleTile.H:1302
void swap(ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > &other) noexcept
Definition AMReX_ParticleTile.H:1117
void push_back_int(int comp, amrex::Vector< int >::const_iterator beg, amrex::Vector< int >::const_iterator end)
Definition AMReX_ParticleTile.H:1046
void push_back_real(const std::array< ParticleReal, NArrayReal > &v)
Definition AMReX_ParticleTile.H:975
int NumRuntimeRealComps() const noexcept
Definition AMReX_ParticleTile.H:1071
amrex::Gpu::HostVector< const int * > m_h_runtime_i_cptrs
Definition AMReX_ParticleTile.H:1306
amrex::PODVector< const ParticleReal *, Allocator< const ParticleReal * > > m_runtime_r_cptrs
Definition AMReX_ParticleTile.H:1299
AoS & GetArrayOfStructs()
Definition AMReX_ParticleTile.H:820
RealType & pos(int index, int position_index) &
Definition AMReX_ParticleTile.H:797
void resize(std::size_t count)
Definition AMReX_ParticleTile.H:911
typename SoA::IntVector IntVector
Definition AMReX_ParticleTile.H:727
void push_back_int(const std::array< int, NArrayInt > &v)
Definition AMReX_ParticleTile.H:1027
void push_back_real(int comp, amrex::Vector< amrex::ParticleReal >::const_iterator beg, amrex::Vector< amrex::ParticleReal >::const_iterator end)
Definition AMReX_ParticleTile.H:994
Allocator< T > AllocatorType
Definition AMReX_ParticleTile.H:704
int NumRuntimeIntComps() const noexcept
Definition AMReX_ParticleTile.H:1073
bool empty() const
Definition AMReX_ParticleTile.H:826
void push_back_int(int comp, int v)
Definition AMReX_ParticleTile.H:1019
RealType pos(int index, int position_index) const &
Definition AMReX_ParticleTile.H:811
decltype(auto) cpu(int index) &
Definition AMReX_ParticleTile.H:779
SoA m_soa_tile
Definition AMReX_ParticleTile.H:1292
SoA & GetStructOfArrays()
Definition AMReX_ParticleTile.H:823
void push_back_int(int comp, std::size_t npar, int v)
Definition AMReX_ParticleTile.H:1062
bool m_defined
Definition AMReX_ParticleTile.H:1294
void push_back_real(int comp, std::size_t npar, ParticleReal v)
Definition AMReX_ParticleTile.H:1010
void push_back_int(int comp, const int *beg, const int *end)
Definition AMReX_ParticleTile.H:1037
typename SoA::RealVector RealVector
Definition AMReX_ParticleTile.H:726
amrex::PODVector< int *, Allocator< int * > > m_runtime_i_ptrs
Definition AMReX_ParticleTile.H:1297
int numRealParticles() const
Returns the number of real particles (excluding neighbors)
Definition AMReX_ParticleTile.H:858
std::conditional_t< ParticleType::is_soa_particle, ThisParticleTileHasNoAoS, ArrayOfStructs< ParticleType, Allocator > > AoS
Definition AMReX_ParticleTile.H:719
static constexpr int NStructReal
Definition AMReX_ParticleTile.H:711
void push_back_real(int comp, ParticleReal v)
Definition AMReX_ParticleTile.H:967
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 ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:312
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int & idata(int index) &
Definition AMReX_Particle.H:427
Definition AMReX_Particle.H:281
Definition AMReX_ParticleTile.H:377
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE const uint64_t & idcpu() const &
Definition AMReX_ParticleTile.H:414
static constexpr int NArrayReal
Definition AMReX_ParticleTile.H:378
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_ParticleTile.H:483
PTD m_particle_tile_data
Definition AMReX_ParticleTile.H:453
static Long the_next_id
Definition AMReX_ParticleTile.H:394
static constexpr int NArrayInt
Definition AMReX_ParticleTile.H:379
int m_index
Definition AMReX_ParticleTile.H:454
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleCPUWrapper cpu() &
Definition AMReX_ParticleTile.H:399
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleCPUWrapper cpu() const &
Definition AMReX_ParticleTile.H:408
ParticleReal RealType
Definition AMReX_ParticleTile.H:386
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType pos(int position_index) const &
Definition AMReX_ParticleTile.H:429
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTile.H:383
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ParticleIDWrapper id() &
Definition AMReX_ParticleTile.H:402
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE SoAParticle(PTD const &ptd, long i)
Definition AMReX_ParticleTile.H:389
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealVect pos() const &
Definition AMReX_ParticleTile.H:419
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE uint64_t & idcpu() &
Definition AMReX_ParticleTile.H:405
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE ConstParticleIDWrapper id() const &
Definition AMReX_ParticleTile.H:411
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RealType & pos(int position_index) &
Definition AMReX_ParticleTile.H:422
static Long NextID()
Definition AMReX_ParticleTile.H:462
Definition AMReX_StructOfArrays.H:20
Definition AMReX_ParticleTile.H:695
Definition AMReX_ParticleTile.H:693
Definition AMReX_MakeParticle.H:13