opm-simulators
parametersystem.hpp
Go to the documentation of this file.
1 // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 // vi: set et ts=4 sw=4 sts=4:
3 /*
4  This file is part of the Open Porous Media project (OPM).
5 
6  OPM is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 2 of the License, or
9  (at your option) any later version.
10 
11  OPM is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OPM. If not, see <http://www.gnu.org/licenses/>.
18 
19  Consult the COPYING file in the top-level source directory of this
20  module for the precise wording of the license and the list of
21  copyright holders.
22 */
32 #ifndef OPM_PARAMETER_SYSTEM_HPP
33 #define OPM_PARAMETER_SYSTEM_HPP
34 
35 #include <dune/common/classname.hh>
36 
37 #include <cstring>
38 #include <functional>
39 #include <set>
40 #include <sstream>
41 #include <string>
42 #include <type_traits>
43 #include <vector>
44 
45 namespace Opm::Parameters {
46 
47 namespace detail {
48 
49 template <typename, class = void>
50 struct has_name : public std::false_type {};
51 
52 template <typename T>
53 struct has_name<T, std::void_t<decltype(std::declval<T>().name)>>
54 : public std::true_type {};
55 
57 template<class Parameter>
59 {
60  if constexpr (has_name<Parameter>::value) {
61  return Parameter::name;
62  } else {
63  std::string paramName = Dune::className<Parameter>();
64  paramName.replace(0, std::strlen("Opm::Parameters::"), "");
65  const auto pos = paramName.find_first_of('<');
66  if (pos != std::string::npos) {
67  paramName.erase(pos);
68  }
69  return paramName;
70  }
71 }
72 
74 template<class ParamType>
75 ParamType Get_(const std::string& paramName, ParamType defaultValue,
76  bool errorIfNotRegistered);
77 
79 void Hide_(const std::string& paramName);
80 
82 bool HideIfRegistered_(const std::string& paramName);
83 
85 bool IsSet_(const std::string& paramName, bool errorIfNotRegistered);
86 
88 void Register_(const std::string& paramName,
89  const std::string& paramTypeName,
90  const std::string& defaultValue,
91  const char* usageString);
92 
94 void SetDefault_(const std::string& paramName,
95  const std::string& paramValue);
96 
97 }
98 
100 
111 void printUsage(const std::string& helpPreamble,
112  std::ostream& os,
113  const std::string& errorMsg = "",
114  const bool showAll = false);
115 
117 using PositionalArgumentCallback = std::function<int(std::function<void(const std::string&,
118  const std::string&)>,
119  std::set<std::string>&,
120  std::string&,
121  int,
122  const char**,
123  int,
124  int)>;
142 std::string
143 parseCommandLineOptions(int argc,
144  const char **argv,
145  const PositionalArgumentCallback& posArgCallback,
146  const std::string& helpPreamble = "");
147 
154 bool parseParameterFile(const std::string& fileName, bool overwrite = true);
155 
162 void printValues(std::ostream& os);
163 
172 bool printUnused(std::ostream& os);
173 
189 template <class Param>
190 auto Get(bool errorIfNotRegistered = true)
191 {
192  using ParamType = std::conditional_t<std::is_same_v<decltype(Param::value),
193  const char* const>, std::string,
194  std::remove_const_t<decltype(Param::value)>>;
195  ParamType defaultValue = Param::value;
196  return detail::Get_(detail::getParamName<Param>(),
197  defaultValue, errorIfNotRegistered);
198 }
199 
214 template <class Param>
215 void SetDefault(decltype(Param::value) new_value)
216 {
217  const std::string paramName = detail::getParamName<Param>();
218  std::ostringstream oss;
219  oss << new_value;
220  detail::SetDefault_(paramName, oss.str());
221 }
222 
226 struct Parameter
227 {
228  Parameter(const std::string& k, const std::string& v)
229  : key(k), value(v)
230  {}
231 
232  friend std::ostream& operator<<(std::ostream& os, const Parameter& param)
233  {
234  os << param.key << "=\"" << param.value << '"';
235  return os;
236  }
237 
238  bool operator==(const Parameter& setting) const
239  {
240  return setting.key == key
241  && setting.value == value;
242  }
243 
244  bool operator !=(const Parameter& setting) const
245  {
246  return !(*this == setting);
247  }
248 
249  std::string key, value;
250 };
251 
258 void getLists(std::vector<Parameter>& usedParams,
259  std::vector<Parameter>& unusedParams);
260 
264 void reset();
265 
272 template <class Param>
273 bool IsSet(bool errorIfNotRegistered = true)
274 {
275  return detail::IsSet_(detail::getParamName<Param>(), errorIfNotRegistered);
276 }
277 
294 template <class Param>
295 void Register(const char* usageString)
296 {
297  const std::string paramName = detail::getParamName<Param>();
298  const auto defaultValue = Param::value;
299  using ParamType = std::conditional_t<std::is_same_v<decltype(defaultValue),
300  const char* const>, std::string,
301  std::remove_const_t<decltype(defaultValue)>>;
302 
303  std::ostringstream oss;
304  oss << defaultValue;
305  detail::Register_(paramName, Dune::className<ParamType>(), oss.str(), usageString);
306 }
307 
313 template <class Param>
314 void Hide()
315 {
316  detail::Hide_(detail::getParamName<Param>());
317 }
318 
324 template <class Param>
326 {
327  return detail::HideIfRegistered_(detail::getParamName<Param>());
328 }
329 
334 bool IsRegistrationOpen();
335 
343 void endRegistration();
345 
346 } // namespace Opm::Parameters
347 
348 #endif // OPM_PARAMETER_SYSTEM_HPP
auto Get(bool errorIfNotRegistered=true)
Retrieve a runtime parameter.
Definition: parametersystem.hpp:190
void Hide()
Indicate that a given parameter should not be mentioned in the help message.
Definition: parametersystem.hpp:314
void SetDefault(decltype(Param::value) new_value)
Set a runtime parameter.
Definition: parametersystem.hpp:215
bool parseParameterFile(const std::string &fileName, bool overwrite)
Read the parameters from an INI-style file.
Definition: parametersystem.cpp:610
std::string parseCommandLineOptions(int argc, const char **argv, const PositionalArgumentCallback &posArgCallback, const std::string &helpPreamble)
Parse the parameters provided on the command line.
Definition: parametersystem.cpp:683
bool printUnused(std::ostream &os)
Print the list of unused run-time parameters.
Definition: parametersystem.cpp:827
Definition: parametersystem.hpp:50
A struct holding the key-value pair for a parameter.
Definition: parametersystem.hpp:226
Definition: blackoilnewtonmethodparams.hpp:31
void Register(const char *usageString)
Register a run-time parameter.
Definition: parametersystem.hpp:295
void reset()
Reset parameter system.
Definition: parametersystem.cpp:532
auto getParamName()
get the name data member of a parameter
Definition: parametersystem.hpp:58
bool IsSet(bool errorIfNotRegistered=true)
Returns true if a parameter has been specified at runtime, false otherwise.
Definition: parametersystem.hpp:273
void getLists(std::vector< Parameter > &usedParams, std::vector< Parameter > &unusedParams)
Retrieves the lists of parameters specified at runtime and their values.
Definition: parametersystem.cpp:552
bool HideIfRegistered()
Indicate that a given parameter should not be mentioned in the help message if present.
Definition: parametersystem.hpp:325
std::function< int(std::function< void(const std::string &, const std::string &)>, std::set< std::string > &, std::string &, int, const char **, int, int)> PositionalArgumentCallback
Callback function for command line parsing.
Definition: parametersystem.hpp:124
void printValues(std::ostream &os)
Print values of the run-time parameters.
Definition: parametersystem.cpp:778