1#ifndef AMREX_PARTICLETILERT_H_
2#define AMREX_PARTICLETILERT_H_
3#include <AMReX_Config.H>
22template <
class RType,
class IType>
61 explicit operator T* ()
const {
69template <
class RType,
class IType>
80 static constexpr bool is_const = std::is_const_v<RType>;
97 decltype(
m_idata) a_idata,
int a_n_real,
int a_n_int) noexcept :
105 template <
class aRType,
class aIType>
119 return this->m_rdata[dir *
m_capacity + index];
148 return this->m_idcpu[index];
152 RType *
rdata (
const int comp_index)
const &
155 return this->m_rdata + comp_index *
m_capacity;
159 IType *
idata (
const int comp_index)
const &
162 return this->m_idata + comp_index *
m_capacity;
169 return this->m_rdata[comp_index *
m_capacity + partice_index];
176 return this->m_idata[comp_index *
m_capacity + partice_index];
188 const int* comm_real,
const int * comm_int)
const noexcept
191 auto* dst = buffer + dst_offset;
193 memcpy(dst,
m_idcpu + src_index,
sizeof(uint64_t));
194 dst +=
sizeof(uint64_t);
196 for (
int i = 0; i <
m_n_real; ++i) {
199 dst +=
sizeof(RType);
203 for (
int i = 0; i <
m_n_int; ++i) {
206 dst +=
sizeof(IType);
213 const int* comm_real,
const int* comm_int)
const noexcept
216 const auto* src = buffer + src_offset;
218 memcpy(
m_idcpu + dst_index, src,
sizeof(uint64_t));
219 src +=
sizeof(uint64_t);
221 for (
int i = 0; i <
m_n_real; ++i) {
224 src +=
sizeof(RType);
228 for (
int i = 0; i <
m_n_int; ++i) {
231 src +=
sizeof(IType);
247template <
class RType,
class IType>
263 m_particle_tile_data(ptd),
266 template <
class aRType,
class aIType>
269 template <
class aRType,
class aIType>
272 m_particle_tile_data(rhs.m_particle_tile_data),
273 m_index(rhs.m_index) {}
278 decltype(
auto)
cpu ()
const & {
return this->m_particle_tile_data.
cpu(m_index); }
281 decltype(
auto)
id ()
const & {
return this->m_particle_tile_data.
id(m_index); }
284 decltype(
auto)
idcpu ()
const & {
return this->m_particle_tile_data.
idcpu(m_index); }
287 RType&
rdata (
const int comp_index)
const & {
288 return this->m_particle_tile_data.
rdata(comp_index, m_index);
292 IType&
idata (
const int comp_index)
const & {
293 return this->m_particle_tile_data.
idata(comp_index, m_index);
301 this->m_particle_tile_data.
pos(0, m_index),
302 this->m_particle_tile_data.pos(1, m_index),
303 this->m_particle_tile_data.pos(2, m_index)
308 RType&
pos (
int position_index)
const & {
309 return this->m_particle_tile_data.
pos(position_index, m_index);
328 static_assert(std::is_trivially_copyable<PTD>(),
"ParticleTileData is not trivially copyable");
330 PTD m_particle_tile_data;
338template <
class RType,
class IType>
345#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
346#pragma omp critical (amrex_particle_nextid)
347#elif defined(AMREX_USE_OMP)
348#pragma omp atomic capture
353 amrex::Abort(
"RTSoAParticle<RType, IType>::NextID() -- too many particles");
359template <
class RType,
class IType>
365 amrex::Abort(
"RTSoAParticle<RType, IType>::NextID() -- too many particles");
370template <
class RType,
class IType>
377template<
class RType,
class IType>
380template <
class RType=ParticleReal,
class IType=
int>
411 int a_num_real_comps,
413 std::vector<std::string>* a_rdata_names=
nullptr,
414 std::vector<std::string>* a_idata_names=
nullptr,
415 Arena* a_arena=
nullptr
420 "ParticleTileRT redefined with different memory arena");
421 if (a_num_real_comps != m_n_real || a_num_int_comps != m_n_int) {
426 "ParticleTileRT defined with no memory arena! "
427 "Make sure to call setArena() on the ParticleContainer before initialization or "
428 "to pass an Arena to ParticleTile::define()");
431 m_n_real = a_num_real_comps;
432 m_n_int = a_num_int_comps;
435 if (a_rdata_names !=
nullptr) {
436 m_real_names = a_rdata_names;
438 if (a_idata_names !=
nullptr) {
439 m_int_names = a_idata_names;
533 if (m_real_names !=
nullptr) {
534 return *m_real_names;
536 return std::vector<std::string>();
544 if (m_int_names !=
nullptr) {
547 return std::vector<std::string>();
554 return {m_idcpu_data.data(), m_capacity};
560 return {m_idcpu_data.data(), m_capacity};
570 return {m_real_data.data() + comp_index * m_capacity, m_capacity};
580 return {m_real_data.data() + comp_index * m_capacity, m_capacity};
590 return {m_int_data.data() + comp_index * m_capacity, m_capacity};
600 return {m_int_data.data() + comp_index * m_capacity, m_capacity};
608 return GetRealData(get_idx_from_str(name, m_real_names));
616 return GetRealData(get_idx_from_str(name, m_real_names));
624 return GetIntData(get_idx_from_str(name, m_int_names));
632 return GetIntData(get_idx_from_str(name, m_int_names));
639 if (m_capacity < new_size) {
652 if (m_capacity < new_capacity) {
662 for (
auto [p,s] : addsizes) {
663 p->reserve(p->size()+s);
668 int new_n_real,
int new_n_int)
672 if (new_capacity <= new_size) {
673 new_capacity = new_size;
676 decltype(m_idcpu_data) new_idcpu_data;
677 decltype(m_real_data) new_real_data;
678 decltype(m_int_data) new_int_data;
680 new_idcpu_data.setArena(m_arena);
681 new_real_data.setArena(m_arena);
682 new_int_data.setArena(m_arena);
689 auto copy_size = std::min(m_size, new_size);
690 auto copy_n_real = std::min(m_n_real, new_n_real);
691 auto copy_n_int = std::min(m_n_int, new_n_int);
694 m_capacity = new_capacity;
695 m_n_real = new_n_real;
697 m_idcpu_data.swap(new_idcpu_data);
698 m_real_data.swap(new_real_data);
699 m_int_data.swap(new_int_data);
710 new_ptd.idcpu(i) = old_ptd.idcpu(i);
712 for (
int n = 0; n < copy_n_real; ++n) {
713 new_ptd.rdata(n, i) = old_ptd.rdata(n, i);
716 for (
int n = 0; n < copy_n_int; ++n) {
717 new_ptd.idata(n, i) = old_ptd.idata(n, i);
722 for (
size_type i = 0; i < copy_size; ++i) {
723 new_ptd.idcpu(i) = old_ptd.idcpu(i);
725 for (
int n = 0; n < copy_n_real; ++n) {
726 new_ptd.rdata(n, i) = old_ptd.rdata(n, i);
729 for (
int n = 0; n < copy_n_int; ++n) {
730 new_ptd.idata(n, i) = old_ptd.idata(n, i);
740 if (m_size != m_capacity) {
748 return m_capacity * (
sizeof(uint64_t) + m_n_real *
sizeof(RType) + m_n_int *
sizeof(IType));
753 std::swap(m_defined, other.m_defined);
754 std::swap(m_arena, other.m_arena);
755 std::swap(m_capacity, other.m_capacity);
756 std::swap(m_size, other.m_size);
757 std::swap(m_n_real, other.m_n_real);
758 std::swap(m_n_int, other.m_n_int);
759 m_idcpu_data.swap(other.m_idcpu_data);
760 m_real_data.swap(other.m_real_data);
761 m_int_data.swap(other.m_int_data);
762 std::swap(m_real_names, other.m_real_names);
763 std::swap(m_int_names, other.m_int_names);
801 static int get_idx_from_str (std::string
const & name, std::vector<std::string>* name_list) {
803 auto const pos = std::find(name_list->begin(), name_list->end(), name);
805 return static_cast<int>(std::distance(name_list->begin(), pos));
808 bool m_defined =
false;
810 Arena* m_arena =
nullptr;
822 std::vector<std::string>* m_real_names =
nullptr;
823 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
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:49
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:35
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:240
Definition AMReX_ParticleTileRT.H:28
__host__ __device__ T * end() const
Definition AMReX_ParticleTileRT.H:56
__host__ __device__ T * data() const
Definition AMReX_ParticleTileRT.H:41
__host__ __device__ T * dataPtr() const
Definition AMReX_ParticleTileRT.H:46
__host__ __device__ T & operator[](const size_type i) const
Definition AMReX_ParticleTileRT.H:35
size_type m_capacity
Definition AMReX_ParticleTileRT.H:32
Long size_type
Definition AMReX_ParticleTileRT.H:29
T * m_data
Definition AMReX_ParticleTileRT.H:31
__host__ __device__ T * begin() const
Definition AMReX_ParticleTileRT.H:51
Definition AMReX_Particle.H:327
Definition AMReX_Particle.H:301
Definition AMReX_ParticleTileRT.H:334
static Long the_next_id
Definition AMReX_ParticleTileRT.H:335
Definition AMReX_Particle.H:259
Definition AMReX_Particle.H:154
Definition AMReX_ParticleTileRT.H:71
IType IntType
Definition AMReX_ParticleTileRT.H:77
RType *__restrict__ m_rdata
Definition AMReX_ParticleTileRT.H:86
__host__ __device__ RType * rdata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:152
__host__ __device__ constexpr ParticleTileDataRT()=default
static constexpr bool is_const
Definition AMReX_ParticleTileRT.H:80
RType RealType
Definition AMReX_ParticleTileRT.H:76
__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:95
Long size_type
Definition AMReX_ParticleTileRT.H:73
__host__ __device__ IType * idata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:159
__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:187
__host__ __device__ decltype(auto) idcpu(const size_type index) const &
Definition AMReX_ParticleTileRT.H:145
__host__ __device__ IType & idata(const int comp_index, const size_type partice_index) const &
Definition AMReX_ParticleTileRT.H:173
static constexpr bool is_particle_tile_data
Definition AMReX_ParticleTileRT.H:79
__host__ __device__ RType & rdata(const int comp_index, const size_type partice_index) const &
Definition AMReX_ParticleTileRT.H:166
__host__ __device__ decltype(auto) id(const size_type index) const &
Definition AMReX_ParticleTileRT.H:123
IType *__restrict__ m_idata
Definition AMReX_ParticleTileRT.H:87
size_type m_capacity
Definition AMReX_ParticleTileRT.H:82
__host__ __device__ RType & pos(const int dir, const size_type index) const &
Definition AMReX_ParticleTileRT.H:116
__host__ __device__ constexpr ParticleTileDataRT(ParticleTileDataRT< aRType, aIType > const &rhs) noexcept
Definition AMReX_ParticleTileRT.H:107
int m_n_real
Definition AMReX_ParticleTileRT.H:88
int m_n_int
Definition AMReX_ParticleTileRT.H:89
__host__ __device__ Particle< 0, 0 > getSuperParticle(size_type index) const noexcept
Definition AMReX_ParticleTileRT.H:237
std::conditional_t< is_const, const uint64_t *__restrict__, uint64_t *__restrict__ > m_idcpu
Definition AMReX_ParticleTileRT.H:85
__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:212
__host__ __device__ decltype(auto) cpu(const size_type index) const &
Definition AMReX_ParticleTileRT.H:134
Definition AMReX_ParticleTileRT.H:382
const auto & GetStructOfArrays() const
Definition AMReX_ParticleTileRT.H:793
int NumRuntimeIntComps() const noexcept
Definition AMReX_ParticleTileRT.H:523
size_type numParticles() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:461
ArrayView< RType > GetRealData(std::string const &name)
Definition AMReX_ParticleTileRT.H:607
int NumRealComps() const noexcept
Definition AMReX_ParticleTileRT.H:505
ArrayView< RType > GetRealData(int comp_index)
Definition AMReX_ParticleTileRT.H:567
ArrayView< IType > GetIntData(std::string const &name)
Definition AMReX_ParticleTileRT.H:623
void swap(ParticleTileRT< RType, IType > &other) noexcept
Definition AMReX_ParticleTileRT.H:751
typename ParticleTileDataType::size_type size_type
Definition AMReX_ParticleTileRT.H:390
RType RealType
Definition AMReX_ParticleTileRT.H:384
void realloc_and_move(size_type new_size, size_type new_capacity, int new_n_real, int new_n_int)
Definition AMReX_ParticleTileRT.H:667
bool empty() const
Definition AMReX_ParticleTileRT.H:443
~ParticleTileRT()=default
void shrink_to_fit()
Definition AMReX_ParticleTileRT.H:736
size_type getNumNeighbors() const
Returns the number of neighbor particles. For ParticleTileRT this is always zero.
Definition AMReX_ParticleTileRT.H:499
std::vector< std::string > GetIntNames() const
Definition AMReX_ParticleTileRT.H:541
ArrayView< const RType > GetRealData(std::string const &name) const
Definition AMReX_ParticleTileRT.H:615
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:410
ConstParticleTileDataType getConstParticleTileData() const
Definition AMReX_ParticleTileRT.H:779
int NumRuntimeRealComps() const noexcept
Definition AMReX_ParticleTileRT.H:517
ParticleTileDataType getParticleTileData()
Definition AMReX_ParticleTileRT.H:766
size_type size() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:452
size_type numRealParticles() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:470
ParticleTileRT(ParticleTileRT &&) noexcept=default
Arena * arena() const
Definition AMReX_ParticleTileRT.H:795
int NumIntComps() const noexcept
Definition AMReX_ParticleTileRT.H:511
ArrayView< uint64_t > GetIdCPUData()
Definition AMReX_ParticleTileRT.H:552
ArrayView< const IType > GetIntData(std::string const &name) const
Definition AMReX_ParticleTileRT.H:631
std::vector< std::string > GetRealNames() const
Definition AMReX_ParticleTileRT.H:530
ArrayView< IType > GetIntData(int comp_index)
Definition AMReX_ParticleTileRT.H:587
ArrayView< const RType > GetRealData(int comp_index) const
Definition AMReX_ParticleTileRT.H:577
ArrayView< const uint64_t > GetIdCPUData() const
Definition AMReX_ParticleTileRT.H:558
void resize(size_type new_size, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTileRT.H:635
size_type numTotalParticles() const
Returns the number of particles.
Definition AMReX_ParticleTileRT.H:489
ParticleTileRT(ParticleTileRT const &)=delete
ArrayView< const IType > GetIntData(int comp_index) const
Definition AMReX_ParticleTileRT.H:597
size_type capacity() const
Definition AMReX_ParticleTileRT.H:745
auto & GetStructOfArrays()
Definition AMReX_ParticleTileRT.H:792
size_type numNeighborParticles() const
Returns the number of neighbor particles. For ParticleTileRT this is always zero.
Definition AMReX_ParticleTileRT.H:480
static void reserve(std::map< ParticleTileRT< RType, IType > *, int > const &addsizes)
Definition AMReX_ParticleTileRT.H:659
IType IntType
Definition AMReX_ParticleTileRT.H:385
void reserve(size_type new_capacity, GrowthStrategy strategy=GrowthStrategy::Poisson)
Definition AMReX_ParticleTileRT.H:648
The struct used to store particles.
Definition AMReX_Particle.H:405
Definition AMReX_ParticleTileRT.H:249
typename PTD::size_type size_type
Definition AMReX_ParticleTileRT.H:257
static Long NextID()
Definition AMReX_ParticleTileRT.H:340
__host__ __device__ IType & idata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:292
static constexpr int NReal
Definition AMReX_ParticleTileRT.H:253
__host__ __device__ RTSoAParticle(PTD const &ptd, size_type i) noexcept
Definition AMReX_ParticleTileRT.H:262
__host__ __device__ RType & pos(int position_index) const &
Definition AMReX_ParticleTileRT.H:308
__host__ __device__ RType & rdata(const int comp_index) const &
Definition AMReX_ParticleTileRT.H:287
__host__ __device__ decltype(auto) idcpu() const &
Definition AMReX_ParticleTileRT.H:284
__host__ __device__ RealVect pos() const &
Definition AMReX_ParticleTileRT.H:299
__host__ __device__ RTSoAParticle(RTSoAParticle< aRType, aIType > const &rhs) noexcept
Definition AMReX_ParticleTileRT.H:271
ParticleTileDataRT< RType, IType > PTD
Definition AMReX_ParticleTileRT.H:250
IType IntType
Definition AMReX_ParticleTileRT.H:259
__host__ __device__ decltype(auto) cpu() const &
Definition AMReX_ParticleTileRT.H:278
static constexpr bool is_rtsoa_particle
Definition AMReX_ParticleTileRT.H:256
RType RealType
Definition AMReX_ParticleTileRT.H:258
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_ParticleTileRT.H:361
static constexpr int NInt
Definition AMReX_ParticleTileRT.H:254
static constexpr bool is_constsoa_particle
Definition AMReX_ParticleTileRT.H:252
Definition AMReX_ParticleTile.H:716
Definition AMReX_MakeParticle.H:13