Version: SMASH-1.5
spheremodus.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2013-2018
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #include <cmath>
11 #include <cstdio>
12 #include <cstdlib>
13 #include <list>
14 #include <map>
15 #include <utility>
16 #include <vector>
17 
18 #include "smash/algorithms.h"
19 #include "smash/angles.h"
20 #include "smash/configuration.h"
21 #include "smash/constants.h"
22 #include "smash/distributions.h"
24 #include "smash/fourvector.h"
25 #include "smash/hadgas_eos.h"
26 #include "smash/logging.h"
27 #include "smash/macros.h"
28 #include "smash/particles.h"
29 #include "smash/random.h"
30 #include "smash/spheremodus.h"
31 #include "smash/threevector.h"
32 
33 namespace smash {
34 
134  const ExperimentParameters &)
135  : radius_(modus_config.take({"Sphere", "Radius"})),
136  sphere_temperature_(modus_config.take({"Sphere", "Sphere_Temperature"})),
137  start_time_(modus_config.take({"Sphere", "Start_Time"}, 0.)),
138  use_thermal_(
139  modus_config.take({"Sphere", "Use_Thermal_Multiplicities"}, false)),
140  mub_(modus_config.take({"Sphere", "Baryon_Chemical_Potential"}, 0.)),
141  mus_(modus_config.take({"Sphere", "Strange_Chemical_Potential"}, 0.)),
142  init_multipl_(use_thermal_
143  ? std::map<PdgCode, int>()
144  : modus_config.take({"Sphere", "Init_Multiplicities"})
145  .convert_for(init_multipl_)),
146  init_distr_(modus_config.take({"Sphere", "Initial_Condition"},
148 
149 /* console output on startup of sphere specific parameters */
150 std::ostream &operator<<(std::ostream &out, const SphereModus &m) {
151  out << "-- Sphere Modus:\nRadius of the sphere: " << m.radius_ << " fm\n";
152  if (m.use_thermal_) {
153  out << "Thermal multiplicities (T = " << m.sphere_temperature_
154  << " GeV, muB = " << m.mub_ << " GeV, muS = " << m.mus_ << " GeV)\n";
155  } else {
156  for (const auto &p : m.init_multipl_) {
157  ParticleTypePtr ptype = &ParticleType::find(p.first);
158  out << ptype->name() << " initial multiplicity " << p.second << '\n';
159  }
160  }
161  out << "Boltzmann momentum distribution with T = " << m.sphere_temperature_
162  << " GeV.\n";
163  return out;
164 }
165 
166 /* initial_conditions - sets particle data for @particles */
168  const ExperimentParameters &parameters) {
169  const auto &log = logger<LogArea::Sphere>();
170  FourVector momentum_total(0, 0, 0, 0);
171  const double T = this->sphere_temperature_;
172  /* Create NUMBER OF PARTICLES according to configuration */
173  if (use_thermal_) {
174  const double V = 4.0 / 3.0 * M_PI * radius_ * radius_ * radius_;
175  if (average_multipl_.empty()) {
176  for (const ParticleType &ptype : ParticleType::list_all()) {
177  if (HadronGasEos::is_eos_particle(ptype)) {
178  const double n = HadronGasEos::partial_density(ptype, T, mub_, mus_);
179  average_multipl_[ptype.pdgcode()] = n * V * parameters.testparticles;
180  }
181  }
182  }
183  double nb_init = 0.0, ns_init = 0.0;
184  for (const auto &mult : average_multipl_) {
185  const int thermal_mult_int = random::poisson(mult.second);
186  particles->create(thermal_mult_int, mult.first);
187  nb_init += mult.second * mult.first.baryon_number();
188  ns_init += mult.second * mult.first.strangeness();
189  log.debug(mult.first, " initial multiplicity ", thermal_mult_int);
190  }
191  log.info("Initial hadron gas baryon density ", nb_init);
192  log.info("Initial hadron gas strange density ", ns_init);
193  } else {
194  for (const auto &p : init_multipl_) {
195  particles->create(p.second * parameters.testparticles, p.first);
196  log.debug("Particle ", p.first, " initial multiplicity ", p.second);
197  }
198  }
199  /* loop over particle data to fill in momentum and position information */
200  for (ParticleData &data : *particles) {
201  Angles phitheta;
202  /* thermal momentum according Maxwell-Boltzmann distribution */
203  double momentum_radial, mass = data.pole_mass();
204  /* assign momentum_radial according to requested distribution */
205  switch (init_distr_) {
207  momentum_radial = sample_momenta_IC_ES(T);
208  break;
210  momentum_radial = sample_momenta_1M_IC(T, mass);
211  break;
213  momentum_radial = sample_momenta_2M_IC(T, mass);
214  break;
216  momentum_radial = sample_momenta_non_eq_mass(T, mass);
217  break;
219  default:
220  mass = HadronGasEos::sample_mass_thermal(data.type(), 1.0 / T);
221  momentum_radial = sample_momenta_from_thermal(T, mass);
222  break;
223  }
224  phitheta.distribute_isotropically();
225  log.debug(data.type().name(), "(id ", data.id(), ") radial momentum ",
226  momentum_radial, ", direction", phitheta);
227  data.set_4momentum(mass, phitheta.threevec() * momentum_radial);
228  momentum_total += data.momentum();
229  /* uniform sampling in a sphere with radius r */
230  double position_radial;
231  position_radial = std::cbrt(random::canonical()) * radius_;
232  Angles pos_phitheta;
233  pos_phitheta.distribute_isotropically();
234  data.set_4position(
235  FourVector(start_time_, pos_phitheta.threevec() * position_radial));
236  data.set_formation_time(start_time_);
237  }
238  /* Make total 3-momentum 0 */
239  for (ParticleData &data : *particles) {
240  data.set_4momentum(data.momentum().abs(),
241  data.momentum().threevec() -
242  momentum_total.threevec() / particles->size());
243  }
244 
245  /* Recalculate total momentum */
246  momentum_total = FourVector(0, 0, 0, 0);
247  for (ParticleData &data : *particles) {
248  momentum_total += data.momentum();
249  /* IC: debug checks */
250  log.debug() << data;
251  }
252  /* allows to check energy conservation */
253  log.debug() << "Sphere initial total 4-momentum [GeV]: " << momentum_total;
254  return start_time_;
255 }
256 } // namespace smash
double radius_
Sphere radius (in fm/c)
Definition: spheremodus.h:78
const SphereInitialCondition init_distr_
Initialization scheme for momenta in the sphere; used for expanding metric setup. ...
Definition: spheremodus.h:112
double sample_momenta_2M_IC(const double temperature, const double mass)
Samples a momentum from the non-equilibrium distribution 2M_IC from Bazow:2016oky ...
void create(size_t n, PdgCode pdg)
Add n particles of the same type (pdg) to the list.
Definition: particles.cc:66
Collection of useful constants that are known at compile time.
ThreeVector threevec() const
Definition: angles.h:268
double sphere_temperature_
Temperature for momentum distribution (in GeV)
Definition: spheremodus.h:80
Interface to the SMASH configuration files.
const double start_time_
Starting time for the Sphere.
Definition: spheremodus.h:82
static bool is_eos_particle(const ParticleType &ptype)
Check if a particle belongs to the EoS.
Definition: hadgas_eos.h:277
T canonical()
Definition: random.h:110
std::map< PdgCode, double > average_multipl_
Average multiplicities in case of thermal initialization.
Definition: spheremodus.h:107
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
SphereModus: Provides a modus for expanding matter calculations.
Definition: spheremodus.h:47
double sample_momenta_IC_ES(const double temperature)
Sample momenta according to the momentum distribution in Bazow:2016oky
static const ParticleTypeList & list_all()
Definition: particletype.cc:55
const bool use_thermal_
Whether to use a thermal initialization for all particles instead of specific numbers.
Definition: spheremodus.h:87
Generic algorithms on containers and ranges.
Particle type contains the static properties of a particle species.
Definition: particletype.h:87
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.
static double sample_mass_thermal(const ParticleType &ptype, double beta)
Sample resonance mass in a thermal medium.
Definition: hadgas_eos.cc:305
const double mus_
Strange chemical potential for thermal initialization; only used if use_thermal_ is true...
Definition: spheremodus.h:97
SphereModus(Configuration modus_config, const ExperimentParameters &parameters)
Constructor.
Definition: spheremodus.cc:133
const double mub_
Baryon chemical potential for thermal initialization; only used if use_thermal_ is true...
Definition: spheremodus.h:92
double sample_momenta_non_eq_mass(const double temperature, const double mass)
Samples a momentum via rejection method from the non-equilibrium distribution .
const std::map< PdgCode, int > init_multipl_
Particle multiplicities at initialization; required if use_thermal_ is false.
Definition: spheremodus.h:102
constexpr int p
Proton.
double sample_momenta_1M_IC(const double temperature, const double mass)
Samples a momentum from the non-equilibrium distribution 1M_IC from Bazow:2016oky ...
static double partial_density(const ParticleType &ptype, double T, double mub, double mus)
Compute partial density of one hadron sort.
Definition: hadgas_eos.cc:219
int poisson(const T &lam)
Returns a Poisson distributed random number.
Definition: random.h:223
int testparticles
Number of test particle.
double initial_conditions(Particles *particles, const ExperimentParameters &parameters)
Generates initial state of the particles in the system according to specified parameters: number of p...
Definition: spheremodus.cc:167
A pointer-like interface to global references to ParticleType objects.
Definition: particletype.h:660
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
void distribute_isotropically()
Populate the object with a new direction.
Definition: angles.h:188
The Particles class abstracts the storage and manipulation of particles.
Definition: particles.h:33
constexpr int n
Neutron.
std::ostream & operator<<(std::ostream &out, const ActionPtr &action)
Convenience: dereferences the ActionPtr to Action.
Definition: action.h:457
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:32
Helper structure for Experiment.
ParticleData contains the dynamic information of a certain particle.
Definition: particledata.h:52
Definition: action.h:24
const std::string & name() const
Definition: particletype.h:131