7 #ifndef SRC_INCLUDE_SMASH_GRANDCAN_THERMALIZER_H_
8 #define SRC_INCLUDE_SMASH_GRANDCAN_THERMALIZER_H_
96 double nb()
const {
return nb_; }
98 double ns()
const {
return ns_; }
102 double e()
const {
return e_; }
104 double p()
const {
return p_; }
108 double T()
const {
return T_; }
207 const std::array<int, 3> n_cells,
208 const std::array<double, 3> origin,
bool periodicity,
209 double e_critical,
double t_start,
double delta_t,
213 const std::array<double, 3> lat_sizes,
214 const std::array<double, 3> origin,
bool periodicity)
216 lat_sizes, conf.take({
"Cell_Number"}), origin, periodicity,
217 conf.
take({
"Critical_Edens"}), conf.take({
"Start_Time"}),
218 conf.take({
"Timestep"}),
220 conf.take({
"Microcanonical"},
false)) {}
227 const double t = clock->current_time();
228 const int n =
static_cast<int>(std::floor((t - t_start_) / period_));
229 return (t > t_start_ &&
230 t < t_start_ + n * period_ + clock->timestep_duration());
241 void update_thermalizer_lattice(
const std::vector<Particles>& ensembles,
243 bool ignore_cells_under_threshold =
true);
253 void renormalize_momenta(ParticleList& plist,
266 void sample_multinomial(
HadronClass particle_class,
int N);
278 void sample_in_random_cell_BF_algo(ParticleList& plist,
const double time,
292 void thermalize_BF_algo(
QuantumNumbers& conserved_initial,
double time,
301 template <
typename F>
304 N_total_in_cells_ = 0.0;
305 for (
auto cell_index : cells_to_sample_) {
307 const double gamma = 1.0 / std::sqrt(1.0 - cell.
v().
sqr());
310 if (condition(i->strangeness(), i->baryon_number(), i->charge())) {
312 N_tot += lat_cell_volume_ * gamma *
313 HadronGasEos::partial_density(*i, cell.
T(), cell.
mub(),
317 N_in_cells_.push_back(N_tot);
318 N_total_in_cells_ += N_tot;
332 template <
typename F>
337 double partial_sum = 0.0;
338 int index_only_thermalized = -1;
339 while (partial_sum < r) {
340 index_only_thermalized++;
341 partial_sum += N_in_cells_[index_only_thermalized];
343 const int cell_index = cells_to_sample_[index_only_thermalized];
345 const ThreeVector cell_center = lat_->cell_center(cell_index);
346 const double gamma = 1.0 / std::sqrt(1.0 - cell.
v().
sqr());
347 const double N_in_cell = N_in_cells_[index_only_thermalized];
353 if (!condition(i->strangeness(), i->baryon_number(), i->charge())) {
356 N_sum += lat_cell_volume_ * gamma *
357 HadronGasEos::partial_density(*i, cell.
T(), cell.
mub(),
366 const double m = type_to_sample->
mass();
387 void thermalize_mode_algo(
QuantumNumbers& conserved_initial,
double time);
395 void thermalize(
const Particles& particles,
double time,
int ntest);
403 void print_statistics(
const Clock& clock)
const;
407 double e_crit()
const {
return e_crit_; }
419 ParticleTypePtrList res;
420 for (
const ParticleType& ptype : ParticleType::list_all()) {
421 if (HadronGasEos::is_eos_particle(ptype)) {
422 res.push_back(&ptype);
432 const int B = eos_typelist_[typelist_index]->baryon_number();
433 const int S = eos_typelist_[typelist_index]->strangeness();
434 const int ch = eos_typelist_[typelist_index]->charge();
436 return (B > 0) ? HadronClass::Baryon :
437 (B < 0) ? HadronClass::Antibaryon :
438 (
S > 0) ? HadronClass::PositiveSMeson :
439 (
S < 0) ? HadronClass::NegativeSMeson :
440 (ch > 0) ? HadronClass::PositiveQZeroSMeson :
441 (ch < 0) ? HadronClass::NegativeQZeroSMeson :
442 HadronClass::ZeroQZeroSMeson;
447 return mult_classes_[
static_cast<size_t>(cl)];
456 std::unique_ptr<RectangularLattice<ThermLatticeNode>>
lat_;
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
ThreeVector threevec() const
void distribute_isotropically()
Populate the object with a new direction.
Clock tracks the time in the simulation.
Interface to the SMASH configuration files.
Value take(std::initializer_list< const char * > keys)
The default interface for SMASH to read configuration values.
A class to pre-calculate and store parameters relevant for density calculation.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
The GrandCanThermalizer class implements the following functionality:
void compute_N_in_cells_mode_algo(F &&condition)
Computes average number of particles in each cell for the mode algorithm.
std::vector< double > mult_sort_
Real number multiplicity for each particle type.
std::vector< int > mult_int_
Integer multiplicity for each particle type.
GrandCanThermalizer(Configuration &conf, const std::array< double, 3 > lat_sizes, const std::array< double, 3 > origin, bool periodicity)
ParticleList to_remove_
Particles to be removed after this thermalization step.
const bool BF_enforce_microcanonical_
Enforce energy conservation as part of BF sampling algorithm or not.
std::unique_ptr< RectangularLattice< ThermLatticeNode > > lat_
The lattice on which the thermodynamic quantities are calculated.
ParticleList particles_to_insert() const
List of newly created particles to be inserted in the simulation.
double mult_class(const HadronClass cl) const
ParticleList particles_to_remove() const
List of particles to be removed from the simulation.
HadronClass get_class(size_t typelist_index) const
Defines the class of hadrons by quantum numbers.
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.
const double t_start_
Starting time of the simulation.
const double period_
Defines periodicity of the lattice in fm.
ParticleTypePtrList list_eos_particles() const
Extracts the particles in the hadron gas equation of state from the complete list of particle types i...
const double e_crit_
Critical energy density above which cells are thermalized.
ParticleList sampled_list_
Newly generated particles by thermalizer.
std::array< double, 7 > mult_classes_
The different hadron species according to the enum defined in.
std::vector< size_t > cells_to_sample_
Cells above critical energy density.
const ThermalizationAlgorithm algorithm_
Algorithm to choose for sampling of particles obeying conservation laws.
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 ...
RectangularLattice< ThermLatticeNode > & lattice() const
Getter function for the lattice.
double e_crit() const
Get the critical energy density.
const ParticleTypePtrList eos_typelist_
List of particle types from which equation of state is computed.
std::vector< double > N_in_cells_
Number of particles to be sampled in one cell.
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...
double lat_cell_volume_
Volume of a single lattice cell, necessary to convert thermal densities to actual particle numbers.
const size_t N_sorts_
Number of different species to be sampled.
double N_total_in_cells_
Total number of particles over all cells in thermalization region.
Class to handle the equation of state (EoS) of the hadron gas, consisting of all hadrons included in ...
ParticleData contains the dynamic information of a certain particle.
void set_4momentum(const FourVector &momentum_vector)
Set the particle's 4-momentum directly.
void set_4position(const FourVector &pos)
Set the particle's 4-position directly.
void set_formation_time(const double &form_time)
Set the absolute formation time.
void boost_momentum(const ThreeVector &v)
Apply a Lorentz-boost to only the momentum.
A pointer-like interface to global references to ParticleType objects.
Particle type contains the static properties of a particle species.
The Particles class abstracts the storage and manipulation of particles.
A container for storing conserved values.
A container class to hold all the arrays on the lattice and access them.
The ThermLatticeNode class is intended to compute thermodynamical quantities in a cell given a set of...
void compute_rest_frame_quantities(HadronGasEos &eos)
Temperature, chemical potentials and rest frame velocity are calculated given the hadron gas equation...
double muq() const
Get the net charge chemical potential.
FourVector Tmu0() const
Get Four-momentum flow of the cell.
double ns_
Net strangeness density of the cell in the computational frame.
void set_rest_frame_quantities(double T0, double mub0, double mus0, double muq0, const ThreeVector v0)
Set all the rest frame quantities to some values, this is useful for testing.
double p() const
Get pressure in the rest frame.
double p_
Pressure in the rest frame.
double mus_
Net strangeness chemical potential.
ThreeVector v() const
Get 3-velocity of the rest frame.
double ns() const
Get net strangeness density of the cell in the computational frame.
double e_
Energy density in the rest frame.
double nb_
Net baryon density of the cell in the computational frame.
void add_particle(const ParticleData &p, double factor)
Add particle contribution to Tmu0, nb, ns and nq May look like unused at first glance,...
double muq_
Net charge chemical potential.
void add_particle_for_derivatives(const ParticleData &, double, ThreeVector)
dummy function for update_lattice
double nq() const
Get net charge density of the cell in the computational frame.
double mub_
Net baryon chemical potential.
FourVector Tmu0_
Four-momentum flow of the cell.
double mus() const
Get the net strangeness chemical potential.
ThreeVector v_
Velocity of the rest frame.
ThermLatticeNode()
Default constructor of thermal quantities on the lattice returning thermodynamic quantities in comput...
double mub() const
Get the net baryon chemical potential.
double nb() const
Get net baryon density of the cell in the computational frame.
double nq_
Net charge density of the cell in the computational frame.
double e() const
Get energy density in the rest frame.
double T() const
Get the temperature.
The ThreeVector class represents a physical three-vector with the components .
ThermalizationAlgorithm
Defines the algorithm used for the forced thermalization.
std::ostream & operator<<(std::ostream &out, const ActionPtr &action)
Convenience: dereferences the ActionPtr to Action.
double sample_momenta_from_thermal(const double temperature, const double mass)
Samples a momentum from the Maxwell-Boltzmann (thermal) distribution in a faster way,...
HadronClass
Specifier to classify the different hadron species according to their quantum numbers.
@ Antibaryon
All anti-baryons.
@ ZeroQZeroSMeson
Neutral non-strange mesons.
@ NegativeSMeson
Mesons with strangeness S < 0.
@ NegativeQZeroSMeson
Non-strange mesons (S = 0) with electric cherge Q < 0.
@ PositiveSMeson
Mesons with strangeness S > 0.
@ PositiveQZeroSMeson
Non-strange mesons (S = 0) with electric cherge Q > 0.