Version: SMASH-1.8
grandcan_thermalizer.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016-
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 #ifndef SRC_INCLUDE_GRANDCAN_THERMALIZER_H_
8 #define SRC_INCLUDE_GRANDCAN_THERMALIZER_H_
9 
10 #include <memory>
11 #include <vector>
12 
13 #include "angles.h"
14 #include "clock.h"
15 #include "configuration.h"
16 #include "density.h"
17 #include "distributions.h"
18 #include "forwarddeclarations.h"
19 #include "hadgas_eos.h"
20 #include "lattice.h"
21 #include "particledata.h"
22 #include "quantumnumbers.h"
23 
24 namespace smash {
25 
49  public:
65  void add_particle(const ParticleData& p, double factor);
89  void set_rest_frame_quantities(double T0, double mub0, double mus0,
90  const ThreeVector v0);
92  FourVector Tmu0() const { return Tmu0_; }
94  double nb() const { return nb_; }
96  double ns() const { return ns_; }
98  double e() const { return e_; }
100  double p() const { return p_; }
102  ThreeVector v() const { return v_; }
104  double T() const { return T_; }
106  double mub() const { return mub_; }
108  double mus() const { return mus_; }
109 
110  private:
114  double nb_;
116  double ns_;
118  double e_;
120  double p_;
124  double T_;
126  double mub_;
128  double mus_;
129 };
130 
137 std::ostream& operator<<(std::ostream& s, const ThermLatticeNode& node);
138 
143 enum class HadronClass {
145  Baryon = 0,
147  Antibaryon = 1,
149  PositiveSMeson = 2,
151  NegativeSMeson = 3,
157  ZeroQZeroSMeson = 6,
158 };
159 
218  public:
235  GrandCanThermalizer(const std::array<double, 3> lat_sizes,
236  const std::array<int, 3> n_cells,
237  const std::array<double, 3> origin, bool periodicity,
238  double e_critical, double t_start, double delta_t,
239  ThermalizationAlgorithm algo, bool BF_microcanonical);
242  const std::array<double, 3> lat_sizes,
243  const std::array<double, 3> origin, bool periodicity)
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)) {}
255  bool is_time_to_thermalize(std::unique_ptr<Clock>& clock) const {
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  }
268  void update_thermalizer_lattice(const Particles& particles,
269  const DensityParameters& par,
270  bool ignore_cells_under_threshold = true);
280  void renormalize_momenta(ParticleList& plist,
281  const FourVector required_total_momentum);
282 
283  // Functions for BF-sampling algorithm
284 
293  void sample_multinomial(HadronClass particle_class, int N);
305  void sample_in_random_cell_BF_algo(ParticleList& plist, const double time,
306  size_t type_index);
319  void thermalize_BF_algo(QuantumNumbers& conserved_initial, double time,
320  int ntest);
321 
322  // Functions for mode-sampling algorithm
323 
328  template <typename F>
329  void compute_N_in_cells_mode_algo(F&& condition) {
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  }
348 
359  template <typename F>
361  F&& condition) {
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  }
405 
414  void thermalize_mode_algo(QuantumNumbers& conserved_initial, double time);
422  void thermalize(const Particles& particles, double time, int ntest);
423 
430  void print_statistics(const Clock& clock) const;
434  double e_crit() const { return e_crit_; }
436  ParticleList particles_to_remove() const { return to_remove_; }
438  ParticleList particles_to_insert() const { return sampled_list_; }
439 
440  private:
445  ParticleTypePtrList list_eos_particles() const {
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  }
458  HadronClass get_class(size_t typelist_index) const {
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 :
470  // clang-format on
471  }
473  double mult_class(const HadronClass cl) const {
474  return mult_classes_[static_cast<size_t>(cl)];
475  }
477  std::vector<double> N_in_cells_;
479  std::vector<size_t> cells_to_sample_;
483  std::unique_ptr<RectangularLattice<ThermLatticeNode>> lat_;
485  ParticleList to_remove_;
487  ParticleList sampled_list_;
496  const ParticleTypePtrList eos_typelist_;
498  const size_t N_sorts_;
500  std::vector<double> mult_sort_;
502  std::vector<int> mult_int_;
507  std::array<double, 7> mult_classes_;
514  double cell_volume_;
516  const double e_crit_;
518  const double t_start_;
520  const double period_;
525 };
526 
527 } // namespace smash
528 
529 #endif // SRC_INCLUDE_GRANDCAN_THERMALIZER_H_
smash::HadronGasEos
Class to handle the equation of state (EoS) of the hadron gas, consisting of all hadrons included int...
Definition: hadgas_eos.h:112
smash::ThermLatticeNode::p
double p() const
Get pressure in the rest frame.
Definition: grandcan_thermalizer.h:100
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:220
smash
Definition: action.h:24
smash::ThermLatticeNode::add_particle_for_derivatives
void add_particle_for_derivatives(const ParticleData &, double, ThreeVector)
dummy function for update_lattice
Definition: grandcan_thermalizer.h:67
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:99
quantumnumbers.h
particledata.h
smash::GrandCanThermalizer::cell_volume_
double cell_volume_
Volume of a single cell, necessary to convert thermal densities to actual particle numbers.
Definition: grandcan_thermalizer.h:514
smash::ThermLatticeNode::mub_
double mub_
Net baryon chemical potential.
Definition: grandcan_thermalizer.h:126
smash::DensityParameters
A class to pre-calculate and store parameters relevant for density calculation.
Definition: density.h:107
smash::ThermLatticeNode::ns
double ns() const
Get net strangeness density of the cell in the computational frame.
Definition: grandcan_thermalizer.h:96
smash::HadronClass::NegativeSMeson
Mesons with strangeness S < 0.
smash::ParticleData
Definition: particledata.h:52
smash::ThermLatticeNode::ThermLatticeNode
ThermLatticeNode()
Default constructor of thermal quantities on the lattice returning thermodynamic quantities in comput...
Definition: grandcan_thermalizer.cc:24
smash::GrandCanThermalizer::t_start_
const double t_start_
Starting time of the simulation.
Definition: grandcan_thermalizer.h:518
smash::HadronGasEos::partial_density
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
smash::ThermLatticeNode::Tmu0_
FourVector Tmu0_
Four-momentum flow of the cell.
Definition: grandcan_thermalizer.h:112
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:445
smash::ThermLatticeNode::v
ThreeVector v() const
Get 3-velocity of the rest frame.
Definition: grandcan_thermalizer.h:102
smash::GrandCanThermalizer::particles_to_remove
ParticleList particles_to_remove() const
List of particles to be removed from the simulation.
Definition: grandcan_thermalizer.h:436
smash::operator<<
std::ostream & operator<<(std::ostream &out, const ActionPtr &action)
Definition: action.h:463
smash::GrandCanThermalizer::N_sorts_
const size_t N_sorts_
Number of different species to be sampled.
Definition: grandcan_thermalizer.h:498
smash::HadronClass::NegativeQZeroSMeson
Non-strange mesons (S = 0) with electric cherge Q < 0.
smash::ParticleType::mass
double mass() const
Definition: particletype.h:144
smash::Angles::distribute_isotropically
void distribute_isotropically()
Populate the object with a new direction.
Definition: angles.h:188
smash::GrandCanThermalizer::algorithm_
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
Definition: grandcan_thermalizer.h:522
smash::ThreeVector::sqr
double sqr() const
Definition: threevector.h:259
smash::ThermLatticeNode::T_
double T_
Temperature.
Definition: grandcan_thermalizer.h:124
smash::GrandCanThermalizer::period_
const double period_
Defines periodicity of the lattice in fm.
Definition: grandcan_thermalizer.h:520
smash::GrandCanThermalizer::thermalize
void thermalize(const Particles &particles, double time, int ntest)
Main thermalize function, that chooses the algorithm to follow (BF or mode sampling).
Definition: grandcan_thermalizer.cc:497
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:291
smash::GrandCanThermalizer::print_statistics
void print_statistics(const Clock &clock) const
Generates standard output with information about the thermodynamic properties of the lattice,...
Definition: grandcan_thermalizer.cc:565
smash::ParticleData::set_4momentum
void set_4momentum(const FourVector &momentum_vector)
Set the particle's 4-momentum directly.
Definition: particledata.h:148
clock.h
smash::ThermLatticeNode
The ThermLatticeNode class is intended to compute thermodynamical quantities in a cell given a set of...
Definition: grandcan_thermalizer.h:48
angles.h
smash::Configuration
Interface to the SMASH configuration files.
Definition: configuration.h:464
smash::GrandCanThermalizer::GrandCanThermalizer
GrandCanThermalizer(Configuration &conf, const std::array< double, 3 > lat_sizes, const std::array< double, 3 > origin, bool periodicity)
Definition: grandcan_thermalizer.h:241
smash::ThermLatticeNode::compute_rest_frame_quantities
void compute_rest_frame_quantities(HadronGasEos &eos)
Temperature, chemical potentials and rest frame velocity are calculated given the hadron gas equation...
Definition: grandcan_thermalizer.cc:41
smash::ThermLatticeNode::e
double e() const
Get energy density in the rest frame.
Definition: grandcan_thermalizer.h:98
forwarddeclarations.h
smash::ParticleTypePtr
Definition: particletype.h:663
ThermalizationAlgorithm
ThermalizationAlgorithm
Defines the algorithm used for the forced thermalization.
Definition: forwarddeclarations.h:237
smash::ThreeVector
Definition: threevector.h:31
smash::ThermLatticeNode::T
double T() const
Get the temperature.
Definition: grandcan_thermalizer.h:104
smash::ThermLatticeNode::p_
double p_
Pressure in the rest frame.
Definition: grandcan_thermalizer.h:120
lattice.h
smash::ParticleData::set_formation_time
void set_formation_time(const double &form_time)
Set the absolute formation time.
Definition: particledata.h:235
smash::ParticleData::boost_momentum
void boost_momentum(const ThreeVector &v)
Apply a Lorentz-boost to only the momentum.
Definition: particledata.h:316
smash::RectangularLattice
A container class to hold all the arrays on the lattice and access them.
Definition: lattice.h:47
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:524
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:509
smash::ParticleType
Definition: particletype.h:97
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:458
smash::GrandCanThermalizer::uniform_in_cell
ThreeVector uniform_in_cell() const
Definition: grandcan_thermalizer.cc:144
distributions.h
smash::HadronClass::PositiveSMeson
Mesons with strangeness S > 0.
smash::HadronClass::PositiveQZeroSMeson
Non-strange mesons (S = 0) with electric cherge Q > 0.
smash::ThermLatticeNode::set_rest_frame_quantities
void set_rest_frame_quantities(double T0, double mub0, double mus0, const ThreeVector v0)
Set all the rest frame quantities to some values, this is useful for testing.
Definition: grandcan_thermalizer.cc:78
smash::GrandCanThermalizer::update_thermalizer_lattice
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.
Definition: grandcan_thermalizer.cc:123
smash::ThermLatticeNode::v_
ThreeVector v_
Velocity of the rest frame.
Definition: grandcan_thermalizer.h:122
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:153
density.h
smash::Clock
Clock tracks the time in the simulation.
Definition: clock.h:70
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:360
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:329
smash::ThermLatticeNode::ns_
double ns_
Net strangeness density of the cell in the computational frame.
Definition: grandcan_thermalizer.h:116
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:245
smash::ThermLatticeNode::mus
double mus() const
Get the net strangeness chemical potential.
Definition: grandcan_thermalizer.h:108
smash::GrandCanThermalizer::N_in_cells_
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
Definition: grandcan_thermalizer.h:477
smash::GrandCanThermalizer::sampled_list_
ParticleList sampled_list_
Newly generated particles by thermalizer.
Definition: grandcan_thermalizer.h:487
smash::GrandCanThermalizer::cells_to_sample_
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
Definition: grandcan_thermalizer.h:479
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:507
smash::HadronClass
HadronClass
Specifier to classify the different hadron species according to their quantum numbers.
Definition: grandcan_thermalizer.h:143
smash::Particles
Definition: particles.h:33
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:308
smash::ThermLatticeNode::nb_
double nb_
Net baryon density of the cell in the computational frame.
Definition: grandcan_thermalizer.h:114
smash::GrandCanThermalizer::eos_
HadronGasEos eos_
Hadron gas equation of state.
Definition: grandcan_thermalizer.h:481
smash::GrandCanThermalizer::mult_sort_
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
Definition: grandcan_thermalizer.h:500
smash::GrandCanThermalizer::mult_int_
std::vector< int > mult_int_
Integer multiplicity for each particle type.
Definition: grandcan_thermalizer.h:502
smash::ThermLatticeNode::mub
double mub() const
Get the net baryon chemical potential.
Definition: grandcan_thermalizer.h:106
smash::GrandCanThermalizer::e_crit
double e_crit() const
Get the critical energy density.
Definition: grandcan_thermalizer.h:434
configuration.h
smash::ThermLatticeNode::nb
double nb() const
Get net baryon density of the cell in the computational frame.
Definition: grandcan_thermalizer.h:94
smash::ThermLatticeNode::Tmu0
FourVector Tmu0() const
Get Four-momentum flow of the cell.
Definition: grandcan_thermalizer.h:92
smash::Configuration::take
Value take(std::initializer_list< const char * > keys)
The default interface for SMASH to read configuration values.
Definition: configuration.cc:140
smash::ParticleData::set_4position
void set_4position(const FourVector &pos)
Set the particle's 4-position directly.
Definition: particledata.h:193
smash::GrandCanThermalizer::eos_typelist_
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.
Definition: grandcan_thermalizer.h:496
smash::ThermLatticeNode::mus_
double mus_
Net strangeness chemical potential.
Definition: grandcan_thermalizer.h:128
smash::GrandCanThermalizer::mult_class
double mult_class(const HadronClass cl) const
Definition: grandcan_thermalizer.h:473
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:396
smash::ThermLatticeNode::add_particle
void add_particle(const ParticleData &p, double factor)
Add particle contribution to Tmu0, nb and ns May look like unused at first glance,...
Definition: grandcan_thermalizer.cc:35
smash::FourVector
Definition: fourvector.h:33
S
#define S(x, n)
Definition: sha256.cc:54
smash::GrandCanThermalizer::lattice
RectangularLattice< ThermLatticeNode > & lattice() const
Getter function for the lattice.
Definition: grandcan_thermalizer.h:432
smash::Angles
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
smash::random::uniform
T uniform(T min, T max)
Definition: random.h:88
hadgas_eos.h
smash::pdg::n
constexpr int n
Neutron.
Definition: pdgcode_constants.h:30
smash::GrandCanThermalizer::particles_to_insert
ParticleList particles_to_insert() const
List of newly created particles to be inserted in the simulation.
Definition: grandcan_thermalizer.h:438
smash::GrandCanThermalizer
The GrandCanThermalizer class implements the following functionality:
Definition: grandcan_thermalizer.h:217
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:190
smash::GrandCanThermalizer::to_remove_
ParticleList to_remove_
Particles to be removed after this thermalization step.
Definition: grandcan_thermalizer.h:485
smash::QuantumNumbers
Definition: quantumnumbers.h:53
smash::GrandCanThermalizer::e_crit_
const double e_crit_
Critical energy density above which cells are thermalized.
Definition: grandcan_thermalizer.h:516
smash::GrandCanThermalizer::lat_
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
Definition: grandcan_thermalizer.h:483
smash::ParticleType::list_all
static const ParticleTypeList & list_all()
Definition: particletype.cc:57
smash::HadronClass::Antibaryon
All anti-baryons.
smash::ThermLatticeNode::e_
double e_
Energy density in the rest frame.
Definition: grandcan_thermalizer.h:118
smash::GrandCanThermalizer::is_time_to_thermalize
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 ...
Definition: grandcan_thermalizer.h:255