1#ifndef AMREX_PARTICLETILERT_H_
2#define AMREX_PARTICLETILERT_H_
3#include <AMReX_Config.H>
23template <
class RType,
class IType>
62 explicit operator T* ()
const {
70template <
class RType,
class IType>
81 static constexpr bool is_const = std::is_const_v<RType>;
98 decltype(
m_idata) a_idata,
int a_n_real,
int a_n_int) noexcept :
106 template <
class aRType,
class aIType>
120 return this->m_rdata[dir *
m_capacity + index];
149 return this->m_idcpu[index];
153 RType *
rdata (
const int comp_index)
const &
156 return this->m_rdata + comp_index *
m_capacity;
160 IType *
idata (
const int comp_index)
const &
163 return this->m_idata + comp_index *
m_capacity;
170 return this->m_rdata[comp_index *
m_capacity + partice_index];
177 return this->m_idata[comp_index *
m_capacity + partice_index];
189 const int* comm_real,
const int * comm_int)
const noexcept
192 auto* dst = buffer + dst_offset;
194 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
195 dst +=
sizeof(uint64_t);
197 for (
int i = 0; i <
m_n_real; ++i) {
200 dst +=
sizeof(RType);
204 for (
int i = 0; i <
m_n_int; ++i) {
207 dst +=
sizeof(IType);
214 const int* comm_real,
const int* comm_int)
const noexcept
217 const auto* src = buffer + src_offset;
219 memcpy(
m_idcpu + dst_index, src,
sizeof(uint64_t));
220 src +=
sizeof(uint64_t);
222 for (
int i = 0; i <
m_n_real; ++i) {
225 src +=
sizeof(RType);
229 for (
int i = 0; i <
m_n_int; ++i) {
232 src +=
sizeof(IType);
248template <
class RType,
class IType>
264 m_particle_tile_data(ptd),
267 template <
class aRType,
class aIType>
270 template <
class aRType,
class aIType>
273 m_particle_tile_data(rhs.m_particle_tile_data),
274 m_index(rhs.m_index) {}
279 decltype(
auto)
cpu ()
const & {
return this->m_particle_tile_data.
cpu(m_index); }
282 decltype(
auto)
id ()
const & {
return this->m_particle_tile_data.
id(m_index); }
285 decltype(
auto)
idcpu ()
const & {
return this->m_particle_tile_data.
idcpu(m_index); }
288 RType&
rdata (
const int comp_index)
const & {
289 return this->m_particle_tile_data.
rdata(comp_index, m_index);
293 IType&
idata (
const int comp_index)
const & {
294 return this->m_particle_tile_data.
idata(comp_index, m_index);
302 this->m_particle_tile_data.
pos(0, m_index),
303 this->m_particle_tile_data.pos(1, m_index),
304 this->m_particle_tile_data.pos(2, m_index)
309 RType&
pos (
int position_index)
const & {
310 return this->m_particle_tile_data.
pos(position_index, m_index);
329 static_assert(std::is_trivially_copyable<PTD>(),
"ParticleTileData is not trivially copyable");
331 PTD m_particle_tile_data;
339template <
class RType,
class IType>
346#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
347#pragma omp critical (amrex_particle_nextid)
348#elif defined(AMREX_USE_OMP)
349#pragma omp atomic capture
354 amrex::Abort(
"RTSoAParticle<RType, IType>::NextID() -- too many particles");
360template <
class RType,
class IType>
366 amrex::Abort(
"RTSoAParticle<RType, IType>::NextID() -- too many particles");
371template <
class RType,
class IType>
378template<
class RType,
class IType>
381template <
class RType=ParticleReal,
class IType=
int>
412 int a_num_real_comps,
414 std::vector<std::string>* a_rdata_names=
nullptr,
415 std::vector<std::string>* a_idata_names=
nullptr,
416 Arena* a_arena=
nullptr
421 "ParticleTileRT redefined with different memory arena");
422 if (a_num_real_comps != m_n_real || a_num_int_comps != m_n_int) {
427 "ParticleTileRT defined with no memory arena! "
428 "Make sure to call setArena() on the ParticleContainer before initialization or "
429 "to pass an Arena to ParticleTile::define()");
432 m_n_real = a_num_real_comps;
433 m_n_int = a_num_int_comps;
436 if (a_rdata_names !=
nullptr) {
437 m_real_names = a_rdata_names;
439 if (a_idata_names !=
nullptr) {
440 m_int_names = a_idata_names;
534 if (m_real_names !=
nullptr) {
535 return *m_real_names;
537 return std::vector<std::string>();
545 if (m_int_names !=
nullptr) {
548 return std::vector<std::string>();
555 return {m_idcpu_data.data(), m_capacity};
561 return {m_idcpu_data.data(), m_capacity};
571 return {m_real_data.data() + comp_index * m_capacity, m_capacity};
581 return {m_real_data.data() + comp_index * m_capacity, m_capacity};
591 return {m_int_data.data() + comp_index * m_capacity, m_capacity};
601 return {m_int_data.data() + comp_index * m_capacity, m_capacity};
609 return GetRealData(get_idx_from_str(name, m_real_names));
617 return GetRealData(get_idx_from_str(name, m_real_names));
625 return GetIntData(get_idx_from_str(name, m_int_names));
633 return GetIntData(get_idx_from_str(name, m_int_names));
640 if (m_capacity < new_size) {
643 new_grown_capacity = align_capacity(new_grown_capacity);
654 if (m_capacity < new_capacity) {
657 new_grown_capacity = align_capacity(new_grown_capacity);
665 for (
auto [p,s] : addsizes) {
666 p->reserve(p->size()+s);
671 int new_n_real,
int new_n_int)
675 if (new_capacity <= new_size) {
676 new_capacity = new_size;
679 decltype(m_idcpu_data) new_idcpu_data;
680 decltype(m_real_data) new_real_data;
681 decltype(m_int_data) new_int_data;
683 new_idcpu_data.setArena(m_arena);
684 new_real_data.setArena(m_arena);
685 new_int_data.setArena(m_arena);
692 auto copy_size = std::min(m_size, new_size);
693 auto copy_n_real = std::min(m_n_real, new_n_real);
694 auto copy_n_int = std::min(m_n_int, new_n_int);
697 m_capacity = new_capacity;
698 m_n_real = new_n_real;
700 m_idcpu_data.swap(new_idcpu_data);
701 m_real_data.swap(new_real_data);
702 m_int_data.swap(new_int_data);
713 new_ptd.idcpu(i) = old_ptd.idcpu(i);
715 for (
int n = 0; n < copy_n_real; ++n) {
716 new_ptd.rdata(n, i) = old_ptd.rdata(n, i);
719 for (
int n = 0; n < copy_n_int; ++n) {
720 new_ptd.idata(n, i) = old_ptd.idata(n, i);
725 for (
size_type i = 0; i < copy_size; ++i) {
726 new_ptd.idcpu(i) = old_ptd.idcpu(i);
728 for (
int n = 0; n < copy_n_real; ++n) {
729 new_ptd.rdata(n, i) = old_ptd.rdata(n, i);
732 for (
int n = 0; n < copy_n_int; ++n) {
733 new_ptd.idata(n, i) = old_ptd.idata(n, i);
752 return m_capacity * (
sizeof(uint64_t) + m_n_real *
sizeof(RType) + m_n_int *
sizeof(IType));
757 std::swap(m_defined, other.m_defined);
758 std::swap(m_arena, other.m_arena);
759 std::swap(m_capacity, other.m_capacity);
760 std::swap(m_size, other.m_size);
761 std::swap(m_n_real, other.m_n_real);
762 std::swap(m_n_int, other.m_n_int);
763 m_idcpu_data.swap(other.m_idcpu_data);
764 m_real_data.swap(other.m_real_data);
765 m_int_data.swap(other.m_int_data);
766 std::swap(m_real_names, other.m_real_names);
767 std::swap(m_int_names, other.m_int_names);
805 static int get_idx_from_str (std::string
const & name, std::vector<std::string>* name_list) {
807 auto const pos = std::find(name_list->begin(), name_list->end(), name);
809 return static_cast<int>(std::distance(name_list->begin(), pos));
814 constexpr auto aligment_in_elements = aligment_in_bytes / std::gcd(
815 std::gcd(aligment_in_bytes,
sizeof(uint64_t)),
816 std::gcd(
sizeof(RType),
sizeof(IType))
821 bool m_defined =
false;
823 Arena* m_arena =
nullptr;
835 std::vector<std::string>* m_real_names =
nullptr;
836 std::vector<std::string>* m_int_names =
nullptr;
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_RESTRICT
Definition AMReX_Extension.H:32
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
A virtual base class for objects that manage their own dynamic memory allocation.
Definition AMReX_Arena.H:132
static const std::size_t align_size
Definition AMReX_Arena.H:317
virtual bool isDeviceAccessible() const
Definition AMReX_Arena.cpp:66
Dynamically allocated vector for trivially copyable data.
Definition AMReX_PODVector.H:308
amrex_long Long
Definition AMReX_INT.H:30
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:310
constexpr Long LastParticleID
Definition AMReX_Particle.H:21
Definition AMReX_Amr.cpp:50
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Definition AMReX_CTOParallelForImpl.H:193
GrowthStrategy
Definition AMReX_PODVector.H:250
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:36
std::size_t grow_podvector_capacity(GrowthStrategy strategy, std::size_t new_size, std::size_t old_capacity, std::size_t sizeof_T)
Definition AMReX_PODVector.H:268
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:241
std::size_t aligned_size(std::size_t align_requirement, std::size_t size) noexcept
Given a minimum required size in bytes, this returns the smallest size greater or equal to size that ...
Definition AMReX_Arena.H:33
Definition AMReX_ParticleTileRT.H:29
__host__ __device__ T * end() const
Definition AMReX_ParticleTileRT.H:57
__host__ __device__ T * data() const
Definition AMReX_ParticleTileRT.H:42
__host__ __device__ T * dataPtr() const
Definition AMReX_ParticleTileRT.H:47
__host__ __device__ T & operator[](const size_type i) const
Definition AMReX_ParticleTileRT.H:36
size_type m_capacity
Definition AMReX_ParticleTileRT.H:33
Long size_type
Definition AMReX_ParticleTileRT.H:30
T * m_data
Definition AMReX_ParticleTileRT.H:32
__host__ __device__ T * begin() const
Definition AMReX_ParticleTileRT.H:52
Definition AMReX_Particle.H:327
Definition AMReX_Particle.H:301
Definition AMReX_ParticleTileRT.H:335
static Long the_next_id
Definition AMReX_ParticleTileRT.H:336
Definition AMReX_Particle.H:259
Definition AMReX_Particle.H:154
Definition AMReX_ParticleTileRT.H:72
IType IntType
Definition AMReX_ParticleTileRT.H:78
RType *__restrict__ m_rdata
Definition AMReX_ParticleTileRT.H:87
__host__ __device__ RType * rdata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:153
__host__ __device__ constexpr ParticleTileDataRT()=default
static constexpr bool is_const
Definition AMReX_ParticleTileRT.H:81
RType RealType
Definition AMReX_ParticleTileRT.H:77
__host__ __device__ constexpr ParticleTileDataRT(size_type a_capacity, decltype(m_idcpu) a_idcpu, decltype(m_rdata) a_rdata, decltype(m_idata) a_idata, int a_n_real, int a_n_int) noexcept
Definition AMReX_ParticleTileRT.H:96
Long size_type
Definition AMReX_ParticleTileRT.H:74
__host__ __device__ IType * idata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:160
__host__ __device__ void packParticleData(char *buffer, size_type src_index, std::size_t dst_offset, const int *comm_real, const int *comm_int) const noexcept
Definition AMReX_ParticleTileRT.H:188
__host__ __device__ decltype(auto) idcpu(const size_type index) const &
Definition AMReX_ParticleTileRT.H:146
__host__ __device__ IType & idata(const int comp_index, const size_type partice_index) const &
Definition AMReX_ParticleTileRT.H:174
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTileRT.H:80
__host__ __device__ RType & rdata(const int comp_index, const size_type partice_index) const &
Definition AMReX_ParticleTileRT.H:167
__host__ __device__ decltype(auto) id(const size_type index) const &
Definition AMReX_ParticleTileRT.H:124
IType *__restrict__ m_idata
Definition AMReX_ParticleTileRT.H:88
size_type m_capacity
Definition AMReX_ParticleTileRT.H:83
__host__ __device__ RType & pos(const int dir, const size_type index) const &
Definition AMReX_ParticleTileRT.H:117
__host__ __device__ constexpr ParticleTileDataRT(ParticleTileDataRT< aRType, aIType > const &rhs) noexcept
Definition AMReX_ParticleTileRT.H:108
int m_n_real
Definition AMReX_ParticleTileRT.H:89
int m_n_int
Definition AMReX_ParticleTileRT.H:90
__host__ __device__ Particle< 0, 0 > getSuperParticle(size_type index) const noexcept
Definition AMReX_ParticleTileRT.H:238
std::conditional_t< is_const, const uint64_t *__restrict__, uint64_t *__restrict__ > m_idcpu
Definition AMReX_ParticleTileRT.H:86
__host__ __device__ void unpackParticleData(const char *buffer, Long src_offset, size_type dst_index, const int *comm_real, const int *comm_int) const noexcept
Definition AMReX_ParticleTileRT.H:213
__host__ __device__ decltype(auto) cpu(const size_type index) const &
Definition AMReX_ParticleTileRT.H:135
Definition AMReX_ParticleTileRT.H:383
const auto & GetStructOfArrays() const
Definition AMReX_ParticleTileRT.H:797
int NumRuntimeIntComps() const noexcept
Definition AMReX_ParticleTileRT.H:524
size_type numParticles() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:462
ArrayView< RType > GetRealData(std::string const &name)
Definition AMReX_ParticleTileRT.H:608
int NumRealComps() const noexcept
Definition AMReX_ParticleTileRT.H:506
ArrayView< RType > GetRealData(int comp_index)
Definition AMReX_ParticleTileRT.H:568
ArrayView< IType > GetIntData(std::string const &name)
Definition AMReX_ParticleTileRT.H:624
void swap(ParticleTileRT< RType, IType > &other) noexcept
Definition AMReX_ParticleTileRT.H:755
typename ParticleTileDataType::size_type size_type
Definition AMReX_ParticleTileRT.H:391
RType RealType
Definition AMReX_ParticleTileRT.H:385
void realloc_and_move(size_type new_size, size_type new_capacity, int new_n_real, int new_n_int)
Definition AMReX_ParticleTileRT.H:670
bool empty() const
Definition AMReX_ParticleTileRT.H:444
~ParticleTileRT()=default
void shrink_to_fit()
Definition AMReX_ParticleTileRT.H:739
size_type getNumNeighbors() const
Returns the number of neighbor particles. For ParticleTileRT this is always zero.
Definition AMReX_ParticleTileRT.H:500
std::vector< std::string > GetIntNames() const
Definition AMReX_ParticleTileRT.H:542
ArrayView< const RType > GetRealData(std::string const &name) const
Definition AMReX_ParticleTileRT.H:616
void define(int a_num_real_comps, int a_num_int_comps, std::vector< std::string > *a_rdata_names=nullptr, std::vector< std::string > *a_idata_names=nullptr, Arena *a_arena=nullptr)
Definition AMReX_ParticleTileRT.H:411
ConstParticleTileDataType getConstParticleTileData() const
Definition AMReX_ParticleTileRT.H:783
int NumRuntimeRealComps() const noexcept
Definition AMReX_ParticleTileRT.H:518
ParticleTileDataType getParticleTileData()
Definition AMReX_ParticleTileRT.H:770
size_type size() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:453
size_type numRealParticles() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:471
ParticleTileRT(ParticleTileRT &&) noexcept=default
Arena * arena() const
Definition AMReX_ParticleTileRT.H:799
int NumIntComps() const noexcept
Definition AMReX_ParticleTileRT.H:512
ArrayView< uint64_t > GetIdCPUData()
Definition AMReX_ParticleTileRT.H:553
ArrayView< const IType > GetIntData(std::string const &name) const
Definition AMReX_ParticleTileRT.H:632
std::vector< std::string > GetRealNames() const
Definition AMReX_ParticleTileRT.H:531
ArrayView< IType > GetIntData(int comp_index)
Definition AMReX_ParticleTileRT.H:588
ArrayView< const RType > GetRealData(int comp_index) const
Definition AMReX_ParticleTileRT.H:578
ArrayView< const uint64_t > GetIdCPUData() const
Definition AMReX_ParticleTileRT.H:559
void resize(size_type new_size, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTileRT.H:636
size_type numTotalParticles() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:490
ParticleTileRT(ParticleTileRT const &)=delete
ArrayView< const IType > GetIntData(int comp_index) const
Definition AMReX_ParticleTileRT.H:598
size_type capacity() const
Definition AMReX_ParticleTileRT.H:749
auto & GetStructOfArrays()
Definition AMReX_ParticleTileRT.H:796
size_type numNeighborParticles() const
Returns the number of neighbor particles. For ParticleTileRT this is always zero.
Definition AMReX_ParticleTileRT.H:481
static void reserve(std::map< ParticleTileRT< RType, IType > *, int > const &addsizes)
Definition AMReX_ParticleTileRT.H:662
IType IntType
Definition AMReX_ParticleTileRT.H:386
void reserve(size_type new_capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTileRT.H:650
The struct used to store particles.
Definition AMReX_Particle.H:405
Definition AMReX_ParticleTileRT.H:250
typename PTD::size_type size_type
Definition AMReX_ParticleTileRT.H:258
static Long NextID()
Definition AMReX_ParticleTileRT.H:341
__host__ __device__ IType & idata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:293
static constexpr int NReal
Definition AMReX_ParticleTileRT.H:254
__host__ __device__ RTSoAParticle(PTD const &ptd, size_type i) noexcept
Definition AMReX_ParticleTileRT.H:263
__host__ __device__ RType & pos(int position_index) const &
Definition AMReX_ParticleTileRT.H:309
__host__ __device__ RType & rdata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:288
__host__ __device__ decltype(auto) idcpu() const &
Definition AMReX_ParticleTileRT.H:285
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTileRT.H:300
__host__ __device__ RTSoAParticle(RTSoAParticle< aRType, aIType > const &rhs) noexcept
Definition AMReX_ParticleTileRT.H:272
ParticleTileDataRT< RType, IType > PTD
Definition AMReX_ParticleTileRT.H:251
IType IntType
Definition AMReX_ParticleTileRT.H:260
__host__ __device__ decltype(auto) cpu() const &
Definition AMReX_ParticleTileRT.H:279
static constexpr bool is_rtsoa_particle
Definition AMReX_ParticleTileRT.H:257
RType RealType
Definition AMReX_ParticleTileRT.H:259
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_ParticleTileRT.H:362
static constexpr int NInt
Definition AMReX_ParticleTileRT.H:255
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTileRT.H:253
Definition AMReX_ParticleTile.H:717
Definition AMReX_MakeParticle.H:13