30 #if ((defined(G4MULTITHREADED) && !defined(G4USE_STD11)) || \
31 !__has_feature(cxx_thread_local)) || !__has_feature(c_atomic)
32 #define CLANG_NOSTDTLS
36 #if (defined(G4MULTITHREADED) && \
37 (!defined(G4USE_STD11) || (defined(CLANG_NOSTDTLS) || defined(__INTEL_COMPILER))))
49 return genGamma( anEngine, k, lambda );
54 return genGamma( anEngine, k, lambda );
66 for (i=0; i<size; ++i)
67 vect[i] =
shoot(k,lambda);
76 for (i=0; i<size; ++i)
77 vect[i] =
shoot(anEngine,k,lambda);
84 for (i=0; i<size; ++i)
93 for (i=0; i<size; ++i)
94 vect[i] =
fire(k,lambda);
104 static G4ThreadLocal G4double aa = -1.0, aaa = -1.0, b, c, d, e, r,
s, si, ss, q0,
105 q1 = 0.0416666664, q2 = 0.0208333723, q3 = 0.0079849875,
106 q4 = 0.0015746717, q5 = -0.0003349403, q6 = 0.0003340332,
107 q7 = 0.0006053049, q8 = -0.0004701849, q9 = 0.0001710320,
108 a1 = 0.333333333,
a2 = -0.249999949,
a3 = 0.199999867,
109 a4 =-0.166677482,
a5 = 0.142873973, a6 =-0.124385581,
110 a7 = 0.110368310, a8 = -0.112750886, a9 = 0.104089866,
111 e1 = 1.000000000,
e2 = 0.499999994,
e3 = 0.166666848,
112 e4 = 0.041664508, e5 = 0.008345522, e6 = 0.001353826,
120 if( a <= 0.0 )
return (-1.0);
121 if( lambda <= 0.0 )
return (-1.0);
125 b = 1.0 + 0.36788794412 *
a;
128 p = b * anEngine->flat();
131 gds = std::exp(std::log(p) / a);
132 if (std::log(anEngine->flat()) <= -gds)
return(gds/lambda);
136 gds = - std::log ((b - p) / a);
137 if (std::log(anEngine->flat()) <= ((a - 1.0) * std::log(gds)))
return(gds/lambda);
148 d = 5.656854249 - 12.0 *
s;
152 v1 = 2.0 * anEngine->flat() - 1.0;
153 v2 = 2.0 * anEngine->flat() - 1.0;
155 }
while ( v12 > 1.0 );
156 t = v1*std::sqrt(-2.0*std::log(v12)/v12);
159 if (t >= 0.0)
return(gds/lambda);
161 u = anEngine->flat();
162 if (d * u <= t * t * t)
return(gds/lambda);
168 q0 = ((((((((q9 * r + q8) * r + q7) * r + q6) * r + q5) * r + q4) *
169 r + q3) * r + q2) * r + q1) * r;
180 b = 1.654 + 0.0076 * ss;
181 si = 1.68 / s + 0.275;
182 c = 0.062 / s + 0.024;
187 b = 0.463 + s - 0.178 * ss;
189 c = 0.195 / s - 0.079 + 0.016 *
s;
195 if (std::fabs(v) > 0.25)
197 q = q0 - s * t + 0.25 * t * t + (ss + ss) * std::log(1.0 + v);
201 q = q0 + 0.5 * t * t * ((((((((a9 * v + a8) * v + a7) * v + a6) *
202 v +
a5) * v +
a4) * v +
a3) * v +
a2) * v +
a1) * v;
204 if (std::log(1.0 - u) <= q)
return(gds/lambda);
211 e = -std::log(anEngine->flat());
212 u = anEngine->flat();
214 sign_u = (u > 0)? 1.0 : -1.0;
215 t = b + (e * si) * sign_u;
217 while (t <= -0.71874483771719);
219 if (std::fabs(v) > 0.25)
221 q = q0 - s * t + 0.25 * t * t + (ss + ss) * std::log(1.0 + v);
225 q = q0 + 0.5 * t * t * ((((((((a9 * v + a8) * v + a7) * v + a6) *
226 v +
a5) * v +
a4) * v +
a3) * v +
a2) * v +
a1) * v;
228 if (q <= 0.0)
continue;
231 w = std::exp(q) - 1.0;
235 w = ((((((e7 * q + e6) * q + e5) * q +
e4) * q +
e3) * q +
e2) *
238 if ( c * u * sign_u <= w * std::exp(e - 0.5 * t * t))
static CLHEP::HepRandomEngine * getTheEngine()
void fireArray(const G4int size, G4double *vect)
const G4double w[NPOINTSGL]
CLHEP::HepRandomEngine * localEngine
static void shootArray(const G4int size, G4double *vect, G4double k=1.0, G4double lambda=1.0)
const G4double x[NPOINTSGL]
static G4double genGamma(CLHEP::HepRandomEngine *anEngine, G4double k, G4double lambda)