8 #ifndef WARPX_SAMPLE_GAUSSIAN_FLUX_DISTRIBUTION_H
9 #define WARPX_SAMPLE_GAUSSIAN_FLUX_DISTRIBUTION_H
25 generateGaussianFluxDist( amrex::Real u_m, amrex::Real u_th,
amrex::RandomEngine const& engine ) {
27 using namespace amrex::literals;
30 amrex::Real u = 0._rt;
32 const amrex::Real abs_u_m = std::abs(u_m);
36 }
else if (abs_u_m < 0.6*u_th) {
42 const amrex::Real umsign = std::copysign(1._rt, u_m);
43 const amrex::Real approx_u_th = u_th/std::sqrt( 1._rt - abs_u_m/u_th );
44 const amrex::Real reject_prefactor = (abs_u_m/u_th)/(2._rt*u_th*u_th);
50 u = approx_u_th * std::sqrt(2._rt*std::log(1._rt/xrand));
53 if (xrand < std::exp(-reject_prefactor*(u - umsign*u_th)*(u - umsign*u_th))) { reject =
false; }
64 const amrex::Real approx_u_m = u_m + u_th*u_th/abs_u_m;
65 const amrex::Real inv_um = 1._rt/abs_u_m;
74 if (xrand < u*inv_um* std::exp(1._rt - u*inv_um)) { reject =
false; }
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
Real RandomNormal(Real mean, Real stddev)