50 const amrex::ParticleReal& u1z,
const amrex::ParticleReal& u2x,
51 const amrex::ParticleReal& u2y,
const amrex::ParticleReal& u2z,
52 amrex::ParticleReal w1, amrex::ParticleReal w2,
53 const amrex::Real& dt,
const amrex::ParticleReal& dV,
const int& pair_index,
56 const amrex::ParticleReal& event_multiplier,
57 const int& multiplier_ratio,
58 const amrex::ParticleReal& probability_threshold,
59 const amrex::ParticleReal& probability_target_value,
62 using namespace amrex::literals;
63 constexpr amrex::ParticleReal inv_c = 1._prt /
PhysConst::c;
64 constexpr amrex::ParticleReal inv_c_sq = inv_c * inv_c;
66 const amrex::ParticleReal w_min =
amrex::min(w1, w2);
67 const amrex::ParticleReal w_max =
amrex::max(w1, w2);
74 const amrex::ParticleReal gamma_lepton = std::sqrt(1._prt + (u2x*u2x + u2y*u2y + u2z*u2z)*inv_c_sq);
76 amrex::ParticleReal
const u1_norm = std::sqrt(u1x*u1x + u1y*u1y + u1z*u1z);
79 const amrex::ParticleReal u1_norm_rest = u1_norm * gamma_lepton - (u1x*u2x + u1y*u2y + u1z*u2z)*inv_c;
82 const amrex::ParticleReal lab_to_rest_frame_factor = u1_norm_rest * 1._prt / (u1_norm * gamma_lepton);
88 const amrex::ParticleReal k = u1_norm_rest * inv_c;
90 const amrex::ParticleReal f1 = 2._prt * ( 2._prt + k*(1._prt+k)*(8._prt+k) ) / ( k*k * (1._prt + 2._prt*k)*(1._prt + 2._prt*k) );
91 const amrex::ParticleReal f2 = ( 2._prt + k*(2._prt-k) ) * std::log( 1._prt + 2._prt*k ) / (k*k*k);
96 amrex::ParticleReal probability_estimate = multiplier_ratio * event_multiplier *
97 lab_to_rest_frame_factor * w_max * klein_nishina_cross_section * v_rel * dt / dV;
100 amrex::ParticleReal event_multiplier_eff = event_multiplier;
105 if (probability_estimate > probability_threshold)
109 event_multiplier_eff =
amrex::max(event_multiplier *
110 probability_target_value / probability_estimate , 1._prt);
111 probability_estimate *= event_multiplier_eff/event_multiplier;
119 const amrex::ParticleReal probability = -std::expm1(-probability_estimate);
122 const amrex::ParticleReal random_number =
amrex::Random(engine);
125 if (random_number < probability)
127 p_mask[pair_index] =
true;
128 p_pair_reaction_weight[pair_index] = w_min/event_multiplier_eff;
132 p_mask[pair_index] =
false;
AMREX_GPU_HOST_DEVICE AMREX_INLINE void SingleLinearComptonCollisionEvent(const amrex::ParticleReal &u1x, const amrex::ParticleReal &u1y, const amrex::ParticleReal &u1z, const amrex::ParticleReal &u2x, const amrex::ParticleReal &u2y, const amrex::ParticleReal &u2z, amrex::ParticleReal w1, amrex::ParticleReal w2, const amrex::Real &dt, const amrex::ParticleReal &dV, const int &pair_index, index_type *AMREX_RESTRICT p_mask, amrex::ParticleReal *AMREX_RESTRICT p_pair_reaction_weight, const amrex::ParticleReal &event_multiplier, const int &multiplier_ratio, const amrex::ParticleReal &probability_threshold, const amrex::ParticleReal &probability_target_value, const amrex::RandomEngine &engine)
This function computes whether the collision between a photon and lepton results in a scattering even...
Definition SingleLinearComptonCollisionEvent.H:49