30 if (data_mode ==
"Ascii")
34 if (data_mode ==
"Binary")
38 if (data_mode ==
"Appended")
43 "Unsupported vtk output file data mode '{:s}'. Expected Ascii, Binary, "
49 std::string
const& output_file_prefix,
50 std::string
const& mesh_name)
54 output_file_prefix, mesh_name, 0, 0, 0) +
63 auto const fixed_output_time = std::lower_bound(
66 (std::abs(*fixed_output_time - t) <
67 std::numeric_limits<double>::epsilon()))
76 each_steps = pair.each_steps;
78 if (timestep > pair.repeat * each_steps)
80 timestep -= pair.repeat * each_steps;
88 if (timestep % each_steps == 0)
97 std::string file_prefix, std::string file_suffix,
98 bool const compress_output,
unsigned int const n_files,
99 std::string
const& data_mode,
100 bool const output_nonlinear_iteration_results,
101 std::vector<PairRepeatEachSteps> repeats_each_steps,
102 std::vector<double>&& fixed_output_times,
104 std::vector<std::string>&& mesh_names_for_output,
105 std::vector<std::unique_ptr<MeshLib::Mesh>>
const& meshes)
106 : _output_directory(std::move(directory)),
107 _output_file_type(file_type),
108 _output_file_prefix(std::move(file_prefix)),
109 _output_file_suffix(std::move(file_suffix)),
110 _output_file_compression(compress_output),
113 _output_nonlinear_iteration_results(output_nonlinear_iteration_results),
114 _repeats_each_steps(std::move(repeats_each_steps)),
115 _fixed_output_times(std::move(fixed_output_times)),
116 _output_data_specification(std::move(output_data_specification)),
117 _mesh_names_for_output(mesh_names_for_output),
123 "Vector of fixed output time steps passed to the Output "
124 "constructor must be sorted");
140 std::forward_as_tuple(&process),
141 std::forward_as_tuple(filename));
148 const int process_id,
149 std::string
const& mesh_name_for_output)
156 for (
auto spd_it = range.first; spd_it != range.second; ++spd_it)
158 if (spd_it->second.pvd_filename == filename)
160 if (counter == process_id)
162 pvd_file = &spd_it->second;
168 if (pvd_file ==
nullptr)
171 "The given process is not contained in the output configuration. "
181 std::string
const& prefix, std::string
const& suffix,
182 std::string
const& mesh_name,
int const timestep,
double const t,
183 int const iteration,
int const data_mode_,
184 bool const compression_,
211 std::string prefix, std::string suffix,
212 std::string mesh_name,
213 int const timestep,
double const t,
216 std::map<OutputType, std::string> filetype_to_extension = {
221 std::string extension = filetype_to_extension.at(
type);
223 timestep, t, iteration) +
225 timestep, t, iteration) +
228 catch (std::out_of_range&)
231 "No supported file type provided. Read `{:s}' from <output><type> \
232 in prj file. Supported: VTK, XDMF.",
240 std::vector<std::reference_wrapper<const MeshLib::Mesh>>
249 std::filesystem::path path(output_file.
path);
251 std::move(meshes), path, timestep, t,
266 DBUG(
"output to {:s}", output_file.
path);
278 const int process_id,
282 std::vector<GlobalVector*>
const& x)
287 std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
288 dof_tables.reserve(x.size());
289 for (std::size_t i = 0; i < x.size(); ++i)
294 bool output_secondary_variable =
true;
299 output_secondary_variable,
314 auto output_bulk_mesh =
315 [&](std::vector<std::reference_wrapper<const MeshLib::Mesh>> meshes)
320 for (
auto const& mesh : meshes)
329 findPVDFile(process, process_id, mesh.get().getName());
335 std::string
name = meshes[0].get().getName();
346 std::vector<std::reference_wrapper<const MeshLib::Mesh>> output_meshes;
352 output_meshes.push_back(process.
getMesh());
358 [&mesh_output_name](
auto const& m)
359 {
return m->getName() == mesh_output_name; },
360 "Need mesh '" + mesh_output_name +
"' for the output.");
362 std::vector<MeshLib::Node*>
const& nodes = non_bulk_mesh.getNodes();
363 DBUG(
"Found {:d} nodes for output at mesh '{:s}'.", nodes.size(),
364 non_bulk_mesh.getName());
366 std::vector<std::unique_ptr<NumLib::LocalToGlobalIndexMap>>
368 mesh_dof_tables.reserve(x.size());
369 for (std::size_t i = 0; i < x.size(); ++i)
371 mesh_dof_tables.push_back(
375 std::vector<NumLib::LocalToGlobalIndexMap const*>
376 mesh_dof_table_pointers;
377 mesh_dof_table_pointers.reserve(mesh_dof_tables.size());
378 transform(cbegin(mesh_dof_tables), cend(mesh_dof_tables),
379 back_inserter(mesh_dof_table_pointers),
380 [](std::unique_ptr<NumLib::LocalToGlobalIndexMap>
const& p)
381 {
return p.get(); });
383 output_secondary_variable =
false;
385 t, x, process_id, non_bulk_mesh, dof_tables,
391 output_meshes.push_back(non_bulk_mesh);
394 output_bulk_mesh(std::move(output_meshes));
395 INFO(
"[time] Output of timestep {:d} took {:g} s.", timestep,
400 const int process_id,
404 std::vector<GlobalVector*>
const& x)
419 const int process_id,
423 std::vector<GlobalVector*>
const& x)
436 const int process_id,
437 int const timestep,
const double t,
439 std::vector<GlobalVector*>
const& x)
449 std::vector<NumLib::LocalToGlobalIndexMap const*> dof_tables;
450 for (std::size_t i = 0; i < x.size(); ++i)
455 bool const output_secondary_variable =
true;
459 output_secondary_variable,
479 std::string
const output_file_path =
482 DBUG(
"output iteration results to {:s}", output_file_path);
485 INFO(
"[time] Output took {:g} s.", time_output.
elapsed());
void INFO(char const *fmt, Args const &... args)
void DBUG(char const *fmt, Args const &... args)
Definition of the RunTime class.
double elapsed() const
Get the elapsed time in seconds.
void start()
Start the timer.
void addVTUFile(std::string const &vtu_fname, double timestep)
Add a VTU file to this PVD file.
A subset of nodes on a single mesh.
const std::string getName() const
Get name of the mesh.
LocalToGlobalIndexMap * deriveBoundaryConstrainedMap(int const variable_id, std::vector< int > const &component_ids, MeshLib::MeshSubset &&new_mesh_subset) const
std::vector< PairRepeatEachSteps > _repeats_each_steps
Describes after which timesteps to write output.
void doOutputNonlinearIteration(Process const &process, const int process_id, int const timestep, const double t, const int iteration, std::vector< GlobalVector * > const &x)
bool const _output_file_compression
Enables or disables zlib-compression of the output files.
std::vector< std::string > _mesh_names_for_output
std::string const _output_file_prefix
OutputDataSpecification const _output_data_specification
Output(std::string directory, OutputType const type, std::string prefix, std::string suffix, bool const compress_output, unsigned int n_files, std::string const &data_mode, bool const output_nonlinear_iteration_results, std::vector< PairRepeatEachSteps > repeats_each_steps, std::vector< double > &&fixed_output_times, OutputDataSpecification &&output_data_specification, std::vector< std::string > &&mesh_names_for_output, std::vector< std::unique_ptr< MeshLib::Mesh >> const &meshes)
int const _output_file_data_mode
std::multimap< Process const *, MeshLib::IO::PVDFile > _process_to_pvd_file
void doOutput(Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &x)
void outputMeshXdmf(OutputFile const &output_file, std::vector< std::reference_wrapper< const MeshLib::Mesh >> meshes, int const timestep, double const t)
static void outputMesh(OutputFile const &output_file, MeshLib::IO::PVDFile *const pvd_file, MeshLib::Mesh const &mesh, double const t)
std::string const _output_directory
bool shallDoOutput(int timestep, double const t)
Determines if there should be output at the given timestep or t.
std::vector< double > const _fixed_output_times
Given times that steps have to reach.
OutputType const _output_file_type
void doOutputAlways(Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &x)
unsigned int const _n_files
Specifies the number of hdf5 output files.
void doOutputLastTimestep(Process const &process, const int process_id, int const timestep, const double t, int const iteration, std::vector< GlobalVector * > const &x)
void addProcess(ProcessLib::Process const &process)
TODO doc. Opens a PVD file for each process.
std::string const _output_file_suffix
MeshLib::IO::PVDFile * findPVDFile(Process const &process, const int process_id, std::string const &mesh_name_for_output)
std::unique_ptr< MeshLib::IO::XdmfHdfWriter > _mesh_xdmf_hdf_writer
std::vector< std::unique_ptr< MeshLib::Mesh > > const & _meshes
bool const _output_nonlinear_iteration_results
virtual NumLib::LocalToGlobalIndexMap const & getDOFTable(const int) const
std::vector< std::reference_wrapper< ProcessVariable > > const & getProcessVariables(const int process_id) const
MeshLib::Mesh & getMesh() const
std::vector< std::unique_ptr< IntegrationPointWriter > > const * getIntegrationPointWriter(MeshLib::Mesh const &mesh) const
SecondaryVariableCollection const & getSecondaryVariables() const
bool isMonolithicSchemeUsed() const
std::string constructFormattedFileName(std::string const &format_specification, std::string const &mesh_name, int const timestep, double const t, int const iteration)
std::string joinPaths(std::string const &pathA, std::string const &pathB)
std::iterator_traits< InputIt >::reference findElementOrError(InputIt begin, InputIt end, Predicate predicate, std::string const &error="")
void CoProcess(MeshLib::Mesh const &mesh, double const time, unsigned int const timeStep, bool const lastTimeStep, std::string output_directory)
void addProcessDataToMesh(const double t, std::vector< GlobalVector * > const &x, int const process_id, MeshLib::Mesh &mesh, [[maybe_unused]] std::vector< NumLib::LocalToGlobalIndexMap const * > const &bulk_dof_tables, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::vector< std::reference_wrapper< ProcessVariable >> const &process_variables, SecondaryVariableCollection const &secondary_variables, bool const output_secondary_variable, std::vector< std::unique_ptr< IntegrationPointWriter >> const *const integration_point_writer, OutputDataSpecification const &process_output)
void makeOutput(std::string const &file_name, MeshLib::Mesh const &mesh, bool const compress_output, int const data_mode)
std::string constructPVDName(std::string const &output_directory, std::string const &output_file_prefix, std::string const &mesh_name)
int convertVtkDataMode(std::string const &data_mode)
Holds information about which variables to write to output files.
std::set< std::string > output_variables
All variables that shall be output.
bool const compression
Enables or disables zlib-compression of the output files.
OutputFile(std::string const &directory, OutputType const type, std::string const &prefix, std::string const &suffix, std::string const &mesh_name, int const timestep, double const t, int const iteration, int const data_mode_, bool const compression_, std::set< std::string > const &outputnames, unsigned int const n_files)
static std::string constructFilename(OutputType const type, std::string prefix, std::string suffix, std::string mesh_name, int const timestep, double const t, int const iteration)
std::set< std::string > outputnames