Version: SMASH-3.1
scatteractionsfinder.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2022
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #ifndef SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
11 #define SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
12 
13 #include <memory>
14 #include <set>
15 #include <vector>
16 
17 #include "action.h"
18 #include "actionfinderfactory.h"
19 #include "configuration.h"
20 #include "scatteraction.h"
22 
23 namespace smash {
24 
32  public:
48  const ExperimentParameters &parameters);
49 
66  inline double collision_time(
67  const ParticleData &p1, const ParticleData &p2, double dt,
68  const std::vector<FourVector> &beam_momentum) const {
70  return dt * random::uniform(0., 1.);
71  } else {
72  /*
73  * For frozen Fermi motion:
74  * If particles have not yet interacted and are the initial nucleons,
75  * perform action finding with beam momentum instead of Fermi motion
76  * corrected momentum. That is because the particles are propagated with
77  * the beam momentum until they interact.
78  */
79  if (p1.id() < 0 || p2.id() < 0) {
80  throw std::runtime_error("Invalid particle ID for Fermi motion");
81  }
82  const bool p1_has_no_prior_interactions =
83  (static_cast<uint64_t>(p1.id()) < // particle from
84  static_cast<uint64_t>(beam_momentum.size())) && // initial nucleus
86 
87  const bool p2_has_no_prior_interactions =
88  (static_cast<uint64_t>(p2.id()) < // particle from
89  static_cast<uint64_t>(beam_momentum.size())) && // initial nucleus
91 
92  const FourVector p1_mom = (p1_has_no_prior_interactions)
93  ? beam_momentum[p1.id()]
94  : p1.momentum();
95  const FourVector p2_mom = (p2_has_no_prior_interactions)
96  ? beam_momentum[p2.id()]
97  : p2.momentum();
105  const FourVector delta_x = p1.position() - p2.position();
106  const double p1_sqr = p1_mom.sqr();
107  const double p2_sqr = p2_mom.sqr();
108  const double p1_dot_x = p1_mom.Dot(delta_x);
109  const double p2_dot_x = p2_mom.Dot(delta_x);
110  const double p1_dot_p2 = p1_mom.Dot(p2_mom);
111  const double denominator = std::pow(p1_dot_p2, 2) - p1_sqr * p2_sqr;
112  if (unlikely(std::abs(denominator) < really_small * really_small)) {
113  return -1.0;
114  }
115 
116  const double time_1 = (p2_sqr * p1_dot_x - p1_dot_p2 * p2_dot_x) *
117  p1_mom.x0() / denominator;
118  const double time_2 = -(p1_sqr * p2_dot_x - p1_dot_p2 * p1_dot_x) *
119  p2_mom.x0() / denominator;
120  return (time_1 + time_2) / 2;
121  } else {
131  const ThreeVector dv_times_e1e2 =
132  p1_mom.threevec() * p2_mom.x0() - p2_mom.threevec() * p1_mom.x0();
133  const double dv_times_e1e2_sqr = dv_times_e1e2.sqr();
134  if (dv_times_e1e2_sqr < really_small) {
135  return -1.0;
136  }
137  const ThreeVector dr =
138  p1.position().threevec() - p2.position().threevec();
139  return -(dr * dv_times_e1e2) *
140  (p1_mom.x0() * p2_mom.x0() / dv_times_e1e2_sqr);
141  }
142  }
143  }
144 
159  ActionList find_actions_in_cell(
160  const ParticleList &search_list, double dt, const double gcell_vol,
161  const std::vector<FourVector> &beam_momentum) const override;
162 
175  ActionList find_actions_with_neighbors(
176  const ParticleList &search_list, const ParticleList &neighbors_list,
177  double dt, const std::vector<FourVector> &beam_momentum) const override;
178 
191  const ParticleList &search_list, const Particles &surrounding_list,
192  double dt, const std::vector<FourVector> &beam_momentum) const override;
193 
198  ActionList find_final_actions(const Particles & /*search_list*/,
199  bool /*only_res*/ = false) const override {
200  return ActionList();
201  }
202 
213  inline bool is_constant_elastic_isotropic() const {
214  return ParticleType::list_all().size() == 1 &&
217  }
218 
231  double max_transverse_distance_sqr(int testparticles) const {
235  testparticles * fm2_mb * M_1_PI;
236  }
237 
242  void dump_reactions() const;
243 
257  void dump_cross_sections(const ParticleType &a, const ParticleType &b,
258  double m_a, double m_b, bool final_state,
259  std::vector<double> &plab) const;
260 
267  return string_process_interface_.get();
268  } else {
269  return NULL;
270  }
271  }
272 
273  private:
296  ActionPtr check_collision_two_part(
297  const ParticleData &data_a, const ParticleData &data_b, double dt,
298  const std::vector<FourVector> &beam_momentum = {},
299  const double gcell_vol = 0.0) const;
300 
316  ActionPtr check_collision_multi_part(const ParticleList &plist, double dt,
317  const double gcell_vol) const;
318 
322  std::unique_ptr<StringProcess> string_process_interface_;
324  const bool isotropic_;
330  const double box_length_;
333 };
334 
345  Configuration &config, const ExperimentParameters &parameters);
346 
347 } // namespace smash
348 
349 #endif // SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
ActionFinderInterface is the abstract base class for all action finders, i.e.
Interface to the SMASH configuration files.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:33
double sqr() const
calculate the square of the vector (which is a scalar)
Definition: fourvector.h:460
ThreeVector threevec() const
Definition: fourvector.h:329
double Dot(const FourVector &a) const
calculate the scalar product with another four-vector
Definition: fourvector.h:456
double x0() const
Definition: fourvector.h:313
ParticleData contains the dynamic information of a certain particle.
Definition: particledata.h:58
const FourVector & momentum() const
Get the particle's 4-momentum.
Definition: particledata.h:158
int32_t id() const
Get the id of the particle.
Definition: particledata.h:76
HistoryData get_history() const
Get history information.
Definition: particledata.h:139
const FourVector & position() const
Get the particle's position in Minkowski space.
Definition: particledata.h:204
Particle type contains the static properties of a particle species.
Definition: particletype.h:98
static const ParticleTypeList & list_all()
Definition: particletype.cc:51
The Particles class abstracts the storage and manipulation of particles.
Definition: particles.h:33
A simple scatter finder: Just loops through all particles and checks each pair for a collision.
ActionList find_final_actions(const Particles &, bool=false) const override
Find some final collisions at the end of the simulation.
ScatterActionsFinder(Configuration &config, const ExperimentParameters &parameters)
Constructor of the finder with the given parameters.
ScatterActionsFinderParameters finder_parameters_
Struct collecting several parameters.
ActionList find_actions_in_cell(const ParticleList &search_list, double dt, const double gcell_vol, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible collisions within one cell.
void dump_cross_sections(const ParticleType &a, const ParticleType &b, double m_a, double m_b, bool final_state, std::vector< double > &plab) const
Print out partial cross-sections of all processes that can occur in the collision of a(mass = m_a) an...
StringProcess * get_process_string_ptr()
const bool isotropic_
Do all collisions isotropically.
double max_transverse_distance_sqr(int testparticles) const
The maximal distance over which particles can interact in case of the geometric criterion,...
ActionPtr check_collision_two_part(const ParticleData &data_a, const ParticleData &data_b, double dt, const std::vector< FourVector > &beam_momentum={}, const double gcell_vol=0.0) const
Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and...
const double string_formation_time_
Parameter for formation time.
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
void dump_reactions() const
Prints out all the 2-> n (n > 1) reactions with non-zero cross-sections between all possible pairs of...
bool is_constant_elastic_isotropic() const
If there is only one particle sort, no decays (only elastic scatterings are possible),...
ActionPtr check_collision_multi_part(const ParticleList &plist, double dt, const double gcell_vol) const
Check for multiple i.e.
const double box_length_
Box length: needed to determine coordinates of collision correctly in case of collision through the w...
ActionList find_actions_with_surrounding_particles(const ParticleList &search_list, const Particles &surrounding_list, double dt, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible secondary collisions between the outgoing particles and the rest.
ActionList find_actions_with_neighbors(const ParticleList &search_list, const ParticleList &neighbors_list, double dt, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible collisions among the neighboring cells.
double collision_time(const ParticleData &p1, const ParticleData &p2, double dt, const std::vector< FourVector > &beam_momentum) const
Determine the collision time of the two particles.
String excitation processes used in SMASH.
Definition: stringprocess.h:45
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:31
double sqr() const
Definition: threevector.h:266
@ Stochastic
Stochastic Criteiron.
@ Covariant
Covariant Criterion.
#define unlikely(x)
Tell the branch predictor that this expression is likely false.
Definition: macros.h:16
T uniform(T min, T max)
Definition: random.h:88
Definition: action.h:24
ScatterActionsFinderParameters create_finder_parameters(Configuration &config, const ExperimentParameters &parameters)
Gather all relevant parameters for a ScatterActionsFinder either getting them from an ExperimentParam...
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Definition: constants.h:28
Helper structure for Experiment.
int32_t collisions_per_particle
Collision counter per particle, zero only for initially present particles.
Definition: particledata.h:32
Helper structure for ScatterActionsFinder.
const double elastic_parameter
Elastic cross section parameter (in mb).
const bool strings_switch
Indicates whether string fragmentation is switched on.
const bool two_to_one
Enables resonance production.
const CollisionCriterion coll_crit
Specifies which collision criterion is used.