diff --git a/CMakeLists_files.cmake b/CMakeLists_files.cmake index af9783ff1..f2e0c9fc7 100644 --- a/CMakeLists_files.cmake +++ b/CMakeLists_files.cmake @@ -41,6 +41,7 @@ list (APPEND MAIN_SOURCE_FILES opm/core/props/satfunc/RelpermDiagnostics.cpp opm/simulators/timestepping/SimulatorReport.cpp opm/simulators/flow/countGlobalCells.cpp + opm/simulators/flow/ConvergenceOutputConfiguration.cpp opm/simulators/flow/KeywordValidation.cpp opm/simulators/flow/SimulatorFullyImplicitBlackoilEbos.cpp opm/simulators/flow/ValidationFunctions.cpp @@ -171,6 +172,7 @@ endif() list (APPEND TEST_SOURCE_FILES tests/test_ALQState.cpp tests/test_blackoil_amg.cpp + tests/test_convergenceoutputconfiguration.cpp tests/test_convergencereport.cpp tests/test_deferredlogger.cpp tests/test_eclinterregflows.cpp @@ -271,6 +273,7 @@ list (APPEND PUBLIC_HEADER_FILES opm/simulators/flow/countGlobalCells.hpp opm/simulators/flow/BlackoilModelEbos.hpp opm/simulators/flow/BlackoilModelParametersEbos.hpp + opm/simulators/flow/ConvergenceOutputConfiguration.hpp opm/simulators/flow/FlowMainEbos.hpp opm/simulators/flow/Main.hpp opm/simulators/flow/NonlinearSolverEbos.hpp diff --git a/opm/simulators/flow/ConvergenceOutputConfiguration.cpp b/opm/simulators/flow/ConvergenceOutputConfiguration.cpp new file mode 100644 index 000000000..384752a66 --- /dev/null +++ b/opm/simulators/flow/ConvergenceOutputConfiguration.cpp @@ -0,0 +1,128 @@ +/* + Copyright 2022 Equinor ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace { + std::vector tokenizeOptionValues(std::string_view options) + { + const auto split = std::regex { R"(\s*,\s*)" }; + return { + std::cregex_token_iterator { + options.begin(), options.end(), split, -1 + }, + std::cregex_token_iterator {} + }; + } + + void reportUnsupportedOptionValuesAndThrow(std::vector unsupp, + std::string_view optionName) + { + std::sort(unsupp.begin(), unsupp.end()); + auto u = std::unique(unsupp.begin(), unsupp.end()); + + const auto pl = (std::distance(unsupp.begin(), u) != 1) ? "s" : ""; + + if (optionName.empty()) { + throw std::invalid_argument { + fmt::format("Unsupported convergence output " + "option value{}: {}\n" + "Supported values are \"none\", " + "\"steps\", and \"iterations\"", + pl, fmt::join(unsupp.begin(), u, ", ")) + }; + } + + throw std::invalid_argument { + fmt::format("Option {}:\n - Unsupported value{}: {}\n" + " - Supported values are \"none\", " + "\"steps\", and \"iterations\"", + optionName, pl, + fmt::join(unsupp.begin(), u, ", ")) + }; + } + + std::vector + getOptions(std::string_view options, std::string_view optionName) + { + using Option = Opm::ConvergenceOutputConfiguration::Option; + + auto opt = std::vector