11 #include <gsl/gsl_sf_bessel.h> 23 double breit_wigner(
const double m,
const double pole,
const double width) {
24 const double msqr = m * m;
25 const double dmsqr = msqr - pole * pole;
26 return 2. * msqr * width / (M_PI * (dmsqr * dmsqr + msqr * width * width));
31 return cauchy(m, pole, width / 2.);
35 double cauchy(
double x,
double pole,
double width) {
36 const double dm = x - pole;
37 return width / (M_PI * (dm * dm + width * width));
42 const double temperature) {
43 return 4.0 * M_PI * momentum_sqr * std::exp(-energy / temperature);
47 const double temperature) {
48 return momentum_sqr * std::sqrt(momentum_sqr) *
49 std::exp(-energy / temperature);
53 const double temperature) {
54 return ((3.0 / 20.0) * (momentum_sqr / (temperature * temperature)) -
55 (6.0 / 5.0) * (energy / temperature) + (14.0 / 5.0)) *
56 std::exp(-energy / temperature) * momentum_sqr;
60 const double temperature) {
61 return (0.75 + 0.125 * (momentum_sqr / (temperature * temperature)) -
62 (1.0 / 30.0) * (momentum_sqr * energy /
63 (temperature * temperature * temperature)) +
65 (momentum_sqr * momentum_sqr /
66 (temperature * temperature * temperature * temperature))) *
67 std::exp(-energy / temperature) * momentum_sqr;
71 const double mass,
const double temperature,
72 const double baryon_chemical_potential,
75 (std::exp((std::sqrt(momentum_radial * momentum_radial + mass * mass) -
76 baryon_chemical_potential) /
82 const auto &log = logger<LogArea::Distributions>();
83 log.debug(
"Sample momenta with mass ", mass,
" and T ", temperature);
87 const double mom_min = 0.0;
88 const double mom_max =
89 std::sqrt(50. * 50. * temperature * temperature - mass * mass);
92 const double p_non_eq_sq =
93 0.5 * (9 * temperature * temperature +
95 std::sqrt(81 * temperature * temperature + 36 * mass * mass));
96 const double e_non_eq = std::sqrt(p_non_eq_sq + mass * mass);
97 const double probability_max =
102 double energy, momentum_radial, probability;
107 energy = std::sqrt(momentum_radial * momentum_radial + mass * mass);
109 energy, momentum_radial * momentum_radial, temperature);
112 return momentum_radial;
116 const auto &log = logger<LogArea::Distributions>();
117 log.debug(
"Sample momenta with mass ", mass,
" and T ", temperature);
119 double energy_average;
122 const double m_over_T = mass / temperature;
123 energy_average = 3 * temperature + mass * gsl_sf_bessel_K1(m_over_T) /
124 gsl_sf_bessel_Kn(2, m_over_T);
127 energy_average = 3 * temperature;
129 const double momentum_average_sqr =
130 (energy_average - mass) * (energy_average + mass);
131 const double energy_min = mass;
132 const double energy_max = 50. * temperature;
135 const double probability_max =
141 double momentum_radial_sqr, probability;
144 momentum_radial_sqr = (energy - mass) * (energy + mass);
149 return std::sqrt(momentum_radial_sqr);
153 const auto &log = logger<LogArea::Distributions>();
154 log.debug(
"Sample momenta with mass ", mass,
" and T ", temperature);
156 double energy_average;
159 const double m_over_T = mass / temperature;
160 energy_average = 3 * temperature + mass * gsl_sf_bessel_K1(m_over_T) /
161 gsl_sf_bessel_Kn(2, m_over_T);
164 energy_average = 3 * temperature;
166 const double momentum_average_sqr =
167 (energy_average - mass) * (energy_average + mass);
168 const double energy_min = mass;
169 const double energy_max = 50. * temperature;
172 const double probability_max =
178 double momentum_radial_sqr, probability;
181 momentum_radial_sqr = (energy - mass) * (energy + mass);
186 return std::sqrt(momentum_radial_sqr);
206 const auto &log = logger<LogArea::Distributions>();
207 log.debug(
"Sample momenta with mass ", mass,
" and T ", temperature);
208 double momentum_radial, energy;
210 if (temperature > 0.6 * mass) {
215 momentum_radial = temperature * (a + b + c);
216 energy = std::sqrt(momentum_radial * momentum_radial + mass * mass);
218 std::exp((momentum_radial - energy) / temperature)) {
225 const double I1 = mass * mass;
226 const double I2 = 2.0 * mass * temperature;
227 const double I3 = 2.0 * temperature * temperature;
228 const double Itot = I1 + I2 + I3;
230 if (r0 < I1 / Itot) {
232 K = -temperature * std::log(r1);
233 }
else if (r0 < (I1 + I2) / Itot) {
236 K = -temperature * std::log(r1 * r2);
241 K = -temperature * std::log(r1 * r2 * r3);
244 momentum_radial = std::sqrt((energy + mass) * (energy - mass));
250 return momentum_radial;
254 double momentum_radial;
259 momentum_radial = (3.0 / 4.0) * temperature * (a + b + c + d);
261 return momentum_radial;
double juttner_distribution_func(const double momentum_radial, const double mass, const double temperature, const double baryon_chemical_potential, const double lam)
Relativistic Juttner distribution function.
double breit_wigner_nonrel(double m, double pole, double width)
Returns a non-relativistic Breit-Wigner distribution, which is essentially a Cauchy distribution with...
double sample_momenta_2M_IC(const double temperature, const double mass)
Samples a momentum from the non-equilibrium distribution 2M_IC from Bazow:2016oky ...
Collection of useful constants that are known at compile time.
double cauchy(double x, double pole, double width)
Returns a Cauchy distribution (sometimes also called Lorentz or non-relativistic Breit-Wigner distrib...
double sample_momenta_IC_ES(const double temperature)
Sample momenta according to the momentum distribution in Bazow:2016oky
double density_integrand_1M_IC(const double energy, const double momentum_sqr, const double temperature)
density integrand - 1M_IC massless particles for expanding metric initialization, see Bazow:2016oky ...
double density_integrand_2M_IC(const double energy, const double momentum_sqr, const double temperature)
density integrand - 2M_IC massless particles for expanding metric initialization, see Bazow:2016oky ...
double breit_wigner(double m, double pole, double width)
Returns a relativistic Breit-Wigner distribution.
double sample_momenta_from_thermal(const double temperature, const double mass)
Samples a momentum from the Maxwell-Boltzmann (thermal) distribution in a faster way, given by Scott Pratt.
double density_integrand(const double energy, const double momentum_sqr, const double temperature)
Returns the Maxwell-Boltzmann distribution.
double sample_momenta_non_eq_mass(const double temperature, const double mass)
Samples a momentum via rejection method from the non-equilibrium distribution .
double sample_momenta_1M_IC(const double temperature, const double mass)
Samples a momentum from the non-equilibrium distribution 1M_IC from Bazow:2016oky ...
double density_integrand_mass(const double energy, const double momentum_sqr, const double temperature)
density_integrand_mass - off_equilibrium distribution for massive particles