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>
401template <
int T_NReal,
int T_NInt=0>
410 static constexpr int NReal = T_NReal;
413 static constexpr int NInt = T_NInt;
438#if defined(AMREX_USE_OMP)
439#pragma omp atomic write
442 auto *old_ptr =
reinterpret_cast<unsigned long long*
>(&(this->
m_idcpu));
460 return this->
m_pos[index];
467 return this->
m_pos[index];
470 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
478 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
486 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
494 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
505 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
515 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
523 template <
int U = T_NReal, std::enable_if_t<U != 0,
int> = 0>
533 template <
int U = T_NReal, std::enable_if_t<U == 0,
int> = 0>
541 template <
int U = T_NInt, std::enable_if_t<U != 0,
int> = 0>
549 template <
int U = T_NInt, std::enable_if_t<U == 0,
int> = 0>
557 template <
int U = T_NInt, std::enable_if_t<U != 0,
int> = 0>
559 const int&
idata (
int index)
const &
565 template <
int U = T_NInt, std::enable_if_t<U == 0,
int> = 0>
601template <
int NReal,
int NInt>
608#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
609#pragma omp critical (amrex_particle_nextid)
610#elif defined(AMREX_USE_OMP)
611#pragma omp atomic capture
613 next = the_next_id++;
616 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
622template <
int NReal,
int NInt>
626 Long next = the_next_id++;
628 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
633template <
int NReal,
int NInt>
637 the_next_id = nextid;
640template <
int NReal,
int NInt>
647 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
648 os << p.
pos(i) <<
' ';
651 for (
int i = 0; i < NReal; i++) {
652 os << p.
rdata(i) <<
' ';
655 for (
int i = 0; i < NInt; i++) {
656 os << p.
idata(i) <<
' ';
660 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
673 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
674 os << p.
pos(i) <<
' ';
677 for (
int i = 0; i < NReal; i++) {
678 os << p.
rdata(i) <<
' ';
682 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
695 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
696 os << p.
pos(i) <<
' ';
699 for (
int i = 0; i < NInt; i++) {
700 os << p.
idata(i) <<
' ';
704 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
710template <
int NReal=0,
int NInt=0>
717 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
718 os << p.
pos(i) <<
' ';
722 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:487
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:404
__host__ __device__ uint64_t & idcpu() &
Definition AMReX_Particle.H:448
__host__ __device__ ConstParticleIDWrapper id() const &
Definition AMReX_Particle.H:431
__host__ __device__ const uint64_t & idcpu() const &
Definition AMReX_Particle.H:451
__host__ __device__ uint64_t & idata(int) &
Definition AMReX_Particle.H:551
__host__ __device__ RealVect pos() const &
Definition AMReX_Particle.H:454
ParticleReal RealType
The floating point type used for the particles.
Definition AMReX_Particle.H:416
int IntType
Definition AMReX_Particle.H:417
__host__ __device__ RealType rdata(int) const &
Definition AMReX_Particle.H:496
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:543
__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:603
static Long the_next_id
Definition AMReX_Particle.H:419
__host__ __device__ ConstParticleCPUWrapper cpu() const &
Definition AMReX_Particle.H:428
__host__ __device__ ParticleCPUWrapper cpu() &
Definition AMReX_Particle.H:422
__host__ __device__ RealVect rvec(const IntVect &) const &
Definition AMReX_Particle.H:535
__host__ __device__ RealVect rvec(const IntVect &indices) const &
Definition AMReX_Particle.H:525
__host__ __device__ RealType idata(int) &&=delete
__host__ __device__ void atomicSetID(const Long id)
Definition AMReX_Particle.H:434
__host__ __device__ RealType & rdata(int) &
Definition AMReX_Particle.H:480
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_Particle.H:624
__host__ __device__ int idata(int) const &
Definition AMReX_Particle.H:567
static constexpr int NReal
number of extra Real components in the particle struct
Definition AMReX_Particle.H:410
__host__ __device__ RealVect rvec(int indx, int indy, int indz) const &
Definition AMReX_Particle.H:507
__host__ __device__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:425
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:472
__host__ __device__ const RealType & rdata(int index) const &
Definition AMReX_Particle.H:488
__host__ __device__ RealType & pos(int index) &
Definition AMReX_Particle.H:457
static constexpr int NInt
number of extra integer components in the particle struct
Definition AMReX_Particle.H:413
__host__ __device__ RealVect rvec(int, int, int) const &
Definition AMReX_Particle.H:517
__host__ __device__ const int & idata(int index) const &
Definition AMReX_Particle.H:559
__host__ __device__ RealType pos(int index) const &
Definition AMReX_Particle.H:464
Particle const ConstType
Definition AMReX_Particle.H:407
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