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);
46 Long lval =
static_cast<Long
>(val);
47 r = (sign) ? lval : -lval;
53 return static_cast<int>(idcpu & 0x00FFFFFF);
57 void pack_id (uint64_t& idcpu,
const Long
id)
noexcept {
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>
399template <
int T_NReal,
int T_NInt=0>
408 static constexpr int NReal = T_NReal;
411 static constexpr int NInt = T_NInt;
436#if defined(AMREX_USE_OMP)
437#pragma omp atomic write
440 auto *old_ptr =
reinterpret_cast<unsigned long long*
>(&(this->
m_idcpu));
458 return this->
m_pos[index];
465 return this->
m_pos[index];
468 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
476 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
484 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
492 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
503 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
513 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
521 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
531 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
539 template <
int U = T_NInt, std::enable_if_t<U != 0,
int> = 0>
547 template <
int U = T_NInt, std::enable_if_t<U == 0,
int> = 0>
555 template <
int U = T_NInt, std::enable_if_t<U != 0,
int> = 0>
557 const int&
idata (
int index)
const &
563 template <
int U = T_NInt, std::enable_if_t<U == 0,
int> = 0>
582 [[nodiscard]]
static Long
NextID ();
594 static void NextID (Long nextid);
599template <
int NReal,
int NInt>
606#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
607#pragma omp critical (amrex_particle_nextid)
608#elif defined(AMREX_USE_OMP)
609#pragma omp atomic capture
611 next = the_next_id++;
614 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
620template <
int NReal,
int NInt>
624 Long next = the_next_id++;
626 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
631template <
int NReal,
int NInt>
635 the_next_id = nextid;
638template <
int NReal,
int NInt>
645 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
646 os << p.
pos(i) <<
' ';
649 for (
int i = 0; i < NReal; i++) {
650 os << p.
rdata(i) <<
' ';
653 for (
int i = 0; i < NInt; i++) {
654 os << p.
idata(i) <<
' ';
658 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
671 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
672 os << p.
pos(i) <<
' ';
675 for (
int i = 0; i < NReal; i++) {
676 os << p.
rdata(i) <<
' ';
680 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
693 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
694 os << p.
pos(i) <<
' ';
697 for (
int i = 0; i < NInt; i++) {
698 os << p.
idata(i) <<
' ';
702 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
708template <
int NReal=0,
int NInt=0>
715 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
716 os << p.
pos(i) <<
' ';
720 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
__host__ __device__ AMREX_FORCE_INLINE T Exch(T *address, T val) noexcept
Definition AMReX_GpuAtomic.H:485
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
__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:224
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1236
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:402
__host__ __device__ uint64_t & idcpu() &
Definition AMReX_Particle.H:446
__host__ __device__ ConstParticleIDWrapper id() const &
Definition AMReX_Particle.H:429
__host__ __device__ const uint64_t & idcpu() const &
Definition AMReX_Particle.H:449
__host__ __device__ uint64_t & idata(int) &
Definition AMReX_Particle.H:549
__host__ __device__ RealVect pos() const &
Definition AMReX_Particle.H:452
ParticleReal RealType
The floating point type used for the particles.
Definition AMReX_Particle.H:414
int IntType
Definition AMReX_Particle.H:415
__host__ __device__ RealType rdata(int) const &
Definition AMReX_Particle.H:494
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:541
__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:601
static Long the_next_id
Definition AMReX_Particle.H:417
__host__ __device__ ConstParticleCPUWrapper cpu() const &
Definition AMReX_Particle.H:426
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:420
__host__ __device__ RealVect rvec(const IntVect &) const &
Definition AMReX_Particle.H:533
__host__ __device__ RealVect rvec(const IntVect &indices) const &
Definition AMReX_Particle.H:523
__host__ __device__ RealType idata(int) &&=delete
__host__ __device__ void atomicSetID(const Long id)
Definition AMReX_Particle.H:432
__host__ __device__ RealType & rdata(int) &
Definition AMReX_Particle.H:478
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_Particle.H:622
__host__ __device__ int idata(int) const &
Definition AMReX_Particle.H:565
static constexpr int NReal
number of extra Real components in the particle struct
Definition AMReX_Particle.H:408
__host__ __device__ RealVect rvec(int indx, int indy, int indz) const &
Definition AMReX_Particle.H:505
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:423
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:470
__host__ __device__ const RealType & rdata(int index) const &
Definition AMReX_Particle.H:486
__host__ __device__ RealType & pos(int index) &
Definition AMReX_Particle.H:455
static constexpr int NInt
number of extra integer components in the particle struct
Definition AMReX_Particle.H:411
__host__ __device__ RealVect rvec(int, int, int) const &
Definition AMReX_Particle.H:515
__host__ __device__ const int & idata(int index) const &
Definition AMReX_Particle.H:557
__host__ __device__ RealType pos(int index) const &
Definition AMReX_Particle.H:462
Particle const ConstType
Definition AMReX_Particle.H:405
Definition AMReX_Particle.H:388
static constexpr int NInt
Definition AMReX_Particle.H:390
static constexpr int NReal
Definition AMReX_Particle.H:389
Definition AMReX_MakeParticle.H:13