1#ifndef AMREX_PARTICLE_H_
2#define AMREX_PARTICLE_H_
3#include <AMReX_Config.H>
18 namespace LongParticleIds {
26 using namespace LongParticleIds;
31 namespace ParticleIdCpus {
32 constexpr std::uint64_t
Invalid = 16777216;
35 using namespace ParticleIdCpus;
37 namespace particle_impl {
43 uint64_t sign = idcpu >> 63;
44 uint64_t val = ((idcpu >> 24) & 0x7FFFFFFFFF);
47 r = (sign) ? lval : -lval;
53 return static_cast<int>(idcpu & 0x00FFFFFF);
62 uint64_t sign =
id >= 0;
76 (idcpu) |= (sign << 63);
77 (idcpu) |= (val << 24);
81 void pack_cpu (uint64_t& idcpu,
const int cpu)
noexcept {
83 idcpu &= (~ 0x00FFFFFF);
94 idcpu &= ~(uint64_t(1) << 63);
97 template<
typename T_SIMD,
typename T_Mask>
101 if constexpr (std::is_same_v<T_Mask, bool>) {
103 static_assert(std::is_same_v<T_SIMD, uint64_t>,
"make_invalid: forgot template on wrapper?");
108 static_assert(!std::is_same_v<T_SIMD, uint64_t>,
"make_invalid: forgot template on wrapper?");
111 simd::stdx::where(simd::stdx::cvt(
mask), idcpu) &= ~(T_SIMD{1} << 63);
121 idcpu |= uint64_t(1) << 63;
124 template<
typename T_SIMD,
typename T_Mask>
128 if constexpr (std::is_same_v<T_Mask, bool>) {
130 static_assert(std::is_same_v<T_SIMD, uint64_t>,
"make_valid: forgot template on wrapper?");
135 static_assert(!std::is_same_v<T_SIMD, uint64_t>,
"make_valid: forgot template on wrapper?");
138 simd::stdx::where(simd::stdx::cvt(
mask), idcpu) |= T_SIMD{1} << 63;
152template<
typename T = u
int64_t>
196 operator Long () const noexcept
217 template<
typename T_Bool>
240 template<
typename T_Bool>
294 operator int () const noexcept
310 operator Long () const noexcept
336 operator int () const noexcept {
348 std::uint64_t idcpu = 0;
354template <
typename T,
int NReal,
int NInt>
363template <
typename T,
int NInt>
371template <
typename T,
int NReal>
402template <
int T_NReal,
int T_NInt=0>
412 static constexpr int NReal = T_NReal;
415 static constexpr int NInt = T_NInt;
440#if defined(AMREX_USE_OMP)
441#pragma omp atomic write
444 auto *old_ptr =
reinterpret_cast<unsigned long long*
>(&(this->
m_idcpu));
462 return this->
m_pos[index];
469 return this->
m_pos[index];
472 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
480 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
488 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
496 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
507 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
517 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
525 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
535 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
543 template <
int U = T_NInt, std::enable_if_t<U != 0,
int> = 0>
551 template <
int U = T_NInt, std::enable_if_t<U == 0,
int> = 0>
559 template <
int U = T_NInt, std::enable_if_t<U != 0,
int> = 0>
561 const int&
idata (
int index)
const &
567 template <
int U = T_NInt, std::enable_if_t<U == 0,
int> = 0>
603template <
int NReal,
int NInt>
610#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
611#pragma omp critical (amrex_particle_nextid)
612#elif defined(AMREX_USE_OMP)
613#pragma omp atomic capture
615 next = the_next_id++;
618 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
624template <
int NReal,
int NInt>
628 Long next = the_next_id++;
630 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
635template <
int NReal,
int NInt>
639 the_next_id = nextid;
642template <
int NReal,
int NInt>
649 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
650 os << p.
pos(i) <<
' ';
653 for (
int i = 0; i < NReal; i++) {
654 os << p.
rdata(i) <<
' ';
657 for (
int i = 0; i < NInt; i++) {
658 os << p.
idata(i) <<
' ';
662 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
675 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
676 os << p.
pos(i) <<
' ';
679 for (
int i = 0; i < NReal; i++) {
680 os << p.
rdata(i) <<
' ';
684 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
697 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
698 os << p.
pos(i) <<
' ';
701 for (
int i = 0; i < NInt; i++) {
702 os << p.
idata(i) <<
' ';
706 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
712template <
int NReal=0,
int NInt=0>
719 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
720 os << p.
pos(i) <<
' ';
724 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
#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_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
amrex_particle_real ParticleReal
Floating Point Type for Particles.
Definition AMReX_REAL.H:90
amrex_long Long
Definition AMReX_INT.H:30
__host__ __device__ AMREX_FORCE_INLINE T Exch(T *address, T val) noexcept
Definition AMReX_GpuAtomic.H:488
constexpr Long GhostParticleID
Definition AMReX_Particle.H:19
constexpr Long NoSplitParticleID
Definition AMReX_Particle.H:23
constexpr Long VirtualParticleID
Definition AMReX_Particle.H:20
constexpr Long DoSplitParticleID
Definition AMReX_Particle.H:22
constexpr Long LastParticleID
Definition AMReX_Particle.H:21
constexpr std::uint64_t Invalid
Definition AMReX_Particle.H:32
__host__ __device__ void pack_cpu(uint64_t &idcpu, const int cpu) noexcept
Definition AMReX_Particle.H:81
__host__ __device__ bool is_valid(const uint64_t idcpu) noexcept
Definition AMReX_Particle.H:146
__host__ __device__ void make_invalid(uint64_t &idcpu) noexcept
Definition AMReX_Particle.H:92
__host__ __device__ Long unpack_id(const uint64_t idcpu) noexcept
Definition AMReX_Particle.H:40
__host__ __device__ void make_valid(uint64_t &idcpu) noexcept
Definition AMReX_Particle.H:119
__host__ __device__ void pack_id(uint64_t &idcpu, const Long id) noexcept
Definition AMReX_Particle.H:57
__host__ __device__ int unpack_cpu(const uint64_t idcpu) noexcept
Definition AMReX_Particle.H:52
Definition AMReX_Amr.cpp:49
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1239
__host__ __device__ std::uint64_t SetParticleIDandCPU(Long id, int cpu) noexcept
Definition AMReX_Particle.H:347
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:35
void Error(const std::string &msg)
Print out message to cerr and exit via amrex::Abort().
Definition AMReX.cpp:234
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:240
const int[]
Definition AMReX_BLProfiler.cpp:1664
Definition AMReX_Particle.H:327
__host__ __device__ ConstParticleCPUWrapper(const uint64_t &idata) noexcept
Definition AMReX_Particle.H:331
const uint64_t * m_idata
Definition AMReX_Particle.H:328
Definition AMReX_Particle.H:301
__host__ __device__ ConstParticleIDWrapper(const uint64_t &idata) noexcept
Definition AMReX_Particle.H:305
const uint64_t * m_idata
Definition AMReX_Particle.H:302
__host__ __device__ bool is_valid() const noexcept
Definition AMReX_Particle.H:320
Definition AMReX_Particle.H:356
T m_rdata[NReal]
Definition AMReX_Particle.H:358
uint64_t m_idcpu
Definition AMReX_Particle.H:359
int m_idata[NInt]
Definition AMReX_Particle.H:360
T m_pos[3]
Definition AMReX_Particle.H:357
Definition AMReX_Particle.H:259
ParticleCPUWrapper(ParticleCPUWrapper &&)=delete
~ParticleCPUWrapper() noexcept=default
__host__ __device__ ParticleCPUWrapper(const ParticleCPUWrapper &rhs)=default
uint64_t * m_idata
Definition AMReX_Particle.H:260
__host__ __device__ ParticleCPUWrapper & operator=(const ParticleCPUWrapper &pcpuw) noexcept
Definition AMReX_Particle.H:275
Definition AMReX_Particle.H:154
__host__ __device__ void make_valid(T_Bool const &mask) const noexcept
Definition AMReX_Particle.H:242
__host__ __device__ void make_invalid() const noexcept
Definition AMReX_Particle.H:207
T * m_idata
Definition AMReX_Particle.H:162
__host__ __device__ void make_valid() const noexcept
Definition AMReX_Particle.H:230
__host__ __device__ ParticleIDWrapper(const ParticleIDWrapper &rhs)=default
~ParticleIDWrapper() noexcept=default
__host__ __device__ ParticleIDWrapper & operator=(const ParticleIDWrapper &pidw) noexcept
Definition AMReX_Particle.H:177
__host__ __device__ void make_invalid(T_Bool const &mask) const noexcept
Definition AMReX_Particle.H:219
ParticleIDWrapper(ParticleIDWrapper &&)=delete
__host__ __device__ bool is_valid() const noexcept
Definition AMReX_Particle.H:252
The struct used to store particles.
Definition AMReX_Particle.H:405
__host__ __device__ uint64_t & idcpu() &
Definition AMReX_Particle.H:450
__host__ __device__ ConstParticleIDWrapper id() const &
Definition AMReX_Particle.H:433
__host__ __device__ const uint64_t & idcpu() const &
Definition AMReX_Particle.H:453
__host__ __device__ uint64_t & idata(int) &
Definition AMReX_Particle.H:553
__host__ __device__ RealVect pos() const &
Definition AMReX_Particle.H:456
ParticleReal RealType
The floating point type used for the particles.
Definition AMReX_Particle.H:418
int IntType
Definition AMReX_Particle.H:419
__host__ __device__ RealType rdata(int) const &
Definition AMReX_Particle.H:498
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:545
__host__ __device__ RealType rdata(int) &&=delete
static Long NextID()
Returns the next particle ID for this processor. Particle IDs start at 1 and are never reused....
Definition AMReX_Particle.H:605
static Long the_next_id
Definition AMReX_Particle.H:421
__host__ __device__ ConstParticleCPUWrapper cpu() const &
Definition AMReX_Particle.H:430
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:424
__host__ __device__ RealVect rvec(const IntVect &) const &
Definition AMReX_Particle.H:537
__host__ __device__ RealVect rvec(const IntVect &indices) const &
Definition AMReX_Particle.H:527
__host__ __device__ RealType idata(int) &&=delete
__host__ __device__ void atomicSetID(const Long id)
Definition AMReX_Particle.H:436
__host__ __device__ RealType & rdata(int) &
Definition AMReX_Particle.H:482
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_Particle.H:626
__host__ __device__ int idata(int) const &
Definition AMReX_Particle.H:569
static constexpr bool is_rtsoa_particle
Definition AMReX_Particle.H:407
static constexpr int NReal
number of extra Real components in the particle struct
Definition AMReX_Particle.H:412
__host__ __device__ RealVect rvec(int indx, int indy, int indz) const &
Definition AMReX_Particle.H:509
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:427
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:474
__host__ __device__ const RealType & rdata(int index) const &
Definition AMReX_Particle.H:490
__host__ __device__ RealType & pos(int index) &
Definition AMReX_Particle.H:459
static constexpr int NInt
number of extra integer components in the particle struct
Definition AMReX_Particle.H:415
__host__ __device__ RealVect rvec(int, int, int) const &
Definition AMReX_Particle.H:519
__host__ __device__ const int & idata(int index) const &
Definition AMReX_Particle.H:561
__host__ __device__ RealType pos(int index) const &
Definition AMReX_Particle.H:466
Particle const ConstType
Definition AMReX_Particle.H:409
Definition AMReX_Particle.H:388
static constexpr bool is_rtsoa_particle
Definition AMReX_Particle.H:392
static constexpr int NInt
Definition AMReX_Particle.H:390
static constexpr int NReal
Definition AMReX_Particle.H:389
Definition AMReX_MakeParticle.H:13