Version: SMASH-2.0
smash::GrandCanThermalizer Class Reference

#include <grandcan_thermalizer.h>

The GrandCanThermalizer class implements the following functionality:

  1. Create a lattice and find the local rest frame energy density in each cell from the particles.
  2. Remove particles from the cells, where the energy density is high enough. Save the energy, momentum and quantum numbers of the removed particles.
  3. 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 [36].

Definition at line 227 of file grandcan_thermalizer.h.

Collaboration diagram for smash::GrandCanThermalizer:
[legend]

Public Member Functions

 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...
 

Private Member Functions

ParticleTypePtrList list_eos_particles () const
 Extracts the particles in the hadron gas equation of state from the complete list of particle types in SMASH. More...
 
HadronClass get_class (size_t typelist_index) const
 Defines the class of hadrons by quantum numbers. More...
 
double mult_class (const HadronClass cl) const
 

Private Attributes

std::vector< double > N_in_cells_
 Number of particles to be sampled in one cell. More...
 
std::vector< size_t > cells_to_sample_
 Cells above critical energy density. More...
 
HadronGasEos eos_ = HadronGasEos(true, false)
 Hadron gas equation of state. More...
 
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
 The lattice on which the thermodynamic quantities are calculated. More...
 
ParticleList to_remove_
 Particles to be removed after this thermalization step. More...
 
ParticleList sampled_list_
 Newly generated particles by thermalizer. More...
 
const ParticleTypePtrList eos_typelist_
 List of particle types from which equation of state is computed. More...
 
const size_t N_sorts_
 Number of different species to be sampled. More...
 
std::vector< double > mult_sort_
 Real number multiplicity for each particle type. More...
 
std::vector< int > mult_int_
 Integer multiplicity for each particle type. More...
 
std::array< double, 7 > mult_classes_
 The different hadron species according to the enum defined in. More...
 
double N_total_in_cells_
 Total number of particles over all cells in thermalization region. More...
 
double lat_cell_volume_
 Volume of a single lattice cell, necessary to convert thermal densities to actual particle numbers. More...
 
const double e_crit_
 Critical energy density above which cells are thermalized. More...
 
const double t_start_
 Starting time of the simulation. More...
 
const double period_
 Defines periodicity of the lattice in fm. More...
 
const ThermalizationAlgorithm algorithm_
 Algorithm to choose for sampling of particles obeying conservation laws. More...
 
const bool BF_enforce_microcanonical_
 Enforce energy conservation as part of BF sampling algorithm or not. More...
 

Constructor & Destructor Documentation

◆ 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_sizesSize of lattice in x,y and z-direction in fm.
[in]n_cellsNumber of cells in x, y and z-direction.
[in]originCoordinates of the left, down, near corner of the lattice in fm.
[in]periodicityBoolean to decide, if the lattice is periodically extended to infinity or not
[in]e_criticalCritical energy density above which the cells are thermalized
[in]t_startStarting time of the simulation
[in]delta_tTimestep of the simulation
[in]algoChoice of algorithm for the canonical sampling
[in]BF_microcanonicalEnforce energy conservation in BF sampling algorithms or nor

Definition at line 106 of file grandcan_thermalizer.cc.

114  N_sorts_(eos_typelist_.size()),
115  e_crit_(e_critical),
116  t_start_(t_start),
117  period_(delta_t),
118  algorithm_(algo),
119  BF_enforce_microcanonical_(BF_microcanonical) {
121  lat_ = make_unique<RectangularLattice<ThermLatticeNode>>(
122  lat_sizes, n_cells, origin, periodicity, upd);
123  const std::array<double, 3> abc = lat_->cell_sizes();
124  lat_cell_volume_ = abc[0] * abc[1] * abc[2];
125  cells_to_sample_.resize(50000);
126  mult_sort_.resize(N_sorts_);
127  mult_int_.resize(N_sorts_);
128 }

◆ 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 251 of file grandcan_thermalizer.h.

255  lat_sizes, conf.take({"Cell_Number"}), origin, periodicity,
256  conf.take({"Critical_Edens"}), conf.take({"Start_Time"}),
257  conf.take({"Timestep"}),
258  conf.take({"Algorithm"}, ThermalizationAlgorithm::BiasedBF),
259  conf.take({"Microcanonical"}, false)) {}

Member Function Documentation

◆ 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]clockCurrent system time

Definition at line 265 of file grandcan_thermalizer.h.

265  {
266  const double t = clock->current_time();
267  const int n = static_cast<int>(std::floor((t - t_start_) / period_));
268  return (t > t_start_ &&
269  t < t_start_ + n * period_ + clock->timestep_duration());
270  }

◆ 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]particlesCurrent list of particles
See also
Particles
Parameters
[in]parParameters necessary for density determination
See also
DensityParameters
Parameters
[in]ignore_cells_under_thresholdBoolean that is true by default

Definition at line 130 of file grandcan_thermalizer.cc.

132  {
133  const DensityType dens_type = DensityType::Hadron;
135  update_lattice(lat_.get(), update, dens_type, dens_par, particles);
136  for (auto &node : *lat_) {
137  /* If energy density is definitely below e_crit -
138  no need to find T, mu, etc. So if e = T00 - T0i*vi <=
139  T00 + sum abs(T0i) < e_crit, no efforts are necessary. */
140  if (!ignore_cells_under_treshold ||
141  node.Tmu0().x0() + std::abs(node.Tmu0().x1()) +
142  std::abs(node.Tmu0().x2()) + std::abs(node.Tmu0().x3()) >=
143  e_crit_) {
144  node.compute_rest_frame_quantities(eos_);
145  } else {
146  node = ThermLatticeNode();
147  }
148  }
149 }
Here is the call graph for this function:

◆ uniform_in_cell()

ThreeVector smash::GrandCanThermalizer::uniform_in_cell ( ) const
Returns
3 vector uniformly sampled from the rectangular cell.

Definition at line 151 of file grandcan_thermalizer.cc.

151  {
152  return ThreeVector(random::uniform(-0.5 * lat_->cell_sizes()[0],
153  +0.5 * lat_->cell_sizes()[0]),
154  random::uniform(-0.5 * lat_->cell_sizes()[1],
155  +0.5 * lat_->cell_sizes()[1]),
156  random::uniform(-0.5 * lat_->cell_sizes()[2],
157  +0.5 * lat_->cell_sizes()[2]));
158 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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 [36].

Parameters
[in]plistList of particles
See also
ParticleList
Parameters
[in]required_total_momentumThe necessary total momentum of the cell

Definition at line 160 of file grandcan_thermalizer.cc.

161  {
162  // Centralize momenta
163  QuantumNumbers conserved = QuantumNumbers(plist);
164  logg[LGrandcanThermalizer].info("Required 4-momentum: ",
165  required_total_momentum);
166  logg[LGrandcanThermalizer].info("Sampled 4-momentum: ", conserved.momentum());
167  const ThreeVector mom_to_add =
168  (required_total_momentum.threevec() - conserved.momentum().threevec()) /
169  plist.size();
170  logg[LGrandcanThermalizer].info("Adjusting momenta by ", mom_to_add);
171  for (auto &particle : plist) {
172  particle.set_4momentum(particle.type().mass(),
173  particle.momentum().threevec() + mom_to_add);
174  }
175 
176  // Boost every particle to the common center of mass frame
177  conserved = QuantumNumbers(plist);
178  const ThreeVector beta_CM_generated = conserved.momentum().velocity();
179  const ThreeVector beta_CM_required = required_total_momentum.velocity();
180 
181  double E = 0.0;
182  double E_expected = required_total_momentum.abs();
183  for (auto &particle : plist) {
184  particle.boost_momentum(beta_CM_generated);
185  E += particle.momentum().x0();
186  }
187  // Renorm. momenta by factor (1+a) to get the right energy, binary search
188  const double tolerance = really_small;
189  double a, a_min, a_max, er;
190  const int max_iter = 100;
191  int iter = 0;
192  if (E_expected >= E) {
193  a_min = 0.0;
194  a_max = 10.0;
195  } else {
196  a_min = -1.0;
197  a_max = 0.0;
198  }
199  do {
200  a = 0.5 * (a_min + a_max);
201  E = 0.0;
202  for (const auto &particle : plist) {
203  const double p2 = particle.momentum().threevec().sqr();
204  const double E2 = particle.momentum().x0() * particle.momentum().x0();
205  E += std::sqrt(E2 + a * (a + 2.0) * p2);
206  }
207  er = E - E_expected;
208  if (er >= 0.0) {
209  a_max = a;
210  } else {
211  a_min = a;
212  }
213  logg[LGrandcanThermalizer].debug("Iteration ", iter, ": a = ", a,
214  ", Δ = ", er);
215  iter++;
216  } while (std::abs(er) > tolerance && iter < max_iter);
217 
218  logg[LGrandcanThermalizer].info("Renormalizing momenta by factor 1+a, a = ",
219  a);
220  for (auto &particle : plist) {
221  particle.set_4momentum(particle.type().mass(),
222  (1 + a) * particle.momentum().threevec());
223  particle.boost_momentum(-beta_CM_required);
224  }
225 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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_classA certain group of hadron species
See also
HadronClass
Parameters
[out]NNumber of particles to be sampled
Todo:
(oliiny) what to do with this output?

Definition at line 227 of file grandcan_thermalizer.cc.

228  {
229  /* The array mult_sort_ contains real numbers \f$ a_i \f$. The numbers \f$
230  * n_i \f$ are saved in the mult_int_ array. Only particles of class
231  * particle_class are sampled, where particle_class is defined by the
232  * get_class function. */
233  double sum = mult_class(particle_class);
234  for (size_t i_type = 0; (i_type < N_sorts_) && (N_to_sample > 0); i_type++) {
235  if (get_class(i_type) != particle_class) {
236  continue;
237  }
238  const double p = mult_sort_[i_type] / sum;
239  mult_int_[i_type] = random::binomial(N_to_sample, p);
241  /*std::cout << eos_typelist_[i_type]->name() <<
242  ": mult_sort = " << mult_sort_[i_type] <<
243  ", sum = " << sum <<
244  ", p = " << p <<
245  ", N to sample = " << N_to_sample <<
246  ", mult_int_ = " << mult_int_[i_type] << std::endl;*/
247  sum -= mult_sort_[i_type];
248  N_to_sample -= mult_int_[i_type];
249  }
250 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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
[out]plist
See also
ParticleList of newly produced particles
Parameters
[in]timeCurrent time in the simulation to become zero component of sampled particles
[in]type_indexSpecies that should be sampled

Definition at line 252 of file grandcan_thermalizer.cc.

254  {
255  N_in_cells_.clear();
256  N_total_in_cells_ = 0.0;
257  for (auto cell_index : cells_to_sample_) {
258  const ThermLatticeNode cell = (*lat_)[cell_index];
259  const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
260  const double N_this_cell =
261  lat_cell_volume_ * gamma *
262  HadronGasEos::partial_density(*eos_typelist_[type_index], cell.T(),
263  cell.mub(), cell.mus(), cell.muq());
264  N_in_cells_.push_back(N_this_cell);
265  N_total_in_cells_ += N_this_cell;
266  }
267 
268  for (int i = 0; i < mult_int_[type_index]; i++) {
269  // Choose random cell, probability = N_in_cell/N_total
270  double r = random::uniform(0.0, N_total_in_cells_);
271  double partial_sum = 0.0;
272  int index_only_thermalized = -1;
273  while (partial_sum < r) {
274  index_only_thermalized++;
275  partial_sum += N_in_cells_[index_only_thermalized];
276  }
277  const int cell_index = cells_to_sample_[index_only_thermalized];
278  const ThermLatticeNode cell = (*lat_)[cell_index];
279  const ThreeVector cell_center = lat_->cell_center(cell_index);
280 
281  ParticleData particle(*eos_typelist_[type_index]);
282  // Note: it's pole mass for resonances!
283  const double m = eos_typelist_[type_index]->mass();
284  // Position
285  particle.set_4position(FourVector(time, cell_center + uniform_in_cell()));
286  // Momentum
287  double momentum_radial = sample_momenta_from_thermal(cell.T(), m);
288  Angles phitheta;
289  phitheta.distribute_isotropically();
290  particle.set_4momentum(m, phitheta.threevec() * momentum_radial);
291  particle.boost_momentum(-cell.v());
292  particle.set_formation_time(time);
293 
294  plist.push_back(particle);
295  }
296 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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_initialThe quantum numbers of the total ensemble of of particles in the region to be thermalized
[in]timeCurrent time of the simulation
[in]ntestNumber of testparticles
Returns
Particle list with newly sampled particles according to Becattini-Feroni algorithm

Definition at line 298 of file grandcan_thermalizer.cc.

299  {
300  std::fill(mult_sort_.begin(), mult_sort_.end(), 0.0);
301  for (auto cell_index : cells_to_sample_) {
302  const ThermLatticeNode cell = (*lat_)[cell_index];
303  const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
304  for (size_t i = 0; i < N_sorts_; i++) {
305  // N_i = n u^mu dsigma_mu = (isochronous hypersurface) n * V * gamma
306  mult_sort_[i] +=
307  lat_cell_volume_ * gamma * ntest *
308  HadronGasEos::partial_density(*eos_typelist_[i], cell.T(), cell.mub(),
309  cell.mus(), cell.muq());
310  }
311  }
312 
313  std::fill(mult_classes_.begin(), mult_classes_.end(), 0.0);
314  for (size_t i = 0; i < N_sorts_; i++) {
315  mult_classes_[static_cast<size_t>(get_class(i))] += mult_sort_[i];
316  }
317 
318  random::BesselSampler bessel_sampler_B(mult_class(HadronClass::Baryon),
320  conserved_initial.baryon_number());
321 
322  while (true) {
323  sampled_list_.clear();
324  std::fill(mult_int_.begin(), mult_int_.end(), 0);
325  const auto Nbar_antibar = bessel_sampler_B.sample();
326 
327  sample_multinomial(HadronClass::Baryon, Nbar_antibar.first);
328  sample_multinomial(HadronClass::Antibaryon, Nbar_antibar.second);
329 
330  // Count strangeness of the sampled particles
331  int S_sampled = 0;
332  for (size_t i = 0; i < N_sorts_; i++) {
333  S_sampled += eos_typelist_[i]->strangeness() * mult_int_[i];
334  }
335 
336  std::pair<int, int> NS_antiS;
338  random::BesselSampler bessel_sampler_S(
341  conserved_initial.strangeness() - S_sampled);
342  NS_antiS = bessel_sampler_S.sample();
344  NS_antiS = std::make_pair(
347  if (NS_antiS.first - NS_antiS.second !=
348  conserved_initial.strangeness() - S_sampled) {
349  continue;
350  }
351  }
352 
355  // Count charge of the sampled particles
356  int ch_sampled = 0;
357  for (size_t i = 0; i < N_sorts_; i++) {
358  ch_sampled += eos_typelist_[i]->charge() * mult_int_[i];
359  }
360 
361  std::pair<int, int> NC_antiC;
363  random::BesselSampler bessel_sampler_C(
366  conserved_initial.charge() - ch_sampled);
367  NC_antiC = bessel_sampler_C.sample();
369  NC_antiC = std::make_pair(
372  if (NC_antiC.first - NC_antiC.second !=
373  conserved_initial.charge() - ch_sampled) {
374  continue;
375  }
376  }
377 
383 
384  for (size_t itype = 0; itype < N_sorts_; itype++) {
386  }
388  double e_tot;
389  const double e_init = conserved_initial.momentum().x0();
390  e_tot = 0.0;
391  for (auto &particle : sampled_list_) {
392  e_tot += particle.momentum().x0();
393  }
394  if (std::abs(e_tot - e_init) > 0.01 * e_init) {
395  logg[LGrandcanThermalizer].info("Rejecting: energy ", e_tot,
396  " too far from ", e_init);
397  continue;
398  }
399  }
400  break;
401  }
402 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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]conditionSpecifies the current mode (1 to 7)

Definition at line 339 of file grandcan_thermalizer.h.

339  {
340  N_in_cells_.clear();
341  N_total_in_cells_ = 0.0;
342  for (auto cell_index : cells_to_sample_) {
343  const ThermLatticeNode cell = (*lat_)[cell_index];
344  const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
345  double N_tot = 0.0;
346  for (ParticleTypePtr i : eos_typelist_) {
347  if (condition(i->strangeness(), i->baryon_number(), i->charge())) {
348  // N_i = n u^mu dsigma_mu = (isochronous hypersurface) n * V * gamma
349  N_tot += lat_cell_volume_ * gamma *
350  HadronGasEos::partial_density(*i, cell.T(), cell.mub(),
351  cell.mus(), 0.0);
352  }
353  }
354  N_in_cells_.push_back(N_tot);
355  N_total_in_cells_ += N_tot;
356  }
357  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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]timeCurrent time in simulation
[in]conditionSpecifies the actual mode (1 to 7)

Definition at line 370 of file grandcan_thermalizer.h.

371  {
372  // Choose random cell, probability = N_in_cell/N_total
373  double r = random::uniform(0.0, N_total_in_cells_);
374  double partial_sum = 0.0;
375  int index_only_thermalized = -1;
376  while (partial_sum < r) {
377  index_only_thermalized++;
378  partial_sum += N_in_cells_[index_only_thermalized];
379  }
380  const int cell_index = cells_to_sample_[index_only_thermalized];
381  const ThermLatticeNode cell = (*lat_)[cell_index];
382  const ThreeVector cell_center = lat_->cell_center(cell_index);
383  const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
384  const double N_in_cell = N_in_cells_[index_only_thermalized];
385  // Which sort to sample - probability N_i/N_tot
386  r = random::uniform(0.0, N_in_cell);
387  double N_sum = 0.0;
388  ParticleTypePtr type_to_sample;
389  for (ParticleTypePtr i : eos_typelist_) {
390  if (!condition(i->strangeness(), i->baryon_number(), i->charge())) {
391  continue;
392  }
393  N_sum += lat_cell_volume_ * gamma *
394  HadronGasEos::partial_density(*i, cell.T(), cell.mub(),
395  cell.mus(), 0.0);
396  if (N_sum >= r) {
397  type_to_sample = i;
398  break;
399  }
400  }
401  ParticleData particle(*type_to_sample);
402  // Note: it's pole mass for resonances!
403  const double m = type_to_sample->mass();
404  // Position
405  particle.set_4position(FourVector(time, cell_center + uniform_in_cell()));
406  // Momentum
407  double momentum_radial = sample_momenta_from_thermal(cell.T(), m);
408  Angles phitheta;
409  phitheta.distribute_isotropically();
410  particle.set_4momentum(m, phitheta.threevec() * momentum_radial);
411  particle.boost_momentum(-cell.v());
412  particle.set_formation_time(time);
413  return particle;
414  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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_initialQuantum numbers of the original particles in the region to be thermalized
[in]timeCurrent time of the simulation

Definition at line 404 of file grandcan_thermalizer.cc.

405  {
406  double energy = 0.0;
407  int S_plus = 0, S_minus = 0, B_plus = 0, B_minus = 0, E_plus = 0, E_minus = 0;
408  // Mode 1: sample until energy is conserved, take only strangeness < 0
409  auto condition1 = [](int, int, int) { return true; };
410  compute_N_in_cells_mode_algo(condition1);
411  while (conserved_initial.momentum().x0() > energy ||
412  S_plus < conserved_initial.strangeness()) {
413  ParticleData p = sample_in_random_cell_mode_algo(time, condition1);
414  energy += p.momentum().x0();
415  if (p.pdgcode().strangeness() > 0) {
416  sampled_list_.push_back(p);
417  S_plus += p.pdgcode().strangeness();
418  }
419  }
420 
421  // Mode 2: sample until strangeness is conserved
422  auto condition2 = [](int S, int, int) { return (S < 0); };
423  compute_N_in_cells_mode_algo(condition2);
424  while (S_plus + S_minus > conserved_initial.strangeness()) {
425  ParticleData p = sample_in_random_cell_mode_algo(time, condition2);
426  const int s_part = p.pdgcode().strangeness();
427  // Do not allow particles with S = -2 or -3 spoil the total sum
428  if (S_plus + S_minus + s_part >= conserved_initial.strangeness()) {
429  sampled_list_.push_back(p);
430  S_minus += s_part;
431  }
432  }
433 
434  // Mode 3: sample non-strange baryons
435  auto condition3 = [](int S, int, int) { return (S == 0); };
436  QuantumNumbers conserved_remaining =
437  conserved_initial - QuantumNumbers(sampled_list_);
438  energy = 0.0;
439  compute_N_in_cells_mode_algo(condition3);
440  while (conserved_remaining.momentum().x0() > energy ||
441  B_plus < conserved_remaining.baryon_number()) {
442  ParticleData p = sample_in_random_cell_mode_algo(time, condition3);
443  energy += p.momentum().x0();
444  if (p.pdgcode().baryon_number() > 0) {
445  sampled_list_.push_back(p);
446  B_plus += p.pdgcode().baryon_number();
447  }
448  }
449 
450  // Mode 4: sample non-strange anti-baryons
451  auto condition4 = [](int S, int B, int) { return (S == 0) && (B < 0); };
452  compute_N_in_cells_mode_algo(condition4);
453  while (B_plus + B_minus > conserved_remaining.baryon_number()) {
454  ParticleData p = sample_in_random_cell_mode_algo(time, condition4);
455  const int bar = p.pdgcode().baryon_number();
456  if (B_plus + B_minus + bar >= conserved_remaining.baryon_number()) {
457  sampled_list_.push_back(p);
458  B_minus += bar;
459  }
460  }
461 
462  // Mode 5: sample non_strange mesons, but take only with charge > 0
463  auto condition5 = [](int S, int B, int) { return (S == 0) && (B == 0); };
464  conserved_remaining = conserved_initial - QuantumNumbers(sampled_list_);
465  energy = 0.0;
466  compute_N_in_cells_mode_algo(condition5);
467  while (conserved_remaining.momentum().x0() > energy ||
468  E_plus < conserved_remaining.charge()) {
469  ParticleData p = sample_in_random_cell_mode_algo(time, condition5);
470  energy += p.momentum().x0();
471  if (p.pdgcode().charge() > 0) {
472  sampled_list_.push_back(p);
473  E_plus += p.pdgcode().charge();
474  }
475  }
476 
477  // Mode 6: sample non_strange mesons to conserve charge
478  auto condition6 = [](int S, int B, int C) {
479  return (S == 0) && (B == 0) && (C < 0);
480  };
481  compute_N_in_cells_mode_algo(condition6);
482  while (E_plus + E_minus > conserved_remaining.charge()) {
483  ParticleData p = sample_in_random_cell_mode_algo(time, condition6);
484  const int charge = p.pdgcode().charge();
485  if (E_plus + E_minus + charge >= conserved_remaining.charge()) {
486  sampled_list_.push_back(p);
487  E_minus += charge;
488  }
489  }
490 
491  // Mode 7: sample neutral non-strange mesons to conserve energy
492  auto condition7 = [](int S, int B, int C) {
493  return (S == 0) && (B == 0) && (C == 0);
494  };
495  conserved_remaining = conserved_initial - QuantumNumbers(sampled_list_);
496  energy = 0.0;
497  compute_N_in_cells_mode_algo(condition7);
498  while (conserved_remaining.momentum().x0() > energy) {
499  ParticleData p = sample_in_random_cell_mode_algo(time, condition7);
500  sampled_list_.push_back(p);
501  energy += p.momentum().x0();
502  }
503 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ 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]particlesList of sampled particles in thermalized region
[in]timeCurrent time of the simulation
[in]ntestnumber of testparticles

Definition at line 505 of file grandcan_thermalizer.cc.

506  {
507  logg[LGrandcanThermalizer].info("Starting forced thermalization, time ", time,
508  " fm/c");
509  to_remove_.clear();
510  sampled_list_.clear();
511  /* Remove particles from the cells with e > e_crit_,
512  * sum up their conserved quantities */
513  QuantumNumbers conserved_initial = QuantumNumbers();
514  ThermLatticeNode node;
515  for (auto &particle : particles) {
516  const bool is_on_lattice =
517  lat_->value_at(particle.position().threevec(), node);
518  if (is_on_lattice && node.e() > e_crit_) {
519  to_remove_.push_back(particle);
520  }
521  }
522  /* Do not thermalize too small number of particles: for the number
523  * of particles < 30 the algorithm tends to hang or crash too often. */
524  if (to_remove_.size() > 30) {
525  for (auto &particle : to_remove_) {
526  conserved_initial.add_values(particle);
527  }
528  } else {
529  to_remove_.clear();
530  conserved_initial = QuantumNumbers();
531  }
532  logg[LGrandcanThermalizer].info("Removed ", to_remove_.size(), " particles.");
533 
534  // Exit if there is nothing to thermalize
535  if (conserved_initial == QuantumNumbers()) {
536  return;
537  }
538  // Save the indices of cells inside the volume with e > e_crit_
539  cells_to_sample_.clear();
540  const size_t lattice_total_cells = lat_->size();
541  for (size_t i = 0; i < lattice_total_cells; i++) {
542  if ((*lat_)[i].e() > e_crit_) {
543  cells_to_sample_.push_back(i);
544  }
545  }
547  "Number of cells in the thermalization region = ",
548  cells_to_sample_.size(),
549  ", its total volume [fm^3]: ", cells_to_sample_.size() * lat_cell_volume_,
550  ", in % of lattice: ",
551  100.0 * cells_to_sample_.size() / lattice_total_cells);
552 
553  switch (algorithm_) {
556  thermalize_BF_algo(conserved_initial, time, ntest);
557  break;
559  thermalize_mode_algo(conserved_initial, time);
560  break;
561  default:
562  throw std::invalid_argument(
563  "This thermalization algorithm is"
564  " not yet implemented");
565  }
566  logg[LGrandcanThermalizer].info("Sampled ", sampled_list_.size(),
567  " particles.");
568 
569  // Adjust momenta
570  renormalize_momenta(sampled_list_, conserved_initial.momentum());
571 }
Here is the call graph for this function:

◆ 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]clockCurrent time of the simulation

Definition at line 573 of file grandcan_thermalizer.cc.

573  {
574  struct to_average {
575  double T;
576  double mub;
577  double mus;
578  double muq;
579  double nb;
580  double ns;
581  double nq;
582  };
583  struct to_average on_lattice = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
584  struct to_average in_therm_reg = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
585  double e_sum_on_lattice = 0.0, e_sum_in_therm_reg = 0.0;
586  int node_counter = 0;
587  for (const auto &node : *lat_) {
588  const double e = node.e();
589  on_lattice.T += node.T() * e;
590  on_lattice.mub += node.mub() * e;
591  on_lattice.mus += node.mus() * e;
592  on_lattice.muq += node.muq() * e;
593  on_lattice.nb += node.nb() * e;
594  on_lattice.ns += node.ns() * e;
595  on_lattice.nq += node.nq() * e;
596  e_sum_on_lattice += e;
597  if (e >= e_crit_) {
598  in_therm_reg.T += node.T() * e;
599  in_therm_reg.mub += node.mub() * e;
600  in_therm_reg.mus += node.mus() * e;
601  in_therm_reg.muq += node.muq() * e;
602  in_therm_reg.nb += node.nb() * e;
603  in_therm_reg.ns += node.ns() * e;
604  in_therm_reg.nq += node.nq() * e;
605  e_sum_in_therm_reg += e;
606  node_counter++;
607  }
608  }
609  if (e_sum_on_lattice > really_small) {
610  on_lattice.T /= e_sum_on_lattice;
611  on_lattice.mub /= e_sum_on_lattice;
612  on_lattice.mus /= e_sum_on_lattice;
613  on_lattice.muq /= e_sum_on_lattice;
614  on_lattice.nb /= e_sum_on_lattice;
615  on_lattice.ns /= e_sum_on_lattice;
616  on_lattice.nq /= e_sum_on_lattice;
617  }
618  if (e_sum_in_therm_reg > really_small) {
619  in_therm_reg.T /= e_sum_in_therm_reg;
620  in_therm_reg.mub /= e_sum_in_therm_reg;
621  in_therm_reg.mus /= e_sum_in_therm_reg;
622  in_therm_reg.muq /= e_sum_in_therm_reg;
623  in_therm_reg.nb /= e_sum_in_therm_reg;
624  in_therm_reg.ns /= e_sum_in_therm_reg;
625  in_therm_reg.nq /= e_sum_in_therm_reg;
626  }
627 
628  std::cout << "Current time [fm/c]: " << clock.current_time() << std::endl;
629  std::cout << "Averages on the lattice - T[GeV], mub[GeV], mus[GeV], muq[GeV] "
630  << "nb[fm^-3], ns[fm^-3], nq[fm^-3]: " << on_lattice.T << " "
631  << on_lattice.mub << " " << on_lattice.mus << " " << on_lattice.muq
632  << " " << on_lattice.nb << " " << on_lattice.ns << " "
633  << on_lattice.nq << std::endl;
634  std::cout
635  << "Averages in therm. region - T[GeV], mub[GeV], mus[GeV], muq[GeV] "
636  << "nb[fm^-3], ns[fm^-3], nq[fm^-3]: " << in_therm_reg.T << " "
637  << in_therm_reg.mub << " " << in_therm_reg.mus << " " << in_therm_reg.muq
638  << " " << in_therm_reg.nb << " " << in_therm_reg.ns << " "
639  << in_therm_reg.nq << std::endl;
640  std::cout << "Volume with e > e_crit [fm^3]: "
641  << lat_cell_volume_ * node_counter << std::endl;
642 }
Here is the call graph for this function:

◆ lattice()

RectangularLattice<ThermLatticeNode>& smash::GrandCanThermalizer::lattice ( ) const
inline

Getter function for the lattice.

Definition at line 442 of file grandcan_thermalizer.h.

442 { return *lat_; }
Here is the caller graph for this function:

◆ e_crit()

double smash::GrandCanThermalizer::e_crit ( ) const
inline

Get the critical energy density.

Definition at line 444 of file grandcan_thermalizer.h.

444 { return e_crit_; }

◆ particles_to_remove()

ParticleList smash::GrandCanThermalizer::particles_to_remove ( ) const
inline

List of particles to be removed from the simulation.

Definition at line 446 of file grandcan_thermalizer.h.

446 { return to_remove_; }

◆ particles_to_insert()

ParticleList smash::GrandCanThermalizer::particles_to_insert ( ) const
inline

List of newly created particles to be inserted in the simulation.

Definition at line 448 of file grandcan_thermalizer.h.

448 { return sampled_list_; }

◆ 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 455 of file grandcan_thermalizer.h.

455  {
456  ParticleTypePtrList res;
457  for (const ParticleType& ptype : ParticleType::list_all()) {
458  if (HadronGasEos::is_eos_particle(ptype)) {
459  res.push_back(&ptype);
460  }
461  }
462  return res;
463  }
Here is the call graph for this function:

◆ get_class()

HadronClass smash::GrandCanThermalizer::get_class ( size_t  typelist_index) const
inlineprivate

Defines the class of hadrons by quantum numbers.

Parameters
[in]typelist_indexIndex for a certain quantum number

Definition at line 468 of file grandcan_thermalizer.h.

468  {
469  const int B = eos_typelist_[typelist_index]->baryon_number();
470  const int S = eos_typelist_[typelist_index]->strangeness();
471  const int ch = eos_typelist_[typelist_index]->charge();
472  // clang-format off
473  return (B > 0) ? HadronClass::Baryon :
474  (B < 0) ? HadronClass::Antibaryon :
480  // clang-format on
481  }
Here is the caller graph for this function:

◆ mult_class()

double smash::GrandCanThermalizer::mult_class ( const HadronClass  cl) const
inlineprivate
Parameters
[out]clMultiplicity of the hadron class

Definition at line 483 of file grandcan_thermalizer.h.

483  {
484  return mult_classes_[static_cast<size_t>(cl)];
485  }
Here is the caller graph for this function:

Member Data Documentation

◆ N_in_cells_

std::vector<double> smash::GrandCanThermalizer::N_in_cells_
private

Number of particles to be sampled in one cell.

Definition at line 487 of file grandcan_thermalizer.h.

◆ cells_to_sample_

std::vector<size_t> smash::GrandCanThermalizer::cells_to_sample_
private

Cells above critical energy density.

Definition at line 489 of file grandcan_thermalizer.h.

◆ eos_

HadronGasEos smash::GrandCanThermalizer::eos_ = HadronGasEos(true, false)
private

Hadron gas equation of state.

Definition at line 491 of file grandcan_thermalizer.h.

◆ lat_

std::unique_ptr<RectangularLattice<ThermLatticeNode> > smash::GrandCanThermalizer::lat_
private

The lattice on which the thermodynamic quantities are calculated.

Definition at line 493 of file grandcan_thermalizer.h.

◆ to_remove_

ParticleList smash::GrandCanThermalizer::to_remove_
private

Particles to be removed after this thermalization step.

Definition at line 495 of file grandcan_thermalizer.h.

◆ sampled_list_

ParticleList smash::GrandCanThermalizer::sampled_list_
private

Newly generated particles by thermalizer.

Definition at line 497 of file grandcan_thermalizer.h.

◆ 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 506 of file grandcan_thermalizer.h.

◆ N_sorts_

const size_t smash::GrandCanThermalizer::N_sorts_
private

Number of different species to be sampled.

Definition at line 508 of file grandcan_thermalizer.h.

◆ mult_sort_

std::vector<double> smash::GrandCanThermalizer::mult_sort_
private

Real number multiplicity for each particle type.

Definition at line 510 of file grandcan_thermalizer.h.

◆ mult_int_

std::vector<int> smash::GrandCanThermalizer::mult_int_
private

Integer multiplicity for each particle type.

Definition at line 512 of file grandcan_thermalizer.h.

◆ mult_classes_

std::array<double, 7> smash::GrandCanThermalizer::mult_classes_
private

The different hadron species according to the enum defined in.

See also
HadronClass

Definition at line 517 of file grandcan_thermalizer.h.

◆ N_total_in_cells_

double smash::GrandCanThermalizer::N_total_in_cells_
private

Total number of particles over all cells in thermalization region.

Definition at line 519 of file grandcan_thermalizer.h.

◆ lat_cell_volume_

double smash::GrandCanThermalizer::lat_cell_volume_
private

Volume of a single lattice cell, necessary to convert thermal densities to actual particle numbers.

Definition at line 524 of file grandcan_thermalizer.h.

◆ e_crit_

const double smash::GrandCanThermalizer::e_crit_
private

Critical energy density above which cells are thermalized.

Definition at line 526 of file grandcan_thermalizer.h.

◆ t_start_

const double smash::GrandCanThermalizer::t_start_
private

Starting time of the simulation.

Definition at line 528 of file grandcan_thermalizer.h.

◆ period_

const double smash::GrandCanThermalizer::period_
private

Defines periodicity of the lattice in fm.

Definition at line 530 of file grandcan_thermalizer.h.

◆ algorithm_

const ThermalizationAlgorithm smash::GrandCanThermalizer::algorithm_
private

Algorithm to choose for sampling of particles obeying conservation laws.

Definition at line 532 of file grandcan_thermalizer.h.

◆ BF_enforce_microcanonical_

const bool smash::GrandCanThermalizer::BF_enforce_microcanonical_
private

Enforce energy conservation as part of BF sampling algorithm or not.

Definition at line 534 of file grandcan_thermalizer.h.


The documentation for this class was generated from the following files:
smash::LatticeUpdate
LatticeUpdate
Enumerator option for lattice updates.
Definition: lattice.h:36
smash::GrandCanThermalizer::sample_multinomial
void sample_multinomial(HadronClass particle_class, int N)
The sample_multinomial function samples integer numbers n_i distributed according to the multinomial ...
Definition: grandcan_thermalizer.cc:227
smash::GrandCanThermalizer::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.
Definition: grandcan_thermalizer.cc:106
smash::HadronClass::NegativeSMeson
Mesons with strangeness S < 0.
smash::GrandCanThermalizer::t_start_
const double t_start_
Starting time of the simulation.
Definition: grandcan_thermalizer.h:528
smash::GrandCanThermalizer::list_eos_particles
ParticleTypePtrList list_eos_particles() const
Extracts the particles in the hadron gas equation of state from the complete list of particle types i...
Definition: grandcan_thermalizer.h:455
smash::GrandCanThermalizer::N_sorts_
const size_t N_sorts_
Number of different species to be sampled.
Definition: grandcan_thermalizer.h:508
smash::HadronClass::NegativeQZeroSMeson
Non-strange mesons (S = 0) with electric cherge Q < 0.
smash::GrandCanThermalizer::algorithm_
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
Definition: grandcan_thermalizer.h:532
smash::GrandCanThermalizer::period_
const double period_
Defines periodicity of the lattice in fm.
Definition: grandcan_thermalizer.h:530
smash::HadronGasEos::partial_density
static double partial_density(const ParticleType &ptype, double T, double mub, double mus, double muq, bool account_for_resonance_widths=false)
Compute partial density of one hadron sort.
Definition: hadgas_eos.cc:270
smash::GrandCanThermalizer::thermalize_BF_algo
void thermalize_BF_algo(QuantumNumbers &conserved_initial, double time, int ntest)
Samples particles according to the BF algorithm by making use of the.
Definition: grandcan_thermalizer.cc:298
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
ThermalizationAlgorithm::UnbiasedBF
smash::GrandCanThermalizer::lat_cell_volume_
double lat_cell_volume_
Volume of a single lattice cell, necessary to convert thermal densities to actual particle numbers.
Definition: grandcan_thermalizer.h:524
smash::LatticeUpdate::EveryFixedInterval
smash::random::binomial
int binomial(const int N, const T &p)
Returns a binomially distributed random number.
Definition: random.h:238
smash::update_lattice
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.
Definition: density.h:402
smash::GrandCanThermalizer::BF_enforce_microcanonical_
const bool BF_enforce_microcanonical_
Enforce energy conservation as part of BF sampling algorithm or not.
Definition: grandcan_thermalizer.h:534
smash::GrandCanThermalizer::N_total_in_cells_
double N_total_in_cells_
Total number of particles over all cells in thermalization region.
Definition: grandcan_thermalizer.h:519
smash::HadronClass::ZeroQZeroSMeson
Neutral non-strange mesons.
smash::GrandCanThermalizer::get_class
HadronClass get_class(size_t typelist_index) const
Defines the class of hadrons by quantum numbers.
Definition: grandcan_thermalizer.h:468
smash::GrandCanThermalizer::uniform_in_cell
ThreeVector uniform_in_cell() const
Definition: grandcan_thermalizer.cc:151
smash::HadronClass::PositiveSMeson
Mesons with strangeness S > 0.
smash::HadronClass::PositiveQZeroSMeson
Non-strange mesons (S = 0) with electric cherge Q > 0.
smash::random::poisson
int poisson(const T &lam)
Returns a Poisson distributed random number.
Definition: random.h:226
smash::GrandCanThermalizer::renormalize_momenta
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.
Definition: grandcan_thermalizer.cc:160
smash::GrandCanThermalizer::sample_in_random_cell_mode_algo
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...
Definition: grandcan_thermalizer.h:370
smash::GrandCanThermalizer::compute_N_in_cells_mode_algo
void compute_N_in_cells_mode_algo(F &&condition)
Computes average number of particles in each cell for the mode algorithm.
Definition: grandcan_thermalizer.h:339
ThermalizationAlgorithm::ModeSampling
smash::GrandCanThermalizer::sample_in_random_cell_BF_algo
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...
Definition: grandcan_thermalizer.cc:252
smash::GrandCanThermalizer::N_in_cells_
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
Definition: grandcan_thermalizer.h:487
smash::GrandCanThermalizer::sampled_list_
ParticleList sampled_list_
Newly generated particles by thermalizer.
Definition: grandcan_thermalizer.h:497
smash::GrandCanThermalizer::cells_to_sample_
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
Definition: grandcan_thermalizer.h:489
ThermalizationAlgorithm::BiasedBF
smash::GrandCanThermalizer::mult_classes_
std::array< double, 7 > mult_classes_
The different hadron species according to the enum defined in.
Definition: grandcan_thermalizer.h:517
smash::DensityType
DensityType
Allows to choose which kind of density to calculate.
Definition: density.h:36
smash::HadronGasEos::is_eos_particle
static bool is_eos_particle(const ParticleType &ptype)
Check if a particle belongs to the EoS.
Definition: hadgas_eos.h:355
smash::GrandCanThermalizer::eos_
HadronGasEos eos_
Hadron gas equation of state.
Definition: grandcan_thermalizer.h:491
smash::GrandCanThermalizer::mult_sort_
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
Definition: grandcan_thermalizer.h:510
smash::GrandCanThermalizer::mult_int_
std::vector< int > mult_int_
Integer multiplicity for each particle type.
Definition: grandcan_thermalizer.h:512
smash::GrandCanThermalizer::eos_typelist_
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.
Definition: grandcan_thermalizer.h:506
smash::GrandCanThermalizer::mult_class
double mult_class(const HadronClass cl) const
Definition: grandcan_thermalizer.h:483
smash::GrandCanThermalizer::thermalize_mode_algo
void thermalize_mode_algo(QuantumNumbers &conserved_initial, double time)
Samples particles to the according to the mode algorithm.
Definition: grandcan_thermalizer.cc:404
S
#define S(x, n)
Definition: sha256.cc:54
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::random::uniform
T uniform(T min, T max)
Definition: random.h:88
smash::pdg::n
constexpr int n
Neutron.
Definition: pdgcode_constants.h:30
smash::DensityType::Hadron
smash::DensityType::Baryon
smash::sample_momenta_from_thermal
double sample_momenta_from_thermal(const double temperature, const double mass)
Samples a momentum from the Maxwell-Boltzmann (thermal) distribution in a faster way,...
Definition: distributions.cc:199
smash::GrandCanThermalizer::to_remove_
ParticleList to_remove_
Particles to be removed after this thermalization step.
Definition: grandcan_thermalizer.h:495
smash::GrandCanThermalizer::e_crit_
const double e_crit_
Critical energy density above which cells are thermalized.
Definition: grandcan_thermalizer.h:526
smash::LGrandcanThermalizer
static constexpr int LGrandcanThermalizer
Definition: grandcan_thermalizer.cc:21
smash::GrandCanThermalizer::lat_
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
Definition: grandcan_thermalizer.h:493
smash::ParticleType::list_all
static const ParticleTypeList & list_all()
Definition: particletype.cc:51
smash::HadronClass::Antibaryon
All anti-baryons.