/*
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