17 #include "smash/config.h"
116 const std::string &name,
119 file_{path /
"thermodynamics.dat",
"w"},
121 std::fprintf(
file_.
get(),
"# %s thermodynamics output\n", SMASH_VERSION);
124 std::fprintf(
file_.
get(),
"# only participants are taken into account\n");
127 std::fprintf(
file_.
get(),
"# @ point (%6.2f, %6.2f, %6.2f) [fm]\n", r.
x1(),
130 std::fprintf(
file_.
get(),
"# averaged over the entire volume\n");
133 std::fprintf(
file_.
get(),
"# time [fm], ");
135 std::fprintf(
file_.
get(),
"%s [fm^-3], ",
140 std::fprintf(
file_.
get(),
"%s [GeV/fm^3] 00 01 02 03 11 12 13 22 23 33, ",
143 std::fprintf(
file_.
get(),
"%s [GeV] 00 01 02 03 11 12 13 22 23 33, ",
149 std::fprintf(
file_.
get(),
"%s [GeV/fm^3] 00 01 02 03 11 12 13 22 23 33, ",
152 std::fprintf(
file_.
get(),
"%s [GeV] 00 01 02 03 11 12 13 22 23 33, ",
157 std::fprintf(
file_.
get(),
"%s x y z, ",
162 std::fprintf(
file_.
get(),
"j_QBS [(Q,B,S)/fm^3] (0 1 2 3)x3");
164 std::fprintf(
file_.
get(),
"j_QBS [(Q,B,S)] (0 1 2 3)x3");
173 const std::vector<Particles> & ,
const int event_number) {
174 std::fprintf(
file_.
get(),
"# event %i\n", event_number);
178 const std::vector<Particles> & ,
const int ) {
183 const std::vector<Particles> &ensembles,
185 std::fprintf(
file_.
get(),
"%6.2f ", clock->current_time());
186 constexpr
bool compute_gradient =
false;
189 for (
const Particles &particles : ensembles) {
198 for (
const Particles &particles : ensembles) {
199 for (
const auto &
p : particles) {
202 if (
p.get_history().collisions_per_particle == 0) {
206 const double dens_factor =
215 1.0 /
p.momentum().abs(), dens_param, compute_gradient)
222 Tmn.add_particle(
p, dens_factor);
229 for (
int i = 0; i < 10; i++) {
234 for (
int i = 0; i < 10; i++) {
235 std::fprintf(
file_.
get(),
"%15.12f ", Tmn_L[i]);
239 std::fprintf(
file_.
get(),
"%15.12f %15.12f %15.12f ", -u[1] / u[0],
240 -u[2] / u[0], -u[3] / u[0]);
245 for (
const Particles &particles : ensembles) {
256 std::fprintf(
file_.
get(),
"%15.12f %15.12f %15.12f %15.12f ", jQ[0], jQ[1],
258 std::fprintf(
file_.
get(),
"%15.12f %15.12f %15.12f %15.12f ", jB[0], jB[1],
260 std::fprintf(
file_.
get(),
"%15.12f %15.12f %15.12f %15.12f ", jS[0], jS[1],
267 const char *file_name,
const ParticleList &plist,
271 std::ofstream a_file;
272 a_file.open(file_name, std::ios::out);
273 const bool compute_gradient =
false;
274 const bool smearing =
true;
276 for (
int i = 0; i <= n_points; i++) {
277 r = line_start + (line_end - line_start) * (1.0 * i / n_points);
278 double rho_eck = std::get<0>(
279 current_eckart(r, plist, param, dens_type, compute_gradient, smearing));
280 a_file << r.
x1() <<
" " << r.
x2() <<
" " << r.
x3() <<
" " << rho_eck
A class to pre-calculate and store parameters relevant for density calculation.
bool only_participants() const
double norm_factor_sf() const
The EnergyMomentumTensor class represents a symmetric positive semi-definite energy-momentum tensor .
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
double abs() const
calculate the lorentz invariant absolute value
Abstraction of generic output.
const char * to_string(const ThermodynamicQuantity tq)
Convert thermodynamic quantities to strings.
The Particles class abstracts the storage and manipulation of particles.
FILE * get()
Get the underlying FILE* pointer.
void at_eventend(const std::vector< Particles > &ensembles, const int event_number) override
only flushes the output the file
void density_along_line(const char *file_name, const ParticleList &plist, const DensityParameters ¶m, DensityType dens_type, const ThreeVector &line_start, const ThreeVector &line_end, int n_points)
Prints density along the specified line.
ThermodynamicOutput(const std::filesystem::path &path, const std::string &name, const OutputParameters &out_par)
Construct Output param[in] path Path to output param[in] name Filename param[in] out_par Parameters o...
void at_intermediate_time(const std::vector< Particles > &ensembles, const std::unique_ptr< Clock > &clock, const DensityParameters &dens_param) override
Writes thermodynamics every fixed time interval.
void at_eventstart(const std::vector< Particles > &ensembles, const int event_number) override
writes the event header
RenamingFilePtr file_
Pointer to output file.
const OutputParameters out_par_
Structure that holds all the information about what to printout.
~ThermodynamicOutput()
Default destructor.
The ThreeVector class represents a physical three-vector with the components .
@ EckartDensity
Density in the Eckart frame.
@ Tmn
Energy-momentum tensor in lab frame.
@ LandauVelocity
Velocity of the Landau rest frame.
@ TmnLandau
Energy-momentum tensor in Landau rest frame.
std::tuple< double, FourVector, ThreeVector, ThreeVector, FourVector, FourVector, FourVector, FourVector > current_eckart(const ThreeVector &r, const ParticleList &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient, bool smearing)
Calculates Eckart rest frame density and 4-current of a given density type and optionally the gradien...
std::pair< double, ThreeVector > unnormalized_smearing_factor(const ThreeVector &r, const FourVector &p, const double m_inv, const DensityParameters &dens_par, const bool compute_gradient=false)
Implements gaussian smearing for any quantity.
constexpr double really_small
Numerical error tolerance.
DensityType
Allows to choose which kind of density to calculate.
double density_factor(const ParticleType &type, DensityType dens_type)
Get the factor that determines how much a particle contributes to the density type that is computed.
Helper structure for Experiment to hold output options and parameters.
bool td_v_landau
Print out Landau velocity of type td_dens_type or not?
bool td_tmn_landau
Print out energy-momentum tensor in Landau rest frame (of type td_dens_type) or not?
bool td_jQBS
Print out QBS 4-currents or not?
DensityType td_dens_type
Type (e.g., baryon/pion/hadron) of thermodynamic quantity.
bool td_tmn
Print out energy-momentum tensor of type td_dens_type or not?
bool td_smearing
Whether smearing is on or off; WARNING : if smearing is off, then final result is in GeV instead of G...
bool td_rho_eckart
Print out Eckart rest frame density of type td_dens_type or not?
bool td_only_participants
Flag reporting whether only participants are considered (true) or also spectators (false)
ThreeVector td_position
Point, where thermodynamic quantities are calculated.