mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-12-02 13:59:12 -06:00
63654a73fc
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.
161 lines
6.6 KiB
C++
161 lines
6.6 KiB
C++
/*
|
|
Copyright 2022 Equinor.
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#define BOOST_TEST_MODULE TestConvergenceOutputConfiguration
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <opm/simulators/flow/ConvergenceOutputConfiguration.hpp>
|
|
|
|
#include <cstddef>
|
|
#include <stdexcept>
|
|
#include <string_view>
|
|
#include <string>
|
|
|
|
BOOST_AUTO_TEST_SUITE(Common_Operations)
|
|
|
|
BOOST_AUTO_TEST_CASE(None)
|
|
{
|
|
const auto config = Opm::ConvergenceOutputConfiguration{"none"};
|
|
BOOST_CHECK_MESSAGE(! config.any(),
|
|
"Configuration object with option value "
|
|
"\"none\" must NOT activate output");
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(Steps)
|
|
{
|
|
const auto config = Opm::ConvergenceOutputConfiguration{"steps"};
|
|
BOOST_CHECK_MESSAGE(config.any(),
|
|
"Configuration object with supported "
|
|
"option value must activate option");
|
|
BOOST_CHECK_MESSAGE(config.want(Opm::ConvergenceOutputConfiguration::Option::Steps),
|
|
"Configuration object with \"steps\" "
|
|
"option value must activate Steps option");
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(Steps_Alias)
|
|
{
|
|
const auto config = Opm::ConvergenceOutputConfiguration{"step"};
|
|
BOOST_CHECK_MESSAGE(config.any(),
|
|
"Configuration object with supported "
|
|
"option value must activate option");
|
|
BOOST_CHECK_MESSAGE(config.want(Opm::ConvergenceOutputConfiguration::Option::Steps),
|
|
"Configuration object with \"step\" "
|
|
"option value must activate Steps option");
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(Iterations)
|
|
{
|
|
const auto config = Opm::ConvergenceOutputConfiguration{"iterations"};
|
|
BOOST_CHECK_MESSAGE(config.any(),
|
|
"Configuration object with supported "
|
|
"option value must activate option");
|
|
BOOST_CHECK_MESSAGE(config.want(Opm::ConvergenceOutputConfiguration::Option::Iterations),
|
|
"Configuration object with \"iterations\" "
|
|
"option value must activate Steps option");
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(Iterations_Alias)
|
|
{
|
|
const auto config = Opm::ConvergenceOutputConfiguration{"iteration"};
|
|
BOOST_CHECK_MESSAGE(config.any(),
|
|
"Configuration object with supported "
|
|
"option value must activate option");
|
|
BOOST_CHECK_MESSAGE(config.want(Opm::ConvergenceOutputConfiguration::Option::Iterations),
|
|
"Configuration object with \"iterations\" "
|
|
"option value must activate Steps option");
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(Combinations)
|
|
{
|
|
const auto steps_iter = Opm::ConvergenceOutputConfiguration{"steps,iterations"};
|
|
BOOST_CHECK_MESSAGE(steps_iter.any(),
|
|
"Configuration object with supported "
|
|
"option value must activate option");
|
|
BOOST_CHECK_MESSAGE(steps_iter.want(Opm::ConvergenceOutputConfiguration::Option::Steps),
|
|
"Configuration object with \"steps\" "
|
|
"option value must activate Steps option");
|
|
BOOST_CHECK_MESSAGE(steps_iter.want(Opm::ConvergenceOutputConfiguration::Option::Iterations),
|
|
"Configuration object with \"iterations\" "
|
|
"option value must activate Steps option");
|
|
|
|
const auto iter_steps = Opm::ConvergenceOutputConfiguration{"iterations,steps"};
|
|
BOOST_CHECK_MESSAGE(iter_steps.any(),
|
|
"Configuration object with supported "
|
|
"option value must activate option");
|
|
BOOST_CHECK_MESSAGE(iter_steps.want(Opm::ConvergenceOutputConfiguration::Option::Steps),
|
|
"Configuration object with \"steps\" "
|
|
"option value must activate Steps option");
|
|
BOOST_CHECK_MESSAGE(iter_steps.want(Opm::ConvergenceOutputConfiguration::Option::Iterations),
|
|
"Configuration object with \"iterations\" "
|
|
"option value must activate Steps option");
|
|
|
|
const auto none_iter_steps = Opm::ConvergenceOutputConfiguration{"none,iterations,steps"};
|
|
BOOST_CHECK_MESSAGE(! none_iter_steps.any(),
|
|
"Configuration object with any option "
|
|
"value \"none\" must NOT activate output");
|
|
|
|
const auto iter_none_steps = Opm::ConvergenceOutputConfiguration{"iterations,none,steps"};
|
|
BOOST_CHECK_MESSAGE(! iter_none_steps.any(),
|
|
"Configuration object with any option "
|
|
"value \"none\" must NOT activate output");
|
|
|
|
const auto steps_iter_none = Opm::ConvergenceOutputConfiguration{"steps,iterations, none"};
|
|
BOOST_CHECK_MESSAGE(! steps_iter_none.any(),
|
|
"Configuration object with any option "
|
|
"value \"none\" must NOT activate output");
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END() // Common_Operations
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
BOOST_AUTO_TEST_SUITE(Failed_Construction)
|
|
|
|
BOOST_AUTO_TEST_CASE(Misprint)
|
|
{
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"nonce"},
|
|
std::invalid_argument);
|
|
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"stepS"},
|
|
std::invalid_argument);
|
|
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"steps, iter"},
|
|
std::invalid_argument);
|
|
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"steps, iterations, non"},
|
|
std::invalid_argument);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(Unknown)
|
|
{
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"Hello"},
|
|
std::invalid_argument);
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"meow"},
|
|
std::invalid_argument);
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{""},
|
|
std::invalid_argument);
|
|
BOOST_CHECK_THROW(Opm::ConvergenceOutputConfiguration{"xyz,zy;;;"},
|
|
std::invalid_argument);
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|