Version: SMASH-1.7
smash::Experiment< Modus > Class Template Reference

#include <experiment.h>

template<typename Modus>
class smash::Experiment< Modus >

The main class, where the simulation of an experiment is executed.

The Experiment class owns all data (maybe indirectly) relevant for the execution of the experiment simulation. The experiment can be conducted in different running modi. Since the abstraction of these differences should not incur any overhead, the design is built around the Policy pattern.

The Policy pattern was defined by Andrei Alexandrescu in his book "Modern C++ Design: Generic Programming and Design Patterns Applied". Addison-Wesley:

A policy defines a class interface or a class template interface. The interface consists of one or all of the following: inner type definitions, member functions, and member variables.

The policy pattern can also be understood as a compile-time variant of the strategy pattern.

The Modus template parameter defines the "policy" of the Experiment class. It determines several aspects of the experiment execution at compile time. The original strategy pattern would select these differences at run time, thus incurring an overhead. This overhead becomes severe in cases where calls to strategy/policy functions are done very frequently. Using the policy pattern, the compiler can fully optimize: It creates a new instance of all functions in Experiment for all different Modus types.

Definition at line 135 of file experiment.h.

Inheritance diagram for smash::Experiment< Modus >:
[legend]
Collaboration diagram for smash::Experiment< Modus >:
[legend]

Public Member Functions

void run () override
 Runs the experiment. More...
 
 Experiment (Configuration config, const bf::path &output_path)
 Create a new Experiment. More...
 
void initialize_new_event ()
 This is called in the beginning of each event. More...
 
void run_time_evolution ()
 Runs the time evolution of an event with fixed-sized time steps or without timesteps, from action to actions. More...
 
void do_final_decays ()
 Performs the final decays of an event. More...
 
void final_output (const int evt_num)
 Output at the end of an event. More...
 
Particlesparticles ()
 Provides external access to SMASH particles. More...
 
Modus * modus ()
 Provides external access to SMASH calculation modus. More...
 
- Public Member Functions inherited from smash::ExperimentBase
 ExperimentBase ()=default
 
virtual ~ExperimentBase ()=default
 The virtual destructor avoids undefined behavior when destroying derived objects. More...
 

Private Member Functions

template<typename Container >
bool perform_action (Action &action, const Container &particles_before_actions)
 Perform the given action. More...
 
void create_output (const std::string &format, const std::string &content, const bf::path &output_path, const OutputParameters &par)
 Create a list of output files. More...
 
void propagate_and_shine (double to_time)
 Propagate all particles until time to_time without any interactions and shine dileptons. More...
 
void run_time_evolution_timestepless (Actions &actions)
 Performs all the propagations and actions during a certain time interval neglecting the influence of the potentials. More...
 
void intermediate_output ()
 Intermediate output during an event. More...
 
void update_potentials ()
 Recompute potentials on lattices if necessary. More...
 
double compute_min_cell_length (double dt) const
 Calculate the minimal size for the grid cells such that the ScatterActionsFinder will find all collisions within the maximal transverse distance (which is determined by the maximal cross section). More...
 
double next_output_time () const
 Shortcut for next output time. More...
 

Private Attributes

ExperimentParameters parameters_
 Struct of several member variables. More...
 
DensityParameters density_param_
 Structure to precalculate and hold parameters for density computations. More...
 
Modus modus_
 Instance of the Modus template parameter. More...
 
Particles particles_
 Complete particle list. More...
 
std::unique_ptr< Potentialspotentials_
 An instance of potentials class, that stores parameters of potentials, calculates them and their gradients. More...
 
std::unique_ptr< PauliBlockerpauli_blocker_
 An instance of PauliBlocker class that stores parameters needed for Pauli blocking calculations and computes phase-space density. More...
 
OutputsList outputs_
 A list of output formaters. More...
 
OutputPtr dilepton_output_
 The Dilepton output. More...
 
OutputPtr photon_output_
 The Photon output. More...
 
std::vector< bool > nucleon_has_interacted_ = {}
 nucleon_has_interacted_ labels whether the particles in the nuclei have experienced any collisions or not. More...
 
bool projectile_target_interact_ = false
 Whether the projectile and the target collided. More...
 
std::vector< FourVectorbeam_momentum_ = {}
 The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen. More...
 
std::vector< std::unique_ptr< ActionFinderInterface > > action_finders_
 The Action finder objects. More...
 
std::unique_ptr< DecayActionsFinderDileptondilepton_finder_
 The Dilepton Action Finder. More...
 
std::unique_ptr< ActionFinderInterfacephoton_finder_
 The (Scatter) Actions Finder for Direct Photons. More...
 
int n_fractional_photons_ = 100
 Number of fractional photons produced per single reaction. More...
 
std::unique_ptr< DensityLatticejmu_B_lat_
 Baryon density on the lattices. More...
 
std::unique_ptr< DensityLatticejmu_I3_lat_
 Isospin projection density on the lattices. More...
 
std::unique_ptr< DensityLatticejmu_custom_lat_
 Custom density on the lattices. More...
 
DensityType dens_type_lattice_printout_ = DensityType::None
 Type of density for lattice printout. More...
 
std::unique_ptr< RectangularLattice< FourVector > > UB_lat_ = nullptr
 Lattices for Skyrme potentials (evaluated in the local rest frame) times the baryon flow 4-velocity. More...
 
std::unique_ptr< RectangularLattice< FourVector > > UI3_lat_ = nullptr
 Lattices for symmetry potentials (evaluated in the local rest frame) times the isospin flow 4-velocity. More...
 
std::unique_ptr< RectangularLattice< std::pair< ThreeVector, ThreeVector > > > FB_lat_
 Lattices for the electric and magnetic components of the Skyrme force. More...
 
std::unique_ptr< RectangularLattice< std::pair< ThreeVector, ThreeVector > > > FI3_lat_
 Lattices for the electric and magnetic component of the symmetry force. More...
 
std::unique_ptr< RectangularLattice< EnergyMomentumTensor > > Tmn_
 Lattices of energy-momentum tensors for printout. More...
 
bool printout_tmn_ = false
 Whether to print the energy-momentum tensor. More...
 
bool printout_tmn_landau_ = false
 Whether to print the energy-momentum tensor in Landau frame. More...
 
bool printout_v_landau_ = false
 Whether to print the 4-velocity in Landau fram. More...
 
bool printout_lattice_td_ = false
 Whether to print the thermodynamics quantities evaluated on the lattices. More...
 
std::unique_ptr< GrandCanThermalizerthermalizer_
 Instance of class used for forced thermalization. More...
 
StringProcessprocess_string_ptr_
 Pointer to the string process class object, which is used to set the random seed for PYTHIA objects in each event. More...
 
const int nevents_
 Number of events. More...
 
const double end_time_
 simulation time at which the evolution is stopped. More...
 
const double delta_time_startup_
 The clock's timestep size at start up. More...
 
const bool force_decays_
 This indicates whether we force all resonances to decay in the last timestep. More...
 
const bool use_grid_
 This indicates whether to use the grid. More...
 
const ExpansionProperties metric_
 This struct contains information on the metric to be used. More...
 
const bool dileptons_switch_
 This indicates whether dileptons are switched on. More...
 
const bool photons_switch_
 This indicates whether photons are switched on. More...
 
const bool IC_output_switch_
 This indicates whether the IC output is enabled. More...
 
const TimeStepMode time_step_mode_
 This indicates whether to use time steps. More...
 
double max_transverse_distance_sqr_ = std::numeric_limits<double>::max()
 Maximal distance at which particles can interact, squared. More...
 
QuantumNumbers conserved_initial_
 The conserved quantities of the system. More...
 
SystemTimePoint time_start_ = SystemClock::now()
 system starting time of the simulation More...
 
DensityType dens_type_ = DensityType::None
 Type of density to be written to collision headers. More...
 
uint64_t interactions_total_ = 0
 Total number of interactions for current timestep. More...
 
uint64_t previous_interactions_total_ = 0
 Total number of interactions for previous timestep. More...
 
uint64_t wall_actions_total_ = 0
 Total number of wall-crossings for current timestep. More...
 
uint64_t previous_wall_actions_total_ = 0
 Total number of wall-crossings for previous timestep. More...
 
uint64_t total_pauli_blocked_ = 0
 Total number of Pauli-blockings for current timestep. More...
 
uint64_t total_hypersurface_crossing_actions_ = 0
 Total number of particles removed from the evolution in hypersurface crossing actions. More...
 
double total_energy_removed_ = 0.0
 Total energy removed from the system in hypersurface crossing actions. More...
 
int64_t seed_ = -1
 random seed for the next event. More...
 

Friends

class ExperimentBase
 
std::ostream & operator<< (std::ostream &out, const Experiment &e)
 Writes the initial state for the Experiment to the output stream. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from smash::ExperimentBase
static std::unique_ptr< ExperimentBasecreate (Configuration config, const bf::path &output_path)
 Factory method that creates and initializes a new Experiment<Modus>. More...
 

Constructor & Destructor Documentation

template<typename Modus >
smash::Experiment< Modus >::Experiment ( Configuration  config,
const bf::path &  output_path 
)
explicit

Create a new Experiment.

This constructor is only called from the ExperimentBase::create factory method.

Parameters
[in]configThe Configuration object contains all initial setup of the experiment. It is forwarded to the constructors of member variables as needed. Note that the object is passed by non-const reference. This is only necessary for bookkeeping: Values are not only read, but actually taken out of the object. Thus, all values that remain were not used.
[in]output_pathThe directory where the output files are written.

Member Function Documentation

template<typename Modus >
void smash::Experiment< Modus >::run ( )
overridevirtual

Runs the experiment.

The constructor does the setup of the experiment. The run function executes the complete experiment.

Implements smash::ExperimentBase.

Definition at line 1983 of file experiment.h.

1983  {
1984  const auto &mainlog = logger<LogArea::Main>();
1985  for (int j = 0; j < nevents_; j++) {
1986  mainlog.info() << "Event " << j;
1987 
1988  // Sample initial particles, start clock, some printout and book-keeping
1990  /* In the ColliderModus, if the first collisions within the same nucleus are
1991  * forbidden, 'nucleon_has_interacted_', which records whether a nucleon has
1992  * collided with another nucleon, is initialized equal to false. If allowed,
1993  * 'nucleon_has_interacted' is initialized equal to true, which means these
1994  * incoming particles have experienced some fake scatterings, they can
1995  * therefore collide with each other later on since these collisions are not
1996  * "first" to them. */
1997  if (modus_.is_collider()) {
1998  if (!modus_.cll_in_nucleus()) {
1999  nucleon_has_interacted_.assign(modus_.total_N_number(), false);
2000  } else {
2001  nucleon_has_interacted_.assign(modus_.total_N_number(), true);
2002  }
2003  }
2004  /* In the ColliderModus, if Fermi motion is frozen, assign the beam momenta
2005  * to the nucleons in both the projectile and the target. */
2006  if (modus_.is_collider() && modus_.fermi_motion() == FermiMotion::Frozen) {
2007  for (int i = 0; i < modus_.total_N_number(); i++) {
2008  const auto mass_beam = particles_.copy_to_vector()[i].effective_mass();
2009  const auto v_beam = i < modus_.proj_N_number()
2010  ? modus_.velocity_projectile()
2011  : modus_.velocity_target();
2012  const auto gamma = 1.0 / std::sqrt(1.0 - v_beam * v_beam);
2013  beam_momentum_.emplace_back(FourVector(gamma * mass_beam, 0.0, 0.0,
2014  gamma * v_beam * mass_beam));
2015  }
2016  }
2017 
2018  // Output at event start
2019  for (const auto &output : outputs_) {
2020  output->at_eventstart(particles_, j);
2021  }
2022 
2024 
2025  if (force_decays_) {
2026  do_final_decays();
2027  }
2028 
2029  // Output at event end
2030  final_output(j);
2031  }
2032 }
void run_time_evolution()
Runs the time evolution of an event with fixed-sized time steps or without timesteps, from action to actions.
Definition: experiment.h:1558
void final_output(const int evt_num)
Output at the end of an event.
Definition: experiment.h:1922
void do_final_decays()
Performs the final decays of an event.
Definition: experiment.h:1886
const bool force_decays_
This indicates whether we force all resonances to decay in the last timestep.
Definition: experiment.h:464
ParticleList copy_to_vector() const
Definition: particles.h:44
Particles particles_
Complete particle list.
Definition: experiment.h:316
void initialize_new_event()
This is called in the beginning of each event.
Definition: experiment.h:1326
std::vector< bool > nucleon_has_interacted_
nucleon_has_interacted_ labels whether the particles in the nuclei have experienced any collisions or...
Definition: experiment.h:347
Use fermi motion without potentials.
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334
Modus modus_
Instance of the Modus template parameter.
Definition: experiment.h:313
const int nevents_
Number of events.
Definition: experiment.h:448
std::vector< FourVector > beam_momentum_
The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen...
Definition: experiment.h:358
template<typename Modus >
void smash::Experiment< Modus >::initialize_new_event ( )

This is called in the beginning of each event.

It initializes particles according to selected modus, resets the clock and saves the initial conserved quantities for subsequent sanity checks.

Definition at line 1326 of file experiment.h.

1326  {
1327  const auto &log = logger<LogArea::Experiment>();
1328 
1330  log.info() << "random number seed: " << seed_;
1331  /* Set seed for the next event. It has to be positive, so it can be entered
1332  * in the config.
1333  *
1334  * We have to be careful about the minimal integer, whose absolute value
1335  * cannot be represented. */
1336  int64_t r = random::advance();
1337  while (r == INT64_MIN) {
1338  r = random::advance();
1339  }
1340  seed_ = std::abs(r);
1341  /* Set the random seed used in PYTHIA hadronization
1342  * to be same with the SMASH one.
1343  * In this way we ensure that the results are reproducible
1344  * for every event if one knows SMASH random seed. */
1345  if (process_string_ptr_ != NULL) {
1347  }
1348 
1349  particles_.reset();
1350 
1351  // Sample particles according to the initial conditions
1352  double start_time = modus_.initial_conditions(&particles_, parameters_);
1353  /* For box modus make sure that particles are in the box. In principle, after
1354  * a correct initialization they should be, so this is just playing it safe.
1355  */
1356  modus_.impose_boundary_conditions(&particles_, outputs_);
1357  // Reset the simulation clock
1358  double timestep = delta_time_startup_;
1359 
1360  switch (time_step_mode_) {
1361  case TimeStepMode::Fixed:
1362  break;
1363  case TimeStepMode::None:
1364  timestep = end_time_ - start_time;
1365  // Take care of the box modus + timestepless propagation
1366  const double max_dt = modus_.max_timestep(max_transverse_distance_sqr_);
1367  if (max_dt > 0. && max_dt < timestep) {
1368  timestep = max_dt;
1369  }
1370  break;
1371  }
1372  std::unique_ptr<UniformClock> clock_for_this_event;
1373  if (modus_.is_list() && (timestep < 0.0)) {
1374  throw std::runtime_error(
1375  "Timestep for the given event is negative. \n"
1376  "This might happen if the formation times of the input particles are "
1377  "larger than the specified end time of the simulation.");
1378  }
1379  clock_for_this_event = make_unique<UniformClock>(start_time, timestep);
1380  parameters_.labclock = std::move(clock_for_this_event);
1381 
1382  // Reset the output clock
1383  parameters_.outputclock->reset(start_time, true);
1384  // remove time before starting time in case of custom output times.
1385  parameters_.outputclock->remove_times_in_past(start_time);
1386 
1387  log.debug("Lab clock: t_start = ", parameters_.labclock->current_time(),
1388  ", dt = ", parameters_.labclock->timestep_duration());
1389 
1390  /* Save the initial conserved quantum numbers and total momentum in
1391  * the system for conservation checks */
1392  conserved_initial_ = QuantumNumbers(particles_);
1393  wall_actions_total_ = 0;
1395  interactions_total_ = 0;
1400  total_energy_removed_ = 0.0;
1401  // Print output headers
1402  log.info() << hline;
1403  log.info() << "Time [fm] Ediff [GeV] Scatt.|Decays "
1404  "Particles Timing";
1405  log.info() << hline;
1406 }
void reset()
Reset the state of the Particles object to an empty list and a new id counter.
Definition: particles.cc:139
uint64_t total_hypersurface_crossing_actions_
Total number of particles removed from the evolution in hypersurface crossing actions.
Definition: experiment.h:536
std::unique_ptr< Clock > labclock
System clock (for simulation time keeping in the computational frame)
int64_t seed_
random seed for the next event.
Definition: experiment.h:545
uint64_t total_pauli_blocked_
Total number of Pauli-blockings for current timestep.
Definition: experiment.h:530
const TimeStepMode time_step_mode_
This indicates whether to use time steps.
Definition: experiment.h:482
void set_seed(T &&seed)
Sets the seed of the random number engine.
Definition: random.h:71
uint64_t wall_actions_total_
Total number of wall-crossings for current timestep.
Definition: experiment.h:518
bool projectile_target_interact_
Whether the projectile and the target collided.
Definition: experiment.h:351
StringProcess * process_string_ptr_
Pointer to the string process class object, which is used to set the random seed for PYTHIA objects i...
Definition: experiment.h:432
QuantumNumbers conserved_initial_
The conserved quantities of the system.
Definition: experiment.h:494
std::unique_ptr< Clock > outputclock
Output clock to keep track of the next output time.
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:304
Particles particles_
Complete particle list.
Definition: experiment.h:316
const std::string hline(67, '-')
String representing a horizontal line.
const double end_time_
simulation time at which the evolution is stopped.
Definition: experiment.h:451
uint64_t previous_wall_actions_total_
Total number of wall-crossings for previous timestep.
Definition: experiment.h:524
double max_transverse_distance_sqr_
Maximal distance at which particles can interact, squared.
Definition: experiment.h:485
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:506
Engine::result_type advance()
Advance the engine&#39;s state and return the generated value.
Definition: random.h:78
const double delta_time_startup_
The clock&#39;s timestep size at start up.
Definition: experiment.h:458
uint64_t previous_interactions_total_
Total number of interactions for previous timestep.
Definition: experiment.h:512
double total_energy_removed_
Total energy removed from the system in hypersurface crossing actions.
Definition: experiment.h:542
Use fixed time step.
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334
Modus modus_
Instance of the Modus template parameter.
Definition: experiment.h:313
void init_pythia_hadron_rndm()
Set PYTHIA random seeds to be desired values.

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::run_time_evolution ( )

Runs the time evolution of an event with fixed-sized time steps or without timesteps, from action to actions.

Within one timestep (fixed) evolution from action to action is invoked.

Definition at line 1558 of file experiment.h.

1558  {
1559  Actions actions;
1560 
1561  const auto &log = logger<LogArea::Experiment>();
1562 
1564  time_start_,
1565  parameters_.labclock->current_time());
1566 
1567  while (parameters_.labclock->current_time() < end_time_) {
1568  const double t = parameters_.labclock->current_time();
1569  const double dt =
1570  std::min(parameters_.labclock->timestep_duration(), end_time_ - t);
1571  log.debug("Timestepless propagation for next ", dt, " fm/c.");
1572 
1573  // Perform forced thermalization if required
1574  if (thermalizer_ &&
1575  thermalizer_->is_time_to_thermalize(parameters_.labclock)) {
1576  const bool ignore_cells_under_treshold = true;
1577  thermalizer_->update_thermalizer_lattice(particles_, density_param_,
1578  ignore_cells_under_treshold);
1579  const double current_t = parameters_.labclock->current_time();
1580  thermalizer_->thermalize(particles_, current_t,
1582  ThermalizationAction th_act(*thermalizer_, current_t);
1583  if (th_act.any_particles_thermalized()) {
1584  perform_action(th_act, particles_);
1585  }
1586  }
1587 
1588  if (particles_.size() > 0 && action_finders_.size() > 0) {
1589  /* (1.a) Create grid. */
1590  double min_cell_length = compute_min_cell_length(dt);
1591  log.debug("Creating grid with minimal cell length ", min_cell_length);
1592  const auto &grid =
1593  use_grid_ ? modus_.create_grid(particles_, min_cell_length, dt)
1594  : modus_.create_grid(particles_, min_cell_length, dt,
1596 
1597  const double cell_vol = grid.cell_volume();
1598 
1599  /* (1.b) Iterate over cells and find actions. */
1600  grid.iterate_cells(
1601  [&](const ParticleList &search_list) {
1602  for (const auto &finder : action_finders_) {
1603  actions.insert(finder->find_actions_in_cell(
1604  search_list, dt, cell_vol, beam_momentum_));
1605  }
1606  },
1607  [&](const ParticleList &search_list,
1608  const ParticleList &neighbors_list) {
1609  for (const auto &finder : action_finders_) {
1610  actions.insert(finder->find_actions_with_neighbors(
1611  search_list, neighbors_list, dt, beam_momentum_));
1612  }
1613  });
1614  }
1615 
1616  /* \todo (optimizations) Adapt timestep size here */
1617 
1618  /* (2) Propagation from action to action until the end of timestep */
1620 
1621  /* (3) Update potentials (if computed on the lattice) and
1622  * compute new momenta according to equations of motion */
1623  if (potentials_) {
1625  update_momenta(&particles_, parameters_.labclock->timestep_duration(),
1626  *potentials_, FB_lat_.get(), FI3_lat_.get());
1627  }
1628 
1629  /* (4) Expand universe if non-minkowskian metric; updates
1630  * positions and momenta according to the selected expansion */
1633  }
1634 
1635  ++(*parameters_.labclock);
1636 
1637  /* (5) Check conservation laws.
1638  *
1639  * Check conservation of conserved quantities if potentials and string
1640  * fragmentation are off. If potentials are on then momentum is conserved
1641  * only in average. If string fragmentation is on, then energy and
1642  * momentum are only very roughly conserved in high-energy collisions. */
1645  std::string err_msg = conserved_initial_.report_deviations(particles_);
1646  if (!err_msg.empty()) {
1647  log.error() << err_msg;
1648  throw std::runtime_error("Violation of conserved quantities!");
1649  }
1650  }
1651  }
1652 
1653  if (pauli_blocker_) {
1654  log.info("Interactions: Pauli-blocked/performed = ", total_pauli_blocked_,
1656  }
1657 }
std::unique_ptr< Clock > labclock
System clock (for simulation time keeping in the computational frame)
std::unique_ptr< RectangularLattice< std::pair< ThreeVector, ThreeVector > > > FB_lat_
Lattices for the electric and magnetic components of the Skyrme force.
Definition: experiment.h:404
uint64_t total_pauli_blocked_
Total number of Pauli-blockings for current timestep.
Definition: experiment.h:530
void update_momenta(Particles *particles, double dt, const Potentials &pot, RectangularLattice< std::pair< ThreeVector, ThreeVector >> *FB_lat, RectangularLattice< std::pair< ThreeVector, ThreeVector >> *FI3_lat)
Updates the momenta of all particles at the current time step according to the equations of motion: ...
Definition: propagation.cc:111
uint64_t wall_actions_total_
Total number of wall-crossings for current timestep.
Definition: experiment.h:518
std::unique_ptr< GrandCanThermalizer > thermalizer_
Instance of class used for forced thermalization.
Definition: experiment.h:426
QuantumNumbers conserved_initial_
The conserved quantities of the system.
Definition: experiment.h:494
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:304
void update_potentials()
Recompute potentials on lattices if necessary.
Definition: experiment.h:1839
const bool use_grid_
This indicates whether to use the grid.
Definition: experiment.h:467
Particles particles_
Complete particle list.
Definition: experiment.h:316
bool perform_action(Action &action, const Container &particles_before_actions)
Perform the given action.
std::string report_deviations(const Particles &particles) const
Checks if the current particle list has still the same values and reports about differences.
const double end_time_
simulation time at which the evolution is stopped.
Definition: experiment.h:451
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:506
std::unique_ptr< RectangularLattice< std::pair< ThreeVector, ThreeVector > > > FI3_lat_
Lattices for the electric and magnetic component of the symmetry force.
Definition: experiment.h:408
std::string format_measurements(const Particles &particles, uint64_t scatterings_this_interval, const QuantumNumbers &conserved_initial, SystemTimePoint time_start, double time)
Generate the tabulated string which will be printed to the screen when SMASH is running.
Definition: experiment.cc:392
const bool IC_output_switch_
This indicates whether the IC output is enabled.
Definition: experiment.h:479
const ExpansionProperties metric_
This struct contains information on the metric to be used.
Definition: experiment.h:470
double compute_min_cell_length(double dt) const
Calculate the minimal size for the grid cells such that the ScatterActionsFinder will find all collis...
Definition: experiment.h:290
size_t size() const
Definition: particles.h:87
SystemTimePoint time_start_
system starting time of the simulation
Definition: experiment.h:497
void run_time_evolution_timestepless(Actions &actions)
Performs all the propagations and actions during a certain time interval neglecting the influence of ...
Definition: experiment.h:1685
std::unique_ptr< Potentials > potentials_
An instance of potentials class, that stores parameters of potentials, calculates them and their grad...
Definition: experiment.h:322
ExpansionMode mode_
Type of metric used.
Definition: propagation.h:27
bool strings_switch
This indicates whether string fragmentation is switched on.
Modus modus_
Instance of the Modus template parameter.
Definition: experiment.h:313
void expand_space_time(Particles *particles, const ExperimentParameters &parameters, const ExpansionProperties &metric)
Modifies positions and momentum of all particles to account for space-time deformation.
Definition: propagation.cc:86
std::vector< std::unique_ptr< ActionFinderInterface > > action_finders_
The Action finder objects.
Definition: experiment.h:361
int testparticles
Number of test particle.
DensityParameters density_param_
Structure to precalculate and hold parameters for density computations.
Definition: experiment.h:307
Make cells as large as possible.
std::unique_ptr< PauliBlocker > pauli_blocker_
An instance of PauliBlocker class that stores parameters needed for Pauli blocking calculations and c...
Definition: experiment.h:328
std::vector< FourVector > beam_momentum_
The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen...
Definition: experiment.h:358

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::do_final_decays ( )

Performs the final decays of an event.

Definition at line 1886 of file experiment.h.

1886  {
1887  /* At end of time evolution: Force all resonances to decay. In order to handle
1888  * decay chains, we need to loop until no further actions occur. */
1889  uint64_t interactions_old;
1890  const auto particles_before_actions = particles_.copy_to_vector();
1891  do {
1892  Actions actions;
1893 
1894  interactions_old = interactions_total_;
1895 
1896  // Dileptons: shining of remaining resonances
1897  if (dilepton_finder_ != nullptr) {
1898  for (const auto &output : outputs_) {
1899  dilepton_finder_->shine_final(particles_, output.get(), true);
1900  }
1901  }
1902  // Find actions.
1903  for (const auto &finder : action_finders_) {
1904  actions.insert(finder->find_final_actions(particles_));
1905  }
1906  // Perform actions.
1907  while (!actions.is_empty()) {
1908  perform_action(*actions.pop(), particles_before_actions);
1909  }
1910  // loop until no more decays occur
1911  } while (interactions_total_ > interactions_old);
1912 
1913  // Dileptons: shining of stable particles at the end
1914  if (dilepton_finder_ != nullptr) {
1915  for (const auto &output : outputs_) {
1916  dilepton_finder_->shine_final(particles_, output.get(), false);
1917  }
1918  }
1919 }
std::unique_ptr< DecayActionsFinderDilepton > dilepton_finder_
The Dilepton Action Finder.
Definition: experiment.h:364
ParticleList copy_to_vector() const
Definition: particles.h:44
Particles particles_
Complete particle list.
Definition: experiment.h:316
bool perform_action(Action &action, const Container &particles_before_actions)
Perform the given action.
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:506
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334
std::vector< std::unique_ptr< ActionFinderInterface > > action_finders_
The Action finder objects.
Definition: experiment.h:361

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::final_output ( const int  evt_num)

Output at the end of an event.

Parameters
[in]evt_numNumber of the event

Definition at line 1922 of file experiment.h.

1922  {
1923  const auto &log = logger<LogArea::Experiment>();
1924  /* make sure the experiment actually ran (note: we should compare this
1925  * to the start time, but we don't know that. Therefore, we check that
1926  * the time is positive, which should heuristically be the same). */
1927  if (likely(parameters_.labclock > 0)) {
1928  const uint64_t wall_actions_this_interval =
1930  const uint64_t interactions_this_interval = interactions_total_ -
1932  wall_actions_this_interval;
1933  log.info() << format_measurements(particles_, interactions_this_interval,
1935  end_time_);
1936  if (IC_output_switch_ && (particles_.size() == 0)) {
1937  // Verify there is no more energy in the system if all particles were
1938  // removed when crossing the hypersurface
1939  const double remaining_energy =
1941  if (remaining_energy > really_small) {
1942  throw std::runtime_error(
1943  "There is remaining energy in the system although all particles "
1944  "were removed.\n"
1945  "E_remain = " +
1946  std::to_string(remaining_energy) + " [GeV]");
1947  } else {
1948  log.info() << hline;
1949  log.info() << "Time real: " << SystemClock::now() - time_start_;
1950  log.info() << "Interactions before reaching hypersurface: "
1953  log.info() << "Total number of particles removed on hypersurface: "
1955  }
1956  } else {
1957  log.info() << hline;
1958  log.info() << "Time real: " << SystemClock::now() - time_start_;
1959  log.info() << "Final interaction number: "
1961  }
1962 
1963  // Check if there are unformed particles
1964  int unformed_particles_count = 0;
1965  for (const auto &particle : particles_) {
1966  if (particle.formation_time() > end_time_) {
1967  unformed_particles_count++;
1968  }
1969  }
1970  if (unformed_particles_count > 0) {
1971  log.warn("End time might be too small. ", unformed_particles_count,
1972  " unformed particles were found at the end of the evolution.");
1973  }
1974  }
1975 
1976  for (const auto &output : outputs_) {
1977  output->at_eventend(particles_, evt_num, modus_.impact_parameter(),
1979  }
1980 }
uint64_t total_hypersurface_crossing_actions_
Total number of particles removed from the evolution in hypersurface crossing actions.
Definition: experiment.h:536
std::unique_ptr< Clock > labclock
System clock (for simulation time keeping in the computational frame)
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
#define likely(x)
Tell the branch predictor that this expression is likely true.
Definition: macros.h:14
uint64_t wall_actions_total_
Total number of wall-crossings for current timestep.
Definition: experiment.h:518
bool projectile_target_interact_
Whether the projectile and the target collided.
Definition: experiment.h:351
QuantumNumbers conserved_initial_
The conserved quantities of the system.
Definition: experiment.h:494
double x0() const
Definition: fourvector.h:303
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:304
Particles particles_
Complete particle list.
Definition: experiment.h:316
const std::string hline(67, '-')
String representing a horizontal line.
const double end_time_
simulation time at which the evolution is stopped.
Definition: experiment.h:451
uint64_t previous_wall_actions_total_
Total number of wall-crossings for previous timestep.
Definition: experiment.h:524
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:506
std::string format_measurements(const Particles &particles, uint64_t scatterings_this_interval, const QuantumNumbers &conserved_initial, SystemTimePoint time_start, double time)
Generate the tabulated string which will be printed to the screen when SMASH is running.
Definition: experiment.cc:392
const bool IC_output_switch_
This indicates whether the IC output is enabled.
Definition: experiment.h:479
size_t size() const
Definition: particles.h:87
SystemTimePoint time_start_
system starting time of the simulation
Definition: experiment.h:497
uint64_t previous_interactions_total_
Total number of interactions for previous timestep.
Definition: experiment.h:512
FourVector momentum() const
double total_energy_removed_
Total energy removed from the system in hypersurface crossing actions.
Definition: experiment.h:542
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334
Modus modus_
Instance of the Modus template parameter.
Definition: experiment.h:313

Here is the call graph for this function:

template<typename Modus >
Particles* smash::Experiment< Modus >::particles ( )
inline

Provides external access to SMASH particles.

This is helpful if SMASH is used as a 3rd-party library.

Definition at line 220 of file experiment.h.

220 { return &particles_; }
Particles particles_
Complete particle list.
Definition: experiment.h:316
template<typename Modus >
Modus* smash::Experiment< Modus >::modus ( )
inline

Provides external access to SMASH calculation modus.

This is helpful if SMASH is used as a 3rd-party library.

Definition at line 226 of file experiment.h.

226 { return &modus_; }
Modus modus_
Instance of the Modus template parameter.
Definition: experiment.h:313

Here is the call graph for this function:

template<typename Modus >
template<typename Container >
bool smash::Experiment< Modus >::perform_action ( Action action,
const Container &  particles_before_actions 
)
private

Perform the given action.

Template Parameters
Containertype that holds the particles before the action.
Parameters
[in]actionThe action to perform. If it performs, it'll modify the private member particles_.
[in]particles_before_actionsA container with the ParticleData from this time step before any actions were performed.
Returns
False if the action is rejected either due to invalidity or Pauli-blocking, or true if it's accepted and performed.
template<typename Modus >
void smash::Experiment< Modus >::create_output ( const std::string &  format,
const std::string &  content,
const bf::path &  output_path,
const OutputParameters par 
)
private

Create a list of output files.

Parameters
[in]formatFormat of the output file (e.g. Root, Oscar, Vtk)
[in]contentContent of the output (e.g. particles, collisions)
[in]output_pathPath of the output file
[in]parOutput options.(e.g. Extended)

Definition at line 564 of file experiment.h.

567  {
568  const auto &log = logger<LogArea::Experiment>();
569  log.info() << "Adding output " << content << " of format " << format
570  << std::endl;
571 
572  if (format == "VTK" && content == "Particles") {
573  outputs_.emplace_back(
574  make_unique<VtkOutput>(output_path, content, out_par));
575  } else if (format == "Root") {
576 #ifdef SMASH_USE_ROOT
577  if (content == "Initial_Conditions") {
578  outputs_.emplace_back(
579  make_unique<RootOutput>(output_path, "SMASH_IC", out_par));
580  } else {
581  outputs_.emplace_back(
582  make_unique<RootOutput>(output_path, content, out_par));
583  }
584 #else
585  log.error("Root output requested, but Root support not compiled in");
586 #endif
587  } else if (format == "Binary") {
588  if (content == "Collisions" || content == "Dileptons" ||
589  content == "Photons") {
590  outputs_.emplace_back(
591  make_unique<BinaryOutputCollisions>(output_path, content, out_par));
592  } else if (content == "Particles") {
593  outputs_.emplace_back(
594  make_unique<BinaryOutputParticles>(output_path, content, out_par));
595  } else if (content == "Initial_Conditions") {
596  outputs_.emplace_back(make_unique<BinaryOutputInitialConditions>(
597  output_path, content, out_par));
598  }
599  } else if (format == "Oscar1999" || format == "Oscar2013") {
600  outputs_.emplace_back(
601  create_oscar_output(format, content, output_path, out_par));
602  } else if (content == "Thermodynamics" && format == "ASCII") {
603  outputs_.emplace_back(
604  make_unique<ThermodynamicOutput>(output_path, content, out_par));
605  } else if (content == "Thermodynamics" && format == "VTK") {
606  printout_lattice_td_ = true;
607  outputs_.emplace_back(
608  make_unique<VtkOutput>(output_path, content, out_par));
609  } else if (content == "Initial_Conditions" && format == "ASCII") {
610  outputs_.emplace_back(
611  make_unique<ICOutput>(output_path, "SMASH_IC", out_par));
612  } else {
613  log.error() << "Unknown combination of format (" << format
614  << ") and content (" << content << "). Fix the config.";
615  }
616 }
FormattingHelper< T > format(const T &value, const char *unit, int width=-1, int precision=-1)
Acts as a stream modifier for std::ostream to output an object with an optional suffix string and wit...
Definition: logging.h:317
bool printout_lattice_td_
Whether to print the thermodynamics quantities evaluated on the lattices.
Definition: experiment.h:423
std::unique_ptr< OutputInterface > create_oscar_output(const std::string &format, const std::string &content, const bf::path &path, const OutputParameters &out_par)
Definition: oscaroutput.cc:765
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::propagate_and_shine ( double  to_time)
private

Propagate all particles until time to_time without any interactions and shine dileptons.

Parameters
[in]to_timeTime at the end of propagation [fm/c]

Definition at line 1660 of file experiment.h.

1660  {
1661  const double dt =
1663  if (dilepton_finder_ != nullptr) {
1664  for (const auto &output : outputs_) {
1665  dilepton_finder_->shine(particles_, output.get(), dt);
1666  }
1667  }
1668 }
double propagate_straight_line(Particles *particles, double to_time, const std::vector< FourVector > &beam_momentum)
Propagates the positions of all particles on a straight line to a given moment.
Definition: propagation.cc:43
std::unique_ptr< DecayActionsFinderDilepton > dilepton_finder_
The Dilepton Action Finder.
Definition: experiment.h:364
Particles particles_
Complete particle list.
Definition: experiment.h:316
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334
std::vector< FourVector > beam_momentum_
The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen...
Definition: experiment.h:358

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::run_time_evolution_timestepless ( Actions actions)
private

Performs all the propagations and actions during a certain time interval neglecting the influence of the potentials.

This function is called in either the time stepless cases or the cases with time steps. In a time stepless case, the time interval should be equal to the whole evolution time, while in the case with time step, the intervals are given by the time steps.

Parameters
[in,out]actionsActions occur during a certain time interval. They provide the ending times of the propagations and are updated during the time interval.

Definition at line 1685 of file experiment.h.

1685  {
1686  const auto &log = logger<LogArea::Experiment>();
1687 
1688  const double start_time = parameters_.labclock->current_time();
1689  const double end_time =
1690  std::min(parameters_.labclock->next_time(), end_time_);
1691  double time_left = end_time - start_time;
1692  log.debug("Timestepless propagation: ", "Actions size = ", actions.size(),
1693  ", start time = ", start_time, ", end time = ", end_time);
1694 
1695  // iterate over all actions
1696  while (!actions.is_empty()) {
1697  // get next action
1698  ActionPtr act = actions.pop();
1699  if (!act->is_valid(particles_)) {
1700  log.debug(~einhard::DRed(), "✘ ", act, " (discarded: invalid)");
1701  continue;
1702  }
1703  if (act->time_of_execution() > end_time) {
1704  log.error(act, " scheduled later than end time: t_action[fm/c] = ",
1705  act->time_of_execution(), ", t_end[fm/c] = ", end_time);
1706  }
1707  log.debug(~einhard::Green(), "✔ ", act);
1708 
1709  while (next_output_time() <= act->time_of_execution()) {
1710  log.debug("Propagating until output time: ", next_output_time());
1712  ++(*parameters_.outputclock);
1714  }
1715 
1716  /* (1) Propagate to the next action. */
1717  log.debug("Propagating until next action ", act,
1718  ", action time = ", act->time_of_execution());
1719  propagate_and_shine(act->time_of_execution());
1720 
1721  /* (2) Perform action.
1722  *
1723  * Update the positions of the incoming particles, because the information
1724  * in the action object will be outdated as the particles have been
1725  * propagated since the construction of the action. */
1726  act->update_incoming(particles_);
1727  const bool performed = perform_action(*act, particles_);
1728 
1729  /* No need to update actions for outgoing particles
1730  * if the action is not performed. */
1731  if (!performed) {
1732  continue;
1733  }
1734 
1735  /* (3) Update actions for newly-produced particles. */
1736 
1737  time_left = end_time - act->time_of_execution();
1738  const ParticleList &outgoing_particles = act->outgoing_particles();
1739  // Cell volume set to zero, since there is no grid
1740  const double cell_vol = 0.0;
1741  for (const auto &finder : action_finders_) {
1742  // Outgoing particles can still decay, cross walls...
1743  actions.insert(finder->find_actions_in_cell(outgoing_particles, time_left,
1744  cell_vol, beam_momentum_));
1745  // ... and collide with other particles.
1746  actions.insert(finder->find_actions_with_surrounding_particles(
1747  outgoing_particles, particles_, time_left, beam_momentum_));
1748  }
1749 
1751  }
1752 
1753  while (next_output_time() <= end_time) {
1754  log.debug("Propagating until output time: ", next_output_time());
1756  ++(*parameters_.outputclock);
1757  // Avoid duplicating printout at event end time
1758  if (parameters_.outputclock->current_time() < end_time_) {
1760  }
1761  }
1762  log.debug("Propagating to time ", end_time);
1763  propagate_and_shine(end_time);
1764 }
void check_interactions_total(uint64_t interactions_total)
Make sure interactions_total can be represented as a 32-bit integer.
Definition: experiment.h:1677
std::unique_ptr< Clock > labclock
System clock (for simulation time keeping in the computational frame)
double next_output_time() const
Shortcut for next output time.
Definition: experiment.h:295
void propagate_and_shine(double to_time)
Propagate all particles until time to_time without any interactions and shine dileptons.
Definition: experiment.h:1660
std::unique_ptr< Clock > outputclock
Output clock to keep track of the next output time.
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:304
Particles particles_
Complete particle list.
Definition: experiment.h:316
bool perform_action(Action &action, const Container &particles_before_actions)
Perform the given action.
const double end_time_
simulation time at which the evolution is stopped.
Definition: experiment.h:451
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:506
void intermediate_output()
Intermediate output during an event.
Definition: experiment.h:1767
std::vector< std::unique_ptr< ActionFinderInterface > > action_finders_
The Action finder objects.
Definition: experiment.h:361
A stream modifier that allows to colorize the log output.
Definition: einhard.hpp:142
std::vector< FourVector > beam_momentum_
The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen...
Definition: experiment.h:358

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::intermediate_output ( )
private

Intermediate output during an event.

Definition at line 1767 of file experiment.h.

1767  {
1768  const auto &log = logger<LogArea::Experiment>();
1769  const uint64_t wall_actions_this_interval =
1771  previous_wall_actions_total_ = wall_actions_total_;
1772  const uint64_t interactions_this_interval = interactions_total_ -
1774  wall_actions_this_interval;
1776  log.info() << format_measurements(particles_, interactions_this_interval,
1778  parameters_.outputclock->current_time());
1779  const LatticeUpdate lat_upd = LatticeUpdate::AtOutput;
1780  // save evolution data
1781  for (const auto &output : outputs_) {
1782  if (output->is_dilepton_output() || output->is_photon_output() ||
1783  output->is_IC_output()) {
1784  continue;
1785  }
1786 
1787  output->at_intermediate_time(particles_, parameters_.outputclock,
1788  density_param_);
1789 
1790  // Thermodynamic output on the lattice versus time
1791  switch (dens_type_lattice_printout_) {
1792  case DensityType::Baryon:
1794  density_param_, particles_, false);
1795  output->thermodynamics_output(ThermodynamicQuantity::EckartDensity,
1796  DensityType::Baryon, *jmu_B_lat_);
1797  break;
1800  density_param_, particles_, false);
1801  output->thermodynamics_output(ThermodynamicQuantity::EckartDensity,
1802  DensityType::BaryonicIsospin,
1803  *jmu_I3_lat_);
1804  break;
1805  case DensityType::None:
1806  break;
1807  default:
1808  update_lattice(jmu_custom_lat_.get(), lat_upd,
1810  false);
1811  output->thermodynamics_output(ThermodynamicQuantity::EckartDensity,
1812  dens_type_lattice_printout_,
1813  *jmu_custom_lat_);
1814  }
1818  if (printout_tmn_) {
1819  output->thermodynamics_output(ThermodynamicQuantity::Tmn,
1820  dens_type_lattice_printout_, *Tmn_);
1821  }
1822  if (printout_tmn_landau_) {
1823  output->thermodynamics_output(ThermodynamicQuantity::TmnLandau,
1824  dens_type_lattice_printout_, *Tmn_);
1825  }
1826  if (printout_v_landau_) {
1827  output->thermodynamics_output(ThermodynamicQuantity::LandauVelocity,
1828  dens_type_lattice_printout_, *Tmn_);
1829  }
1830  }
1831 
1832  if (thermalizer_) {
1833  output->thermodynamics_output(*thermalizer_);
1834  }
1835  }
1836 }
std::unique_ptr< RectangularLattice< EnergyMomentumTensor > > Tmn_
Lattices of energy-momentum tensors for printout.
Definition: experiment.h:411
std::unique_ptr< DensityLattice > jmu_custom_lat_
Custom density on the lattices.
Definition: experiment.h:385
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
uint64_t wall_actions_total_
Total number of wall-crossings for current timestep.
Definition: experiment.h:518
std::unique_ptr< GrandCanThermalizer > thermalizer_
Instance of class used for forced thermalization.
Definition: experiment.h:426
QuantumNumbers conserved_initial_
The conserved quantities of the system.
Definition: experiment.h:494
std::unique_ptr< Clock > outputclock
Output clock to keep track of the next output time.
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:304
bool printout_tmn_landau_
Whether to print the energy-momentum tensor in Landau frame.
Definition: experiment.h:417
Particles particles_
Complete particle list.
Definition: experiment.h:316
std::unique_ptr< DensityLattice > jmu_I3_lat_
Isospin projection density on the lattices.
Definition: experiment.h:376
uint64_t previous_wall_actions_total_
Total number of wall-crossings for previous timestep.
Definition: experiment.h:524
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:506
std::string format_measurements(const Particles &particles, uint64_t scatterings_this_interval, const QuantumNumbers &conserved_initial, SystemTimePoint time_start, double time)
Generate the tabulated string which will be printed to the screen when SMASH is running.
Definition: experiment.cc:392
SystemTimePoint time_start_
system starting time of the simulation
Definition: experiment.h:497
uint64_t previous_interactions_total_
Total number of interactions for previous timestep.
Definition: experiment.h:512
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:334
bool printout_v_landau_
Whether to print the 4-velocity in Landau fram.
Definition: experiment.h:420
DensityParameters density_param_
Structure to precalculate and hold parameters for density computations.
Definition: experiment.h:307
DensityType dens_type_lattice_printout_
Type of density for lattice printout.
Definition: experiment.h:388
std::unique_ptr< DensityLattice > jmu_B_lat_
Baryon density on the lattices.
Definition: experiment.h:373
bool printout_tmn_
Whether to print the energy-momentum tensor.
Definition: experiment.h:414

Here is the call graph for this function:

template<typename Modus >
void smash::Experiment< Modus >::update_potentials ( )
private

Recompute potentials on lattices if necessary.

Definition at line 1839 of file experiment.h.

1839  {
1840  if (potentials_) {
1841  if (potentials_->use_symmetry() && jmu_I3_lat_ != nullptr) {
1844  true);
1845  }
1846  if ((potentials_->use_skyrme() || potentials_->use_symmetry()) &&
1847  jmu_B_lat_ != nullptr) {
1850  const size_t UBlattice_size = UB_lat_->size();
1851  assert(UBlattice_size == UI3_lat_->size());
1852  for (size_t i = 0; i < UBlattice_size; i++) {
1853  auto jB = (*jmu_B_lat_)[i];
1854  const FourVector flow_four_velocity_B =
1855  std::abs(jB.density()) > really_small ? jB.jmu_net() / jB.density()
1856  : FourVector();
1857  double baryon_density = jB.density();
1858  ThreeVector baryon_grad_rho = jB.grad_rho();
1859  ThreeVector baryon_dj_dt = jB.dj_dt();
1860  ThreeVector baryon_rot_j = jB.rot_j();
1861  if (potentials_->use_skyrme()) {
1862  (*UB_lat_)[i] =
1863  flow_four_velocity_B * potentials_->skyrme_pot(baryon_density);
1864  (*FB_lat_)[i] = potentials_->skyrme_force(
1865  baryon_density, baryon_grad_rho, baryon_dj_dt, baryon_rot_j);
1866  }
1867  if (potentials_->use_symmetry() && jmu_I3_lat_ != nullptr) {
1868  auto jI3 = (*jmu_I3_lat_)[i];
1869  const FourVector flow_four_velocity_I3 =
1870  std::abs(jI3.density()) > really_small
1871  ? jI3.jmu_net() / jI3.density()
1872  : FourVector();
1873  (*UI3_lat_)[i] =
1874  flow_four_velocity_I3 *
1875  potentials_->symmetry_pot(jI3.density(), baryon_density);
1876  (*FI3_lat_)[i] = potentials_->symmetry_force(
1877  jI3.density(), jI3.grad_rho(), jI3.dj_dt(), jI3.rot_j(),
1878  baryon_density, baryon_grad_rho, baryon_dj_dt, baryon_rot_j);
1879  }
1880  }
1881  }
1882  }
1883 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
std::unique_ptr< RectangularLattice< FourVector > > UB_lat_
Lattices for Skyrme potentials (evaluated in the local rest frame) times the baryon flow 4-velocity...
Definition: experiment.h:394
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
Particles particles_
Complete particle list.
Definition: experiment.h:316
std::unique_ptr< DensityLattice > jmu_I3_lat_
Isospin projection density on the lattices.
Definition: experiment.h:376
std::unique_ptr< RectangularLattice< FourVector > > UI3_lat_
Lattices for symmetry potentials (evaluated in the local rest frame) times the isospin flow 4-velocit...
Definition: experiment.h:400
std::unique_ptr< Potentials > potentials_
An instance of potentials class, that stores parameters of potentials, calculates them and their grad...
Definition: experiment.h:322
DensityParameters density_param_
Structure to precalculate and hold parameters for density computations.
Definition: experiment.h:307
std::unique_ptr< DensityLattice > jmu_B_lat_
Baryon density on the lattices.
Definition: experiment.h:373

Here is the call graph for this function:

template<typename Modus >
double smash::Experiment< Modus >::compute_min_cell_length ( double  dt) const
inlineprivate

Calculate the minimal size for the grid cells such that the ScatterActionsFinder will find all collisions within the maximal transverse distance (which is determined by the maximal cross section).

Parameters
[in]dtThe current time step size [fm/c]
Returns
The minimal required size of cells

Definition at line 290 of file experiment.h.

290  {
291  return std::sqrt(4 * dt * dt + max_transverse_distance_sqr_);
292  }
double max_transverse_distance_sqr_
Maximal distance at which particles can interact, squared.
Definition: experiment.h:485
template<typename Modus >
double smash::Experiment< Modus >::next_output_time ( ) const
inlineprivate

Shortcut for next output time.

Definition at line 295 of file experiment.h.

295  {
296  return parameters_.outputclock->next_time();
297  }
std::unique_ptr< Clock > outputclock
Output clock to keep track of the next output time.
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:304

Friends And Related Function Documentation

template<typename Modus >
friend class ExperimentBase
friend

Definition at line 165 of file experiment.h.

Member Data Documentation

template<typename Modus >
ExperimentParameters smash::Experiment< Modus >::parameters_
private

Struct of several member variables.

These variables are combined into a struct for efficient input to functions outside of this class.

Definition at line 304 of file experiment.h.

template<typename Modus >
DensityParameters smash::Experiment< Modus >::density_param_
private

Structure to precalculate and hold parameters for density computations.

Definition at line 307 of file experiment.h.

template<typename Modus >
Modus smash::Experiment< Modus >::modus_
private

Instance of the Modus template parameter.

May store modus-specific data and contains modus-specific function implementations.

Definition at line 313 of file experiment.h.

template<typename Modus >
Particles smash::Experiment< Modus >::particles_
private

Complete particle list.

Definition at line 316 of file experiment.h.

template<typename Modus >
std::unique_ptr<Potentials> smash::Experiment< Modus >::potentials_
private

An instance of potentials class, that stores parameters of potentials, calculates them and their gradients.

Definition at line 322 of file experiment.h.

template<typename Modus >
std::unique_ptr<PauliBlocker> smash::Experiment< Modus >::pauli_blocker_
private

An instance of PauliBlocker class that stores parameters needed for Pauli blocking calculations and computes phase-space density.

Definition at line 328 of file experiment.h.

template<typename Modus >
OutputsList smash::Experiment< Modus >::outputs_
private

A list of output formaters.

They will be called to write the state of the particles to file.

Definition at line 334 of file experiment.h.

template<typename Modus >
OutputPtr smash::Experiment< Modus >::dilepton_output_
private

The Dilepton output.

Definition at line 337 of file experiment.h.

template<typename Modus >
OutputPtr smash::Experiment< Modus >::photon_output_
private

The Photon output.

Definition at line 340 of file experiment.h.

template<typename Modus >
std::vector<bool> smash::Experiment< Modus >::nucleon_has_interacted_ = {}
private

nucleon_has_interacted_ labels whether the particles in the nuclei have experienced any collisions or not.

It's only valid in the ColliderModus, so is set as an empty vector by default.

Definition at line 347 of file experiment.h.

template<typename Modus >
bool smash::Experiment< Modus >::projectile_target_interact_ = false
private

Whether the projectile and the target collided.

Definition at line 351 of file experiment.h.

template<typename Modus >
std::vector<FourVector> smash::Experiment< Modus >::beam_momentum_ = {}
private

The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen.

It's only valid in the ColliderModus, so is set as an empty vector by default.

Definition at line 358 of file experiment.h.

template<typename Modus >
std::vector<std::unique_ptr<ActionFinderInterface> > smash::Experiment< Modus >::action_finders_
private

The Action finder objects.

Definition at line 361 of file experiment.h.

template<typename Modus >
std::unique_ptr<DecayActionsFinderDilepton> smash::Experiment< Modus >::dilepton_finder_
private

The Dilepton Action Finder.

Definition at line 364 of file experiment.h.

template<typename Modus >
std::unique_ptr<ActionFinderInterface> smash::Experiment< Modus >::photon_finder_
private

The (Scatter) Actions Finder for Direct Photons.

Definition at line 367 of file experiment.h.

template<typename Modus >
int smash::Experiment< Modus >::n_fractional_photons_ = 100
private

Number of fractional photons produced per single reaction.

Definition at line 370 of file experiment.h.

template<typename Modus >
std::unique_ptr<DensityLattice> smash::Experiment< Modus >::jmu_B_lat_
private

Baryon density on the lattices.

Definition at line 373 of file experiment.h.

template<typename Modus >
std::unique_ptr<DensityLattice> smash::Experiment< Modus >::jmu_I3_lat_
private

Isospin projection density on the lattices.

Definition at line 376 of file experiment.h.

template<typename Modus >
std::unique_ptr<DensityLattice> smash::Experiment< Modus >::jmu_custom_lat_
private

Custom density on the lattices.

In the config user asks for some kind of density for printout. Baryon and isospin projection density are anyway needed for potentials. If user asks for some other density type for printout, it will be handled using jmu_custom variable.

Definition at line 385 of file experiment.h.

template<typename Modus >
DensityType smash::Experiment< Modus >::dens_type_lattice_printout_ = DensityType::None
private

Type of density for lattice printout.

Definition at line 388 of file experiment.h.

template<typename Modus >
std::unique_ptr<RectangularLattice<FourVector> > smash::Experiment< Modus >::UB_lat_ = nullptr
private

Lattices for Skyrme potentials (evaluated in the local rest frame) times the baryon flow 4-velocity.

Definition at line 394 of file experiment.h.

template<typename Modus >
std::unique_ptr<RectangularLattice<FourVector> > smash::Experiment< Modus >::UI3_lat_ = nullptr
private

Lattices for symmetry potentials (evaluated in the local rest frame) times the isospin flow 4-velocity.

Definition at line 400 of file experiment.h.

template<typename Modus >
std::unique_ptr<RectangularLattice<std::pair<ThreeVector, ThreeVector> > > smash::Experiment< Modus >::FB_lat_
private

Lattices for the electric and magnetic components of the Skyrme force.

Definition at line 404 of file experiment.h.

template<typename Modus >
std::unique_ptr<RectangularLattice<std::pair<ThreeVector, ThreeVector> > > smash::Experiment< Modus >::FI3_lat_
private

Lattices for the electric and magnetic component of the symmetry force.

Definition at line 408 of file experiment.h.

template<typename Modus >
std::unique_ptr<RectangularLattice<EnergyMomentumTensor> > smash::Experiment< Modus >::Tmn_
private

Lattices of energy-momentum tensors for printout.

Definition at line 411 of file experiment.h.

template<typename Modus >
bool smash::Experiment< Modus >::printout_tmn_ = false
private

Whether to print the energy-momentum tensor.

Definition at line 414 of file experiment.h.

template<typename Modus >
bool smash::Experiment< Modus >::printout_tmn_landau_ = false
private

Whether to print the energy-momentum tensor in Landau frame.

Definition at line 417 of file experiment.h.

template<typename Modus >
bool smash::Experiment< Modus >::printout_v_landau_ = false
private

Whether to print the 4-velocity in Landau fram.

Definition at line 420 of file experiment.h.

template<typename Modus >
bool smash::Experiment< Modus >::printout_lattice_td_ = false
private

Whether to print the thermodynamics quantities evaluated on the lattices.

Definition at line 423 of file experiment.h.

template<typename Modus >
std::unique_ptr<GrandCanThermalizer> smash::Experiment< Modus >::thermalizer_
private

Instance of class used for forced thermalization.

Definition at line 426 of file experiment.h.

template<typename Modus >
StringProcess* smash::Experiment< Modus >::process_string_ptr_
private

Pointer to the string process class object, which is used to set the random seed for PYTHIA objects in each event.

Definition at line 432 of file experiment.h.

template<typename Modus >
const int smash::Experiment< Modus >::nevents_
private

Number of events.

Event is a single simulation of a physical phenomenon: elementary particle or nucleus-nucleus collision. Result of a single SMASH event is random (by construction) as well as result of one collision in nature. To compare simulation with experiment one has to take ensemble averages, i.e. perform simulation and real experiment many times and compare average results.

nevents_ is number of times single phenomenon (particle or nucleus-nucleus collision) will be simulated.

Definition at line 448 of file experiment.h.

template<typename Modus >
const double smash::Experiment< Modus >::end_time_
private

simulation time at which the evolution is stopped.

Definition at line 451 of file experiment.h.

template<typename Modus >
const double smash::Experiment< Modus >::delta_time_startup_
private

The clock's timestep size at start up.

Stored here so that the next event will remember this.

Definition at line 458 of file experiment.h.

template<typename Modus >
const bool smash::Experiment< Modus >::force_decays_
private

This indicates whether we force all resonances to decay in the last timestep.

Definition at line 464 of file experiment.h.

template<typename Modus >
const bool smash::Experiment< Modus >::use_grid_
private

This indicates whether to use the grid.

Definition at line 467 of file experiment.h.

template<typename Modus >
const ExpansionProperties smash::Experiment< Modus >::metric_
private

This struct contains information on the metric to be used.

Definition at line 470 of file experiment.h.

template<typename Modus >
const bool smash::Experiment< Modus >::dileptons_switch_
private

This indicates whether dileptons are switched on.

Definition at line 473 of file experiment.h.

template<typename Modus >
const bool smash::Experiment< Modus >::photons_switch_
private

This indicates whether photons are switched on.

Definition at line 476 of file experiment.h.

template<typename Modus >
const bool smash::Experiment< Modus >::IC_output_switch_
private

This indicates whether the IC output is enabled.

Definition at line 479 of file experiment.h.

template<typename Modus >
const TimeStepMode smash::Experiment< Modus >::time_step_mode_
private

This indicates whether to use time steps.

Definition at line 482 of file experiment.h.

template<typename Modus >
double smash::Experiment< Modus >::max_transverse_distance_sqr_ = std::numeric_limits<double>::max()
private

Maximal distance at which particles can interact, squared.

Definition at line 485 of file experiment.h.

template<typename Modus >
QuantumNumbers smash::Experiment< Modus >::conserved_initial_
private

The conserved quantities of the system.

This struct carries the sums of the single particle's various quantities as measured at the beginning of the evolution and can be used to regularly check if they are still good.

Definition at line 494 of file experiment.h.

template<typename Modus >
SystemTimePoint smash::Experiment< Modus >::time_start_ = SystemClock::now()
private

system starting time of the simulation

Definition at line 497 of file experiment.h.

template<typename Modus >
DensityType smash::Experiment< Modus >::dens_type_ = DensityType::None
private

Type of density to be written to collision headers.

Definition at line 500 of file experiment.h.

template<typename Modus >
uint64_t smash::Experiment< Modus >::interactions_total_ = 0
private

Total number of interactions for current timestep.

For timestepless mode the whole run time is considered as one timestep.

Definition at line 506 of file experiment.h.

template<typename Modus >
uint64_t smash::Experiment< Modus >::previous_interactions_total_ = 0
private

Total number of interactions for previous timestep.

For timestepless mode the whole run time is considered as one timestep.

Definition at line 512 of file experiment.h.

template<typename Modus >
uint64_t smash::Experiment< Modus >::wall_actions_total_ = 0
private

Total number of wall-crossings for current timestep.

For timestepless mode the whole run time is considered as one timestep.

Definition at line 518 of file experiment.h.

template<typename Modus >
uint64_t smash::Experiment< Modus >::previous_wall_actions_total_ = 0
private

Total number of wall-crossings for previous timestep.

For timestepless mode the whole run time is considered as one timestep.

Definition at line 524 of file experiment.h.

template<typename Modus >
uint64_t smash::Experiment< Modus >::total_pauli_blocked_ = 0
private

Total number of Pauli-blockings for current timestep.

For timestepless mode the whole run time is considered as one timestep.

Definition at line 530 of file experiment.h.

template<typename Modus >
uint64_t smash::Experiment< Modus >::total_hypersurface_crossing_actions_ = 0
private

Total number of particles removed from the evolution in hypersurface crossing actions.

Definition at line 536 of file experiment.h.

template<typename Modus >
double smash::Experiment< Modus >::total_energy_removed_ = 0.0
private

Total energy removed from the system in hypersurface crossing actions.

Definition at line 542 of file experiment.h.

template<typename Modus >
int64_t smash::Experiment< Modus >::seed_ = -1
private

random seed for the next event.

Definition at line 545 of file experiment.h.


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