3#include <AMReX_Config.H>
16 namespace random_util {
23 Real one_to_zero (Real v)
noexcept {
return (v ==
Real(1)) ?
Real(0) : v; }
29 Real zero_to_one (Real v)
noexcept {
return (v ==
Real(0)) ?
Real(1) : v; }
38 Real clamp_below_one (Real v)
noexcept
46 constexpr Real almost_one
47 =
Real(1) -
Real(0.5)*std::numeric_limits<Real>::epsilon();
48 static_assert(almost_one <
Real(1));
49 static_assert(
Real(1) -
Real(0.25)*std::numeric_limits<Real>::epsilon() ==
Real(1));
52 return (v < almost_one) ? v : almost_one;
80#if defined (__SYCL_DEVICE_ONLY__)
83 mkl::rng::device::uniform<Real> distr;
84 return random_util::clamp_below_one(mkl::rng::device::generate(distr, *random_engine.engine));
95 return random_util::one_to_zero(hiprand_uniform(random_engine.
rand_state)); ,
96 return random_util::one_to_zero(curand_uniform(random_engine.
rand_state));
102 return random_util::one_to_zero(hiprand_uniform_double(random_engine.
rand_state)); ,
103 return random_util::one_to_zero(curand_uniform_double(random_engine.
rand_state));
174#if defined (__SYCL_DEVICE_ONLY__)
178 mkl::rng::device::uniform<Real> distr;
179 return random_util::zero_to_one(mkl::rng::device::generate(distr, *random_engine.engine));
187 return hiprand_uniform(random_engine.
rand_state); ,
188 return curand_uniform(random_engine.
rand_state);
194 return hiprand_uniform_double(random_engine.
rand_state); ,
195 return curand_uniform_double(random_engine.
rand_state);
220#if defined (__SYCL_DEVICE_ONLY__)
221 mkl::rng::device::gaussian<Real> distr(mean, stddev);
222 return mkl::rng::device::generate(distr, *random_engine.engine);
227 return stddev * hiprand_normal(random_engine.
rand_state) + mean; ,
228 return stddev * curand_normal(random_engine.
rand_state) + mean;
234 return stddev * hiprand_normal_double(random_engine.
rand_state) + mean; ,
235 return stddev * curand_normal_double(random_engine.
rand_state) + mean;
262#if defined (__SYCL_DEVICE_ONLY__)
263 mkl::rng::device::poisson<unsigned int> distr(lambda);
264 return mkl::rng::device::generate(distr, *random_engine.engine);
268 return hiprand_poisson(random_engine.
rand_state, lambda); ,
269 return curand_poisson(random_engine.
rand_state, lambda);
280 namespace random_util {
283 Real RandomGamma_alpha_ge_1 (Real alpha, Real beta, RandomEngine
const& random_engine)
289 Real d = alpha - 1.0_rt / 3.0_rt;
290 Real c = (1.0_rt / 3.0_rt) / std::sqrt(d);
296 }
while (v <= 0.0_rt);
301 if (u < 1.0_rt - 0.0331_rt * x * x * x * x) {
305 if (std::log(u) < 0.5_rt * x * x + d * (1.0_rt - v + std::log(v))) {
339 return amrex::random_util::RandomGamma_alpha_ge_1(1.0_rt + alpha, beta, random_engine) * std::pow(u, 1.0_rt / alpha);
341 return amrex::random_util::RandomGamma_alpha_ge_1(alpha, beta, random_engine);
366 if (n == 0) {
return 0;}
367#if defined(__SYCL_DEVICE_ONLY__)
368 mkl::rng::device::uniform<unsigned int> distr(0,n);
369 return mkl::rng::device::generate(distr, *random_engine.engine);
373 constexpr unsigned int RAND_M = 4294967295;
377 }
while (rand >= (RAND_M - RAND_M % n));
414 inline ULong DefaultGpuSeed () {
434 ULong gpu_seed = detail::DefaultGpuSeed());
469 bool printSet =
false);
Runtime initialization/finalization helpers and global diagnostics.
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:124
#define AMREX_HIP_OR_CUDA(a, b)
Definition AMReX_GpuControl.H:17
#define AMREX_IF_ON_DEVICE(CODE)
Definition AMReX_GpuQualifiers.H:56
#define AMREX_IF_ON_HOST(CODE)
Definition AMReX_GpuQualifiers.H:58
#define AMREX_GPU_DEVICE
Definition AMReX_GpuQualifiers.H:18
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
amrex_ulong ULong
Unsigned integer type guaranteed to be wider than unsigned int.
Definition AMReX_INT.H:32
amrex_long Long
Definition AMReX_INT.H:30
int MyProc() noexcept
Definition AMReX_ParallelDescriptor.H:128
int NProcs() noexcept
Definition AMReX_ParallelDescriptor.H:255
void InitRandom(ULong cpu_seed, int nprocs, ULong gpu_seed)
Set the seed of the random number generator.
Definition AMReX_Random.cpp:99
unsigned int Random_int(unsigned int n)
Generates one pseudorandom unsigned integer which is uniformly distributed on [0,n-1]-interval for ea...
Definition AMReX_Random.cpp:173
Real Random()
Generate a psuedo-random real from uniform distribution.
Definition AMReX_Random.cpp:142
Real RandomPositive()
Generate a pseudo-random real from uniform distribution, excluding zero.
Definition AMReX_Random.cpp:149
Real RandomNormal(Real mean, Real stddev)
Generate a psuedo-random real from a normal distribution.
Definition AMReX_Random.cpp:126
ULong Random_long(ULong n)
Generates one pseudorandom unsigned long which is uniformly distributed on [0,n-1]-interval for each ...
Definition AMReX_Random.cpp:181
void ResetRandomSeed(ULong cpu_seed, ULong gpu_seed)
Definition AMReX_Random.cpp:246
void UniqueRandomSubset(Vector< int > &uSet, int setSize, int poolSize, bool printSet)
Create a unique subset of random numbers from a pool of integers in the range [0, poolSize - 1] the s...
Definition AMReX_Random.cpp:224
unsigned int RandomPoisson(Real lambda)
Generate a psuedo-random integer from a Poisson distribution.
Definition AMReX_Random.cpp:159
void SaveRandomState(std::ostream &os)
Save host random state.
Definition AMReX_Random.cpp:190
void RestoreRandomState(std::istream &is, int nthreads_old, int nstep_old)
Restore host random state saved by SaveRandomState.
Definition AMReX_Random.cpp:198
Real RandomGamma(Real alpha, Real beta)
Generate a psuedo-random floating point number from the Gamma distribution.
Definition AMReX_Random.cpp:166
Definition AMReX_Amr.cpp:50
__host__ __device__ void ignore_unused(const Ts &...)
No-op helper that marks variables as intentionally unused.
Definition AMReX.H:259
void FillRandomNormal(MultiFab &mf, int scomp, int ncomp, Real mean, Real stddev)
Fill MultiFab with random numbers from normal distribution.
Definition AMReX_MultiFabUtil.cpp:1261
void FillRandom(MultiFab &mf, int scomp, int ncomp)
Fill MultiFab with random numbers from uniform distribution.
Definition AMReX_MultiFabUtil.cpp:1248
void DeallocateRandomSeedDevArray()
Definition AMReX_Random.cpp:252
Definition AMReX_RandomEngine.H:72
randState_t * rand_state
Definition AMReX_RandomEngine.H:73