Version: SMASH-2.0.2
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 146 of file experiment.h.

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 (int event_number)
 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...
 
int npart_projectile () const
 Number of projectile participants. More...
 
int npart_target () const
 Number of target participants. More...
 
bool projectile_target_have_interacted () const
 Return true if any two beam particles interacted. 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_
 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 bremsstrahlung_switch_
 This indicates whether bremsstrahlung is 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...
 
double initial_mean_field_energy_
 The initial total mean field energy in 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...
 
uint64_t discarded_interactions_total_ = 0
 Total number of discarded interactions, because they were invalidated before they could be performed. 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)
 Creates a verbose textual description of the setup of the Experiment. More...
 

Constructor & Destructor Documentation

◆ Experiment()

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

◆ run()

template<typename Modus >
void smash::Experiment< Modus >::run
override

Runs the experiment.

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

Definition at line 2307 of file experiment.h.

2307  {
2308  const auto &mainlog = logg[LMain];
2309  for (int j = 0; j < nevents_; j++) {
2310  mainlog.info() << "Event " << j;
2311 
2312  // Sample initial particles, start clock, some printout and book-keeping
2314  /* In the ColliderModus, if the first collisions within the same nucleus are
2315  * forbidden, 'nucleon_has_interacted_', which records whether a nucleon has
2316  * collided with another nucleon, is initialized equal to false. If allowed,
2317  * 'nucleon_has_interacted' is initialized equal to true, which means these
2318  * incoming particles have experienced some fake scatterings, they can
2319  * therefore collide with each other later on since these collisions are not
2320  * "first" to them. */
2321  if (modus_.is_collider()) {
2322  if (!modus_.cll_in_nucleus()) {
2323  nucleon_has_interacted_.assign(modus_.total_N_number(), false);
2324  } else {
2325  nucleon_has_interacted_.assign(modus_.total_N_number(), true);
2326  }
2327  }
2328  /* In the ColliderModus, if Fermi motion is frozen, assign the beam momenta
2329  * to the nucleons in both the projectile and the target. */
2330  if (modus_.is_collider() && modus_.fermi_motion() == FermiMotion::Frozen) {
2331  for (int i = 0; i < modus_.total_N_number(); i++) {
2332  const auto mass_beam = particles_.copy_to_vector()[i].effective_mass();
2333  const auto v_beam = i < modus_.proj_N_number()
2334  ? modus_.velocity_projectile()
2335  : modus_.velocity_target();
2336  const auto gamma = 1.0 / std::sqrt(1.0 - v_beam * v_beam);
2337  beam_momentum_.emplace_back(FourVector(gamma * mass_beam, 0.0, 0.0,
2338  gamma * v_beam * mass_beam));
2339  }
2340  }
2341 
2343 
2344  if (force_decays_) {
2345  do_final_decays();
2346  }
2347 
2348  // Output at event end
2349  final_output(j);
2350  }
2351 }

◆ initialize_new_event()

template<typename Modus >
void smash::Experiment< Modus >::initialize_new_event ( int  event_number)

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 1533 of file experiment.h.

1533  {
1535  logg[LExperiment].info() << "random number seed: " << seed_;
1536  /* Set seed for the next event. It has to be positive, so it can be entered
1537  * in the config.
1538  *
1539  * We have to be careful about the minimal integer, whose absolute value
1540  * cannot be represented. */
1541  int64_t r = random::advance();
1542  while (r == INT64_MIN) {
1543  r = random::advance();
1544  }
1545  seed_ = std::abs(r);
1546  /* Set the random seed used in PYTHIA hadronization
1547  * to be same with the SMASH one.
1548  * In this way we ensure that the results are reproducible
1549  * for every event if one knows SMASH random seed. */
1550  if (process_string_ptr_ != NULL) {
1552  }
1553 
1554  particles_.reset();
1555  // make sure this is initialized
1556  if (modus_.is_collider()) {
1557  nucleon_has_interacted_.assign(modus_.total_N_number(), false);
1558  }
1559 
1560  // Sample particles according to the initial conditions
1561  double start_time = modus_.initial_conditions(&particles_, parameters_);
1562  /* For box modus make sure that particles are in the box. In principle, after
1563  * a correct initialization they should be, so this is just playing it safe.
1564  */
1565  modus_.impose_boundary_conditions(&particles_, outputs_);
1566  // Reset the simulation clock
1567  double timestep = delta_time_startup_;
1568 
1569  switch (time_step_mode_) {
1570  case TimeStepMode::Fixed:
1571  break;
1572  case TimeStepMode::None:
1573  timestep = end_time_ - start_time;
1574  // Take care of the box modus + timestepless propagation
1575  const double max_dt = modus_.max_timestep(max_transverse_distance_sqr_);
1576  if (max_dt > 0. && max_dt < timestep) {
1577  timestep = max_dt;
1578  }
1579  break;
1580  }
1581  std::unique_ptr<UniformClock> clock_for_this_event;
1582  if (modus_.is_list() && (timestep < 0.0)) {
1583  throw std::runtime_error(
1584  "Timestep for the given event is negative. \n"
1585  "This might happen if the formation times of the input particles are "
1586  "larger than the specified end time of the simulation.");
1587  }
1588  clock_for_this_event = make_unique<UniformClock>(start_time, timestep);
1589  parameters_.labclock = std::move(clock_for_this_event);
1590 
1591  // Reset the output clock
1592  parameters_.outputclock->reset(start_time, true);
1593  // remove time before starting time in case of custom output times.
1594  parameters_.outputclock->remove_times_in_past(start_time);
1595 
1596  logg[LExperiment].debug(
1597  "Lab clock: t_start = ", parameters_.labclock->current_time(),
1598  ", dt = ", parameters_.labclock->timestep_duration());
1599 
1600  /* Save the initial conserved quantum numbers and total momentum in
1601  * the system for conservation checks */
1602  conserved_initial_ = QuantumNumbers(particles_);
1603  wall_actions_total_ = 0;
1605  interactions_total_ = 0;
1611  total_energy_removed_ = 0.0;
1612  // Print output headers
1613  logg[LExperiment].info() << hline;
1614  logg[LExperiment].info() << "Time[fm] Ekin[GeV] E_MF[GeV] ETotal[GeV] "
1615  << "ETot/N[GeV] D(ETot/N)[GeV] Scatt&Decays "
1616  << "Particles Comp.Time";
1617  logg[LExperiment].info() << hline;
1618  double E_mean_field = 0.0;
1619  if (potentials_) {
1621  // using the lattice is necessary
1622  if ((jmu_B_lat_ != nullptr)) {
1623  E_mean_field =
1625  }
1626  }
1627  initial_mean_field_energy_ = E_mean_field;
1630  parameters_.labclock->current_time(), E_mean_field,
1632 
1633  auto event_info =
1634  fill_event_info(particles_, E_mean_field, modus_.impact_parameter(),
1636 
1637  // Output at event start
1638  for (const auto &output : outputs_) {
1639  output->at_eventstart(particles_, event_number, event_info);
1640  }
1641 }
Here is the call graph for this function:

◆ run_time_evolution()

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 1800 of file experiment.h.

1800  {
1801  Actions actions;
1802 
1803  while (parameters_.labclock->current_time() < end_time_) {
1804  const double t = parameters_.labclock->current_time();
1805  const double dt =
1806  std::min(parameters_.labclock->timestep_duration(), end_time_ - t);
1807  logg[LExperiment].debug("Timestepless propagation for next ", dt, " fm/c.");
1808 
1809  // Perform forced thermalization if required
1810  if (thermalizer_ &&
1811  thermalizer_->is_time_to_thermalize(parameters_.labclock)) {
1812  const bool ignore_cells_under_treshold = true;
1813  thermalizer_->update_thermalizer_lattice(particles_, density_param_,
1814  ignore_cells_under_treshold);
1815  const double current_t = parameters_.labclock->current_time();
1816  thermalizer_->thermalize(particles_, current_t,
1818  ThermalizationAction th_act(*thermalizer_, current_t);
1819  if (th_act.any_particles_thermalized()) {
1820  perform_action(th_act, particles_);
1821  }
1822  }
1823 
1824  if (particles_.size() > 0 && action_finders_.size() > 0) {
1825  /* (1.a) Create grid. */
1826  double min_cell_length = compute_min_cell_length(dt);
1827  logg[LExperiment].debug("Creating grid with minimal cell length ",
1828  min_cell_length);
1829  const auto &grid =
1830  use_grid_ ? modus_.create_grid(particles_, min_cell_length, dt)
1831  : modus_.create_grid(particles_, min_cell_length, dt,
1833 
1834  const double gcell_vol = grid.cell_volume();
1835 
1836  /* (1.b) Iterate over cells and find actions. */
1837  grid.iterate_cells(
1838  [&](const ParticleList &search_list) {
1839  for (const auto &finder : action_finders_) {
1840  actions.insert(finder->find_actions_in_cell(
1841  search_list, dt, gcell_vol, beam_momentum_));
1842  }
1843  },
1844  [&](const ParticleList &search_list,
1845  const ParticleList &neighbors_list) {
1846  for (const auto &finder : action_finders_) {
1847  actions.insert(finder->find_actions_with_neighbors(
1848  search_list, neighbors_list, dt, beam_momentum_));
1849  }
1850  });
1851  }
1852 
1853  /* \todo (optimizations) Adapt timestep size here */
1854 
1855  /* (2) Propagation from action to action until the end of timestep */
1857 
1858  /* (3) Update potentials (if computed on the lattice) and
1859  * compute new momenta according to equations of motion */
1860  if (potentials_) {
1862  update_momenta(&particles_, parameters_.labclock->timestep_duration(),
1863  *potentials_, FB_lat_.get(), FI3_lat_.get());
1864  }
1865 
1866  /* (4) Expand universe if non-minkowskian metric; updates
1867  * positions and momenta according to the selected expansion */
1870  }
1871 
1872  ++(*parameters_.labclock);
1873 
1874  /* (5) Check conservation laws.
1875  *
1876  * Check conservation of conserved quantities if potentials and string
1877  * fragmentation are off. If potentials are on then momentum is conserved
1878  * only in average. If string fragmentation is on, then energy and
1879  * momentum are only very roughly conserved in high-energy collisions. */
1882  std::string err_msg = conserved_initial_.report_deviations(particles_);
1883  if (!err_msg.empty()) {
1884  logg[LExperiment].error() << err_msg;
1885  throw std::runtime_error("Violation of conserved quantities!");
1886  }
1887  }
1888  }
1889 
1890  if (pauli_blocker_) {
1891  logg[LExperiment].info(
1892  "Interactions: Pauli-blocked/performed = ", total_pauli_blocked_, "/",
1894  }
1895 }
Here is the call graph for this function:

◆ do_final_decays()

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

Performs the final decays of an event.

Definition at line 2171 of file experiment.h.

2171  {
2172  /* At end of time evolution: Force all resonances to decay. In order to handle
2173  * decay chains, we need to loop until no further actions occur. */
2174  uint64_t interactions_old;
2175  const auto particles_before_actions = particles_.copy_to_vector();
2176  do {
2177  Actions actions;
2178 
2179  interactions_old = interactions_total_;
2180 
2181  // Dileptons: shining of remaining resonances
2182  if (dilepton_finder_ != nullptr) {
2183  for (const auto &output : outputs_) {
2184  dilepton_finder_->shine_final(particles_, output.get(), true);
2185  }
2186  }
2187  // Find actions.
2188  for (const auto &finder : action_finders_) {
2189  actions.insert(finder->find_final_actions(particles_));
2190  }
2191  // Perform actions.
2192  while (!actions.is_empty()) {
2193  perform_action(*actions.pop(), particles_before_actions);
2194  }
2195  // loop until no more decays occur
2196  } while (interactions_total_ > interactions_old);
2197 
2198  // Dileptons: shining of stable particles at the end
2199  if (dilepton_finder_ != nullptr) {
2200  for (const auto &output : outputs_) {
2201  dilepton_finder_->shine_final(particles_, output.get(), false);
2202  }
2203  }
2204 }
Here is the call graph for this function:

◆ final_output()

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 2207 of file experiment.h.

2207  {
2208  /* make sure the experiment actually ran (note: we should compare this
2209  * to the start time, but we don't know that. Therefore, we check that
2210  * the time is positive, which should heuristically be the same). */
2211  double E_mean_field = 0.0;
2212  if (likely(parameters_.labclock > 0)) {
2213  const uint64_t wall_actions_this_interval =
2215  const uint64_t interactions_this_interval = interactions_total_ -
2217  wall_actions_this_interval;
2218  if (potentials_) {
2219  // using the lattice is necessary
2220  if ((jmu_B_lat_ != nullptr)) {
2221  E_mean_field =
2223  }
2224  }
2226  particles_, interactions_this_interval, conserved_initial_, time_start_,
2227  end_time_, E_mean_field, initial_mean_field_energy_);
2228  if (IC_output_switch_ && (particles_.size() == 0)) {
2229  // Verify there is no more energy in the system if all particles were
2230  // removed when crossing the hypersurface
2231  const double remaining_energy =
2233  if (remaining_energy > really_small) {
2234  throw std::runtime_error(
2235  "There is remaining energy in the system although all particles "
2236  "were removed.\n"
2237  "E_remain = " +
2238  std::to_string(remaining_energy) + " [GeV]");
2239  } else {
2240  logg[LExperiment].info() << hline;
2241  logg[LExperiment].info()
2242  << "Time real: " << SystemClock::now() - time_start_;
2243  logg[LExperiment].info()
2244  << "Interactions before reaching hypersurface: "
2247  logg[LExperiment].info()
2248  << "Total number of particles removed on hypersurface: "
2250  }
2251  } else {
2252  const double precent_discarded =
2254  ? static_cast<double>(discarded_interactions_total_) * 100.0 /
2256  : 0.0;
2257  std::stringstream msg_discarded;
2258  msg_discarded
2259  << "Discarded interaction number: " << discarded_interactions_total_
2260  << " (" << precent_discarded
2261  << "% of the total interaction number including wall crossings)";
2262 
2263  logg[LExperiment].info() << hline;
2264  logg[LExperiment].info()
2265  << "Time real: " << SystemClock::now() - time_start_;
2266  logg[LExperiment].debug() << msg_discarded.str();
2267 
2269  precent_discarded > 1.0) {
2270  // The choosen threshold of 1% is a heuristical value
2271  logg[LExperiment].warn()
2272  << msg_discarded.str()
2273  << "\nThe number of discarded interactions is large, which means "
2274  "the assumption for the stochastic criterion of\n1 interaction"
2275  "per particle per timestep is probably violated. Consider "
2276  "reducing the timestep size.";
2277  }
2278 
2279  logg[LExperiment].info() << "Final interaction number: "
2281  }
2282 
2283  // Check if there are unformed particles
2284  int unformed_particles_count = 0;
2285  for (const auto &particle : particles_) {
2286  if (particle.formation_time() > end_time_) {
2287  unformed_particles_count++;
2288  }
2289  }
2290  if (unformed_particles_count > 0) {
2291  logg[LExperiment].warn(
2292  "End time might be too small. ", unformed_particles_count,
2293  " unformed particles were found at the end of the evolution.");
2294  }
2295  }
2296 
2297  auto event_info =
2298  fill_event_info(particles_, E_mean_field, modus_.impact_parameter(),
2300 
2301  for (const auto &output : outputs_) {
2302  output->at_eventend(particles_, evt_num, event_info);
2303  }
2304 }
Here is the call graph for this function:

◆ particles()

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 231 of file experiment.h.

231 { return &particles_; }

◆ modus()

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 237 of file experiment.h.

237 { return &modus_; }

◆ npart_projectile()

template<typename Modus >
int smash::Experiment< Modus >::npart_projectile ( ) const
inline

Number of projectile participants.

This includes all particles of the projectile that did not take part in any scattering. Note that this definition might not be accurate because there can be many secondary interactions with low momentum transfer within the projectile nucleus.

Returns
Number of projectile participants

Definition at line 248 of file experiment.h.

248  {
249  int np = 0;
250  for (size_t i = 0; i < this->modus_.proj_N_number(); i++)
251  np += nucleon_has_interacted_[i] ? 1 : 0;
252  return np;
253  }

◆ npart_target()

template<typename Modus >
int smash::Experiment< Modus >::npart_target ( ) const
inline

Number of target participants.

This includes all particles of the target that did not take part in any scattering. Note that this definition might not be accurate because there can be many secondary interactions with low momentum transfer within the target nucleus.

Returns
Number of target participants

Definition at line 264 of file experiment.h.

264  {
265  int nt = 0;
266  for (size_t i = this->modus_.proj_N_number();
267  i < this->modus_.total_N_number(); i++)
268  nt += nucleon_has_interacted_[i] ? 1 : 0;
269  return nt;
270  }

◆ projectile_target_have_interacted()

template<typename Modus >
bool smash::Experiment< Modus >::projectile_target_have_interacted ( ) const
inline

Return true if any two beam particles interacted.

Definition at line 272 of file experiment.h.

272  {
274  }

◆ perform_action()

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.

◆ create_output()

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 627 of file experiment.h.

630  {
631  logg[LExperiment].info() << "Adding output " << content << " of format "
632  << format << std::endl;
633 
634  if (format == "VTK" && content == "Particles") {
635  outputs_.emplace_back(
636  make_unique<VtkOutput>(output_path, content, out_par));
637  } else if (format == "Root") {
638 #ifdef SMASH_USE_ROOT
639  if (content == "Initial_Conditions") {
640  outputs_.emplace_back(
641  make_unique<RootOutput>(output_path, "SMASH_IC", out_par));
642  } else {
643  outputs_.emplace_back(
644  make_unique<RootOutput>(output_path, content, out_par));
645  }
646 #else
647  logg[LExperiment].error(
648  "Root output requested, but Root support not compiled in");
649 #endif
650  } else if (format == "Binary") {
651  if (content == "Collisions" || content == "Dileptons" ||
652  content == "Photons") {
653  outputs_.emplace_back(
654  make_unique<BinaryOutputCollisions>(output_path, content, out_par));
655  } else if (content == "Particles") {
656  outputs_.emplace_back(
657  make_unique<BinaryOutputParticles>(output_path, content, out_par));
658  } else if (content == "Initial_Conditions") {
659  outputs_.emplace_back(make_unique<BinaryOutputInitialConditions>(
660  output_path, content, out_par));
661  }
662  } else if (format == "Oscar1999" || format == "Oscar2013") {
663  outputs_.emplace_back(
664  create_oscar_output(format, content, output_path, out_par));
665  } else if (content == "Thermodynamics" && format == "ASCII") {
666  outputs_.emplace_back(
667  make_unique<ThermodynamicOutput>(output_path, content, out_par));
668  } else if (content == "Thermodynamics" && format == "VTK") {
669  printout_lattice_td_ = true;
670  outputs_.emplace_back(
671  make_unique<VtkOutput>(output_path, content, out_par));
672  } else if (content == "Initial_Conditions" && format == "ASCII") {
673  outputs_.emplace_back(
674  make_unique<ICOutput>(output_path, "SMASH_IC", out_par));
675  } else if (format == "HepMC") {
676 #ifdef SMASH_USE_HEPMC
677  if (content == "Particles") {
678  outputs_.emplace_back(make_unique<HepMcOutput>(
679  output_path, "SMASH_HepMC_particles", false, modus_.total_N_number(),
680  modus_.proj_N_number()));
681  } else if (content == "Collisions") {
682  outputs_.emplace_back(make_unique<HepMcOutput>(
683  output_path, "SMASH_HepMC_collisions", true, modus_.total_N_number(),
684  modus_.proj_N_number()));
685  } else {
686  logg[LExperiment].error(
687  "HepMC only available for Particles and "
688  "Collisions content. Requested for " +
689  content + ".");
690  }
691 #else
692  logg[LExperiment].error(
693  "HepMC output requested, but HepMC support not compiled in");
694 #endif
695  } else if (content == "Rivet") {
696 #ifdef SMASH_USE_RIVET
697  // flag to ensure that the Rivet format has not been already assigned
698  static bool rivet_format_already_selected = false;
699  // if the next check is true, then we are trying to assign the format twice
700  if (rivet_format_already_selected) {
701  logg[LExperiment].warn(
702  "Rivet output format can only be one, either YODA or YODA-full. "
703  "Only your first valid choice will be used.");
704  return;
705  }
706  if (format == "YODA") {
707  outputs_.emplace_back(make_unique<RivetOutput>(
708  output_path, "SMASH_Rivet", false, modus_.total_N_number(),
709  modus_.proj_N_number(), out_par));
710  rivet_format_already_selected = true;
711  } else if (format == "YODA-full") {
712  outputs_.emplace_back(make_unique<RivetOutput>(
713  output_path, "SMASH_Rivet_full", true, modus_.total_N_number(),
714  modus_.proj_N_number(), out_par));
715  rivet_format_already_selected = true;
716  } else {
717  logg[LExperiment].error("Rivet format " + format +
718  "not one of YODA or YODA-full");
719  }
720 #else
721  logg[LExperiment].error(
722  "Rivet output requested, but Rivet support not compiled in");
723 #endif
724  } else {
725  logg[LExperiment].error()
726  << "Unknown combination of format (" << format << ") and content ("
727  << content << "). Fix the config.";
728  }
729 }
Here is the call graph for this function:

◆ propagate_and_shine()

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 1898 of file experiment.h.

1898  {
1899  const double dt =
1901  if (dilepton_finder_ != nullptr) {
1902  for (const auto &output : outputs_) {
1903  dilepton_finder_->shine(particles_, output.get(), dt);
1904  }
1905  }
1906 }
Here is the call graph for this function:

◆ run_time_evolution_timestepless()

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 1923 of file experiment.h.

1923  {
1924  const double start_time = parameters_.labclock->current_time();
1925  const double end_time =
1926  std::min(parameters_.labclock->next_time(), end_time_);
1927  double time_left = end_time - start_time;
1928  logg[LExperiment].debug(
1929  "Timestepless propagation: ", "Actions size = ", actions.size(),
1930  ", start time = ", start_time, ", end time = ", end_time);
1931 
1932  // iterate over all actions
1933  while (!actions.is_empty()) {
1934  // get next action
1935  ActionPtr act = actions.pop();
1936  if (!act->is_valid(particles_)) {
1938  logg[LExperiment].debug(~einhard::DRed(), "✘ ", act,
1939  " (discarded: invalid)");
1940  continue;
1941  }
1942  if (act->time_of_execution() > end_time) {
1943  logg[LExperiment].error(
1944  act, " scheduled later than end time: t_action[fm/c] = ",
1945  act->time_of_execution(), ", t_end[fm/c] = ", end_time);
1946  }
1947  logg[LExperiment].debug(~einhard::Green(), "✔ ", act);
1948 
1949  while (next_output_time() <= act->time_of_execution()) {
1950  logg[LExperiment].debug("Propagating until output time: ",
1951  next_output_time());
1953  ++(*parameters_.outputclock);
1955  }
1956 
1957  /* (1) Propagate to the next action. */
1958  logg[LExperiment].debug("Propagating until next action ", act,
1959  ", action time = ", act->time_of_execution());
1960  propagate_and_shine(act->time_of_execution());
1961 
1962  /* (2) Perform action.
1963  *
1964  * Update the positions of the incoming particles, because the information
1965  * in the action object will be outdated as the particles have been
1966  * propagated since the construction of the action. */
1967  act->update_incoming(particles_);
1968  const bool performed = perform_action(*act, particles_);
1969 
1970  /* No need to update actions for outgoing particles
1971  * if the action is not performed. */
1972  if (!performed) {
1973  continue;
1974  }
1975 
1976  /* (3) Update actions for newly-produced particles. */
1977 
1978  time_left = end_time - act->time_of_execution();
1979  const ParticleList &outgoing_particles = act->outgoing_particles();
1980  // Grid cell volume set to zero, since there is no grid
1981  const double gcell_vol = 0.0;
1982  for (const auto &finder : action_finders_) {
1983  // Outgoing particles can still decay, cross walls...
1984  actions.insert(finder->find_actions_in_cell(outgoing_particles, time_left,
1985  gcell_vol, beam_momentum_));
1986  // ... and collide with other particles.
1987  actions.insert(finder->find_actions_with_surrounding_particles(
1988  outgoing_particles, particles_, time_left, beam_momentum_));
1989  }
1990 
1992  }
1993 
1994  while (next_output_time() <= end_time) {
1995  logg[LExperiment].debug("Propagating until output time: ",
1996  next_output_time());
1998  ++(*parameters_.outputclock);
1999  // Avoid duplicating printout at event end time
2000  if (parameters_.outputclock->current_time() < end_time_) {
2002  }
2003  }
2004  logg[LExperiment].debug("Propagating to time ", end_time);
2005  propagate_and_shine(end_time);
2006 }
Here is the call graph for this function:

◆ intermediate_output()

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

Intermediate output during an event.

Definition at line 2009 of file experiment.h.

2009  {
2010  const uint64_t wall_actions_this_interval =
2013  const uint64_t interactions_this_interval = interactions_total_ -
2015  wall_actions_this_interval;
2017  double E_mean_field = 0.0;
2018  if (potentials_) {
2019  // using the lattice is necessary
2020  if ((jmu_B_lat_ != nullptr)) {
2021  E_mean_field =
2023  /*
2024  * Mean field calculated in a box should remain approximately constant if
2025  * the system is in equilibrium, and so deviations from its original value
2026  * may signal a phase transition or other dynamical process. This
2027  * comparison only makes sense in the Box Modus, hence the condition.
2028  */
2029  if (modus_.is_box()) {
2030  double tmp = (E_mean_field - initial_mean_field_energy_) /
2031  (E_mean_field + initial_mean_field_energy_);
2032  /*
2033  * This is displayed when the system evolves away from its initial
2034  * configuration (which is when the total mean field energy in the box
2035  * deviates from its initial value).
2036  */
2037  if (std::abs(tmp) > 0.01) {
2038  logg[LExperiment].info()
2039  << "\n\n\n\t The mean field at t = "
2040  << parameters_.outputclock->current_time()
2041  << " [fm/c] differs from the mean field at t = 0:"
2042  << "\n\t\t initial_mean_field_energy_ = "
2043  << initial_mean_field_energy_ << " [GeV]"
2044  << "\n\t\t abs[(E_MF - E_MF(t=0))/(E_MF + E_MF(t=0))] = "
2045  << std::abs(tmp)
2046  << "\n\t\t E_MF/E_MF(t=0) = "
2047  << E_mean_field / initial_mean_field_energy_ << "\n\n";
2048  }
2049  }
2050  }
2051  }
2052 
2054  particles_, interactions_this_interval, conserved_initial_, time_start_,
2055  parameters_.outputclock->current_time(), E_mean_field,
2057  const LatticeUpdate lat_upd = LatticeUpdate::AtOutput;
2058 
2059  auto event_info =
2060  fill_event_info(particles_, E_mean_field, modus_.impact_parameter(),
2062  // save evolution data
2063  if (!(modus_.is_box() && parameters_.outputclock->current_time() <
2064  modus_.equilibration_time())) {
2065  for (const auto &output : outputs_) {
2066  if (output->is_dilepton_output() || output->is_photon_output() ||
2067  output->is_IC_output()) {
2068  continue;
2069  }
2070 
2071  output->at_intermediate_time(particles_, parameters_.outputclock,
2072  density_param_, event_info);
2073 
2074  // Thermodynamic output on the lattice versus time
2075  switch (dens_type_lattice_printout_) {
2076  case DensityType::Baryon:
2078  density_param_, particles_, false);
2079  output->thermodynamics_output(ThermodynamicQuantity::EckartDensity,
2081  break;
2083  update_lattice(jmu_I3_lat_.get(), lat_upd,
2085  particles_, false);
2086  output->thermodynamics_output(ThermodynamicQuantity::EckartDensity,
2088  *jmu_I3_lat_);
2089  break;
2090  case DensityType::None:
2091  break;
2092  default:
2093  update_lattice(jmu_custom_lat_.get(), lat_upd,
2095  particles_, false);
2096  output->thermodynamics_output(ThermodynamicQuantity::EckartDensity,
2098  *jmu_custom_lat_);
2099  }
2103  if (printout_tmn_) {
2104  output->thermodynamics_output(ThermodynamicQuantity::Tmn,
2106  }
2107  if (printout_tmn_landau_) {
2108  output->thermodynamics_output(ThermodynamicQuantity::TmnLandau,
2110  }
2111  if (printout_v_landau_) {
2112  output->thermodynamics_output(ThermodynamicQuantity::LandauVelocity,
2114  }
2115  }
2116 
2117  if (thermalizer_) {
2118  output->thermodynamics_output(*thermalizer_);
2119  }
2120  }
2121  }
2122 }
Here is the call graph for this function:

◆ update_potentials()

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

Recompute potentials on lattices if necessary.

Definition at line 2125 of file experiment.h.

2125  {
2126  if (potentials_) {
2127  if (potentials_->use_symmetry() && jmu_I3_lat_ != nullptr) {
2130  true);
2131  }
2132  if ((potentials_->use_skyrme() || potentials_->use_symmetry()) &&
2133  jmu_B_lat_ != nullptr) {
2136  const size_t UBlattice_size = UB_lat_->size();
2137  for (size_t i = 0; i < UBlattice_size; i++) {
2138  auto jB = (*jmu_B_lat_)[i];
2139  const FourVector flow_four_velocity_B =
2140  std::abs(jB.density()) > really_small ? jB.jmu_net() / jB.density()
2141  : FourVector();
2142  double baryon_density = jB.density();
2143  ThreeVector baryon_grad_rho = jB.grad_rho();
2144  ThreeVector baryon_dj_dt = jB.dj_dt();
2145  ThreeVector baryon_rot_j = jB.rot_j();
2146  if (potentials_->use_skyrme()) {
2147  (*UB_lat_)[i] =
2148  flow_four_velocity_B * potentials_->skyrme_pot(baryon_density);
2149  (*FB_lat_)[i] = potentials_->skyrme_force(
2150  baryon_density, baryon_grad_rho, baryon_dj_dt, baryon_rot_j);
2151  }
2152  if (potentials_->use_symmetry() && jmu_I3_lat_ != nullptr) {
2153  auto jI3 = (*jmu_I3_lat_)[i];
2154  const FourVector flow_four_velocity_I3 =
2155  std::abs(jI3.density()) > really_small
2156  ? jI3.jmu_net() / jI3.density()
2157  : FourVector();
2158  (*UI3_lat_)[i] =
2159  flow_four_velocity_I3 *
2160  potentials_->symmetry_pot(jI3.density(), baryon_density);
2161  (*FI3_lat_)[i] = potentials_->symmetry_force(
2162  jI3.density(), jI3.grad_rho(), jI3.dj_dt(), jI3.rot_j(),
2163  baryon_density, baryon_grad_rho, baryon_dj_dt, baryon_rot_j);
2164  }
2165  }
2166  }
2167  }
2168 }
Here is the call graph for this function:

◆ compute_min_cell_length()

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 338 of file experiment.h.

338  {
339  return std::sqrt(4 * dt * dt + max_transverse_distance_sqr_);
340  }

◆ next_output_time()

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

Shortcut for next output time.

Definition at line 343 of file experiment.h.

343  {
344  return parameters_.outputclock->next_time();
345  }

Friends And Related Function Documentation

◆ ExperimentBase

template<typename Modus >
friend class ExperimentBase
friend

Definition at line 176 of file experiment.h.

Member Data Documentation

◆ parameters_

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 352 of file experiment.h.

◆ density_param_

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

Structure to precalculate and hold parameters for density computations.

Definition at line 355 of file experiment.h.

◆ modus_

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 361 of file experiment.h.

◆ particles_

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

Complete particle list.

Definition at line 364 of file experiment.h.

◆ potentials_

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 370 of file experiment.h.

◆ pauli_blocker_

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 376 of file experiment.h.

◆ outputs_

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 382 of file experiment.h.

◆ dilepton_output_

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

The Dilepton output.

Definition at line 385 of file experiment.h.

◆ photon_output_

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

The Photon output.

Definition at line 388 of file experiment.h.

◆ nucleon_has_interacted_

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 395 of file experiment.h.

◆ projectile_target_interact_

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

Whether the projectile and the target collided.

Definition at line 399 of file experiment.h.

◆ beam_momentum_

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 406 of file experiment.h.

◆ action_finders_

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

The Action finder objects.

Definition at line 409 of file experiment.h.

◆ dilepton_finder_

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

The Dilepton Action Finder.

Definition at line 412 of file experiment.h.

◆ photon_finder_

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

The (Scatter) Actions Finder for Direct Photons.

Definition at line 415 of file experiment.h.

◆ n_fractional_photons_

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

Number of fractional photons produced per single reaction.

Definition at line 418 of file experiment.h.

◆ jmu_B_lat_

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

Baryon density on the lattices.

Definition at line 421 of file experiment.h.

◆ jmu_I3_lat_

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

Isospin projection density on the lattices.

Definition at line 424 of file experiment.h.

◆ jmu_custom_lat_

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 433 of file experiment.h.

◆ dens_type_lattice_printout_

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

Type of density for lattice printout.

Definition at line 436 of file experiment.h.

◆ UB_lat_

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 442 of file experiment.h.

◆ UI3_lat_

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 448 of file experiment.h.

◆ FB_lat_

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 452 of file experiment.h.

◆ FI3_lat_

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 456 of file experiment.h.

◆ Tmn_

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

Lattices of energy-momentum tensors for printout.

Definition at line 459 of file experiment.h.

◆ printout_tmn_

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

Whether to print the energy-momentum tensor.

Definition at line 462 of file experiment.h.

◆ printout_tmn_landau_

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 465 of file experiment.h.

◆ printout_v_landau_

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

Whether to print the 4-velocity in Landau fram.

Definition at line 468 of file experiment.h.

◆ printout_lattice_td_

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 471 of file experiment.h.

◆ thermalizer_

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

Instance of class used for forced thermalization.

Definition at line 474 of file experiment.h.

◆ process_string_ptr_

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 480 of file experiment.h.

◆ nevents_

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 496 of file experiment.h.

◆ end_time_

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

simulation time at which the evolution is stopped.

Definition at line 499 of file experiment.h.

◆ delta_time_startup_

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 506 of file experiment.h.

◆ force_decays_

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 512 of file experiment.h.

◆ use_grid_

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

This indicates whether to use the grid.

Definition at line 515 of file experiment.h.

◆ metric_

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

This struct contains information on the metric to be used.

Definition at line 518 of file experiment.h.

◆ dileptons_switch_

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

This indicates whether dileptons are switched on.

Definition at line 521 of file experiment.h.

◆ photons_switch_

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

This indicates whether photons are switched on.

Definition at line 524 of file experiment.h.

◆ bremsstrahlung_switch_

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

This indicates whether bremsstrahlung is switched on.

Definition at line 527 of file experiment.h.

◆ IC_output_switch_

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

This indicates whether the IC output is enabled.

Definition at line 530 of file experiment.h.

◆ time_step_mode_

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

This indicates whether to use time steps.

Definition at line 533 of file experiment.h.

◆ max_transverse_distance_sqr_

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 536 of file experiment.h.

◆ conserved_initial_

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 545 of file experiment.h.

◆ initial_mean_field_energy_

template<typename Modus >
double smash::Experiment< Modus >::initial_mean_field_energy_
private

The initial total mean field energy in the system.

Note: will only be calculated if lattice is on.

Definition at line 551 of file experiment.h.

◆ time_start_

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

system starting time of the simulation

Definition at line 554 of file experiment.h.

◆ dens_type_

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

Type of density to be written to collision headers.

Definition at line 557 of file experiment.h.

◆ interactions_total_

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 563 of file experiment.h.

◆ previous_interactions_total_

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 569 of file experiment.h.

◆ wall_actions_total_

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 575 of file experiment.h.

◆ previous_wall_actions_total_

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 581 of file experiment.h.

◆ total_pauli_blocked_

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 587 of file experiment.h.

◆ total_hypersurface_crossing_actions_

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 593 of file experiment.h.

◆ discarded_interactions_total_

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

Total number of discarded interactions, because they were invalidated before they could be performed.

Definition at line 599 of file experiment.h.

◆ total_energy_removed_

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 605 of file experiment.h.

◆ seed_

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

random seed for the next event.

Definition at line 608 of file experiment.h.


The documentation for this class was generated from the following file:
smash::LatticeUpdate
LatticeUpdate
Enumerator option for lattice updates.
Definition: lattice.h:36
smash::Experiment::jmu_I3_lat_
std::unique_ptr< DensityLattice > jmu_I3_lat_
Isospin projection density on the lattices.
Definition: experiment.h:424
smash::Experiment::time_step_mode_
const TimeStepMode time_step_mode_
This indicates whether to use time steps.
Definition: experiment.h:533
smash::Experiment::jmu_B_lat_
std::unique_ptr< DensityLattice > jmu_B_lat_
Baryon density on the lattices.
Definition: experiment.h:421
smash::Experiment::run_time_evolution
void run_time_evolution()
Runs the time evolution of an event with fixed-sized time steps or without timesteps,...
Definition: experiment.h:1800
smash::Experiment::printout_tmn_
bool printout_tmn_
Whether to print the energy-momentum tensor.
Definition: experiment.h:462
smash::QuantumNumbers::momentum
FourVector momentum() const
Definition: quantumnumbers.h:131
ThermodynamicQuantity::TmnLandau
@ TmnLandau
smash::Experiment::Tmn_
std::unique_ptr< RectangularLattice< EnergyMomentumTensor > > Tmn_
Lattices of energy-momentum tensors for printout.
Definition: experiment.h:459
smash::Experiment::action_finders_
std::vector< std::unique_ptr< ActionFinderInterface > > action_finders_
The Action finder objects.
Definition: experiment.h:409
smash::Experiment::initialize_new_event
void initialize_new_event(int event_number)
This is called in the beginning of each event.
Definition: experiment.h:1533
smash::expand_space_time
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
smash::Experiment::total_energy_removed_
double total_energy_removed_
Total energy removed from the system in hypersurface crossing actions.
Definition: experiment.h:605
ThermodynamicQuantity::LandauVelocity
@ LandauVelocity
smash::Experiment::previous_wall_actions_total_
uint64_t previous_wall_actions_total_
Total number of wall-crossings for previous timestep.
Definition: experiment.h:581
smash::StringProcess::init_pythia_hadron_rndm
void init_pythia_hadron_rndm()
Set PYTHIA random seeds to be desired values.
Definition: stringprocess.h:289
smash::Experiment::beam_momentum_
std::vector< FourVector > beam_momentum_
The initial nucleons in the ColliderModus propagate with beam_momentum_, if Fermi motion is frozen.
Definition: experiment.h:406
smash::Experiment::next_output_time
double next_output_time() const
Shortcut for next output time.
Definition: experiment.h:343
smash::Experiment::compute_min_cell_length
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:338
smash::Particles::size
size_t size() const
Definition: particles.h:87
smash::Particles::reset
void reset()
Reset the state of the Particles object to an empty list and a new id counter.
Definition: particles.cc:139
smash::LatticeUpdate::AtOutput
@ AtOutput
smash::Experiment::wall_actions_total_
uint64_t wall_actions_total_
Total number of wall-crossings for current timestep.
Definition: experiment.h:575
smash::Experiment::final_output
void final_output(const int evt_num)
Output at the end of an event.
Definition: experiment.h:2207
smash::check_interactions_total
void check_interactions_total(uint64_t interactions_total)
Make sure interactions_total can be represented as a 32-bit integer.
Definition: experiment.h:1915
smash::Experiment::UB_lat_
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:442
smash::LExperiment
static constexpr int LExperiment
Definition: outputparameters.h:19
smash::Experiment::pauli_blocker_
std::unique_ptr< PauliBlocker > pauli_blocker_
An instance of PauliBlocker class that stores parameters needed for Pauli blocking calculations and c...
Definition: experiment.h:376
smash::DensityType::BaryonicIsospin
@ BaryonicIsospin
ExpansionMode::NoExpansion
@ NoExpansion
smash::Experiment::modus_
Modus modus_
Instance of the Modus template parameter.
Definition: experiment.h:361
smash::hline
const std::string hline(113, '-')
String representing a horizontal line.
smash::format_measurements
std::string format_measurements(const Particles &particles, uint64_t scatterings_this_interval, const QuantumNumbers &conserved_initial, SystemTimePoint time_start, double time, double E_mean_field, double E_mean_field_initial)
Generate the tabulated string which will be printed to the screen when SMASH is running.
Definition: experiment.cc:493
smash::ExperimentParameters::coll_crit
const CollisionCriterion coll_crit
Employed collision criterion.
Definition: experimentparameters.h:41
smash::Experiment::projectile_target_interact_
bool projectile_target_interact_
Whether the projectile and the target collided.
Definition: experiment.h:399
smash::Experiment::jmu_custom_lat_
std::unique_ptr< DensityLattice > jmu_custom_lat_
Custom density on the lattices.
Definition: experiment.h:433
smash::Experiment::run_time_evolution_timestepless
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:1923
smash::random::set_seed
void set_seed(T &&seed)
Sets the seed of the random number engine.
Definition: random.h:71
smash::Experiment::particles_
Particles particles_
Complete particle list.
Definition: experiment.h:364
smash::LatticeUpdate::EveryTimestep
@ EveryTimestep
smash::LMain
static constexpr int LMain
Definition: experiment.h:85
smash::Experiment::force_decays_
const bool force_decays_
This indicates whether we force all resonances to decay in the last timestep.
Definition: experiment.h:512
smash::Experiment::total_pauli_blocked_
uint64_t total_pauli_blocked_
Total number of Pauli-blockings for current timestep.
Definition: experiment.h:587
FermiMotion::Frozen
@ Frozen
Use fermi motion without potentials.
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::Experiment::thermalizer_
std::unique_ptr< GrandCanThermalizer > thermalizer_
Instance of class used for forced thermalization.
Definition: experiment.h:474
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
smash::ExpansionProperties::mode_
ExpansionMode mode_
Type of metric used.
Definition: propagation.h:28
smash::Experiment::density_param_
DensityParameters density_param_
Structure to precalculate and hold parameters for density computations.
Definition: experiment.h:355
smash::Experiment::nevents_
const int nevents_
Number of events.
Definition: experiment.h:496
smash::Experiment::seed_
int64_t seed_
random seed for the next event.
Definition: experiment.h:608
smash::fill_event_info
EventInfo fill_event_info(const Particles &particles, double E_mean_field, double modus_impact_parameter, const ExperimentParameters &parameters, bool projectile_target_interact)
Generate the EventInfo object which is passed to outputs_.
Definition: experiment.cc:651
smash::format
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:307
einhard::Color
A stream modifier that allows to colorize the log output.
Definition: einhard.hpp:142
smash::create_oscar_output
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:769
smash::Experiment::metric_
const ExpansionProperties metric_
This struct contains information on the metric to be used.
Definition: experiment.h:518
CollisionCriterion::Stochastic
@ Stochastic
Stochastic Criteiron.
smash::Particles::copy_to_vector
ParticleList copy_to_vector() const
Definition: particles.h:44
smash::Experiment::printout_tmn_landau_
bool printout_tmn_landau_
Whether to print the energy-momentum tensor in Landau frame.
Definition: experiment.h:465
smash::Experiment::FI3_lat_
std::unique_ptr< RectangularLattice< std::pair< ThreeVector, ThreeVector > > > FI3_lat_
Lattices for the electric and magnetic component of the symmetry force.
Definition: experiment.h:456
smash::FourVector::x0
double x0() const
Definition: fourvector.h:303
smash::Experiment::do_final_decays
void do_final_decays()
Performs the final decays of an event.
Definition: experiment.h:2171
smash::update_lattice
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:402
smash::QuantumNumbers::report_deviations
std::string report_deviations(const Particles &particles) const
Checks if the current particle list has still the same values and reports about differences.
Definition: quantumnumbers.h:248
ThermodynamicQuantity::Tmn
@ Tmn
smash::Experiment::use_grid_
const bool use_grid_
This indicates whether to use the grid.
Definition: experiment.h:515
TimeStepMode::None
@ None
Don't use time steps; propagate from action to action.
smash::Experiment::interactions_total_
uint64_t interactions_total_
Total number of interactions for current timestep.
Definition: experiment.h:563
smash::Experiment::intermediate_output
void intermediate_output()
Intermediate output during an event.
Definition: experiment.h:2009
smash::Experiment::propagate_and_shine
void propagate_and_shine(double to_time)
Propagate all particles until time to_time without any interactions and shine dileptons.
Definition: experiment.h:1898
smash::Experiment::delta_time_startup_
const double delta_time_startup_
The clock's timestep size at start up.
Definition: experiment.h:506
smash::Experiment::IC_output_switch_
const bool IC_output_switch_
This indicates whether the IC output is enabled.
Definition: experiment.h:530
smash::CellSizeStrategy::Largest
@ Largest
Make cells as large as possible.
ThermodynamicQuantity::EckartDensity
@ EckartDensity
smash::ExperimentParameters::strings_switch
bool strings_switch
This indicates whether string fragmentation is switched on.
Definition: experimentparameters.h:53
smash::Experiment::previous_interactions_total_
uint64_t previous_interactions_total_
Total number of interactions for previous timestep.
Definition: experiment.h:569
smash::ExperimentParameters::labclock
std::unique_ptr< Clock > labclock
System clock (for simulation time keeping in the computational frame)
Definition: experimentparameters.h:26
smash::Experiment::perform_action
bool perform_action(Action &action, const Container &particles_before_actions)
Perform the given action.
smash::Experiment::update_potentials
void update_potentials()
Recompute potentials on lattices if necessary.
Definition: experiment.h:2125
smash::random::advance
Engine::result_type advance()
Advance the engine's state and return the generated value.
Definition: random.h:78
smash::Experiment::FB_lat_
std::unique_ptr< RectangularLattice< std::pair< ThreeVector, ThreeVector > > > FB_lat_
Lattices for the electric and magnetic components of the Skyrme force.
Definition: experiment.h:452
smash::ExperimentParameters::outputclock
std::unique_ptr< Clock > outputclock
Output clock to keep track of the next output time.
Definition: experimentparameters.h:29
smash::Experiment::dens_type_lattice_printout_
DensityType dens_type_lattice_printout_
Type of density for lattice printout.
Definition: experiment.h:436
smash::Experiment::dilepton_finder_
std::unique_ptr< DecayActionsFinderDilepton > dilepton_finder_
The Dilepton Action Finder.
Definition: experiment.h:412
smash::Experiment::printout_lattice_td_
bool printout_lattice_td_
Whether to print the thermodynamics quantities evaluated on the lattices.
Definition: experiment.h:471
smash::calculate_mean_field_energy
double calculate_mean_field_energy(const Potentials &potentials, RectangularLattice< smash::DensityOnLattice > &jmu_B_lat, const ExperimentParameters &parameters)
Calculate the total mean field energy of the system; this will be printed to the screen when SMASH is...
Definition: experiment.cc:539
smash::Experiment::parameters_
ExperimentParameters parameters_
Struct of several member variables.
Definition: experiment.h:352
smash::DensityType::None
@ None
smash::Experiment::end_time_
const double end_time_
simulation time at which the evolution is stopped.
Definition: experiment.h:499
smash::Experiment::nucleon_has_interacted_
std::vector< bool > nucleon_has_interacted_
nucleon_has_interacted_ labels whether the particles in the nuclei have experienced any collisions or...
Definition: experiment.h:395
smash::Experiment::process_string_ptr_
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:480
smash::propagate_straight_line
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:44
smash::Experiment::potentials_
std::unique_ptr< Potentials > potentials_
An instance of potentials class, that stores parameters of potentials, calculates them and their grad...
Definition: experiment.h:370
likely
#define likely(x)
Tell the branch predictor that this expression is likely true.
Definition: macros.h:14
smash::Experiment::initial_mean_field_energy_
double initial_mean_field_energy_
The initial total mean field energy in the system.
Definition: experiment.h:551
smash::Experiment::outputs_
OutputsList outputs_
A list of output formaters.
Definition: experiment.h:382
smash::Experiment::total_hypersurface_crossing_actions_
uint64_t total_hypersurface_crossing_actions_
Total number of particles removed from the evolution in hypersurface crossing actions.
Definition: experiment.h:593
smash::DensityType::Baryon
@ Baryon
smash::ExperimentParameters::testparticles
int testparticles
Number of test particle.
Definition: experimentparameters.h:32
smash::Experiment::printout_v_landau_
bool printout_v_landau_
Whether to print the 4-velocity in Landau fram.
Definition: experiment.h:468
smash::Experiment::discarded_interactions_total_
uint64_t discarded_interactions_total_
Total number of discarded interactions, because they were invalidated before they could be performed.
Definition: experiment.h:599
smash::Experiment::time_start_
SystemTimePoint time_start_
system starting time of the simulation
Definition: experiment.h:554
TimeStepMode::Fixed
@ Fixed
Use fixed time step.
smash::update_momenta
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
smash::Experiment::conserved_initial_
QuantumNumbers conserved_initial_
The conserved quantities of the system.
Definition: experiment.h:545
smash::Experiment::max_transverse_distance_sqr_
double max_transverse_distance_sqr_
Maximal distance at which particles can interact, squared.
Definition: experiment.h:536