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);
120 std::normal_distribution<Real> normal(a_mean, sqrt(a_mean));
122 ret = (T)std::max(normal(s_rng), (Real)0.0);
128template <
typename T,
typename>
137 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));
139 if (useNormalApprox) {
140 const Real mean = a_N * a_p;
142 std::normal_distribution<Real> normalDist(mean, mean * (1.0 - a_p));
144 ret = (T)std::max(normalDist(s_rng), (Real)0.0);
147 std::binomial_distribution<T> binomDist(a_N, a_p);
149 ret = binomDist(s_rng);
160 return s_uniform01(s_rng);
168 return s_uniform11(s_rng);
176 return s_normal01(s_rng);
184 constexpr Real safety = 1.E-12;
189 Real r = x1 * x1 + x2 * x2;
190 while (r >= 1.0 || r < safety) {
193 r = x1 * x1 + x2 * x2;
196 return RealVect(x1, x2) / sqrt(r);
197#elif CH_SPACEDIM == 3
200 Real r = x1 * x1 + x2 * x2;
201 while (r >= 1.0 || r < safety) {
204 r = x1 * x1 + x2 * x2;
207 const Real x = 2 * x1 * sqrt(1 - r);
208 const Real y = 2 * x2 * sqrt(1 - r);
209 const Real z = 1 - 2 * r;
211 return RealVect(x, y, z);
221 return a_distribution(s_rng);
230 return a_distribution(s_rng);
235 const RealVect& a_lo,
236 const RealVect& a_hi,
237 const RealVect& a_bndryCentroid,
238 const RealVect& a_bndryNormal,
240 const Real a_kappa)
noexcept
253 pos = a_cellPos + pos * a_dx;
260 const RealVect& a_hi,
261 const RealVect& a_bndryCentroid,
262 const RealVect& a_bndryNormal)
noexcept
264 constexpr int maxIter = 100;
267 bool valid = (pos - a_bndryCentroid).dotProduct(a_bndryNormal) >= 0.0;
269 for (
int iter = 0; !valid && iter < maxIter; ++iter) {
271 valid = (pos - a_bndryCentroid).dotProduct(a_bndryNormal) >= 0.0;
277 pos = a_bndryCentroid;
287 RealVect pos = RealVect::Zero;
289 for (
int dir = 0; dir < SpaceDim; dir++) {
296#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:217
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:180
static Real getUniformReal11()
Get a uniform real number on the interval [-1,1].
Definition CD_RandomImplem.H:164
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:226
static Real getUniformReal01()
Get a uniform real number on the interval [0,1].
Definition CD_RandomImplem.H:156
static Real getNormal01()
Get a number from a normal distribution centered on zero and variance 1.
Definition CD_RandomImplem.H:172
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:284
static T getBinomial(const T a_N, const Real a_p) noexcept
Get Poisson distributed number.
Definition CD_RandomImplem.H:130