From 63654a73fc15b045f900281d8d1b941333c0921a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Tue, 13 Dec 2022 14:05:17 +0100 Subject: [PATCH] Don't Output INFOSTEP File by Default This commit introduces a new helper class, ConvergenceOutputConfiguration which parses comma separated option strings into a runtime configuration object for whether to output additional convergence information and, if so, what information to output. Supported option string values are * "none" -- Dont want any additional convergence output. * "steps" -- Want additional convergence output pertaining to the converged solution at the end of each timestep. * "iterations" -- Want additional convergence output pertaining to each non-linar ieration in each timestep. Option value "none" overrides all other options. In other words, if the user requests "none", then there will be no additional convergence output, even if there are other options in the option string. We add a new option, ExtraConvergenceOutput (command line option --extra-convergence-output), which takes a string argument expected to be a comma separated combination of these options. The default value is "none". Finally, make the INFOSTEP file output conditional on the user supplying "steps" as an argument to the new option. --- CMakeLists_files.cmake | 3 + .../flow/ConvergenceOutputConfiguration.cpp | 128 ++++++++++++++ .../flow/ConvergenceOutputConfiguration.hpp | 93 ++++++++++ opm/simulators/flow/FlowMainEbos.hpp | 47 +++-- .../SimulatorFullyImplicitBlackoilEbos.hpp | 21 +++ tests/test_convergenceoutputconfiguration.cpp | 160 ++++++++++++++++++ 6 files changed, 434 insertions(+), 18 deletions(-) create mode 100644 opm/simulators/flow/ConvergenceOutputConfiguration.cpp create mode 100644 opm/simulators/flow/ConvergenceOutputConfiguration.hpp create mode 100644 tests/test_convergenceoutputconfiguration.cpp 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