OGS
ProcessLib/Output/CreateOutput.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "CreateOutput.h"
5
6#include <memory>
7#include <range/v3/algorithm/find.hpp>
8#include <tuple>
9
10#include "BaseLib/ConfigTree.h"
11#include "BaseLib/Logging.h"
12#include "BaseLib/cpp23.h"
13#include "MeshLib/Mesh.h"
15
16namespace
17{
20int convertVtkDataMode(std::string_view const& data_mode)
21{
22 using namespace std::string_view_literals;
23 constexpr std::array data_mode_lookup_table{"Ascii"sv, "Binary"sv,
24 "Appended"sv};
25 auto res = ranges::find(begin(data_mode_lookup_table),
26 end(data_mode_lookup_table), data_mode);
27 if (res == data_mode_lookup_table.end())
28 {
30 "Unsupported vtk output file data mode '{:s}'. Expected Ascii, "
31 "Binary, or Appended.",
32 data_mode);
33 }
34 return static_cast<int>(std::distance(begin(data_mode_lookup_table), res));
35}
36
37bool areOutputNamesUnique(std::vector<ProcessLib::Output> const& outputs)
38{
39 std::vector<std::string> output_names;
40 for (auto const& output : outputs)
41 {
42 auto output_mesh_names = output.getFileNamesForOutput();
43 output_names.insert(output_names.end(), output_mesh_names.begin(),
44 output_mesh_names.end());
45 }
46 std::sort(output_names.begin(), output_names.end());
47 auto const last = std::unique(output_names.begin(), output_names.end());
48 return last == output_names.end();
49}
50} // namespace
51
52namespace ProcessLib
53{
54std::unique_ptr<OutputFormat> createOutputFormat(
55 std::string const& output_directory, OutputType const output_type,
56 std::string prefix, std::string suffix, std::string const& data_mode,
57 bool const compress_output, unsigned int const number_of_files,
58 unsigned int const chunk_size_bytes)
59{
60 switch (output_type)
61 {
62 case OutputType::vtk:
63 return std::make_unique<OutputVTKFormat>(
64 output_directory, std::move(prefix), std::move(suffix),
65 compress_output, convertVtkDataMode(data_mode));
67 return std::make_unique<OutputXDMFHDF5Format>(
68 output_directory, std::move(prefix), std::move(suffix),
69 compress_output, number_of_files, chunk_size_bytes);
70 default:
72 "No supported file type provided. Read '{}' from "
73 "<output><type> in prj file. Supported: VTK, XDMF.",
74 BaseLib::to_underlying(output_type));
75 }
76}
77
78Output createOutput(OutputConfig&& oc, std::string const& output_directory,
79 std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes)
80{
81 auto output_format = createOutputFormat(
82 output_directory, oc.output_type, std::move(oc.prefix),
83 std::move(oc.suffix), oc.data_mode, oc.compress_output,
84 oc.number_of_files, oc.chunk_size_bytes);
85
86 OutputDataSpecification output_data_specification{
87 std::move(oc.output_variables), std::move(oc.fixed_output_times),
88 std::move(oc.repeats_each_steps), oc.output_extrapolation_residuals};
89
90 return {std::move(output_format), oc.output_iteration_results,
91 std::move(output_data_specification),
92 std::move(oc.mesh_names_for_output), meshes};
93}
94
95std::vector<Output> createOutput(
96 const BaseLib::ConfigTree& config,
97 std::string const& output_directory,
98 std::vector<std::unique_ptr<MeshLib::Mesh>>& meshes)
99{
100 std::vector<Output> outputs;
101 auto oc = createOutputConfig(config, meshes);
102 outputs.push_back(createOutput(std::move(oc), output_directory, meshes));
103 return outputs;
104}
105
106std::vector<Output> createOutputs(
107 const BaseLib::ConfigTree& output_configs,
108 std::string const& output_directory,
109 std::vector<std::unique_ptr<MeshLib::Mesh>>& meshes)
110{
111 DBUG("Parse outputs configuration:");
112 std::vector<Output> outputs;
113 for (auto const& output_config :
115 output_configs.getConfigSubtreeList("output"))
116 {
117 auto oc = createOutputConfig(output_config, meshes);
118 outputs.push_back(
119 createOutput(std::move(oc), output_directory, meshes));
120 }
121 if (areOutputNamesUnique(outputs))
122 {
123 return outputs;
124 }
125 else
126 {
127 OGS_FATAL(
128 "Output configuration paths are not unique. This will lead to "
129 "overwritten results or invalid / corrupted data within the "
130 "files.");
131 }
132}
133} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:22
Range< SubtreeIterator > getConfigSubtreeList(std::string const &root) const
constexpr auto to_underlying(E e) noexcept
Converts an enumeration to its underlying type.
Definition cpp23.h:22
OutputConfig createOutputConfig(const BaseLib::ConfigTree &config, std::vector< std::unique_ptr< MeshLib::Mesh > > &meshes)
Output createOutput(OutputConfig &&oc, std::string const &output_directory, std::vector< std::unique_ptr< MeshLib::Mesh > > const &meshes)
std::unique_ptr< OutputFormat > createOutputFormat(std::string const &output_directory, OutputType const output_type, std::string prefix, std::string suffix, std::string const &data_mode, bool const compress_output, unsigned int const number_of_files, unsigned int const chunk_size_bytes)
std::vector< Output > createOutputs(const BaseLib::ConfigTree &output_configs, std::string const &output_directory, std::vector< std::unique_ptr< MeshLib::Mesh > > &meshes)
bool areOutputNamesUnique(std::vector< ProcessLib::Output > const &outputs)
int convertVtkDataMode(std::string_view const &data_mode)
Holds information about which variables to write to output files.