tConfigInterface.hh - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
HTML git clone git://src.adamsgaard.dk/pism
DIR Log
DIR Files
DIR Refs
DIR LICENSE
---
tConfigInterface.hh (7579B)
---
1 /* Copyright (C) 2015, 2016, 2017, 2018 PISM Authors
2 *
3 * This file is part of PISM.
4 *
5 * PISM is free software; you can redistribute it and/or modify it under the
6 * terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * PISM is distributed in the hope that it will be useful, but WITHOUT ANY
11 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with PISM; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19
20 #ifndef _PISMCONFIGINTERFACE_H_
21 #define _PISMCONFIGINTERFACE_H_
22
23 #include <memory>
24 #include <set>
25 #include <map>
26 #include <string>
27 #include <vector>
28
29 #include <mpi.h>
30
31 #include "Units.hh"
32
33 namespace pism {
34
35 class File;
36 class Logger;
37
38
39 //! Flag used by `set_...()` methods.
40 /** Meanings:
41 *
42 * - `DEFAULT`: set the default value; has no effect if a parameter was set by a user at the time
43 * of the call
44 * - `FORCE`: forcibly set a parameter; unconditionally overrides previous values
45 * - `USER`: forcibly set a parameter; unconditionally overrides previous values and marks this
46 * parameter as set by the user. This affects future `set_...()` calls using the `DEFAULT` flag
47 * value and results of `parameters_set_by_user()`.
48 */
49 enum ConfigSettingFlag {CONFIG_DEFAULT = 0, CONFIG_FORCE = 1, CONFIG_USER = 2};
50
51
52 //! A class for storing and accessing PISM configuration flags and parameters.
53 class Config {
54 public:
55 typedef std::shared_ptr<Config> Ptr;
56 typedef std::shared_ptr<const Config> ConstPtr;
57
58 Config(units::System::Ptr unit_system);
59 virtual ~Config();
60
61 //! Flag used by `get_...()` methods.
62 /** Meanings:
63 *
64 * - `REMEMBER_THIS_USE` (the default): add the name of a parameter to the list of parameters used
65 * by a model run.
66 * - `FORGET_THIS_USE`: don't add the name of a parameter to the list of used parameters. This is
67 * necessary to be able to get the current value of a parameter to be used as the default when
68 * processing a command-line option.
69 */
70 enum UseFlag {REMEMBER_THIS_USE = 0, FORGET_THIS_USE = 1};
71
72 // Import settings from an override file
73 void import_from(const Config &other);
74
75 const std::set<std::string>& parameters_set_by_user() const;
76 const std::set<std::string>& parameters_used() const;
77
78 void read(MPI_Comm com, const std::string &filename);
79 void write(MPI_Comm com, const std::string &filename, bool append = true) const;
80 std::string filename() const;
81
82 void read(const File &nc);
83 void write(const File &nc) const;
84
85 bool is_set(const std::string &name) const;
86
87 // doubles
88 typedef std::map<std::string, std::vector<double> > Doubles;
89 Doubles all_doubles() const;
90
91 double get_number(const std::string &name, UseFlag flag = REMEMBER_THIS_USE) const;
92 double get_number(const std::string &name, const std::string &units,
93 UseFlag flag = REMEMBER_THIS_USE) const;
94 std::vector<double> get_numbers(const std::string &name, UseFlag flag = REMEMBER_THIS_USE) const;
95 std::vector<double> get_numbers(const std::string &name, const std::string &units,
96 UseFlag flag = REMEMBER_THIS_USE) const;
97
98 void set_number(const std::string &name, double value, ConfigSettingFlag flag = CONFIG_FORCE);
99 void set_numbers(const std::string &name, const std::vector<double> &values,
100 ConfigSettingFlag flag = CONFIG_FORCE);
101
102 // strings
103 typedef std::map<std::string, std::string> Strings;
104 Strings all_strings() const;
105
106 std::string get_string(const std::string &name, UseFlag flag = REMEMBER_THIS_USE) const;
107 void set_string(const std::string &name, const std::string &value, ConfigSettingFlag flag = CONFIG_FORCE);
108
109 // flags
110 typedef std::map<std::string, bool> Flags;
111 Flags all_flags() const;
112
113 std::set<std::string> keys() const;
114
115 bool get_flag(const std::string& name, UseFlag flag = REMEMBER_THIS_USE) const;
116 void set_flag(const std::string& name, bool value, ConfigSettingFlag flag = CONFIG_FORCE);
117
118 std::string doc(const std::string ¶meter) const;
119 std::string units(const std::string ¶meter) const;
120 std::string type(const std::string ¶meter) const;
121 std::string option(const std::string ¶meter) const;
122 std::string choices(const std::string ¶meter) const;
123 // Implementations
124 protected:
125 virtual void read_impl(const File &nc) = 0;
126 virtual void write_impl(const File &nc) const = 0;
127
128 virtual bool is_set_impl(const std::string &name) const = 0;
129
130 virtual Doubles all_doubles_impl() const = 0;
131 virtual double get_number_impl(const std::string &name) const = 0;
132 virtual std::vector<double> get_numbers_impl(const std::string &name) const = 0;
133
134 virtual void set_number_impl(const std::string &name, double value) = 0;
135 virtual void set_numbers_impl(const std::string &name,
136 const std::vector<double> &values) = 0;
137
138 virtual Strings all_strings_impl() const = 0;
139 virtual std::string get_string_impl(const std::string &name) const = 0;
140 virtual void set_string_impl(const std::string &name, const std::string &value) = 0;
141
142 virtual Flags all_flags_impl() const = 0;
143
144 virtual bool get_flag_impl(const std::string& name) const = 0;
145 virtual void set_flag_impl(const std::string& name, bool value) = 0;
146 private:
147 struct Impl;
148 Impl *m_impl;
149 };
150
151 class ConfigWithPrefix {
152 public:
153 ConfigWithPrefix(Config::ConstPtr c, const std::string &prefix);
154
155 double get_number(const std::string &name) const;
156 double get_number(const std::string &name, const std::string &units) const;
157
158 std::string get_string(const std::string &name) const;
159
160 bool get_flag(const std::string& name) const;
161
162 void reset_prefix(const std::string &prefix);
163
164 private:
165 std::string m_prefix;
166 Config::ConstPtr m_config;
167 };
168
169 Config::Ptr config_from_options(MPI_Comm com, const Logger &log, units::System::Ptr unit_system);
170
171 //! Set configuration parameters using command-line options.
172 void set_config_from_options(Config &config);
173
174 //! Set one parameter using command-line options.
175 void set_parameter_from_options(Config &config, const std::string &name);
176
177 //! Set one flag parameter using command-line options.
178 void set_flag_from_option(Config &config,
179 const std::string &option,const std::string ¶meter);
180
181 //! Set one scalar parameter using command-line options.
182 void set_number_from_option(Config &config,
183 const std::string &option, const std::string ¶meter);
184
185 //! Set one free-form string parameter using command-line options.
186 void set_string_from_option(Config &config,
187 const std::string &option, const std::string ¶meter);
188
189 //! Set one keyword parameter using command-line options.
190 void set_keyword_from_option(Config &config,
191 const std::string &option, const std::string ¶meter,
192 const std::string &choices);
193
194 //! Report configuration parameters to `stdout`.
195 void print_config(const Logger &log, int verbosity_threshhold, const Config &config);
196
197 //! Report unused configuration parameters to `stdout`.
198 void print_unused_parameters(const Logger &log, int verbosity_threshhold,
199 const Config &config);
200
201 } // end of namespace pism
202
203 #endif /* _PISMCONFIGINTERFACE_H_ */