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?");
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?");
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];
505 requires (
NReal != 0)
515 requires (
NReal == 0)
552 const int&
idata (
int index)
const &
requires (
NInt != 0)
593template <
int NReal,
int NInt>
600#if defined(AMREX_USE_OMP) && defined(_OPENMP) && _OPENMP < 201307
601#pragma omp critical (amrex_particle_nextid)
602#elif defined(AMREX_USE_OMP)
603#pragma omp atomic capture
605 next = the_next_id++;
608 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
614template <
int NReal,
int NInt>
618 Long next = the_next_id++;
620 amrex::Abort(
"Particle<NReal, NInt>::NextID() -- too many particles");
625template <
int NReal,
int NInt>
629 the_next_id = nextid;
632template <
int NReal,
int NInt>
639 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
640 os << p.
pos(i) <<
' ';
643 for (
int i = 0; i < NReal; i++) {
644 os << p.
rdata(i) <<
' ';
647 for (
int i = 0; i < NInt; i++) {
648 os << p.
idata(i) <<
' ';
652 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
665 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
666 os << p.
pos(i) <<
' ';
669 for (
int i = 0; i < NReal; i++) {
670 os << p.
rdata(i) <<
' ';
674 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
687 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
688 os << p.
pos(i) <<
' ';
691 for (
int i = 0; i < NInt; i++) {
692 os << p.
idata(i) <<
' ';
696 amrex::Error(
"operator<<(ostream&,Particle<NReal, NInt>&) failed");
702template <
int NReal=0,
int NInt=0>
709 for (
int i = 0; i < AMREX_SPACEDIM; i++) {
710 os << p.
pos(i) <<
' ';
714 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
__host__ __device__ detail::where_expression< T > where(bool const mask, T &value)
Definition AMReX_SIMD.H:120
Definition AMReX_Amr.cpp:50
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Stream helper; forwards to the friend declared inside AmrMesh.
Definition AMReX_AmrMesh.cpp:1306
__host__ __device__ std::uint64_t SetParticleIDandCPU(Long id, int cpu) noexcept
Definition AMReX_Particle.H:347
RealVectND< 3 > RealVect
Definition AMReX_ParmParse.H:37
void Error(const std::string &msg)
Print out message to cerr and exit via amrex::Abort().
Definition AMReX.cpp:235
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:241
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__ RealVect rvec(int indx, int indy, int indz) const &
Definition AMReX_Particle.H:504
__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__ 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__ int idata(int) const &
Definition AMReX_Particle.H:559
__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:595
__host__ __device__ RealType & rdata(int) &
Definition AMReX_Particle.H:480
__host__ __device__ const RealType & rdata(int index) const &
Definition AMReX_Particle.H:487
static Long the_next_id
Definition AMReX_Particle.H:421
__host__ __device__ int & idata(int index) &
Definition AMReX_Particle.H:538
__host__ __device__ const int & idata(int index) const &
Definition AMReX_Particle.H:552
__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 &indices) const &
Definition AMReX_Particle.H:522
__host__ __device__ RealType idata(int) &&=delete
__host__ __device__ void atomicSetID(const Long id)
Definition AMReX_Particle.H:436
__host__ __device__ RealVect rvec(int, int, int) const &
Definition AMReX_Particle.H:514
__host__ __device__ uint64_t & idata(int) &
Definition AMReX_Particle.H:545
static Long UnprotectedNextID()
This version can only be used inside omp critical.
Definition AMReX_Particle.H:616
__host__ __device__ RealType & rdata(int index) &
Definition AMReX_Particle.H:473
__host__ __device__ RealType rdata(int) const &
Definition AMReX_Particle.H:494
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__ ParticleIDWrapper id() &
Definition AMReX_Particle.H:427
__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(const IntVect &) const &
Definition AMReX_Particle.H:531
__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