From 479145028ad42112d94e62d2c7cec3aa9bc5f7b0 Mon Sep 17 00:00:00 2001 From: Tobias Meisel <tobias.meisel@ufz.de> Date: Fri, 9 Oct 2020 12:24:44 +0200 Subject: [PATCH] [PL/MeL] Introduce enum for different file formats --- ProcessLib/Output/CreateOutput.cpp | 29 ++++++----- ProcessLib/Output/Output.cpp | 77 ++++++++++++++--------------- ProcessLib/Output/Output.h | 4 +- ProcessLib/Output/ProcessOutput.cpp | 10 ++-- ProcessLib/Output/ProcessOutput.h | 9 +++- 5 files changed, 70 insertions(+), 59 deletions(-) diff --git a/ProcessLib/Output/CreateOutput.cpp b/ProcessLib/Output/CreateOutput.cpp index f0681235cbf..c8723549fdd 100644 --- a/ProcessLib/Output/CreateOutput.cpp +++ b/ProcessLib/Output/CreateOutput.cpp @@ -21,7 +21,6 @@ #include "MeshLib/Mesh.h" #include "Output.h" -#include <algorithm> namespace ProcessLib { @@ -32,17 +31,23 @@ std::unique_ptr<Output> createOutput( { DBUG("Parse output configuration:"); - //! \ogs_file_param{prj__time_loop__output__type} - auto const type = config.getConfigParameter<std::string>("type"); - constexpr std::array data_formats = { "VTK", "XDMF" }; - auto format_is_allowed = std::any_of(data_formats.cbegin(), data_formats.cend(), - [&type](std::string i ){ return i == type; }); - if (!format_is_allowed) + OutputTypes const output_type = [](auto type) { - OGS_FATAL("No supported file type provided. Read `{:s}' from <output><type> \ - in prj File. Supported: VTK, XDMF.", - type); - } + try + { + + const std::map<std::string, OutputTypes> outputType_to_enum= + {{"VTK",OutputTypes::vtk}, {"XDMF", OutputTypes::xdmf}}; + return outputType_to_enum.at(type); + } + catch (std::out_of_range& e) + { + OGS_FATAL("No supported file type provided. Read `{:s}' from <output><type> \ + in prj File. Supported: VTK, XDMF.", + type); + } + //! \ogs_file_param{prj__time_loop__output__type} + }(config.getConfigParameter<std::string>("type")); auto const prefix = //! \ogs_file_param{prj__time_loop__output__prefix} @@ -153,7 +158,7 @@ std::unique_ptr<Output> createOutput( config.getConfigParameter<bool>("output_iteration_results", false); return std::make_unique<Output>( - output_directory, type, prefix, suffix, compress_output, data_mode, + output_directory, output_type, prefix, suffix, compress_output, data_mode, output_iteration_results, std::move(repeats_each_steps), std::move(fixed_output_times), std::move(output_data_specification), std::move(mesh_names_for_output), meshes); diff --git a/ProcessLib/Output/Output.cpp b/ProcessLib/Output/Output.cpp index 7dd1179bc6e..9fa5bd779d7 100644 --- a/ProcessLib/Output/Output.cpp +++ b/ProcessLib/Output/Output.cpp @@ -11,9 +11,9 @@ #include "Output.h" #include <cassert> +#include <exception> #include <fstream> #include <vector> -#include <exception> #include "Applications/InSituLib/Adaptor.h" #include "BaseLib/Logging.h" @@ -95,10 +95,9 @@ bool Output::shallDoOutput(int timestep, double const t) return false; } -Output::Output(std::string output_directory, std::string output_file_type, - std::string output_file_prefix, - std::string output_file_suffix, bool const compress_output, - std::string const& data_mode, +Output::Output(std::string output_directory, OutputTypes output_file_type, + std::string output_file_prefix, std::string output_file_suffix, + bool const compress_output, std::string const& data_mode, bool const output_nonlinear_iteration_results, std::vector<PairRepeatEachSteps> repeats_each_steps, std::vector<double>&& fixed_output_times, @@ -106,7 +105,7 @@ Output::Output(std::string output_directory, std::string output_file_type, std::vector<std::string>&& mesh_names_for_output, std::vector<std::unique_ptr<MeshLib::Mesh>> const& meshes) : _output_directory(std::move(output_directory)), - _output_file_type(std::move(output_file_type)), + _output_file_type(output_file_type), _output_file_prefix(std::move(output_file_prefix)), _output_file_suffix(std::move(output_file_suffix)), _output_file_compression(compress_output), @@ -182,68 +181,68 @@ MeshLib::IO::PVDFile* Output::findPVDFile( struct Output::OutputFile { - OutputFile(std::string const& directory, std::string const& type, - std::string const& prefix, - std::string const& suffix, std::string const& mesh_name, - int const process_id, int const timestep, double const t, - int const data_mode_, bool const compression_): - name(constructFilename(type, prefix, suffix, mesh_name, process_id, - timestep, t)), - path(BaseLib::joinPaths(directory, name)), - type(type), - data_mode(data_mode_), - compression(compression_) + OutputFile(std::string const& directory, OutputTypes const type, + std::string const& prefix, std::string const& suffix, + std::string const& mesh_name, int const process_id, + int const timestep, double const t, int const data_mode_, + bool const compression_) + : name(constructFilename(type, prefix, suffix, mesh_name, process_id, + timestep, t)), + path(BaseLib::joinPaths(directory, name)), + type(type), + data_mode(data_mode_), + compression(compression_) { } std::string const name; std::string const path; + OutputTypes const type; //! Chooses vtk's data mode for output following the enumeration given /// in the vtkXMLWriter: {Ascii, Binary, Appended}. See vtkXMLWriter /// documentation /// http://www.vtk.org/doc/nightly/html/classvtkXMLWriter.html - std::string const type; int const data_mode; //! Enables or disables zlib-compression of the output files. bool const compression; - static std::string constructFilename(std::string type, std::string prefix, - std::string suffix, std::string mesh_name, - int process_id, int timestep, double t) + static std::string constructFilename(OutputTypes type, std::string prefix, + std::string suffix, + std::string mesh_name, int process_id, + int timestep, double t) { - std::map<std::string, std::string> filetype_to_extension = - {{"VTK", "vtu"}, {"XDMF", "xdmf"} }; + std::map<OutputTypes, std::string> filetype_to_extension = { + {OutputTypes::vtk, "vtu"}, {OutputTypes::xdmf, "xdmf"}}; try { std::string extension = filetype_to_extension.at(type); - std::string name = BaseLib::constructFormattedFileName(prefix, mesh_name, - process_id, timestep, t) + - BaseLib::constructFormattedFileName(suffix, mesh_name, - process_id, timestep, t) + - "." + - extension; + std::string name = BaseLib::constructFormattedFileName( + prefix, mesh_name, process_id, timestep, t) + + BaseLib::constructFormattedFileName( + suffix, mesh_name, process_id, timestep, t) + + "." + extension; return name; } catch (std::out_of_range& e) { - OGS_FATAL("No supported file type provided. Read `{:s}' from <output><type> \ + OGS_FATAL( + "No supported file type provided. Read `{:s}' from <output><type> \ in prj file. Supported: VTK, XDMF.", - type); + type); } - } }; void Output::outputMesh(OutputFile const& output_file, - MeshLib::IO::PVDFile* const pvd_file, - MeshLib::Mesh const& mesh, - double const t) const + MeshLib::IO::PVDFile* const pvd_file, + MeshLib::Mesh const& mesh, + double const t) const { DBUG("output to {:s}", output_file.path); - if (output_file.type == "VTK") + if (output_file.type == OutputTypes::vtk) { pvd_file->addVTUFile(output_file.name, t); } @@ -297,11 +296,11 @@ void Output::doOutputAlways(Process const& process, _output_file_compression); MeshLib::IO::PVDFile* pvd_file = nullptr; - if (_output_file_type=="VTK") + if (_output_file_type == ProcessLib::OutputTypes::vtk) { - pvd_file= findPVDFile(process, process_id, mesh.getName()); + pvd_file = findPVDFile(process, process_id, mesh.getName()); } - outputMesh(file, pvd_file, mesh, t ); + outputMesh(file, pvd_file, mesh, t); }; for (auto const& mesh_output_name : _mesh_names_for_output) diff --git a/ProcessLib/Output/Output.h b/ProcessLib/Output/Output.h index 3c796332f83..907189d01f2 100644 --- a/ProcessLib/Output/Output.h +++ b/ProcessLib/Output/Output.h @@ -37,7 +37,7 @@ public: }; public: - Output(std::string output_directory, std::string type, + Output(std::string output_directory, OutputTypes type, std::string prefix, std::string suffix, bool const compress_output, std::string const& data_mode, bool const output_nonlinear_iteration_results, @@ -88,7 +88,7 @@ private: double const t) const; private: std::string const _output_directory; - std::string const _output_file_type; + OutputTypes const _output_file_type; std::string const _output_file_prefix; std::string const _output_file_suffix; diff --git a/ProcessLib/Output/ProcessOutput.cpp b/ProcessLib/Output/ProcessOutput.cpp index c0413ee49b6..9d5727a3657 100644 --- a/ProcessLib/Output/ProcessOutput.cpp +++ b/ProcessLib/Output/ProcessOutput.cpp @@ -251,7 +251,8 @@ void addProcessDataToMesh( } void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh, - bool const compress_output, int const data_mode, std::string const& file_type) + bool const compress_output, int const data_mode, + OutputTypes file_type) { // Write output file DBUG("Writing output to '{:s}'.", file_name); @@ -269,12 +270,13 @@ void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh, #endif //_WIN32 #endif //__APPLE__ - if (file_type=="VTK") + if (file_type == OutputTypes::vtk) { - MeshLib::IO::VtuInterface vtu_interface(&mesh, data_mode, compress_output); + MeshLib::IO::VtuInterface vtu_interface(&mesh, data_mode, + compress_output); vtu_interface.writeToFile(file_name); } - else if (file_type=="XDMF") + else if (file_type == OutputTypes::xdmf) { MeshLib::IO::writeXdmf3(mesh, file_name); } diff --git a/ProcessLib/Output/ProcessOutput.h b/ProcessLib/Output/ProcessOutput.h index 688480c2e3a..b75a0111e7c 100644 --- a/ProcessLib/Output/ProcessOutput.h +++ b/ProcessLib/Output/ProcessOutput.h @@ -42,11 +42,16 @@ void addProcessDataToMesh( integration_point_writer, OutputDataSpecification const& output_data_specification); -//! Writes output to the given \c file_name using the VTU file format. +//! Writes output to the given \c file_name using the specified file format. /// /// See Output::_output_file_data_mode documentation for the data_mode /// parameter. +enum class OutputTypes : uint8_t +{ + vtk, + xdmf +}; void makeOutput(std::string const& file_name, MeshLib::Mesh const& mesh, bool const compress_output, int const data_mode, - std::string const& file_type); + OutputTypes const file_type); } // namespace ProcessLib -- GitLab