10 #ifndef SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
11 #define SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
67 const std::vector<FourVector> &beam_momentum)
const {
78 if (p1.
id() < 0 || p2.
id() < 0) {
79 throw std::runtime_error(
"Invalid particle ID for Fermi motion");
81 const bool p1_has_no_prior_interactions =
82 (
static_cast<uint64_t
>(p1.
id()) <
83 static_cast<uint64_t
>(beam_momentum.size())) &&
86 const bool p2_has_no_prior_interactions =
87 (
static_cast<uint64_t
>(p2.
id()) <
88 static_cast<uint64_t
>(beam_momentum.size())) &&
91 const FourVector p1_mom = (p1_has_no_prior_interactions)
92 ? beam_momentum[p1.
id()]
94 const FourVector p2_mom = (p2_has_no_prior_interactions)
95 ? beam_momentum[p2.
id()]
105 const double p1_sqr = p1_mom.
sqr();
106 const double p2_sqr = p2_mom.
sqr();
107 const double p1_dot_x = p1_mom.
Dot(delta_x);
108 const double p2_dot_x = p2_mom.
Dot(delta_x);
109 const double p1_dot_p2 = p1_mom.
Dot(p2_mom);
110 const double denominator = std::pow(p1_dot_p2, 2) - p1_sqr * p2_sqr;
115 const double time_1 = (p2_sqr * p1_dot_x - p1_dot_p2 * p2_dot_x) *
116 p1_mom.
x0() / denominator;
117 const double time_2 = -(p1_sqr * p2_dot_x - p1_dot_p2 * p1_dot_x) *
118 p2_mom.
x0() / denominator;
119 return (time_1 + time_2) / 2;
132 const double dv_times_e1e2_sqr = dv_times_e1e2.
sqr();
138 return -(dr * dv_times_e1e2) *
139 (p1_mom.
x0() * p2_mom.
x0() / dv_times_e1e2_sqr);
159 const ParticleList &search_list,
double dt,
const double gcell_vol,
160 const std::vector<FourVector> &beam_momentum)
const override;
175 const ParticleList &search_list,
const ParticleList &neighbors_list,
176 double dt,
const std::vector<FourVector> &beam_momentum)
const override;
190 const ParticleList &search_list,
const Particles &surrounding_list,
191 double dt,
const std::vector<FourVector> &beam_momentum)
const override;
198 bool =
false)
const override {
232 testparticles *
fm2_mb * M_1_PI;
255 double m_a,
double m_b,
bool final_state,
256 std::vector<double> &plab)
const;
295 const std::vector<FourVector> &beam_momentum = {},
296 const double gcell_vol = 0.0)
const;
314 const double gcell_vol)
const;
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.
double sqr() const
calculate the square of the vector (which is a scalar)
ThreeVector threevec() const
double Dot(const FourVector &a) const
calculate the scalar product with another four-vector
ParticleData contains the dynamic information of a certain particle.
const FourVector & momentum() const
Get the particle's 4-momentum.
int32_t id() const
Get the id of the particle.
HistoryData get_history() const
Get history information.
const FourVector & position() const
Get the particle's position in Minkowski space.
Particle type contains the static properties of a particle species.
static const ParticleTypeList & list_all()
The Particles class abstracts the storage and manipulation of particles.
A simple scatter finder: Just loops through all particles and checks each pair for a collision.
const int testparticles_
Number of test particles.
ActionList find_final_actions(const Particles &, bool=false) const override
Find some final collisions at the end of the simulation.
const MultiParticleReactionsBitSet incl_multi_set_
List of included multi-particle reactions.
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.
const double elastic_parameter_
Elastic cross section parameter (in mb).
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...
const bool strings_switch_
Switch to turn off string excitation.
const double additional_el_xs_
Additional constant elastic cross section.
const double scale_xs_
Factor by which all (partial) cross sections are scaled.
const bool allow_first_collisions_within_nucleus_
If particles within nucleus are allowed to collide for their first time.
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
const double low_snn_cut_
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
StringProcess * get_process_string_ptr()
const bool use_AQM_
Switch to control whether to use AQM or not.
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,...
const bool only_warn_for_high_prob_
Switch to turn off throwing an exception for collision probabilities larger than 1.
const CollisionCriterion coll_crit_
Specifies which collision criterion is used.
ScatterActionsFinder(Configuration config, const ExperimentParameters ¶meters)
Constructor of the finder with the given parameters.
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
const bool two_to_one_
Enable 2->1 processes.
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 maximum_cross_section_
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.
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
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.
The ThreeVector class represents a physical three-vector with the components .
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
NNbarTreatment
Treatment of N Nbar Annihilation.
std::bitset< 4 > MultiParticleReactionsBitSet
Container for the n to m reactions in the code.
CollisionCriterion
Criteria used to check collisions.
@ Stochastic
Stochastic Criteiron.
@ Covariant
Covariant Criterion.
#define unlikely(x)
Tell the branch predictor that this expression is likely false.
constexpr double really_small
Numerical error tolerance.
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Helper structure for Experiment.
int32_t collisions_per_particle
Collision counter per particle, zero only for initially present particles.