13#ifndef CD_RANDOMIMPLEM_H
14#define CD_RANDOMIMPLEM_H
29#include <CD_NamespaceHeader.H>
35 ParmParse pp(
"Random");
37 if (pp.contains(
"seed")) {
62 const int seed = a_seed + procID() * omp_get_num_threads() + omp_get_thread_num();
64 s_rng = std::mt19937_64(
seed);
67 const int seed = a_seed + procID();
69 s_rng = std::mt19937_64(
seed);
75 const int seed = a_seed + omp_get_thread_num();
77 s_rng = std::mt19937_64(
seed);
80 const int seed = a_seed;
82 s_rng = std::mt19937_64(
seed);
92 auto seed =
static_cast<int>(std::chrono::system_clock::now().time_since_epoch().count());
96 MPI_Bcast(&
seed, 1, MPI_INT, 0, Chombo_MPI::comm);
102template <
typename T,
typename>
114 if (a_mean < 250.0) {
115 std::poisson_distribution<T> poisson(a_mean);
117 ret = poisson(s_rng);
122 std::normal_distribution<Real> normal(a_mean, sqrt(a_mean));
124 ret = (T)llround(std::max(normal(s_rng), (Real)0.0));
130template <
typename T,
typename>
139 const bool useNormalApprox = (a_N > (T)9.0 * ((1.0 - a_p) / a_p)) && (a_N > (T)9.0 * a_p / (1.0 - a_p));
141 if (useNormalApprox) {
142 const Real mean = a_N * a_p;
144 std::normal_distribution<Real> normalDist(mean, mean * (1.0 - a_p));
146 ret = (T)std::max(normalDist(s_rng), (Real)0.0);
149 std::binomial_distribution<T> binomDist(a_N, a_p);
151 ret = binomDist(s_rng);
162 return s_uniform01(s_rng);
170 return s_uniform11(s_rng);
178 return s_normal01(s_rng);
186 constexpr Real safety = 1.E-12;
191 Real r = x1 * x1 + x2 * x2;
192 while (r >= 1.0 || r < safety) {
195 r = x1 * x1 + x2 * x2;
198 return RealVect(x1, x2) / sqrt(r);
199#elif CH_SPACEDIM == 3
202 Real r = x1 * x1 + x2 * x2;
203 while (r >= 1.0 || r < safety) {
206 r = x1 * x1 + x2 * x2;
209 const Real x = 2 * x1 * sqrt(1 - r);
210 const Real y = 2 * x2 * sqrt(1 - r);
211 const Real z = 1 - 2 * r;
213 return RealVect(x, y, z);
223 return a_distribution(s_rng);
232 return a_distribution(s_rng);
237 const RealVect& a_lo,
238 const RealVect& a_hi,
239 const RealVect& a_bndryCentroid,
240 const RealVect& a_bndryNormal,
242 const Real a_kappa)
noexcept
255 pos = a_cellPos + pos * a_dx;
262 const RealVect& a_hi,
263 const RealVect& a_bndryCentroid,
264 const RealVect& a_bndryNormal)
noexcept
266 constexpr int maxIter = 100;
269 bool valid = (pos - a_bndryCentroid).dotProduct(a_bndryNormal) >= 0.0;
271 for (
int iter = 0; !valid && iter < maxIter; ++iter) {
273 valid = (pos - a_bndryCentroid).dotProduct(a_bndryNormal) >= 0.0;
279 pos = a_bndryCentroid;
289 RealVect pos = RealVect::Zero;
291 for (
int dir = 0; dir < SpaceDim; dir++) {
298#include <CD_NamespaceFooter.H>
File containing some useful static methods related to random number generation.
static Real get(T &a_distribution)
For getting a random number from a user-supplied distribution. T must be a distribution for which we ...
Definition CD_RandomImplem.H:219
static void setRandomSeed()
Set a random RNG seed.
Definition CD_RandomImplem.H:90
static RealVect getDirection()
Get a random direction in space.
Definition CD_RandomImplem.H:182
static Real getUniformReal11()
Get a uniform real number on the interval [-1,1].
Definition CD_RandomImplem.H:166
static size_t getDiscrete(T &a_distribution)
For getting a random number from a user-supplied distribution. T must be a distribution for which we ...
Definition CD_RandomImplem.H:228
static Real getUniformReal01()
Get a uniform real number on the interval [0,1].
Definition CD_RandomImplem.H:158
static Real getNormal01()
Get a number from a normal distribution centered on zero and variance 1.
Definition CD_RandomImplem.H:174
static void seed()
Seed the RNG.
Definition CD_RandomImplem.H:32
static void setSeed(const int a_seed)
Set the RNG seed.
Definition CD_RandomImplem.H:56
static T getPoisson(const Real a_mean)
Get Poisson distributed number.
Definition CD_RandomImplem.H:104
static RealVect randomPosition(const RealVect &a_lo, const RealVect &a_hi) noexcept
Return a random position in the cube (a_lo, a_hi);.
Definition CD_RandomImplem.H:286
static T getBinomial(const T a_N, const Real a_p) noexcept
Get Poisson distributed number.
Definition CD_RandomImplem.H:132