Version: SMASH-1.5
thermodynamicoutput.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2018
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
11 
12 #include <fstream>
13 #include <memory>
14 
15 #include <boost/filesystem.hpp>
16 
17 #include "smash/clock.h"
18 #include "smash/config.h"
19 #include "smash/density.h"
23 #include "smash/particles.h"
24 #include "smash/vtkoutput.h"
25 
26 namespace smash {
27 
110  const std::string &name,
111  const OutputParameters &out_par)
112  : OutputInterface(name),
113  file_{path / "thermodynamics.dat", "w"},
114  out_par_(out_par) {
115  std::fprintf(file_.get(), "# %s thermodynamics output\n", VERSION_MAJOR);
116  const ThreeVector r = out_par.td_position;
117  if (out_par_.td_smearing) {
118  std::fprintf(file_.get(), "# @ point (%6.2f, %6.2f, %6.2f) [fm]\n", r.x1(),
119  r.x2(), r.x3());
120  } else {
121  std::fprintf(file_.get(), "# averaged over the entire volume\n");
122  }
123  std::fprintf(file_.get(), "# %s\n", to_string(out_par.td_dens_type));
124  std::fprintf(file_.get(), "# time [fm/c], ");
125  if (out_par_.td_rho_eckart) {
126  std::fprintf(file_.get(), "%s [fm^-3], ",
128  }
129  if (out_par_.td_tmn) {
130  if (out_par_.td_smearing) {
131  std::fprintf(file_.get(), "%s [GeV/fm^3] 00 01 02 03 11 12 13 22 23 33, ",
132  to_string(ThermodynamicQuantity::Tmn));
133  } else {
134  std::fprintf(file_.get(), "%s [GeV] 00 01 02 03 11 12 13 22 23 33, ",
135  to_string(ThermodynamicQuantity::Tmn));
136  }
137  }
138  if (out_par_.td_tmn_landau) {
139  if (out_par_.td_smearing) {
140  std::fprintf(file_.get(), "%s [GeV/fm^3] 00 01 02 03 11 12 13 22 23 33, ",
142  } else {
143  std::fprintf(file_.get(), "%s [GeV] 00 01 02 03 11 12 13 22 23 33, ",
145  }
146  }
147  if (out_par_.td_v_landau) {
148  std::fprintf(file_.get(), "%s x y z ",
150  }
151  std::fprintf(file_.get(), "\n");
152 }
153 
155 
157  const int event_number) {
158  std::fprintf(file_.get(), "# event %i\n", event_number);
159 }
160 
161 void ThermodynamicOutput::at_eventend(const Particles & /*particles*/,
162  const int /*event_number*/,
163  double /*impact_parameter*/) {
164  std::fflush(file_.get());
165 }
166 
168  const Particles &particles, const Clock &clock,
169  const DensityParameters &dens_param) {
170  std::fprintf(file_.get(), "%6.2f ", clock.current_time());
171  constexpr bool compute_gradient = false;
172  if (out_par_.td_rho_eckart) {
173  const double rho =
174  std::get<0>(rho_eckart(out_par_.td_position, particles, dens_param,
175  out_par_.td_dens_type, compute_gradient));
176  std::fprintf(file_.get(), "%7.4f ", rho);
177  }
180  for (const auto &p : particles) {
181  const double dens_factor =
183  if (std::abs(dens_factor) < really_small) {
184  continue;
185  }
186  if (out_par_.td_smearing) {
187  const auto sf =
189  p.position().threevec() - out_par_.td_position, p.momentum(),
190  1.0 / p.momentum().abs(), dens_param, compute_gradient)
191  .first;
192  if (sf < really_small) {
193  continue;
194  }
195  Tmn.add_particle(p, dens_factor * sf * dens_param.norm_factor_sf());
196  } else {
197  Tmn.add_particle(p, dens_factor);
198  }
199  }
200  const FourVector u = Tmn.landau_frame_4velocity();
201  const EnergyMomentumTensor Tmn_L = Tmn.boosted(u);
202  if (out_par_.td_tmn) {
203  for (int i = 0; i < 10; i++) {
204  std::fprintf(file_.get(), "%15.12f ", Tmn[i]);
205  }
206  }
207  if (out_par_.td_tmn_landau) {
208  for (int i = 0; i < 10; i++) {
209  std::fprintf(file_.get(), "%7.4f ", Tmn_L[i]);
210  }
211  }
212  if (out_par_.td_v_landau) {
213  std::fprintf(file_.get(), "%7.4f %7.4f %7.4f", -u[1] / u[0], -u[2] / u[0],
214  -u[3] / u[0]);
215  }
216  }
217  std::fprintf(file_.get(), "\n");
218 }
219 
221  const char *file_name, const ParticleList &plist,
222  const DensityParameters &param, DensityType dens_type,
223  const ThreeVector &line_start, const ThreeVector &line_end, int n_points) {
224  ThreeVector r;
225  std::ofstream a_file;
226  a_file.open(file_name, std::ios::out);
227  const bool compute_gradient = false;
228 
229  for (int i = 0; i <= n_points; i++) {
230  r = line_start + (line_end - line_start) * (1.0 * i / n_points);
231  double rho_eck =
232  std::get<0>(rho_eckart(r, plist, param, dens_type, compute_gradient));
233  a_file << r.x1() << " " << r.x2() << " " << r.x3() << " " << rho_eck
234  << "\n";
235  }
236 }
237 
238 } // namespace smash
void at_eventend(const Particles &particles, const int event_number, double impact_parameter) override
only flushes the output the file
A class to pre-calculate and store parameters relevant for density calculation.
Definition: density.h:103
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:30
double x3() const
Definition: threevector.h:163
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
double norm_factor_sf() const
Definition: density.h:138
DensityType td_dens_type
Type (e.g., baryon/pion/hadron) of thermodynamic quantity.
FILE * get()
Get the underlying FILE* pointer.
Definition: file.cc:27
ThreeVector td_position
Point, where thermodynamic quantities are calculated.
std::tuple< double, ThreeVector, ThreeVector, ThreeVector > rho_eckart(const ThreeVector &r, const ParticleList &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame...
Definition: density.cc:133
double x1() const
Definition: threevector.h:155
const OutputParameters out_par_
Structure that holds all the information about what to printout.
bool td_tmn_landau
Print out energy-momentum tensor in Landau rest frame (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...
void at_intermediate_time(const Particles &particles, const Clock &clock, const DensityParameters &dens_param) override
Writes thermodynamics every fixed time interval.
~ThermodynamicOutput()
Default destructor.
ThermodynamicOutput(const bf::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_eventstart(const Particles &particles, const int event_number) override
writes the event header
bool td_rho_eckart
Print out Eckart rest frame density of type td_dens_type or not?
Helper structure for Experiment to hold output options and parameters.
The EnergyMomentumTensor class represents a symmetric positive semi-definite energy-momentum tensor ...
Clock tracks the time in the simulation.
Definition: clock.h:75
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...
Definition: density.cc:17
constexpr int p
Proton.
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.
Definition: density.cc:32
bool td_tmn
Print out energy-momentum tensor of type td_dens_type or not?
The Particles class abstracts the storage and manipulation of particles.
Definition: particles.h:33
bool td_v_landau
Print out Landau velocity of type td_dens_type or not?
double current_time() const
Definition: clock.h:110
DensityType
Allows to choose which kind of density to calculate.
Definition: density.h:34
void density_along_line(const char *file_name, const ParticleList &plist, const DensityParameters &param, DensityType dens_type, const ThreeVector &line_start, const ThreeVector &line_end, int n_points)
Prints density along the specified line.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:32
RenamingFilePtr file_
Pointer to output file.
Abstraction of generic output.
double x2() const
Definition: threevector.h:159
Definition: action.h:24