1 #ifndef ERF_HASH_RNG_H_
2 #define ERF_HASH_RNG_H_
6 #include <AMReX_GpuQualifiers.H>
7 #include <AMReX_REAL.H>
17 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
21 x += UINT64_C(0x9e3779b97f4a7c15);
22 x = (
x ^ (
x >> 30U)) * UINT64_C(0xbf58476d1ce4e5b9);
23 x = (
x ^ (
x >> 27U)) * UINT64_C(0x94d049bb133111eb);
24 return x ^ (
x >> 31U);
38 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
40 cell_key (
int i,
int j,
int k,
int comp,
int lev, std::uint64_t seed) noexcept
42 std::uint64_t key =
splitmix64(seed ^ UINT64_C(0x243f6a8885a308d3));
43 key =
splitmix64(key ^ (
static_cast<std::uint64_t
>(
static_cast<std::uint32_t
>(i)) +
44 UINT64_C(0x13198a2e03707344)));
45 key =
splitmix64(key ^ (
static_cast<std::uint64_t
>(
static_cast<std::uint32_t
>(j)) +
46 UINT64_C(0xa4093822299f31d0)));
47 key =
splitmix64(key ^ (
static_cast<std::uint64_t
>(
static_cast<std::uint32_t
>(k)) +
48 UINT64_C(0x082efa98ec4e6c89)));
49 key =
splitmix64(key ^ (
static_cast<std::uint64_t
>(
static_cast<std::uint32_t
>(comp)) +
50 UINT64_C(0x452821e638d01377)));
51 return splitmix64(key ^ (
static_cast<std::uint64_t
>(
static_cast<std::uint32_t
>(lev)) +
52 UINT64_C(0xbe5466cf34e90c6c)));
66 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
68 hash_uniform (
int i,
int j,
int k,
int comp,
int lev, std::uint64_t seed) noexcept
70 constexpr
int mantissa_bits = (
sizeof(
amrex::Real) ==
sizeof(
float)) ? 24 : 53;
71 constexpr std::uint64_t denominator = UINT64_C(1) << mantissa_bits;
72 const std::uint64_t numerator =
cell_key(i, j, k, comp, lev, seed) >>
89 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
91 hash_symmetric (
int i,
int j,
int k,
int comp,
int lev, std::uint64_t seed) noexcept
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_HashRNG.H:9
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::uint64_t cell_key(int i, int j, int k, int comp, int lev, std::uint64_t seed) noexcept
Definition: ERF_HashRNG.H:40
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real hash_symmetric(int i, int j, int k, int comp, int lev, std::uint64_t seed) noexcept
Definition: ERF_HashRNG.H:91
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::uint64_t splitmix64(std::uint64_t x) noexcept
Definition: ERF_HashRNG.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real hash_uniform(int i, int j, int k, int comp, int lev, std::uint64_t seed) noexcept
Definition: ERF_HashRNG.H:68