 |
Version: SMASH-1.8
|
|
#include <grandcan_thermalizer.h>
The GrandCanThermalizer class implements the following functionality:
- Create a lattice and find the local rest frame energy density in each cell from the particles.
- Remove particles from the cells, where the energy density is high enough. Save the energy, momentum and quantum numbers of the removed particles.
- Sample new particles instead of the removed ones according to the grand-canonical thermal distribution, but with an additional constraint: the energy, momentum and quantum numbers should be the same as those of the removed particles.
The step 3. is a challenging task, so several algorithms are implemented that try to fulfil the requirements. The algorithms are a trade-off between mathematical rigour and computational speed. All of them are shown to reproduce the mean values of multiplicities correctly. However, this is not the case for multiplicity fluctuations. For details see Oliinychenko:2016vkg [33].
Definition at line 217 of file grandcan_thermalizer.h.
|
| GrandCanThermalizer (const std::array< double, 3 > lat_sizes, const std::array< int, 3 > n_cells, const std::array< double, 3 > origin, bool periodicity, double e_critical, double t_start, double delta_t, ThermalizationAlgorithm algo, bool BF_microcanonical) |
| Default constructor for the GranCanThermalizer to allocate the lattice. More...
|
|
| GrandCanThermalizer (Configuration &conf, const std::array< double, 3 > lat_sizes, const std::array< double, 3 > origin, bool periodicity) |
|
bool | is_time_to_thermalize (std::unique_ptr< Clock > &clock) const |
| Check that the clock is close to n * period of thermalization, since the thermalization only happens at these times. More...
|
|
void | update_thermalizer_lattice (const Particles &particles, const DensityParameters &par, bool ignore_cells_under_threshold=true) |
| Compute all the thermodynamical quantities on the lattice from particles. More...
|
|
ThreeVector | uniform_in_cell () const |
|
void | renormalize_momenta (ParticleList &plist, const FourVector required_total_momentum) |
| Changes energy and momenta of the particles in plist to match the required_total_momentum. More...
|
|
void | sample_multinomial (HadronClass particle_class, int N) |
| The sample_multinomial function samples integer numbers n_i distributed according to the multinomial distribution with sum N: \( p(n_1, n_2, \dots) = \prod a_i^{n_i} \times \frac{N!}{n_1!n_2! \dots} \) if \( \sum n_i = N \) and \( p = 0 \) otherwise. More...
|
|
void | sample_in_random_cell_BF_algo (ParticleList &plist, const double time, size_t type_index) |
| The total number of particles of species type_index is defined by mult_int_ array that is returned by. More...
|
|
void | thermalize_BF_algo (QuantumNumbers &conserved_initial, double time, int ntest) |
| Samples particles according to the BF algorithm by making use of the. More...
|
|
template<typename F > |
void | compute_N_in_cells_mode_algo (F &&condition) |
| Computes average number of particles in each cell for the mode algorithm. More...
|
|
template<typename F > |
ParticleData | sample_in_random_cell_mode_algo (const double time, F &&condition) |
| Samples one particle and the species, cell, momentum and coordinate are chosen from the corresponding distributions. More...
|
|
void | thermalize_mode_algo (QuantumNumbers &conserved_initial, double time) |
| Samples particles to the according to the mode algorithm. More...
|
|
void | thermalize (const Particles &particles, double time, int ntest) |
| Main thermalize function, that chooses the algorithm to follow (BF or mode sampling). More...
|
|
void | print_statistics (const Clock &clock) const |
| Generates standard output with information about the thermodynamic properties of the lattice, the thermalized region and the volume to be thermalized above the critical energy density. More...
|
|
RectangularLattice< ThermLatticeNode > & | lattice () const |
| Getter function for the lattice. More...
|
|
double | e_crit () const |
| Get the critical energy density. More...
|
|
ParticleList | particles_to_remove () const |
| List of particles to be removed from the simulation. More...
|
|
ParticleList | particles_to_insert () const |
| List of newly created particles to be inserted in the simulation. More...
|
|
◆ GrandCanThermalizer() [1/2]
smash::GrandCanThermalizer::GrandCanThermalizer |
( |
const std::array< double, 3 > |
lat_sizes, |
|
|
const std::array< int, 3 > |
n_cells, |
|
|
const std::array< double, 3 > |
origin, |
|
|
bool |
periodicity, |
|
|
double |
e_critical, |
|
|
double |
t_start, |
|
|
double |
delta_t, |
|
|
ThermalizationAlgorithm |
algo, |
|
|
bool |
BF_microcanonical |
|
) |
| |
Default constructor for the GranCanThermalizer to allocate the lattice.
- Parameters
-
[in] | lat_sizes | Size of lattice in x,y and z-direction in fm. |
[in] | n_cells | Number of cells in x, y and z-direction. |
[in] | origin | Coordinates of the left, down, near corner of the lattice in fm. |
[in] | periodicity | Boolean to decide, if the lattice is periodically extended to infinity or not |
[in] | e_critical | Critical energy density above which the cells are thermalized |
[in] | t_start | Starting time of the simulation |
[in] | delta_t | Timestep of the simulation |
[in] | algo | Choice of algorithm for the canonical sampling |
[in] | BF_microcanonical | Enforce energy conservation in BF sampling algorithms or nor |
Definition at line 99 of file grandcan_thermalizer.cc.
114 lat_ = make_unique<RectangularLattice<ThermLatticeNode>>(
115 lat_sizes, n_cells, origin, periodicity, upd);
116 const std::array<double, 3> abc =
lat_->cell_sizes();
◆ GrandCanThermalizer() [2/2]
smash::GrandCanThermalizer::GrandCanThermalizer |
( |
Configuration & |
conf, |
|
|
const std::array< double, 3 > |
lat_sizes, |
|
|
const std::array< double, 3 > |
origin, |
|
|
bool |
periodicity |
|
) |
| |
|
inline |
- See also
- GrandCanThermalizer Exactly the same but taking values from config
Definition at line 241 of file grandcan_thermalizer.h.
245 lat_sizes, conf.take({
"Cell_Number"}), origin, periodicity,
246 conf.take({
"Critical_Edens"}), conf.take({
"Start_Time"}),
247 conf.take({
"Timestep"}),
249 conf.take({
"Microcanonical"},
false)) {}
◆ is_time_to_thermalize()
bool smash::GrandCanThermalizer::is_time_to_thermalize |
( |
std::unique_ptr< Clock > & |
clock | ) |
const |
|
inline |
Check that the clock is close to n * period of thermalization, since the thermalization only happens at these times.
- Parameters
-
[in] | clock | Current system time |
Definition at line 255 of file grandcan_thermalizer.h.
256 const double t = clock->current_time();
259 t < t_start_ + n * period_ + clock->timestep_duration());
◆ update_thermalizer_lattice()
void smash::GrandCanThermalizer::update_thermalizer_lattice |
( |
const Particles & |
particles, |
|
|
const DensityParameters & |
par, |
|
|
bool |
ignore_cells_under_threshold = true |
|
) |
| |
Compute all the thermodynamical quantities on the lattice from particles.
- Parameters
-
[in] | particles | Current list of particles |
- See also
- Particles
- Parameters
-
[in] | par | Parameters necessary for density determination |
- See also
- DensityParameters
- Parameters
-
[in] | ignore_cells_under_threshold | Boolean that is true by default |
Definition at line 123 of file grandcan_thermalizer.cc.
129 for (
auto &node : *
lat_) {
133 if (!ignore_cells_under_treshold ||
134 node.Tmu0().x0() + std::abs(node.Tmu0().x1()) +
135 std::abs(node.Tmu0().x2()) + std::abs(node.Tmu0().x3()) >=
137 node.compute_rest_frame_quantities(
eos_);
139 node = ThermLatticeNode();
◆ uniform_in_cell()
ThreeVector smash::GrandCanThermalizer::uniform_in_cell |
( |
| ) |
const |
- Returns
- 3 vector uniformly sampled from the rectangular cell.
Definition at line 144 of file grandcan_thermalizer.cc.
146 +0.5 *
lat_->cell_sizes()[0]),
148 +0.5 *
lat_->cell_sizes()[1]),
150 +0.5 *
lat_->cell_sizes()[2]));
◆ renormalize_momenta()
void smash::GrandCanThermalizer::renormalize_momenta |
( |
ParticleList & |
plist, |
|
|
const FourVector |
required_total_momentum |
|
) |
| |
Changes energy and momenta of the particles in plist to match the required_total_momentum.
The procedure is described in Oliinychenko:2016vkg [33].
- Parameters
-
[in] | plist | List of particles |
- See also
- ParticleList
- Parameters
-
[in] | required_total_momentum | The necessary total momentum of the cell |
Definition at line 153 of file grandcan_thermalizer.cc.
156 QuantumNumbers conserved = QuantumNumbers(plist);
158 required_total_momentum);
160 const ThreeVector mom_to_add =
161 (required_total_momentum.threevec() - conserved.momentum().threevec()) /
164 for (
auto &particle : plist) {
165 particle.set_4momentum(particle.type().mass(),
166 particle.momentum().threevec() + mom_to_add);
170 conserved = QuantumNumbers(plist);
171 const ThreeVector beta_CM_generated = conserved.momentum().velocity();
172 const ThreeVector beta_CM_required = required_total_momentum.velocity();
175 double E_expected = required_total_momentum.abs();
176 for (
auto &particle : plist) {
177 particle.boost_momentum(beta_CM_generated);
178 E += particle.momentum().x0();
182 double a, a_min, a_max, er;
183 const int max_iter = 100;
185 if (E_expected >= E) {
193 a = 0.5 * (a_min + a_max);
195 for (
const auto &particle : plist) {
196 const double p2 = particle.momentum().threevec().sqr();
197 const double E2 = particle.momentum().x0() * particle.momentum().x0();
198 E += std::sqrt(E2 + a * (a + 2.0) * p2);
209 }
while (std::abs(er) > tolerance && iter < max_iter);
213 for (
auto &particle : plist) {
214 particle.set_4momentum(particle.type().mass(),
215 (1 + a) * particle.momentum().threevec());
216 particle.boost_momentum(-beta_CM_required);
◆ sample_multinomial()
void smash::GrandCanThermalizer::sample_multinomial |
( |
HadronClass |
particle_class, |
|
|
int |
N |
|
) |
| |
The sample_multinomial function samples integer numbers n_i distributed according to the multinomial distribution with sum N: \( p(n_1, n_2, \dots) = \prod a_i^{n_i} \times \frac{N!}{n_1!n_2! \dots} \) if \( \sum n_i = N \) and \( p = 0 \) otherwise.
- Parameters
-
[in] | particle_class | A certain group of hadron species |
- See also
- HadronClass
- Parameters
-
[out] | N | Number of particles to be sampled |
- Todo:
- (oliiny) what to do with this output?
Definition at line 220 of file grandcan_thermalizer.cc.
227 for (
size_t i_type = 0; (i_type <
N_sorts_) && (N_to_sample > 0); i_type++) {
228 if (
get_class(i_type) != particle_class) {
◆ sample_in_random_cell_BF_algo()
void smash::GrandCanThermalizer::sample_in_random_cell_BF_algo |
( |
ParticleList & |
plist, |
|
|
const double |
time, |
|
|
size_t |
type_index |
|
) |
| |
The total number of particles of species type_index is defined by mult_int_ array that is returned by.
- See also
- sample_multinomial. This function samples mult_int_[type_index] particles. It chooses randomly the cell to sample and picks up momentum and coordinate from the corresponding distributions.
- Parameters
-
- See also
- ParticleList of newly produced particles
- Parameters
-
[in] | time | Current time in the simulation to become zero component of sampled particles |
[in] | type_index | Species that should be sampled |
Definition at line 245 of file grandcan_thermalizer.cc.
251 const ThermLatticeNode cell = (*lat_)[cell_index];
252 const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
253 const double N_this_cell =
256 cell.mub(), cell.mus());
261 for (
int i = 0; i <
mult_int_[type_index]; i++) {
264 double partial_sum = 0.0;
265 int index_only_thermalized = -1;
266 while (partial_sum < r) {
267 index_only_thermalized++;
268 partial_sum +=
N_in_cells_[index_only_thermalized];
271 const ThermLatticeNode cell = (*lat_)[cell_index];
272 const ThreeVector cell_center =
lat_->cell_center(cell_index);
278 particle.set_4position(FourVector(time, cell_center +
uniform_in_cell()));
282 phitheta.distribute_isotropically();
283 particle.set_4momentum(m, phitheta.threevec() * momentum_radial);
284 particle.boost_momentum(-cell.v());
285 particle.set_formation_time(time);
287 plist.push_back(particle);
◆ thermalize_BF_algo()
void smash::GrandCanThermalizer::thermalize_BF_algo |
( |
QuantumNumbers & |
conserved_initial, |
|
|
double |
time, |
|
|
int |
ntest |
|
) |
| |
Samples particles according to the BF algorithm by making use of the.
- See also
- sample_in_random_cell_BF_algo. Quantum numbers of the sampled particles are required to be equal to the original particles in this region.
- Parameters
-
[in] | conserved_initial | The quantum numbers of the total ensemble of of particles in the region to be thermalized |
[in] | time | Current time of the simulation |
[in] | ntest | Number of testparticles |
- Returns
- Particle list with newly sampled particles according to Becattini-Feroni algorithm
Definition at line 291 of file grandcan_thermalizer.cc.
295 const ThermLatticeNode cell = (*lat_)[cell_index];
296 const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
297 for (
size_t i = 0; i <
N_sorts_; i++) {
306 for (
size_t i = 0; i <
N_sorts_; i++) {
312 conserved_initial.baryon_number());
317 const auto Nbar_antibar = bessel_sampler_B.sample();
324 for (
size_t i = 0; i <
N_sorts_; i++) {
328 std::pair<int, int> NS_antiS;
330 random::BesselSampler bessel_sampler_S(
333 conserved_initial.strangeness() - S_sampled);
334 NS_antiS = bessel_sampler_S.sample();
336 NS_antiS = std::make_pair(
339 if (NS_antiS.first - NS_antiS.second !=
340 conserved_initial.strangeness() - S_sampled) {
349 for (
size_t i = 0; i <
N_sorts_; i++) {
353 std::pair<int, int> NC_antiC;
355 random::BesselSampler bessel_sampler_C(
358 conserved_initial.charge() - ch_sampled);
359 NC_antiC = bessel_sampler_C.sample();
361 NC_antiC = std::make_pair(
364 if (NC_antiC.first - NC_antiC.second !=
365 conserved_initial.charge() - ch_sampled) {
376 for (
size_t itype = 0; itype <
N_sorts_; itype++) {
381 const double e_init = conserved_initial.momentum().x0();
384 e_tot += particle.momentum().x0();
386 if (std::abs(e_tot - e_init) > 0.01 * e_init) {
388 " too far from ", e_init);
◆ compute_N_in_cells_mode_algo()
template<typename F >
void smash::GrandCanThermalizer::compute_N_in_cells_mode_algo |
( |
F && |
condition | ) |
|
|
inline |
Computes average number of particles in each cell for the mode algorithm.
- Parameters
-
[in] | condition | Specifies the current mode (1 to 7) |
Definition at line 329 of file grandcan_thermalizer.h.
333 const ThermLatticeNode cell = (*lat_)[cell_index];
334 const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
337 if (condition(i->strangeness(), i->baryon_number(), i->charge())) {
◆ sample_in_random_cell_mode_algo()
template<typename F >
ParticleData smash::GrandCanThermalizer::sample_in_random_cell_mode_algo |
( |
const double |
time, |
|
|
F && |
condition |
|
) |
| |
|
inline |
Samples one particle and the species, cell, momentum and coordinate are chosen from the corresponding distributions.
The condition function limits the choice of possible species.
Condition is a function of the signature of quantum number S, B and Q. bool condition(int strangeness, int baryon_number, int charge);
- Parameters
-
[in] | time | Current time in simulation |
[in] | condition | Specifies the actual mode (1 to 7) |
Definition at line 360 of file grandcan_thermalizer.h.
364 double partial_sum = 0.0;
365 int index_only_thermalized = -1;
366 while (partial_sum < r) {
367 index_only_thermalized++;
368 partial_sum +=
N_in_cells_[index_only_thermalized];
371 const ThermLatticeNode cell = (*lat_)[cell_index];
372 const ThreeVector cell_center =
lat_->cell_center(cell_index);
373 const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
374 const double N_in_cell =
N_in_cells_[index_only_thermalized];
378 ParticleTypePtr type_to_sample;
380 if (!condition(i->strangeness(), i->baryon_number(), i->charge())) {
391 ParticleData particle(*type_to_sample);
393 const double m = type_to_sample->mass();
395 particle.set_4position(FourVector(time, cell_center +
uniform_in_cell()));
399 phitheta.distribute_isotropically();
400 particle.set_4momentum(m, phitheta.threevec() * momentum_radial);
401 particle.boost_momentum(-cell.v());
402 particle.set_formation_time(time);
◆ thermalize_mode_algo()
void smash::GrandCanThermalizer::thermalize_mode_algo |
( |
QuantumNumbers & |
conserved_initial, |
|
|
double |
time |
|
) |
| |
Samples particles to the according to the mode algorithm.
Quantum numbers of the sampled particles are required to be as in conserved_initial.
- Parameters
-
[in] | conserved_initial | Quantum numbers of the original particles in the region to be thermalized |
[in] | time | Current time of the simulation |
Definition at line 396 of file grandcan_thermalizer.cc.
399 int S_plus = 0, S_minus = 0, B_plus = 0, B_minus = 0, E_plus = 0, E_minus = 0;
401 auto condition1 = [](int, int, int) {
return true; };
403 while (conserved_initial.momentum().x0() > energy ||
404 S_plus < conserved_initial.strangeness()) {
406 energy +=
p.momentum().x0();
407 if (
p.pdgcode().strangeness() > 0) {
409 S_plus +=
p.pdgcode().strangeness();
414 auto condition2 = [](
int S, int, int) {
return (
S < 0); };
416 while (S_plus + S_minus > conserved_initial.strangeness()) {
418 const int s_part =
p.pdgcode().strangeness();
420 if (S_plus + S_minus + s_part >= conserved_initial.strangeness()) {
427 auto condition3 = [](
int S, int, int) {
return (
S == 0); };
428 QuantumNumbers conserved_remaining =
432 while (conserved_remaining.momentum().x0() > energy ||
433 B_plus < conserved_remaining.baryon_number()) {
435 energy +=
p.momentum().x0();
436 if (
p.pdgcode().baryon_number() > 0) {
438 B_plus +=
p.pdgcode().baryon_number();
443 auto condition4 = [](
int S,
int B, int) {
return (
S == 0) && (B < 0); };
445 while (B_plus + B_minus > conserved_remaining.baryon_number()) {
447 const int bar =
p.pdgcode().baryon_number();
448 if (B_plus + B_minus + bar >= conserved_remaining.baryon_number()) {
455 auto condition5 = [](
int S,
int B, int) {
return (
S == 0) && (B == 0); };
456 conserved_remaining = conserved_initial - QuantumNumbers(
sampled_list_);
459 while (conserved_remaining.momentum().x0() > energy ||
460 E_plus < conserved_remaining.charge()) {
462 energy +=
p.momentum().x0();
463 if (
p.pdgcode().charge() > 0) {
465 E_plus +=
p.pdgcode().charge();
470 auto condition6 = [](
int S,
int B,
int C) {
471 return (
S == 0) && (B == 0) && (C < 0);
474 while (E_plus + E_minus > conserved_remaining.charge()) {
476 const int charge =
p.pdgcode().charge();
477 if (E_plus + E_minus + charge >= conserved_remaining.charge()) {
484 auto condition7 = [](
int S,
int B,
int C) {
485 return (
S == 0) && (B == 0) && (C == 0);
487 conserved_remaining = conserved_initial - QuantumNumbers(
sampled_list_);
490 while (conserved_remaining.momentum().x0() > energy) {
493 energy +=
p.momentum().x0();
◆ thermalize()
void smash::GrandCanThermalizer::thermalize |
( |
const Particles & |
particles, |
|
|
double |
time, |
|
|
int |
ntest |
|
) |
| |
Main thermalize function, that chooses the algorithm to follow (BF or mode sampling).
- Parameters
-
[out] | particles | List of sampled particles in thermalized region |
[in] | time | Current time of the simulation |
[in] | ntest | number of testparticles |
Definition at line 497 of file grandcan_thermalizer.cc.
505 QuantumNumbers conserved_initial = QuantumNumbers();
506 ThermLatticeNode node;
507 for (
auto &particle : particles) {
508 const bool is_on_lattice =
509 lat_->value_at(particle.position().threevec(), node);
510 if (is_on_lattice && node.e() >
e_crit_) {
518 conserved_initial.add_values(particle);
522 conserved_initial = QuantumNumbers();
527 if (conserved_initial == QuantumNumbers()) {
532 const size_t lattice_total_cells =
lat_->size();
533 for (
size_t i = 0; i < lattice_total_cells; i++) {
539 "Number of cells in the thermalization region = ",
542 ", in % of lattice: ",
554 throw std::invalid_argument(
555 "This thermalization algorithm is"
556 " not yet implemented");
◆ print_statistics()
void smash::GrandCanThermalizer::print_statistics |
( |
const Clock & |
clock | ) |
const |
Generates standard output with information about the thermodynamic properties of the lattice, the thermalized region and the volume to be thermalized above the critical energy density.
- Parameters
-
[in] | clock | Current time of the simulation |
Definition at line 565 of file grandcan_thermalizer.cc.
573 struct to_average on_lattice = {0.0, 0.0, 0.0, 0.0, 0.0};
574 struct to_average in_therm_reg = {0.0, 0.0, 0.0, 0.0, 0.0};
575 double e_sum_on_lattice = 0.0, e_sum_in_therm_reg = 0.0;
576 int node_counter = 0;
577 for (
const auto &node : *
lat_) {
578 const double e = node.e();
579 on_lattice.T += node.T() * e;
580 on_lattice.mub += node.mub() * e;
581 on_lattice.mus += node.mus() * e;
582 on_lattice.nb += node.nb() * e;
583 on_lattice.ns += node.ns() * e;
584 e_sum_on_lattice += e;
586 in_therm_reg.T += node.T() * e;
587 in_therm_reg.mub += node.mub() * e;
588 in_therm_reg.mus += node.mus() * e;
589 in_therm_reg.nb += node.nb() * e;
590 in_therm_reg.ns += node.ns() * e;
591 e_sum_in_therm_reg += e;
596 on_lattice.T /= e_sum_on_lattice;
597 on_lattice.mub /= e_sum_on_lattice;
598 on_lattice.mus /= e_sum_on_lattice;
599 on_lattice.nb /= e_sum_on_lattice;
600 on_lattice.ns /= e_sum_on_lattice;
603 in_therm_reg.T /= e_sum_in_therm_reg;
604 in_therm_reg.mub /= e_sum_in_therm_reg;
605 in_therm_reg.mus /= e_sum_in_therm_reg;
606 in_therm_reg.nb /= e_sum_in_therm_reg;
607 in_therm_reg.ns /= e_sum_in_therm_reg;
610 std::cout <<
"Current time [fm/c]: " << clock.current_time() << std::endl;
611 std::cout <<
"Averages on the lattice - T[GeV], mub[GeV], mus[GeV], "
612 <<
"nb[fm^-3], ns[fm^-3]: " << on_lattice.T <<
" " << on_lattice.mub
613 <<
" " << on_lattice.mus <<
" " << on_lattice.nb <<
" "
614 << on_lattice.ns << std::endl;
615 std::cout <<
"Averages in therm. region - T[GeV], mub[GeV], mus[GeV], "
616 <<
"nb[fm^-3], ns[fm^-3]: " << in_therm_reg.T <<
" "
617 << in_therm_reg.mub <<
" " << in_therm_reg.mus <<
" "
618 << in_therm_reg.nb <<
" " << in_therm_reg.ns << std::endl;
619 std::cout <<
"Volume with e > e_crit [fm^3]: " <<
cell_volume_ * node_counter
◆ lattice()
◆ e_crit()
double smash::GrandCanThermalizer::e_crit |
( |
| ) |
const |
|
inline |
◆ particles_to_remove()
ParticleList smash::GrandCanThermalizer::particles_to_remove |
( |
| ) |
const |
|
inline |
◆ particles_to_insert()
ParticleList smash::GrandCanThermalizer::particles_to_insert |
( |
| ) |
const |
|
inline |
◆ list_eos_particles()
ParticleTypePtrList smash::GrandCanThermalizer::list_eos_particles |
( |
| ) |
const |
|
inlineprivate |
Extracts the particles in the hadron gas equation of state from the complete list of particle types in SMASH.
Definition at line 445 of file grandcan_thermalizer.h.
446 ParticleTypePtrList res;
449 res.push_back(&ptype);
◆ get_class()
HadronClass smash::GrandCanThermalizer::get_class |
( |
size_t |
typelist_index | ) |
const |
|
inlineprivate |
Defines the class of hadrons by quantum numbers.
- Parameters
-
[in] | typelist_index | Index for a certain quantum number |
Definition at line 458 of file grandcan_thermalizer.h.
459 const int B =
eos_typelist_[typelist_index]->baryon_number();
◆ mult_class()
double smash::GrandCanThermalizer::mult_class |
( |
const HadronClass |
cl | ) |
const |
|
inlineprivate |
◆ N_in_cells_
std::vector<double> smash::GrandCanThermalizer::N_in_cells_ |
|
private |
◆ cells_to_sample_
std::vector<size_t> smash::GrandCanThermalizer::cells_to_sample_ |
|
private |
◆ eos_
◆ lat_
◆ to_remove_
ParticleList smash::GrandCanThermalizer::to_remove_ |
|
private |
◆ sampled_list_
ParticleList smash::GrandCanThermalizer::sampled_list_ |
|
private |
◆ eos_typelist_
const ParticleTypePtrList smash::GrandCanThermalizer::eos_typelist_ |
|
private |
List of particle types from which equation of state is computed.
Most particles are included, but not all of them. For example, photons and leptons are not included. Heavy hadrons, that can originate from Pythia, but do not interact in SMASH are not included. The latter are excluded to avoid violations of charm and bottomness conservation, when HadronGasEoS is used for forced thermalization.
Definition at line 496 of file grandcan_thermalizer.h.
◆ N_sorts_
const size_t smash::GrandCanThermalizer::N_sorts_ |
|
private |
◆ mult_sort_
std::vector<double> smash::GrandCanThermalizer::mult_sort_ |
|
private |
◆ mult_int_
std::vector<int> smash::GrandCanThermalizer::mult_int_ |
|
private |
◆ mult_classes_
std::array<double, 7> smash::GrandCanThermalizer::mult_classes_ |
|
private |
◆ N_total_in_cells_
double smash::GrandCanThermalizer::N_total_in_cells_ |
|
private |
◆ cell_volume_
double smash::GrandCanThermalizer::cell_volume_ |
|
private |
Volume of a single cell, necessary to convert thermal densities to actual particle numbers.
Definition at line 514 of file grandcan_thermalizer.h.
◆ e_crit_
const double smash::GrandCanThermalizer::e_crit_ |
|
private |
◆ t_start_
const double smash::GrandCanThermalizer::t_start_ |
|
private |
◆ period_
const double smash::GrandCanThermalizer::period_ |
|
private |
◆ algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
Definition at line 522 of file grandcan_thermalizer.h.
◆ BF_enforce_microcanonical_
const bool smash::GrandCanThermalizer::BF_enforce_microcanonical_ |
|
private |
The documentation for this class was generated from the following files:
LatticeUpdate
Enumerator option for lattice updates.
void sample_multinomial(HadronClass particle_class, int N)
The sample_multinomial function samples integer numbers n_i distributed according to the multinomial ...
GrandCanThermalizer(const std::array< double, 3 > lat_sizes, const std::array< int, 3 > n_cells, const std::array< double, 3 > origin, bool periodicity, double e_critical, double t_start, double delta_t, ThermalizationAlgorithm algo, bool BF_microcanonical)
Default constructor for the GranCanThermalizer to allocate the lattice.
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers.
Mesons with strangeness S < 0.
const double t_start_
Starting time of the simulation.
static double partial_density(const ParticleType &ptype, double T, double mub, double mus, bool account_for_resonance_widths=false)
Compute partial density of one hadron sort.
ParticleTypePtrList list_eos_particles() const
Extracts the particles in the hadron gas equation of state from the complete list of particle types i...
const size_t N_sorts_
Number of different species to be sampled.
Non-strange mesons (S = 0) with electric cherge Q < 0.
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
const double period_
Defines periodicity of the lattice in fm.
void thermalize_BF_algo(QuantumNumbers &conserved_initial, double time, int ntest)
Samples particles according to the BF algorithm by making use of the.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
constexpr double really_small
Numerical error tolerance.
int binomial(const int N, const T &p)
Returns a binomially distributed random number.
void update_lattice(RectangularLattice< T > *lat, const LatticeUpdate update, const DensityType dens_type, const DensityParameters &par, const Particles &particles, const bool compute_gradient=false)
Updates the contents on the lattice.
const bool BF_enforce_microcanonical_
Enforce energy conservation as part of BF sampling algorithm or not.
double N_total_in_cells_
Total number of particles over all cells in thermalization region.
Neutral non-strange mesons.
HadronClass get_class(size_t typelist_index) const
Defines the class of hadrons by quantum numbers.
ThreeVector uniform_in_cell() const
Mesons with strangeness S > 0.
Non-strange mesons (S = 0) with electric cherge Q > 0.
int poisson(const T &lam)
Returns a Poisson distributed random number.
void renormalize_momenta(ParticleList &plist, const FourVector required_total_momentum)
Changes energy and momenta of the particles in plist to match the required_total_momentum.
ParticleData sample_in_random_cell_mode_algo(const double time, F &&condition)
Samples one particle and the species, cell, momentum and coordinate are chosen from the corresponding...
void compute_N_in_cells_mode_algo(F &&condition)
Computes average number of particles in each cell for the mode algorithm.
void sample_in_random_cell_BF_algo(ParticleList &plist, const double time, size_t type_index)
The total number of particles of species type_index is defined by mult_int_ array that is returned by...
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
ParticleList sampled_list_
Newly generated particles by thermalizer.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
std::array< double, 7 > mult_classes_
The different hadron species according to the enum defined in.
DensityType
Allows to choose which kind of density to calculate.
static bool is_eos_particle(const ParticleType &ptype)
Check if a particle belongs to the EoS.
HadronGasEos eos_
Hadron gas equation of state.
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
std::vector< int > mult_int_
Integer multiplicity for each particle type.
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.
double mult_class(const HadronClass cl) const
void thermalize_mode_algo(QuantumNumbers &conserved_initial, double time)
Samples particles to the according to the mode algorithm.
double sample_momenta_from_thermal(const double temperature, const double mass)
Samples a momentum from the Maxwell-Boltzmann (thermal) distribution in a faster way,...
ParticleList to_remove_
Particles to be removed after this thermalization step.
const double e_crit_
Critical energy density above which cells are thermalized.
static constexpr int LGrandcanThermalizer
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
static const ParticleTypeList & list_all()