Version: SMASH-1.5
boxmodus.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2018
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 #include <cmath>
8 #include <cstdio>
9 #include <cstdlib>
10 #include <list>
11 #include <map>
12 #include <utility>
13 #include <vector>
14 
15 #include "smash/algorithms.h"
16 #include "smash/angles.h"
17 #include "smash/boxmodus.h"
18 #include "smash/configuration.h"
19 #include "smash/constants.h"
20 #include "smash/cxx14compat.h"
21 #include "smash/distributions.h"
23 #include "smash/hadgas_eos.h"
24 #include "smash/logging.h"
25 #include "smash/macros.h"
26 #include "smash/outputinterface.h"
27 #include "smash/particles.h"
28 #include "smash/processbranch.h"
29 #include "smash/quantumnumbers.h"
30 #include "smash/random.h"
31 #include "smash/threevector.h"
33 
34 namespace smash {
35 
36 /* console output on startup of box specific parameters */
37 std::ostream &operator<<(std::ostream &out, const BoxModus &m) {
38  out << "-- Box Modus:\nSize of the box: (" << m.length_ << " fm)³\n";
39  if (m.use_thermal_) {
40  out << "Thermal multiplicities "
41  << "(T = " << m.temperature_ << " GeV, muB = " << m.mub_
42  << " GeV, muS = " << m.mus_ << " GeV)\n";
43  } else {
44  for (const auto &p : m.init_multipl_) {
45  ParticleTypePtr ptype = &ParticleType::find(p.first);
46  out << ptype->name() << " initial multiplicity " << p.second << '\n';
47  }
48  }
50  out << "All initial momenta = 3T = " << 3 * m.temperature_ << " GeV\n";
51  } else {
52  out << "Boltzmann momentum distribution with T = " << m.temperature_
53  << " GeV.\n";
54  }
55  return out;
56 }
57 
162  : initial_condition_(modus_config.take({"Box", "Initial_Condition"})),
163  length_(modus_config.take({"Box", "Length"})),
164  temperature_(modus_config.take({"Box", "Temperature"})),
165  start_time_(modus_config.take({"Box", "Start_Time"}, 0.)),
166  use_thermal_(
167  modus_config.take({"Box", "Use_Thermal_Multiplicities"}, false)),
168  mub_(modus_config.take({"Box", "Baryon_Chemical_Potential"}, 0.)),
169  mus_(modus_config.take({"Box", "Strange_Chemical_Potential"}, 0.)),
170  init_multipl_(use_thermal_
171  ? std::map<PdgCode, int>()
172  : modus_config.take({"Box", "Init_Multiplicities"})
173  .convert_for(init_multipl_)) {}
174 
176  const ExperimentParameters &parameters) {
177  const auto &log = logger<LogArea::Box>();
178  double momentum_radial = 0, mass;
179  Angles phitheta;
180  FourVector momentum_total(0, 0, 0, 0);
181  auto uniform_length = random::make_uniform_distribution(0.0, this->length_);
182  const double T = this->temperature_;
183  /* Create NUMBER OF PARTICLES according to configuration, or thermal case */
184  if (use_thermal_) {
185  const double V = length_ * length_ * length_;
186  if (average_multipl_.empty()) {
187  for (const ParticleType &ptype : ParticleType::list_all()) {
188  if (HadronGasEos::is_eos_particle(ptype)) {
189  const double n = HadronGasEos::partial_density(ptype, T, mub_, mus_);
190  average_multipl_[ptype.pdgcode()] = n * V * parameters.testparticles;
191  }
192  }
193  }
194  double nb_init = 0.0, ns_init = 0.0;
195  for (const auto &mult : average_multipl_) {
196  const int thermal_mult_int = random::poisson(mult.second);
197  particles->create(thermal_mult_int, mult.first);
198  nb_init += mult.second * mult.first.baryon_number();
199  ns_init += mult.second * mult.first.strangeness();
200  log.debug(mult.first, " initial multiplicity ", thermal_mult_int);
201  }
202  log.info("Initial hadron gas baryon density ", nb_init);
203  log.info("Initial hadron gas strange density ", ns_init);
204  } else {
205  for (const auto &p : init_multipl_) {
206  particles->create(p.second * parameters.testparticles, p.first);
207  log.debug("Particle ", p.first, " initial multiplicity ", p.second);
208  }
209  }
210 
211  for (ParticleData &data : *particles) {
212  /* Set MOMENTUM SPACE distribution */
214  /* initial thermal momentum is the average 3T */
215  momentum_radial = 3.0 * T;
216  mass = data.pole_mass();
217  } else {
218  /* thermal momentum according Maxwell-Boltzmann distribution */
219  mass = HadronGasEos::sample_mass_thermal(data.type(), 1.0 / T);
220  momentum_radial = sample_momenta_from_thermal(T, mass);
221  }
222  phitheta.distribute_isotropically();
223  log.debug(data.type().name(), "(id ", data.id(), ") radial momentum ",
224  momentum_radial, ", direction", phitheta);
225  data.set_4momentum(mass, phitheta.threevec() * momentum_radial);
226  momentum_total += data.momentum();
227 
228  /* Set COORDINATE SPACE distribution */
229  ThreeVector pos{uniform_length(), uniform_length(), uniform_length()};
230  data.set_4position(FourVector(start_time_, pos));
232  data.set_formation_time(start_time_);
233  }
234 
235  /* Make total 3-momentum 0 */
236  for (ParticleData &data : *particles) {
237  data.set_4momentum(data.momentum().abs(),
238  data.momentum().threevec() -
239  momentum_total.threevec() / particles->size());
240  }
241 
242  /* Recalculate total momentum */
243  momentum_total = FourVector(0, 0, 0, 0);
244  for (ParticleData &data : *particles) {
245  momentum_total += data.momentum();
246  /* IC: debug checks */
247  log.debug() << data;
248  }
249  /* allows to check energy conservation */
250  log.debug() << "Initial total 4-momentum [GeV]: " << momentum_total;
251  return start_time_;
252 }
253 
255  const OutputsList &output_list) {
256  const auto &log = logger<LogArea::Box>();
257  int wraps = 0;
258 
259  for (ParticleData &data : *particles) {
260  FourVector position = data.position();
261  bool wall_hit = enforce_periodic_boundaries(position.begin() + 1,
262  position.end(), length_);
263  if (wall_hit) {
264  const ParticleData incoming_particle(data);
265  data.set_4position(position);
266  ++wraps;
267  ActionPtr action =
268  make_unique<WallcrossingAction>(incoming_particle, data);
269  for (const auto &output : output_list) {
270  if (!output->is_dilepton_output() && !output->is_photon_output()) {
271  output->at_interaction(*action, 0.);
272  }
273  }
274  }
275  }
276  log.debug("Moved ", wraps, " particles back into the box.");
277  return wraps;
278 }
279 
280 } // namespace smash
const double start_time_
Initial time of the box.
Definition: boxmodus.h:130
const double length_
Length of the cube&#39;s edge in fm/c.
Definition: boxmodus.h:126
const std::map< PdgCode, int > init_multipl_
Particle multiplicities at initialization; required if use_thermal_ is false.
Definition: boxmodus.h:150
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:30
const bool use_thermal_
Whether to use a thermal initialization for all particles instead of specific numbers.
Definition: boxmodus.h:135
const double temperature_
Temperature of the Box in GeV.
Definition: boxmodus.h:128
void create(size_t n, PdgCode pdg)
Add n particles of the same type (pdg) to the list.
Definition: particles.cc:66
const BoxInitialCondition initial_condition_
Initial momenta distribution: thermal or peaked momenta.
Definition: boxmodus.h:124
Collection of useful constants that are known at compile time.
ThreeVector threevec() const
Definition: angles.h:268
iterator end()
Definition: fourvector.h:271
const double mus_
Strange chemical potential for thermal initialization; only used if use_thermal_ is true...
Definition: boxmodus.h:145
Interface to the SMASH configuration files.
static bool is_eos_particle(const ParticleType &ptype)
Check if a particle belongs to the EoS.
Definition: hadgas_eos.h:277
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
ThreeVector threevec() const
Definition: fourvector.h:306
static const ParticleTypeList & list_all()
Definition: particletype.cc:55
Generic algorithms on containers and ranges.
Particle type contains the static properties of a particle species.
Definition: particletype.h:87
std::map< PdgCode, double > average_multipl_
Average multiplicities in case of thermal initialization.
Definition: boxmodus.h:155
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
uniform_dist< T > make_uniform_distribution(T min, T max)
Definition: random.h:132
BoxModus: Provides a modus for infinite matter calculations.
Definition: boxmodus.h:46
constexpr int p
Proton.
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
BoxModus(Configuration modus_config, const ExperimentParameters &parameters)
Constructor.
Definition: boxmodus.cc:161
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: boxmodus.cc:175
int poisson(const T &lam)
Returns a Poisson distributed random number.
Definition: random.h:223
int testparticles
Number of test particle.
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
static bool enforce_periodic_boundaries(Iterator begin, const Iterator &end, typename std::iterator_traits< Iterator >::value_type length)
Enforces periodic boundaries on the given collection of values.
Definition: algorithms.h:53
Definition: action.h:24
int impose_boundary_conditions(Particles *particles, const OutputsList &output_list={})
Enforces that all particles are inside the box.
Definition: boxmodus.cc:254
iterator begin()
Definition: fourvector.h:268
const double mub_
Baryon chemical potential for thermal initialization; only used if use_thermal_ is true...
Definition: boxmodus.h:140
const std::string & name() const
Definition: particletype.h:131