mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Parameters::Get split out parts of implementation
allows putting it in translation unit
This commit is contained in:
parent
cfad87b41f
commit
ae8dd62fe3
@ -317,6 +317,14 @@ macro (sources_hook)
|
|||||||
include(opencl-source-provider)
|
include(opencl-source-provider)
|
||||||
list(APPEND opm-simulators_SOURCES ${PROJECT_BINARY_DIR}/clSources.cpp)
|
list(APPEND opm-simulators_SOURCES ${PROJECT_BINARY_DIR}/clSources.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
if(QuadMath_FOUND)
|
||||||
|
get_target_property(qm_defs QuadMath::QuadMath INTERFACE_COMPILE_DEFINITIONS)
|
||||||
|
list(APPEND qm_defs HAVE_QUAD=1)
|
||||||
|
get_target_property(qm_options QuadMath::QuadMath INTERFACE_COMPILE_OPTIONS)
|
||||||
|
set_source_files_properties(opm/models/utils/parametersystem.cpp
|
||||||
|
PROPERTIES COMPILE_DEFINITIONS "${qm_defs}"
|
||||||
|
COMPILE_OPTIONS "${qm_options}")
|
||||||
|
endif()
|
||||||
endmacro (sources_hook)
|
endmacro (sources_hook)
|
||||||
|
|
||||||
macro (fortran_hook)
|
macro (fortran_hook)
|
||||||
|
@ -32,6 +32,10 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <opm/models/utils/parametersystem.hpp>
|
#include <opm/models/utils/parametersystem.hpp>
|
||||||
|
|
||||||
|
#if HAVE_QUAD
|
||||||
|
#include <opm/material/common/quad.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
std::string parseKey(std::string& s)
|
std::string parseKey(std::string& s)
|
||||||
@ -143,6 +147,52 @@ namespace Opm::Parameters {
|
|||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
|
template<class ParamType>
|
||||||
|
ParamType Get_(const std::string& paramName, ParamType defaultValue,
|
||||||
|
bool errorIfNotRegistered)
|
||||||
|
{
|
||||||
|
if (errorIfNotRegistered) {
|
||||||
|
if (MetaData::registrationOpen())
|
||||||
|
throw std::runtime_error("Parameters can only retrieved after _all_ of them have "
|
||||||
|
"been registered.");
|
||||||
|
|
||||||
|
if (MetaData::registry().find(paramName) == MetaData::registry().end()) {
|
||||||
|
throw std::runtime_error("Accessing parameter " + paramName
|
||||||
|
+" without prior registration is not allowed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string& defVal = MetaData::mutableRegistry()[paramName].defaultValue;
|
||||||
|
if constexpr (std::is_same_v<ParamType, std::string>) {
|
||||||
|
defaultValue = defVal;
|
||||||
|
}
|
||||||
|
else if constexpr (std::is_same_v<ParamType, bool>) {
|
||||||
|
defaultValue = defVal == "1";
|
||||||
|
}
|
||||||
|
#if HAVE_QUAD
|
||||||
|
else if constexpr (std::is_same_v<ParamType, quad>) {
|
||||||
|
defaultValue = std::strtold(defVal.data(), nullptr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if !HAVE_FLOATING_POINT_FROM_CHARS
|
||||||
|
else if constexpr (std::is_floating_point_v<ParamType>) {
|
||||||
|
defaultValue = std::strtod(defVal.c_str(), nullptr);
|
||||||
|
}
|
||||||
|
#endif // !HAVE_FLOATING_POINT_FROM_CHARS
|
||||||
|
else {
|
||||||
|
std::from_chars(defVal.data(), defVal.data() + defVal.size(), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefix the parameter name by the model's GroupName. E.g. If
|
||||||
|
// the model specifies its group name to be 'Stokes', in an
|
||||||
|
// INI file this would result in something like:
|
||||||
|
//
|
||||||
|
// [Stokes]
|
||||||
|
// NewtonWriteConvergence = true
|
||||||
|
// retrieve actual parameter from the parameter tree
|
||||||
|
return MetaData::tree().template get<ParamType>(paramName, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
void Hide_(const std::string& paramName)
|
void Hide_(const std::string& paramName)
|
||||||
{
|
{
|
||||||
if (!MetaData::registrationOpen()) {
|
if (!MetaData::registrationOpen()) {
|
||||||
@ -709,4 +759,20 @@ int getTtyWidth()
|
|||||||
return ttyWidth;
|
return ttyWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template bool Get_(const std::string&, bool, bool);
|
||||||
|
template double Get_(const std::string&, double, bool);
|
||||||
|
template float Get_(const std::string&, float, bool);
|
||||||
|
template int Get_(const std::string&, int, bool);
|
||||||
|
template long Get_(const std::string&, long, bool);
|
||||||
|
template std::string Get_(const std::string&, std::string, bool);
|
||||||
|
template unsigned Get_(const std::string&, unsigned, bool);
|
||||||
|
|
||||||
|
#if HAVE_QUAD
|
||||||
|
template quad Get_(const std::string&, quad, bool);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Opm::Parameters
|
} // namespace Opm::Parameters
|
||||||
|
@ -84,6 +84,11 @@ auto getParamName()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! \brief Private implementation.
|
||||||
|
template<class ParamType>
|
||||||
|
ParamType Get_(const std::string& paramName, ParamType defaultValue,
|
||||||
|
bool errorIfNotRegistered);
|
||||||
|
|
||||||
//! \brief Private implementation.
|
//! \brief Private implementation.
|
||||||
void Hide_(const std::string& paramName);
|
void Hide_(const std::string& paramName);
|
||||||
|
|
||||||
@ -114,41 +119,6 @@ struct ParamInfo
|
|||||||
bool operator==(const ParamInfo& other) const;
|
bool operator==(const ParamInfo& other) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
|
||||||
* \ingroup Parameter
|
|
||||||
*
|
|
||||||
* \brief Retrieve a runtime parameter.
|
|
||||||
*
|
|
||||||
* The default value is specified in the parameter struct.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* \code
|
|
||||||
* // Retrieves value UpwindWeight, default
|
|
||||||
* // is taken from the property UpwindWeight
|
|
||||||
* ::Opm::Parameters::get<::Opm::Parameters::UpwindWeight>();
|
|
||||||
* \endcode
|
|
||||||
*/
|
|
||||||
template <class Param>
|
|
||||||
auto Get(bool errorIfNotRegistered = true);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* \ingroup Parameter
|
|
||||||
*
|
|
||||||
* \brief Set a runtime parameter.
|
|
||||||
*
|
|
||||||
* Override the default value specified.
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* \code
|
|
||||||
* // Set the value UpwindWeight
|
|
||||||
* ::Opm::Parameters::Set<::Opm::Parameters::UpwindWeight>(3.0);
|
|
||||||
* \endcode
|
|
||||||
*/
|
|
||||||
template <class Param>
|
|
||||||
void SetDefault(decltype(Param::value) new_value);
|
|
||||||
|
|
||||||
struct MetaData
|
struct MetaData
|
||||||
{
|
{
|
||||||
using type = Dune::ParameterTree;
|
using type = Dune::ParameterTree;
|
||||||
@ -299,57 +269,46 @@ void printValues(std::ostream& os = std::cout);
|
|||||||
*/
|
*/
|
||||||
bool printUnused(std::ostream& os = std::cout);
|
bool printUnused(std::ostream& os = std::cout);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup Parameter
|
||||||
|
*
|
||||||
|
* \brief Retrieve a runtime parameter.
|
||||||
|
*
|
||||||
|
* The default value is specified in the parameter struct.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* \code
|
||||||
|
* // Retrieves value UpwindWeight, default
|
||||||
|
* // is taken from the property UpwindWeight
|
||||||
|
* ::Opm::Parameters::get<::Opm::Parameters::UpwindWeight>();
|
||||||
|
* \endcode
|
||||||
|
*/
|
||||||
template <class Param>
|
template <class Param>
|
||||||
auto Get(bool errorIfNotRegistered)
|
auto Get(bool errorIfNotRegistered = true)
|
||||||
{
|
{
|
||||||
const std::string paramName = detail::getParamName<Param>();
|
|
||||||
if (errorIfNotRegistered) {
|
|
||||||
if (MetaData::registrationOpen())
|
|
||||||
throw std::runtime_error("Parameters can only retrieved after _all_ of them have "
|
|
||||||
"been registered.");
|
|
||||||
|
|
||||||
if (MetaData::registry().find(paramName) == MetaData::registry().end()) {
|
|
||||||
throw std::runtime_error("Accessing parameter " + paramName
|
|
||||||
+" without prior registration is not allowed.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
using ParamType = std::conditional_t<std::is_same_v<decltype(Param::value),
|
using ParamType = std::conditional_t<std::is_same_v<decltype(Param::value),
|
||||||
const char* const>, std::string,
|
const char* const>, std::string,
|
||||||
std::remove_const_t<decltype(Param::value)>>;
|
std::remove_const_t<decltype(Param::value)>>;
|
||||||
ParamType defaultValue = Param::value;
|
ParamType defaultValue = Param::value;
|
||||||
|
return detail::Get_(detail::getParamName<Param>(),
|
||||||
const std::string& defVal = MetaData::mutableRegistry()[paramName].defaultValue;
|
defaultValue, errorIfNotRegistered);
|
||||||
if constexpr (std::is_same_v<ParamType, std::string>) {
|
|
||||||
defaultValue = defVal;
|
|
||||||
}
|
|
||||||
else if constexpr (std::is_same_v<ParamType, bool>) {
|
|
||||||
defaultValue = defVal == "1";
|
|
||||||
}
|
|
||||||
#if HAVE_QUAD
|
|
||||||
else if constexpr (std::is_same_v<ParamType, quad>) {
|
|
||||||
defaultValue = std::strtold(defVal.data(), nullptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if !HAVE_FLOATING_POINT_FROM_CHARS
|
|
||||||
else if constexpr (std::is_floating_point_v<ParamType>) {
|
|
||||||
defaultValue = std::strtod(defVal.c_str(), nullptr);
|
|
||||||
}
|
|
||||||
#endif // !HAVE_FLOATING_POINT_FROM_CHARS
|
|
||||||
else {
|
|
||||||
std::from_chars(defVal.data(), defVal.data() + defVal.size(), defaultValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
// prefix the parameter name by the model's GroupName. E.g. If
|
|
||||||
// the model specifies its group name to be 'Stokes', in an
|
|
||||||
// INI file this would result in something like:
|
|
||||||
//
|
|
||||||
// [Stokes]
|
|
||||||
// NewtonWriteConvergence = true
|
|
||||||
// retrieve actual parameter from the parameter tree
|
|
||||||
return MetaData::tree().template get<ParamType>(paramName, defaultValue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \ingroup Parameter
|
||||||
|
*
|
||||||
|
* \brief Set a runtime parameter.
|
||||||
|
*
|
||||||
|
* Override the default value specified.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* \code
|
||||||
|
* // Set the value UpwindWeight
|
||||||
|
* ::Opm::Parameters::Set<::Opm::Parameters::UpwindWeight>(3.0);
|
||||||
|
* \endcode
|
||||||
|
*/
|
||||||
template <class Param>
|
template <class Param>
|
||||||
void SetDefault(decltype(Param::value) new_value)
|
void SetDefault(decltype(Param::value) new_value)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user