20 const ParticleList &search_list,
double dt,
21 [[maybe_unused]]
const double gcell_vol,
22 [[maybe_unused]]
const std::vector<FourVector> &beam_momentum)
const {
26 const double t0 =
p.position().x0();
27 const double t_creation =
p.begin_formation_time();
28 const double t_end = t0 + dt;
29 if (t_end < min_time_ || t0 >
max_time_) {
35 const double fluidization_time =
38 if (fluidization_time >= t_end) {
45 double time_until = (1 -
p.xsec_scaling_factor() <=
really_small)
47 : std::max(fluidization_time - t0, 0.);
49 std::make_unique<FluidizationAction>(
p,
p, time_until));
63 const double background =
65 const double e_den_particles =
67 if (e_den_particles + background >=
70 <<
"Fluidize " << pdata.
id() <<
" with " << e_den_particles <<
"+"
71 << background <<
" GeV/fm^3 at " << pdata.
position().
x0()
116 const bool are_there_core_particles =
117 std::any_of(search_list.
begin(), search_list.
end(),
119 if (are_there_core_particles) {
120 for (
auto &
p : search_list) {
122 actions.emplace_back(std::make_unique<FreeforallAction>(
123 ParticleList{
p}, ParticleList{},
p.position().x0()));
129 for (
auto &original : search_list) {
130 if (original.get_history().collisions_per_particle == 0) {
134 const double t = original.position().x0();
135 double corona_time = original.get_history().time_last_collision;
136 if (t == corona_time) {
142 const ThreeVector r = original.position().threevec() -
143 (t - corona_time) * original.velocity();
145 backpropagated.set_4position(
FourVector(corona_time, r));
146 backpropagated.set_4momentum(original.momentum());
148 backpropagated.set_formation_time(t);
149 backpropagated.set_cross_section_scaling_factor(0.0);
150 actions.emplace_back(std::make_unique<FreeforallAction>(
151 ParticleList{original}, ParticleList{}, t));
152 actions.emplace_back(std::make_unique<FreeforallAction>(
153 ParticleList{}, ParticleList{backpropagated}, corona_time));
const RectangularLattice< EnergyMomentumTensor > & energy_density_lattice_
Lattice where energy momentum tensor is computed.
const double formation_time_fraction_
Fraction of formation time after which a particles can fluidize.
ActionList find_final_actions(const Particles &search_list) const override
Prepare corona particles left in the IC for the afterburner.
bool is_process_fluidizable(const HistoryData &history) const
Checks if a given process type is in fluidizable_processes_.
int particles_in_core_
Accumulated number of core particles.
const bool delay_initial_elastic_
Whether the first elastic interaction of an initial nucleon is fluidizable.
bool above_threshold(const ParticleData &pdata) const
Determine if fluidization condition is satisfied.
ActionList find_actions_in_cell(const ParticleList &search_list, double dt, double gcell_vol, const std::vector< FourVector > &beam_momentum) const override
Find particles to fluidize, depending on the energy density around them.
const std::map< int32_t, double > & background_
Background energy density at positions of particles, using the id as key.
const double max_time_
Maximum time (in lab frame) in fm to allow fluidization.
double energy_in_core_
Accumulated energy of core particles.
const FluidizableProcessesBitSet fluidizable_processes_
Processes that create a fluidizable particle.
const double energy_density_threshold_
Minimum energy density surrounding the particle to fluidize it.
const double smearing_kernel_at_0_
Smearing kernel at the position of the particle of interest.
The EnergyMomentumTensor class represents a symmetric positive semi-definite energy-momentum tensor .
EnergyMomentumTensor boosted(const FourVector &u) const
Boost to a given 4-velocity.
FourVector landau_frame_4velocity() const
Find the Landau frame 4-velocity from energy-momentum tensor.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
ThreeVector threevec() const
ParticleData contains the dynamic information of a certain particle.
const ParticleType & type() const
Get the type of the particle.
double formation_time() const
Get the absolute formation time of the particle.
int32_t id() const
Get the id of the particle.
double pole_mass() const
Get the particle's pole mass ("on-shell").
const FourVector & position() const
Get the particle's position in Minkowski space.
The Particles class abstracts the storage and manipulation of particles.
The ThreeVector class represents a physical three-vector with the components .
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
static constexpr int LFluidization
ProcessType
ProcessTypes are used to identify the type of the process.
@ TwoToOne
See here for a short description.
@ MultiParticleThreeToTwo
See here for a short description.
@ Decay
See here for a short description.
@ TwoToFive
See here for a short description.
@ TwoToTwo
See here for a short description.
@ Elastic
See here for a short description.
@ TwoToFour
See here for a short description.
@ MultiParticleThreeMesonsToOne
See here for a short description.
@ MultiParticleFourToTwo
See here for a short description.
@ StringHard
See here for a short description.
@ TwoToThree
See here for a short description.
@ MultiParticleFiveToTwo
See here for a short description.
constexpr double really_small
Numerical error tolerance.
bool is_string_soft_process(ProcessType p)
Check if a given process type is a soft string excitation.
A structure to hold information about the history of the particle, e.g.
int32_t collisions_per_particle
Collision counter per particle, zero only for initially present particles.
ProcessType process_type
type of the last action