Version: SMASH-3.1
smash::ThermodynamicOutput Class Reference

#include <thermodynamicoutput.h>

Writes the thermodynamic quantities at a specified point versus time.

This class is a temporary solution to write thermodynamic quantities out. Calculations are called directly inside the output functions. In future it should be substituted by some more general output.

Definition at line 39 of file thermodynamicoutput.h.

Inheritance diagram for smash::ThermodynamicOutput:
smash::OutputInterface

Public Member Functions

 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 of output. More...
 
 ~ThermodynamicOutput ()
 Default destructor. More...
 
void at_eventstart (const std::vector< Particles > &ensembles, const int event_number) override
 writes the event header More...
 
void at_eventend (const std::vector< Particles > &ensembles, const int event_number) override
 only flushes the output the file More...
 
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. More...
 
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. More...
 
- Public Member Functions inherited from smash::OutputInterface
 OutputInterface (std::string name)
 Construct output interface. More...
 
virtual ~OutputInterface ()=0
 Pure virtual destructor to make class abstract and prevent its instantiation. More...
 
virtual void at_eventstart (const Particles &, const int, const EventInfo &)
 Output launched at event start after initialization, when particles are generated but not yet propagated. More...
 
virtual void at_eventstart (const int, const ThermodynamicQuantity, const DensityType, RectangularLattice< DensityOnLattice >)
 Output launched at event start after initialization, when particles are generated but not yet propagated. More...
 
virtual void at_eventstart (const int, const ThermodynamicQuantity, const DensityType, RectangularLattice< EnergyMomentumTensor >)
 Output launched at event start after initialization, when particles are generated but not yet propagated. More...
 
virtual void at_eventend (const int, const ThermodynamicQuantity, const DensityType)
 Output launched at event end. More...
 
virtual void at_eventend (const ThermodynamicQuantity)
 Output launched at event end. More...
 
virtual void at_eventend (const Particles &, const int, const EventInfo &)
 Output launched at event end. More...
 
virtual void at_interaction (const Action &, const double)
 Called whenever an action modified one or more particles. More...
 
virtual void at_intermediate_time (const Particles &, const std::unique_ptr< Clock > &, const DensityParameters &, const EventInfo &)
 Output launched after every N'th time-step. More...
 
virtual void thermodynamics_output (const ThermodynamicQuantity, const DensityType, RectangularLattice< DensityOnLattice > &)
 Output to write thermodynamics from the lattice. More...
 
virtual void thermodynamics_output (const ThermodynamicQuantity, const DensityType, RectangularLattice< EnergyMomentumTensor > &)
 Output to write energy-momentum tensor and related quantities from the lattice. More...
 
virtual void thermodynamics_lattice_output (RectangularLattice< DensityOnLattice > &, const double)
 Output to write thermodynamics from the lattice. More...
 
virtual void thermodynamics_lattice_output (RectangularLattice< DensityOnLattice > &, const double, const std::vector< Particles > &, const DensityParameters &)
 Output to write thermodynamics from the lattice. More...
 
virtual void thermodynamics_lattice_output (const ThermodynamicQuantity, RectangularLattice< EnergyMomentumTensor > &, const double)
 Output to write energy-momentum tensor and related quantities from the lattice. More...
 
virtual void thermodynamics_output (const GrandCanThermalizer &)
 Output to write energy-momentum tensor and related quantities from the thermalizer class. More...
 
virtual void fields_output (const std::string, const std::string, RectangularLattice< std::pair< ThreeVector, ThreeVector >> &)
 Write fields in vtk output Fields are a pair of threevectors for example electric and magnetic field. More...
 
bool is_dilepton_output () const
 Get, whether this is the dilepton output? More...
 
bool is_photon_output () const
 Get, whether this is the photon output? More...
 
bool is_IC_output () const
 Get, whether this is the IC output? More...
 
const char * to_string (const ThermodynamicQuantity tq)
 Convert thermodynamic quantities to strings. More...
 
const char * to_string (const DensityType dens_type)
 Convert density types to strings. More...
 

Private Attributes

RenamingFilePtr file_
 Pointer to output file. More...
 
const OutputParameters out_par_
 Structure that holds all the information about what to printout. More...
 

Additional Inherited Members

- Protected Attributes inherited from smash::OutputInterface
const bool is_dilepton_output_
 Is this the dilepton output? More...
 
const bool is_photon_output_
 Is this the photon output? More...
 
const bool is_IC_output_
 Is this the IC output? More...
 

Constructor & Destructor Documentation

◆ ThermodynamicOutput()

smash::ThermodynamicOutput::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 of output.

Definition at line 115 of file thermodynamicoutput.cc.

118  : OutputInterface(name),
119  file_{path / "thermodynamics.dat", "w"},
120  out_par_(out_par) {
121  std::fprintf(file_.get(), "# %s thermodynamics output\n", SMASH_VERSION);
122  const ThreeVector r = out_par.td_position;
124  std::fprintf(file_.get(), "# only participants are taken into account\n");
125  }
126  if (out_par_.td_smearing) {
127  std::fprintf(file_.get(), "# @ point (%6.2f, %6.2f, %6.2f) [fm]\n", r.x1(),
128  r.x2(), r.x3());
129  } else {
130  std::fprintf(file_.get(), "# averaged over the entire volume\n");
131  }
132  std::fprintf(file_.get(), "# %s\n", to_string(out_par.td_dens_type));
133  std::fprintf(file_.get(), "# time [fm], ");
134  if (out_par_.td_rho_eckart) {
135  std::fprintf(file_.get(), "%s [fm^-3], ",
137  }
138  if (out_par_.td_tmn) {
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_tmn_landau) {
148  if (out_par_.td_smearing) {
149  std::fprintf(file_.get(), "%s [GeV/fm^3] 00 01 02 03 11 12 13 22 23 33, ",
151  } else {
152  std::fprintf(file_.get(), "%s [GeV] 00 01 02 03 11 12 13 22 23 33, ",
154  }
155  }
156  if (out_par_.td_v_landau) {
157  std::fprintf(file_.get(), "%s x y z, ",
159  }
160  if (out_par_.td_jQBS) {
161  if (out_par_.td_smearing) {
162  std::fprintf(file_.get(), "j_QBS [(Q,B,S)/fm^3] (0 1 2 3)x3");
163  } else {
164  std::fprintf(file_.get(), "j_QBS [(Q,B,S)] (0 1 2 3)x3");
165  }
166  }
167  std::fprintf(file_.get(), "\n");
168 }
OutputInterface(std::string name)
Construct output interface.
const char * to_string(const ThermodynamicQuantity tq)
Convert thermodynamic quantities to strings.
FILE * get()
Get the underlying FILE* pointer.
Definition: file.cc:27
RenamingFilePtr file_
Pointer to output file.
const OutputParameters out_par_
Structure that holds all the information about what to printout.
@ 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.
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?
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)

◆ ~ThermodynamicOutput()

smash::ThermodynamicOutput::~ThermodynamicOutput ( )

Default destructor.

Definition at line 170 of file thermodynamicoutput.cc.

170 {}

Member Function Documentation

◆ at_eventstart()

void smash::ThermodynamicOutput::at_eventstart ( const std::vector< Particles > &  ensembles,
const int  event_number 
)
overridevirtual

writes the event header

Parameters
[in]ensemblesDummy, is just here to satisfy inheritance
[in]event_numberCurrent event number, that will be written to the header

Reimplemented from smash::OutputInterface.

Definition at line 172 of file thermodynamicoutput.cc.

173  {
174  std::fprintf(file_.get(), "# event %i\n", event_number);
175 }

◆ at_eventend()

void smash::ThermodynamicOutput::at_eventend ( const std::vector< Particles > &  ensembles,
const int  event_number 
)
overridevirtual

only flushes the output the file

Parameters
[in]ensemblesDummy, is just here to satisfy inheritance
[in]event_numberDummy, is just here to satisfy inheritance

Reimplemented from smash::OutputInterface.

Definition at line 177 of file thermodynamicoutput.cc.

178  {
179  std::fflush(file_.get());
180 }

◆ at_intermediate_time()

void smash::ThermodynamicOutput::at_intermediate_time ( const std::vector< Particles > &  ensembles,
const std::unique_ptr< Clock > &  clock,
const DensityParameters dens_param 
)
overridevirtual

Writes thermodynamics every fixed time interval.

For configuring the output see ASCII thermodynamics output.

Parameters
[in]ensemblesParticles, from which thermodynamic variables are computed
[in]clockClock, needed to get current time
[in]dens_paramset of parameters, defining smearing. For more info about smearing see ASCII thermodynamics output.

Reimplemented from smash::OutputInterface.

Definition at line 182 of file thermodynamicoutput.cc.

184  {
185  std::fprintf(file_.get(), "%6.2f ", clock->current_time());
186  constexpr bool compute_gradient = false;
187  if (out_par_.td_rho_eckart) {
188  FourVector jmu = FourVector();
189  for (const Particles &particles : ensembles) {
190  jmu += std::get<1>(current_eckart(
191  out_par_.td_position, particles, dens_param, out_par_.td_dens_type,
192  compute_gradient, out_par_.td_smearing));
193  }
194  std::fprintf(file_.get(), "%15.12f ", jmu.abs());
195  }
197  EnergyMomentumTensor Tmn;
198  for (const Particles &particles : ensembles) {
199  for (const auto &p : particles) {
200  if (dens_param.only_participants()) {
201  // if this condition holds, the hadron is a spectator and we skip it
202  if (p.get_history().collisions_per_particle == 0) {
203  continue;
204  }
205  }
206  const double dens_factor =
208  if (std::abs(dens_factor) < really_small) {
209  continue;
210  }
211  if (out_par_.td_smearing) {
212  const auto sf =
214  p.position().threevec() - out_par_.td_position, p.momentum(),
215  1.0 / p.momentum().abs(), dens_param, compute_gradient)
216  .first;
217  if (sf < really_small) {
218  continue;
219  }
220  Tmn.add_particle(p, dens_factor * sf * dens_param.norm_factor_sf());
221  } else {
222  Tmn.add_particle(p, dens_factor);
223  }
224  }
225  }
226  const FourVector u = Tmn.landau_frame_4velocity();
227  const EnergyMomentumTensor Tmn_L = Tmn.boosted(u);
228  if (out_par_.td_tmn) {
229  for (int i = 0; i < 10; i++) {
230  std::fprintf(file_.get(), "%15.12f ", Tmn[i]);
231  }
232  }
233  if (out_par_.td_tmn_landau) {
234  for (int i = 0; i < 10; i++) {
235  std::fprintf(file_.get(), "%15.12f ", Tmn_L[i]);
236  }
237  }
238  if (out_par_.td_v_landau) {
239  std::fprintf(file_.get(), "%15.12f %15.12f %15.12f ", -u[1] / u[0],
240  -u[2] / u[0], -u[3] / u[0]);
241  }
242  }
243  if (out_par_.td_jQBS) {
244  FourVector jQ = FourVector(), jB = FourVector(), jS = FourVector();
245  for (const Particles &particles : ensembles) {
246  jQ += std::get<1>(current_eckart(out_par_.td_position, particles,
247  dens_param, DensityType::Charge,
248  compute_gradient, out_par_.td_smearing));
249  jB += std::get<1>(current_eckart(out_par_.td_position, particles,
250  dens_param, DensityType::Baryon,
251  compute_gradient, out_par_.td_smearing));
252  jS += std::get<1>(current_eckart(out_par_.td_position, particles,
253  dens_param, DensityType::Strangeness,
254  compute_gradient, out_par_.td_smearing));
255  }
256  std::fprintf(file_.get(), "%15.12f %15.12f %15.12f %15.12f ", jQ[0], jQ[1],
257  jQ[2], jQ[3]);
258  std::fprintf(file_.get(), "%15.12f %15.12f %15.12f %15.12f ", jB[0], jB[1],
259  jB[2], jB[3]);
260  std::fprintf(file_.get(), "%15.12f %15.12f %15.12f %15.12f ", jS[0], jS[1],
261  jS[2], jS[3]);
262  }
263  std::fprintf(file_.get(), "\n");
264 }
constexpr int p
Proton.
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...
Definition: density.cc:171
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:38
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
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
DensityType td_dens_type
Type (e.g., baryon/pion/hadron) of thermodynamic quantity.
ThreeVector td_position
Point, where thermodynamic quantities are calculated.

◆ density_along_line()

void smash::ThermodynamicOutput::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.

Useful to make 1D plots of density profiles.

Parameters
[in]file_namename of the file to print out
[in]paramParameters for density calculation
[in]plistparticles, from which density is computed
[in]dens_typetype of density
[in]line_startstarting point of the line
[in]line_endending point of the line
[in]n_pointsnumber of points along the line, where density is printed out

Definition at line 266 of file thermodynamicoutput.cc.

269  {
270  ThreeVector r;
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;
275 
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
281  << "\n";
282  }
283 }

Member Data Documentation

◆ file_

RenamingFilePtr smash::ThermodynamicOutput::file_
private

Pointer to output file.

Definition at line 103 of file thermodynamicoutput.h.

◆ out_par_

const OutputParameters smash::ThermodynamicOutput::out_par_
private

Structure that holds all the information about what to printout.

Definition at line 105 of file thermodynamicoutput.h.


The documentation for this class was generated from the following files: