Version: SMASH-1.7
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.

Definition at line 217 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 cell_volume_
 Volume of a single 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

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 98 of file grandcan_thermalizer.cc.

106  N_sorts_(eos_typelist_.size()),
107  e_crit_(e_critical),
108  t_start_(t_start),
109  period_(delta_t),
110  algorithm_(algo),
111  BF_enforce_microcanonical_(BF_microcanonical) {
113  lat_ = make_unique<RectangularLattice<ThermLatticeNode>>(
114  lat_sizes, n_cells, origin, periodicity, upd);
115  const std::array<double, 3> abc = lat_->cell_sizes();
116  cell_volume_ = abc[0] * abc[1] * abc[2];
117  cells_to_sample_.resize(50000);
118  mult_sort_.resize(N_sorts_);
119  mult_int_.resize(N_sorts_);
120 }
const double e_crit_
Critical energy density above which cells are thermalized.
const size_t N_sorts_
Number of different species to be sampled.
const double period_
Defines periodicity of the lattice in fm.
LatticeUpdate
Enumerator option for lattice updates.
Definition: lattice.h:35
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
const bool BF_enforce_microcanonical_
Enforce energy conservation as part of BF sampling algorithm or not.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
std::vector< int > mult_int_
Integer multiplicity for each particle type.
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
ParticleTypePtrList list_eos_particles() const
Extracts the particles in the hadron gas equation of state from the complete list of particle types i...
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.
const double t_start_
Starting time of the simulation.
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"}),
248  conf.take({"Algorithm"}, ThermalizationAlgorithm::BiasedBF),
249  conf.take({"Microcanonical"}, false)) {}
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.

Member Function Documentation

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

255  {
256  const double t = clock->current_time();
257  const int n = static_cast<int>(std::floor((t - t_start_) / period_));
258  return (t > t_start_ &&
259  t < t_start_ + n * period_ + clock->timestep_duration());
260  }
const double period_
Defines periodicity of the lattice in fm.
constexpr int n
Neutron.
const double t_start_
Starting time of the simulation.
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 122 of file grandcan_thermalizer.cc.

124  {
125  const DensityType dens_type = DensityType::Hadron;
127  update_lattice(lat_.get(), update, dens_type, dens_par, particles);
128  for (auto &node : *lat_) {
129  /* If energy density is definitely below e_crit -
130  no need to find T, mu, etc. So if e = T00 - T0i*vi <=
131  T00 + sum abs(T0i) < e_crit, no efforts are necessary. */
132  if (!ignore_cells_under_treshold ||
133  node.Tmu0().x0() + std::abs(node.Tmu0().x1()) +
134  std::abs(node.Tmu0().x2()) + std::abs(node.Tmu0().x3()) >=
135  e_crit_) {
136  node.compute_rest_frame_quantities(eos_);
137  } else {
138  node = ThermLatticeNode();
139  }
140  }
141 }
const double e_crit_
Critical energy density above which cells are thermalized.
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:400
LatticeUpdate
Enumerator option for lattice updates.
Definition: lattice.h:35
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
DensityType
Allows to choose which kind of density to calculate.
Definition: density.h:34
HadronGasEos eos_
Hadron gas equation of state.

Here is the call graph for this function:

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

Definition at line 143 of file grandcan_thermalizer.cc.

143  {
144  return ThreeVector(random::uniform(-0.5 * lat_->cell_sizes()[0],
145  +0.5 * lat_->cell_sizes()[0]),
146  random::uniform(-0.5 * lat_->cell_sizes()[1],
147  +0.5 * lat_->cell_sizes()[1]),
148  random::uniform(-0.5 * lat_->cell_sizes()[2],
149  +0.5 * lat_->cell_sizes()[2]));
150 }
T uniform(T min, T max)
Definition: random.h:88
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.

Here is the call graph for this function:

Here is the caller graph for this function:

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.

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

Definition at line 152 of file grandcan_thermalizer.cc.

153  {
154  const auto &log = logger<LogArea::GrandcanThermalizer>();
155 
156  // Centralize momenta
157  QuantumNumbers conserved = QuantumNumbers(plist);
158  log.info("Required 4-momentum: ", required_total_momentum);
159  log.info("Sampled 4-momentum: ", conserved.momentum());
160  const ThreeVector mom_to_add =
161  (required_total_momentum.threevec() - conserved.momentum().threevec()) /
162  plist.size();
163  log.info("Adjusting momenta by ", mom_to_add);
164  for (auto &particle : plist) {
165  particle.set_4momentum(particle.type().mass(),
166  particle.momentum().threevec() + mom_to_add);
167  }
168 
169  // Boost every particle to the common center of mass frame
170  conserved = QuantumNumbers(plist);
171  const ThreeVector beta_CM_generated = conserved.momentum().velocity();
172  const ThreeVector beta_CM_required = required_total_momentum.velocity();
173 
174  double E = 0.0;
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();
179  }
180  // Renorm. momenta by factor (1+a) to get the right energy, binary search
181  const double tolerance = really_small;
182  double a, a_min, a_max, er;
183  const int max_iter = 100;
184  int iter = 0;
185  if (E_expected >= E) {
186  a_min = 0.0;
187  a_max = 10.0;
188  } else {
189  a_min = -1.0;
190  a_max = 0.0;
191  }
192  do {
193  a = 0.5 * (a_min + a_max);
194  E = 0.0;
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);
199  }
200  er = E - E_expected;
201  if (er >= 0.0) {
202  a_max = a;
203  } else {
204  a_min = a;
205  }
206  log.debug("Iteration ", iter, ": a = ", a, ", Δ = ", er);
207  iter++;
208  } while (std::abs(er) > tolerance && iter < max_iter);
209 
210  log.info("Renormalizing momenta by factor 1+a, a = ", a);
211  for (auto &particle : plist) {
212  particle.set_4momentum(particle.type().mass(),
213  (1 + a) * particle.momentum().threevec());
214  particle.boost_momentum(-beta_CM_required);
215  }
216 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37

Here is the call graph for this function:

Here is the caller graph for this function:

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 218 of file grandcan_thermalizer.cc.

219  {
220  /* The array mult_sort_ contains real numbers \f$ a_i \f$. The numbers \f$
221  * n_i \f$ are saved in the mult_int_ array. Only particles of class
222  * particle_class are sampled, where particle_class is defined by the
223  * get_class function. */
224  double sum = mult_class(particle_class);
225  for (size_t i_type = 0; (i_type < N_sorts_) && (N_to_sample > 0); i_type++) {
226  if (get_class(i_type) != particle_class) {
227  continue;
228  }
229  const double p = mult_sort_[i_type] / sum;
230  mult_int_[i_type] = random::binomial(N_to_sample, p);
232  /*std::cout << eos_typelist_[i_type]->name() <<
233  ": mult_sort = " << mult_sort_[i_type] <<
234  ", sum = " << sum <<
235  ", p = " << p <<
236  ", N to sample = " << N_to_sample <<
237  ", mult_int_ = " << mult_int_[i_type] << std::endl;*/
238  sum -= mult_sort_[i_type];
239  N_to_sample -= mult_int_[i_type];
240  }
241 }
HadronClass get_class(size_t typelist_index) const
Defines the class of hadrons by quantum numbers.
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
int binomial(const int N, const T &p)
Returns a binomially distributed random number.
Definition: random.h:238
constexpr int p
Proton.
std::vector< int > mult_int_
Integer multiplicity for each particle type.
double mult_class(const HadronClass cl) const

Here is the call graph for this function:

Here is the caller graph for this function:

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 243 of file grandcan_thermalizer.cc.

245  {
246  N_in_cells_.clear();
247  N_total_in_cells_ = 0.0;
248  for (auto cell_index : cells_to_sample_) {
249  const ThermLatticeNode cell = (*lat_)[cell_index];
250  const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
251  const double N_this_cell =
252  cell_volume_ * gamma *
253  HadronGasEos::partial_density(*eos_typelist_[type_index], cell.T(),
254  cell.mub(), cell.mus());
255  N_in_cells_.push_back(N_this_cell);
256  N_total_in_cells_ += N_this_cell;
257  }
258 
259  for (int i = 0; i < mult_int_[type_index]; i++) {
260  // Choose random cell, probability = N_in_cell/N_total
261  double r = random::uniform(0.0, N_total_in_cells_);
262  double partial_sum = 0.0;
263  int index_only_thermalized = -1;
264  while (partial_sum < r) {
265  index_only_thermalized++;
266  partial_sum += N_in_cells_[index_only_thermalized];
267  }
268  const int cell_index = cells_to_sample_[index_only_thermalized];
269  const ThermLatticeNode cell = (*lat_)[cell_index];
270  const ThreeVector cell_center = lat_->cell_center(cell_index);
271 
272  ParticleData particle(*eos_typelist_[type_index]);
273  // Note: it's pole mass for resonances!
274  const double m = eos_typelist_[type_index]->mass();
275  // Position
276  particle.set_4position(FourVector(time, cell_center + uniform_in_cell()));
277  // Momentum
278  double momentum_radial = sample_momenta_from_thermal(cell.T(), m);
279  Angles phitheta;
280  phitheta.distribute_isotropically();
281  particle.set_4momentum(m, phitheta.threevec() * momentum_radial);
282  particle.boost_momentum(-cell.v());
283  particle.set_formation_time(time);
284 
285  plist.push_back(particle);
286  }
287 }
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.
Definition: hadgas_eos.cc:234
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 (see Pratt:2014vja) APPENDIX: ALGORITHM FOR GENERATING PARTICLES math trick: for distribution, sample x by: where are uniform random numbers between [0,1) for : , where is used as rejection weight.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
T uniform(T min, T max)
Definition: random.h:88
double N_total_in_cells_
Total number of particles over all cells in thermalization region.
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
std::vector< int > mult_int_
Integer multiplicity for each particle type.
ThreeVector uniform_in_cell() const
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.

Here is the call graph for this function:

Here is the caller graph for this function:

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 289 of file grandcan_thermalizer.cc.

290  {
291  const auto &log = logger<LogArea::GrandcanThermalizer>();
292 
293  std::fill(mult_sort_.begin(), mult_sort_.end(), 0.0);
294  for (auto cell_index : cells_to_sample_) {
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++) {
298  // N_i = n u^mu dsigma_mu = (isochronous hypersurface) n * V * gamma
299  mult_sort_[i] += cell_volume_ * gamma * ntest *
301  *eos_typelist_[i], cell.T(), cell.mub(), cell.mus());
302  }
303  }
304 
305  std::fill(mult_classes_.begin(), mult_classes_.end(), 0.0);
306  for (size_t i = 0; i < N_sorts_; i++) {
307  mult_classes_[static_cast<size_t>(get_class(i))] += mult_sort_[i];
308  }
309 
310  random::BesselSampler bessel_sampler_B(mult_class(HadronClass::Baryon),
312  conserved_initial.baryon_number());
313 
314  while (true) {
315  sampled_list_.clear();
316  std::fill(mult_int_.begin(), mult_int_.end(), 0);
317  const auto Nbar_antibar = bessel_sampler_B.sample();
318 
319  sample_multinomial(HadronClass::Baryon, Nbar_antibar.first);
320  sample_multinomial(HadronClass::Antibaryon, Nbar_antibar.second);
321 
322  // Count strangeness of the sampled particles
323  int S_sampled = 0;
324  for (size_t i = 0; i < N_sorts_; i++) {
325  S_sampled += eos_typelist_[i]->strangeness() * mult_int_[i];
326  }
327 
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) {
341  continue;
342  }
343  }
344 
347  // Count charge of the sampled particles
348  int ch_sampled = 0;
349  for (size_t i = 0; i < N_sorts_; i++) {
350  ch_sampled += eos_typelist_[i]->charge() * mult_int_[i];
351  }
352 
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) {
366  continue;
367  }
368  }
369 
375 
376  for (size_t itype = 0; itype < N_sorts_; itype++) {
378  }
380  double e_tot;
381  const double e_init = conserved_initial.momentum().x0();
382  e_tot = 0.0;
383  for (auto &particle : sampled_list_) {
384  e_tot += particle.momentum().x0();
385  }
386  if (std::abs(e_tot - e_init) > 0.01 * e_init) {
387  log.info("Rejecting: energy ", e_tot, " too far from ", e_init);
388  continue;
389  }
390  }
391  break;
392  }
393 }
HadronClass get_class(size_t typelist_index) const
Defines the class of hadrons by quantum numbers.
const size_t N_sorts_
Number of different species to be sampled.
void sample_multinomial(HadronClass particle_class, int N)
The sample_multinomial function samples integer numbers n_i distributed according to the multinomial ...
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
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.
Definition: hadgas_eos.cc:234
const bool BF_enforce_microcanonical_
Enforce energy conservation as part of BF sampling algorithm or not.
ParticleList sampled_list_
Newly generated particles by thermalizer.
Non-strange mesons (S = 0) with electric cherge Q < 0.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
Mesons with strangeness S < 0.
Neutral non-strange mesons.
Non-strange mesons (S = 0) with electric cherge Q > 0.
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
Mesons with strangeness S > 0.
std::vector< int > mult_int_
Integer multiplicity for each particle type.
int poisson(const T &lam)
Returns a Poisson distributed random number.
Definition: random.h:226
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::array< double, 7 > mult_classes_
The different hadron species according to the enum defined in.
double mult_class(const HadronClass cl) const
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.

Here is the call graph for this function:

Here is the caller graph for this function:

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

329  {
330  N_in_cells_.clear();
331  N_total_in_cells_ = 0.0;
332  for (auto cell_index : cells_to_sample_) {
333  const ThermLatticeNode cell = (*lat_)[cell_index];
334  const double gamma = 1.0 / std::sqrt(1.0 - cell.v().sqr());
335  double N_tot = 0.0;
336  for (ParticleTypePtr i : eos_typelist_) {
337  if (condition(i->strangeness(), i->baryon_number(), i->charge())) {
338  // N_i = n u^mu dsigma_mu = (isochronous hypersurface) n * V * gamma
339  N_tot += cell_volume_ * gamma *
340  HadronGasEos::partial_density(*i, cell.T(), cell.mub(),
341  cell.mus());
342  }
343  }
344  N_in_cells_.push_back(N_tot);
345  N_total_in_cells_ += N_tot;
346  }
347  }
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.
Definition: hadgas_eos.cc:234
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
double N_total_in_cells_
Total number of particles over all cells in thermalization region.
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.

Here is the call graph for this function:

Here is the caller graph for this function:

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

361  {
362  // Choose random cell, probability = N_in_cell/N_total
363  double r = random::uniform(0.0, N_total_in_cells_);
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];
369  }
370  const int cell_index = cells_to_sample_[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];
375  // Which sort to sample - probability N_i/N_tot
376  r = random::uniform(0.0, N_in_cell);
377  double N_sum = 0.0;
378  ParticleTypePtr type_to_sample;
379  for (ParticleTypePtr i : eos_typelist_) {
380  if (!condition(i->strangeness(), i->baryon_number(), i->charge())) {
381  continue;
382  }
383  N_sum +=
384  cell_volume_ * gamma *
385  HadronGasEos::partial_density(*i, cell.T(), cell.mub(), cell.mus());
386  if (N_sum >= r) {
387  type_to_sample = i;
388  break;
389  }
390  }
391  ParticleData particle(*type_to_sample);
392  // Note: it's pole mass for resonances!
393  const double m = type_to_sample->mass();
394  // Position
395  particle.set_4position(FourVector(time, cell_center + uniform_in_cell()));
396  // Momentum
397  double momentum_radial = sample_momenta_from_thermal(cell.T(), m);
398  Angles phitheta;
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);
403  return particle;
404  }
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.
Definition: hadgas_eos.cc:234
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 (see Pratt:2014vja) APPENDIX: ALGORITHM FOR GENERATING PARTICLES math trick: for distribution, sample x by: where are uniform random numbers between [0,1) for : , where is used as rejection weight.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
T uniform(T min, T max)
Definition: random.h:88
double N_total_in_cells_
Total number of particles over all cells in thermalization region.
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
ThreeVector uniform_in_cell() const
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.

Here is the call graph for this function:

Here is the caller graph for this function:

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 395 of file grandcan_thermalizer.cc.

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

Here is the call graph for this function:

Here is the caller graph for this function:

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 496 of file grandcan_thermalizer.cc.

497  {
498  const auto &log = logger<LogArea::GrandcanThermalizer>();
499  log.info("Starting forced thermalization, time ", time, " fm/c");
500  to_remove_.clear();
501  sampled_list_.clear();
502  /* Remove particles from the cells with e > e_crit_,
503  * sum up their conserved quantities */
504  QuantumNumbers conserved_initial = QuantumNumbers();
505  ThermLatticeNode node;
506  for (auto &particle : particles) {
507  const bool is_on_lattice =
508  lat_->value_at(particle.position().threevec(), node);
509  if (is_on_lattice && node.e() > e_crit_) {
510  to_remove_.push_back(particle);
511  }
512  }
513  /* Do not thermalize too small number of particles: for the number
514  * of particles < 30 the algorithm tends to hang or crash too often. */
515  if (to_remove_.size() > 30) {
516  for (auto &particle : to_remove_) {
517  conserved_initial.add_values(particle);
518  }
519  } else {
520  to_remove_.clear();
521  conserved_initial = QuantumNumbers();
522  }
523  log.info("Removed ", to_remove_.size(), " particles.");
524 
525  // Exit if there is nothing to thermalize
526  if (conserved_initial == QuantumNumbers()) {
527  return;
528  }
529  // Save the indices of cells inside the volume with e > e_crit_
530  cells_to_sample_.clear();
531  const size_t lattice_total_cells = lat_->size();
532  for (size_t i = 0; i < lattice_total_cells; i++) {
533  if ((*lat_)[i].e() > e_crit_) {
534  cells_to_sample_.push_back(i);
535  }
536  }
537  log.info("Number of cells in the thermalization region = ",
538  cells_to_sample_.size(), ", its total volume [fm^3]: ",
539  cells_to_sample_.size() * cell_volume_, ", in % of lattice: ",
540  100.0 * cells_to_sample_.size() / lattice_total_cells);
541 
542  switch (algorithm_) {
545  thermalize_BF_algo(conserved_initial, time, ntest);
546  break;
548  thermalize_mode_algo(conserved_initial, time);
549  break;
550  default:
551  throw std::invalid_argument(
552  "This thermalization algorithm is"
553  " not yet implemented");
554  }
555  log.info("Sampled ", sampled_list_.size(), " particles.");
556 
557  // Adjust momenta
558  renormalize_momenta(sampled_list_, conserved_initial.momentum());
559 }
const double e_crit_
Critical energy density above which cells are thermalized.
void thermalize_BF_algo(QuantumNumbers &conserved_initial, double time, int ntest)
Samples particles according to the BF algorithm by making use of the.
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
ParticleList sampled_list_
Newly generated particles by thermalizer.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
void thermalize_mode_algo(QuantumNumbers &conserved_initial, double time)
Samples particles to the according to the mode algorithm.
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.
ParticleList to_remove_
Particles to be removed after this thermalization step.
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...

Here is the call graph for this function:

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 561 of file grandcan_thermalizer.cc.

561  {
562  struct to_average {
563  double T;
564  double mub;
565  double mus;
566  double nb;
567  double ns;
568  };
569  struct to_average on_lattice = {0.0, 0.0, 0.0, 0.0, 0.0};
570  struct to_average in_therm_reg = {0.0, 0.0, 0.0, 0.0, 0.0};
571  double e_sum_on_lattice = 0.0, e_sum_in_therm_reg = 0.0;
572  int node_counter = 0;
573  for (const auto &node : *lat_) {
574  const double e = node.e();
575  on_lattice.T += node.T() * e;
576  on_lattice.mub += node.mub() * e;
577  on_lattice.mus += node.mus() * e;
578  on_lattice.nb += node.nb() * e;
579  on_lattice.ns += node.ns() * e;
580  e_sum_on_lattice += e;
581  if (e >= e_crit_) {
582  in_therm_reg.T += node.T() * e;
583  in_therm_reg.mub += node.mub() * e;
584  in_therm_reg.mus += node.mus() * e;
585  in_therm_reg.nb += node.nb() * e;
586  in_therm_reg.ns += node.ns() * e;
587  e_sum_in_therm_reg += e;
588  node_counter++;
589  }
590  }
591  if (e_sum_on_lattice > really_small) {
592  on_lattice.T /= e_sum_on_lattice;
593  on_lattice.mub /= e_sum_on_lattice;
594  on_lattice.mus /= e_sum_on_lattice;
595  on_lattice.nb /= e_sum_on_lattice;
596  on_lattice.ns /= e_sum_on_lattice;
597  }
598  if (e_sum_in_therm_reg > really_small) {
599  in_therm_reg.T /= e_sum_in_therm_reg;
600  in_therm_reg.mub /= e_sum_in_therm_reg;
601  in_therm_reg.mus /= e_sum_in_therm_reg;
602  in_therm_reg.nb /= e_sum_in_therm_reg;
603  in_therm_reg.ns /= e_sum_in_therm_reg;
604  }
605 
606  std::cout << "Current time [fm/c]: " << clock.current_time() << std::endl;
607  std::cout << "Averages on the lattice - T[GeV], mub[GeV], mus[GeV], "
608  << "nb[fm^-3], ns[fm^-3]: " << on_lattice.T << " " << on_lattice.mub
609  << " " << on_lattice.mus << " " << on_lattice.nb << " "
610  << on_lattice.ns << std::endl;
611  std::cout << "Averages in therm. region - T[GeV], mub[GeV], mus[GeV], "
612  << "nb[fm^-3], ns[fm^-3]: " << in_therm_reg.T << " "
613  << in_therm_reg.mub << " " << in_therm_reg.mus << " "
614  << in_therm_reg.nb << " " << in_therm_reg.ns << std::endl;
615  std::cout << "Volume with e > e_crit [fm^3]: " << cell_volume_ * node_counter
616  << std::endl;
617 }
const double e_crit_
Critical energy density above which cells are thermalized.
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers...

Here is the call graph for this function:

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

Getter function for the lattice.

Definition at line 432 of file grandcan_thermalizer.h.

432 { return *lat_; }
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.

Here is the caller graph for this function:

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

Get the critical energy density.

Definition at line 434 of file grandcan_thermalizer.h.

434 { return e_crit_; }
const double e_crit_
Critical energy density above which cells are thermalized.
ParticleList smash::GrandCanThermalizer::particles_to_remove ( ) const
inline

List of particles to be removed from the simulation.

Definition at line 436 of file grandcan_thermalizer.h.

436 { return to_remove_; }
ParticleList to_remove_
Particles to be removed after this thermalization step.
ParticleList smash::GrandCanThermalizer::particles_to_insert ( ) const
inline

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

Definition at line 438 of file grandcan_thermalizer.h.

438 { return sampled_list_; }
ParticleList sampled_list_
Newly generated particles by thermalizer.
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.

445  {
446  ParticleTypePtrList res;
447  for (const ParticleType& ptype : ParticleType::list_all()) {
448  if (HadronGasEos::is_eos_particle(ptype)) {
449  res.push_back(&ptype);
450  }
451  }
452  return res;
453  }
static bool is_eos_particle(const ParticleType &ptype)
Check if a particle belongs to the EoS.
Definition: hadgas_eos.h:308
static const ParticleTypeList & list_all()
Definition: particletype.cc:55

Here is the call graph for this function:

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

458  {
459  const int B = eos_typelist_[typelist_index]->baryon_number();
460  const int S = eos_typelist_[typelist_index]->strangeness();
461  const int ch = eos_typelist_[typelist_index]->charge();
462  // clang-format off
463  return (B > 0) ? HadronClass::Baryon :
464  (B < 0) ? HadronClass::Antibaryon :
465  (S > 0) ? HadronClass::PositiveSMeson :
466  (S < 0) ? HadronClass::NegativeSMeson :
470  // clang-format on
471  }
Non-strange mesons (S = 0) with electric cherge Q < 0.
Mesons with strangeness S < 0.
Neutral non-strange mesons.
Non-strange mesons (S = 0) with electric cherge Q > 0.
Mesons with strangeness S > 0.
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.

Here is the caller graph for this function:

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

Definition at line 473 of file grandcan_thermalizer.h.

473  {
474  return mult_classes_[static_cast<size_t>(cl)];
475  }
std::array< double, 7 > mult_classes_
The different hadron species according to the enum defined in.

Here is the caller graph for this function:

Member Data Documentation

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

Number of particles to be sampled in one cell.

Definition at line 477 of file grandcan_thermalizer.h.

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

Cells above critical energy density.

Definition at line 479 of file grandcan_thermalizer.h.

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

Hadron gas equation of state.

Definition at line 481 of file grandcan_thermalizer.h.

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

The lattice on which the thermodynamic quantities are calculated.

Definition at line 483 of file grandcan_thermalizer.h.

ParticleList smash::GrandCanThermalizer::to_remove_
private

Particles to be removed after this thermalization step.

Definition at line 485 of file grandcan_thermalizer.h.

ParticleList smash::GrandCanThermalizer::sampled_list_
private

Newly generated particles by thermalizer.

Definition at line 487 of file grandcan_thermalizer.h.

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.

const size_t smash::GrandCanThermalizer::N_sorts_
private

Number of different species to be sampled.

Definition at line 498 of file grandcan_thermalizer.h.

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

Real number multiplicity for each particle type.

Definition at line 500 of file grandcan_thermalizer.h.

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

Integer multiplicity for each particle type.

Definition at line 502 of file grandcan_thermalizer.h.

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

double smash::GrandCanThermalizer::N_total_in_cells_
private

Total number of particles over all cells in thermalization region.

Definition at line 509 of file grandcan_thermalizer.h.

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.

const double smash::GrandCanThermalizer::e_crit_
private

Critical energy density above which cells are thermalized.

Definition at line 516 of file grandcan_thermalizer.h.

const double smash::GrandCanThermalizer::t_start_
private

Starting time of the simulation.

Definition at line 518 of file grandcan_thermalizer.h.

const double smash::GrandCanThermalizer::period_
private

Defines periodicity of the lattice in fm.

Definition at line 520 of file grandcan_thermalizer.h.

const ThermalizationAlgorithm smash::GrandCanThermalizer::algorithm_
private

Algorithm to choose for sampling of particles obeying conservation laws.

Definition at line 522 of file grandcan_thermalizer.h.

const bool smash::GrandCanThermalizer::BF_enforce_microcanonical_
private

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

Definition at line 524 of file grandcan_thermalizer.h.


The documentation for this class was generated from the following files: