11 vslNewStream(&
rdata->r, RANDOM_MKL_RNG, seed);
16 vdRngUniform(VSL_RNG_METHOD_UNIFORM_STD,
rdata->r, 1, &r, 0.0, 1.0);
22 vdRngGaussian(VSL_RNG_METHOD_GAUSSIAN_BOXMULLER,
rdata->r, 1, &r, 0.0, 1.0);
27 vdRngUniform(VSL_RNG_METHOD_UNIFORM_STD,
rdata->r, n, r, 0.0, 1.0);
31 vdRngGaussian(VSL_RNG_METHOD_GAUSSIAN_BOXMULLER2,
rdata->r, n, r, 0.0, 1.0);
35#elif defined(RANDOM_GSL)
37#include <gsl/gsl_rng.h>
41 rdata->r = gsl_rng_alloc(gsl_rng_mt19937);
42 gsl_rng_set(
rdata->r, seed);
46 return gsl_rng_uniform(
rdata->r);
50 return gsl_ran_gaussian(
rdata->r, 1.0);
55 for(
int i = 0; i < n; i++) {
56 r[i] = gsl_rng_uniform(
rdata->r);
62 for(
int i = 0; i < n; i++) {
63 r[i] = gsl_ran_gaussian(
rdata->r, 1.0);
68#elif defined(RANDOM_LCG)
82 uint64_t a = 2862933555777941757;
83 uint64_t b = 3037000493;
90 random_lcg_uniform_simd(
rdata, 1, &r);
96 random_lcg_normal_simd(
rdata, 1, &r);
104 for(
int i = 0; i < n; i++) {
105 r[i] = (double) random_lcg_integer(
rdata) / UINT64_MAX;
111 int isEven = (n+1) % 2;
114#if A5_CCOL_USE_GEOBM == 1
116 GPU_PARALLEL_LOOP_ALL_LEVELS
117 for(
int i = 0; i < n; i=i+2) {
121 x1 = 2*random_lcg_uniform(ri)-1;
122 x2 = 2*random_lcg_uniform(ri)-1;
126 w = sqrt( (-2 * log( w ) ) / w );
128 if((i < n-2) || (isEven > 0)) {
135 GPU_PARALLEL_LOOP_ALL_LEVELS
136 for(
int i = 0; i < n; i=i+2) {
138 x1 = random_lcg_uniform(ri);
139 x2 = random_lcg_uniform(ri);
140 w = sqrt(-2*log(x1));
143 if((i < n-2) || (isEven > 0) ) {
145 r[i+1] = w*sqrt(1-s*s);
148 r[i+1] = -w*sqrt(1-s*s);
184 for(
int i = 0; i < n; i++) {
199 int isEven = (n+1) % 2;
202#if A5_CCOL_USE_GEOBM == 1
205 for(
int i = 0; i < n; i=i+2) {
213 w = sqrt( (-2 * log( w ) ) / w );
215 if((i < n-2) || (isEven > 0)) {
223 for(
int i = 0; i < n; i=i+2) {
226 w = sqrt(-2*log(x1));
229 if((i < n-2) || (isEven > 0) ) {
231 r[i+1] = w*sqrt(1-s*s);
234 r[i+1] = -w*sqrt(1-s*s);
Main header file for ASCOT5.
Header file containing physical and mathematical constants.
void random_drand48_uniform_simd(int n, double *r)
Vectorised sampling from uniform distribution.
double random_drand48_normal()
Initialize random generator which uses the linear congruential algorithm and 48-bit integer arithmeti...
void random_drand48_normal_simd(int n, double *r)
Vectorised sampling from normal distribution.
Header file for random.c.