14 #include "smash/config.h" 25 base_path_(
std::move(path)),
26 is_thermodynamics_output_(name ==
"Thermodynamics") {
27 const auto &log = logger<LogArea::Output>();
29 log.warn() <<
"Creating VTK output: There is no extended VTK format.";
60 const int event_number) {
81 const std::unique_ptr<Clock> &,
91 snprintf(filename,
sizeof(filename),
"pos_ev%05i_tstep%05i.vtk",
96 std::fprintf(file_.get(),
"# vtk DataFile Version 2.0\n");
97 std::fprintf(file_.get(),
"Generated from molecular-offset data %s\n",
99 std::fprintf(file_.get(),
"ASCII\n");
102 std::fprintf(file_.get(),
"DATASET UNSTRUCTURED_GRID\n");
103 std::fprintf(file_.get(),
"POINTS %zu double\n", particles.
size());
104 for (
const auto &
p : particles) {
105 std::fprintf(file_.get(),
"%g %g %g\n",
p.position().x1(),
106 p.position().x2(),
p.position().x3());
108 std::fprintf(file_.get(),
"CELLS %zu %zu\n", particles.size(),
109 particles.size() * 2);
110 for (
size_t point_index = 0; point_index < particles.size(); point_index++) {
111 std::fprintf(file_.get(),
"1 %zu\n", point_index);
113 std::fprintf(file_.get(),
"CELL_TYPES %zu\n", particles.size());
114 for (
size_t point_index = 0; point_index < particles.size(); point_index++) {
115 std::fprintf(file_.get(),
"1\n");
117 std::fprintf(file_.get(),
"POINT_DATA %zu\n", particles.size());
118 std::fprintf(file_.get(),
"SCALARS pdg_codes int 1\n");
119 std::fprintf(file_.get(),
"LOOKUP_TABLE default\n");
120 for (
const auto &
p : particles) {
121 std::fprintf(file_.get(),
"%s\n",
p.pdgcode().string().c_str());
123 std::fprintf(file_.get(),
"SCALARS is_formed int 1\n");
124 std::fprintf(file_.get(),
"LOOKUP_TABLE default\n");
125 double current_time = particles.time();
126 for (
const auto &
p : particles) {
127 std::fprintf(file_.get(),
"%s\n",
128 (
p.formation_time() > current_time) ?
"0" :
"1");
130 std::fprintf(file_.get(),
"SCALARS cross_section_scaling_factor double 1\n");
131 std::fprintf(file_.get(),
"LOOKUP_TABLE default\n");
132 for (
const auto &
p : particles) {
133 std::fprintf(file_.get(),
"%g\n",
p.xsec_scaling_factor());
135 std::fprintf(file_.get(),
"SCALARS mass double 1\n");
136 std::fprintf(file_.get(),
"LOOKUP_TABLE default\n");
137 for (
const auto &
p : particles) {
138 std::fprintf(file_.get(),
"%g\n",
p.effective_mass());
140 std::fprintf(file_.get(),
"SCALARS N_coll int 1\n");
141 std::fprintf(file_.get(),
"LOOKUP_TABLE default\n");
142 for (
const auto &
p : particles) {
143 std::fprintf(file_.get(),
"%i\n",
p.get_history().collisions_per_particle);
145 std::fprintf(file_.get(),
"SCALARS particle_ID int 1\n");
146 std::fprintf(file_.get(),
"LOOKUP_TABLE default\n");
147 for (
const auto &
p : particles) {
148 std::fprintf(file_.get(),
"%i\n",
p.id());
151 std::fprintf(file_.get(),
"VECTORS momentum double\n");
152 for (
const auto &
p : particles) {
153 std::fprintf(file_.get(),
"%g %g %g\n",
p.momentum().x1(),
154 p.momentum().x2(),
p.momentum().x3());
167 template <
typename T>
170 const std::string &description) {
173 const auto orig = lattice.
origin();
174 file <<
"# vtk DataFile Version 2.0\n" 175 << description <<
"\n" 177 <<
"DATASET STRUCTURED_POINTS\n" 178 <<
"DIMENSIONS " << dim[0] <<
" " << dim[1] <<
" " << dim[2] <<
"\n" 179 <<
"SPACING " << cs[0] <<
" " << cs[1] <<
" " << cs[2] <<
"\n" 180 <<
"ORIGIN " << orig[0] <<
" " << orig[1] <<
" " << orig[2] <<
"\n" 181 <<
"POINT_DATA " << lattice.
size() <<
"\n";
184 template <
typename T,
typename F>
187 const std::string &varname, F &&get_quantity) {
188 file <<
"SCALARS " << varname <<
" double 1\n" 189 <<
"LOOKUP_TABLE default\n";
190 file << std::setprecision(3);
194 const double f_from_node = get_quantity(node);
195 file << f_from_node <<
" ";
196 if (ix == dim[0] - 1) {
202 template <
typename T,
typename F>
205 const std::string &varname, F &&get_quantity) {
206 file <<
"VECTORS " << varname <<
" double\n";
207 file << std::setprecision(3);
212 file << v.
x1() <<
" " << v.
x2() <<
" " << v.
x3() <<
"\n";
218 snprintf(suffix,
sizeof(suffix),
"_%05i_tstep%05i.vtk",
current_event_,
220 return base_path_.string() + std::string(
"/") + descr + std::string(suffix);
225 return std::string(
to_string(dens_type)) + std::string(
"_") +
236 const std::string varname =
make_varname(tq, dens_type);
267 const std::string varname =
make_varname(tq, dens_type);
272 for (
int i = 0; i < 4; i++) {
273 for (
int j = i; j < 4; j++) {
275 varname + std::to_string(i) + std::to_string(j),
285 for (
int i = 0; i < 4; i++) {
286 for (
int j = i; j < 4; j++) {
288 varname + std::to_string(i) + std::to_string(j),
FilePtr fopen(const bf::path &filename, const std::string &mode)
Open a file with given mode.
A class to pre-calculate and store parameters relevant for density calculation.
A class for time-efficient (time-memory trade-off) calculation of density on the lattice.
The ThreeVector class represents a physical three-vector with the components .
void at_eventstart(const Particles &particles, const int event_number) override
Writes the initial particle information list of an event to the VTK output.
void write_vtk_vector(std::ofstream &file, RectangularLattice< T > &lat, const std::string &varname, F &&function)
Write a VTK vector.
void write_vtk_header(std::ofstream &file, RectangularLattice< T > &lat, const std::string &description)
Write the VTK header.
static std::int8_t tmn_index(std::int8_t mu, std::int8_t nu)
Access the index of component .
void thermodynamics_output(const ThermodynamicQuantity tq, const DensityType dt, RectangularLattice< DensityOnLattice > &lattice) override
Prints the density lattice in VTK format on a grid.
bool part_extended
Extended format for particles output.
int vtk_tmn_output_counter_
Number of energy-momentum tensor lattice vtk output in current event.
const std::array< int, 3 > & dimensions() const
int vtk_v_landau_output_counter_
Number of Landau rest frame velocity vtk output in current event.
EnergyMomentumTensor boosted(const FourVector &u) const
Boost to a given 4-velocity.
RectangularLattice< ThermLatticeNode > & lattice() const
Getter function for the lattice.
const bf::path base_path_
filesystem path for output
A container class to hold all the arrays on the lattice and access them.
int current_event_
Event number.
std::string make_filename(const std::string &description, int counter)
Make a file name given a description and a counter.
ThermodynamicQuantity
Represents thermodynamic quantities that can be printed out.
ThreeVector velocity() const
Get the velocity (3-vector divided by zero component).
int vtk_tmn_landau_output_counter_
Number of Landau frame energy-momentum tensor vtk output in current event.
FourVector landau_frame_4velocity() const
Find the Landau frame 4-velocity from energy-momentum tensor.
std::unique_ptr< std::FILE, FileDeleter > FilePtr
A RAII type to replace std::FILE *.
int vtk_output_counter_
Number of vtk output in current event.
void write_vtk_scalar(std::ofstream &file, RectangularLattice< T > &lat, const std::string &varname, F &&function)
Write a VTK scalar.
Helper structure for Experiment to hold output options and parameters.
The GrandCanThermalizer class implements the following functionality:
The EnergyMomentumTensor class represents a symmetric positive semi-definite energy-momentum tensor ...
void at_intermediate_time(const Particles &particles, const std::unique_ptr< Clock > &clock, const DensityParameters &dens_param) override
Writes out all current particles.
int vtk_fluidization_counter_
Number of fluidization output.
bool is_thermodynamics_output_
Is the VTK output a thermodynamics output.
const std::array< double, 3 > & origin() const
int vtk_density_output_counter_
Number of density lattice vtk output in current event.
The ThermLatticeNode class is intended to compute thermodynamical quantities in a cell given a set of...
void at_eventend(const Particles &particles, const int event_number, double impact_parameter, bool empty_event) override
Writes the final particle information list of an event to the VTK output.
const char * to_string(const ThermodynamicQuantity tq)
Convert thermodynamic quantities to strings.
void write(const Particles &particles)
Write the given particles to the output.
The Particles class abstracts the storage and manipulation of particles.
DensityType
Allows to choose which kind of density to calculate.
const std::array< double, 3 > & cell_sizes() const
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
VtkOutput(const bf::path &path, const std::string &name, const OutputParameters &out_par)
Create a new VTK output.
std::string make_varname(const ThermodynamicQuantity tq, const DensityType dens_type)
Make a variable name given quantity and density type.
double density(const double norm_factor=1.0)
Compute the net Eckart density on the local lattice.
void iterate_sublattice(const std::array< int, 3 > &lower_bounds, const std::array< int, 3 > &upper_bounds, F &&func)
A sub-lattice iterator, which iterates in a 3D-structured manner and calls a function on every cell...
Abstraction of generic output.