PISM, A Parallel Ice Sheet Model 2.3.0-79cae578d committed by Constantine Khrulev on 2026-03-22
Loading...
Searching...
No Matches
Config.hh
Go to the documentation of this file.
1/* Copyright (C) 2015, 2016, 2017, 2018, 2021, 2022, 2023, 2024, 2025, 2026 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 _PISM_CONFIG_H_
21#define _PISM_CONFIG_H_
22
23#include <memory>
24#include <set>
25#include <map>
26#include <string>
27#include <vector>
28#include <utility> // std::pair
29
30#include <mpi.h> // MPI_Comm
31
32#include "pism/util/VariableMetadata.hh"
33#include "pism/util/Units.hh"
34
35namespace pism {
36
37class File;
38class OutputFile;
39class Logger;
40
41
42//! Flag used by `set_...()` methods.
43/** Meanings:
44 *
45 * - `DEFAULT`: set the default value; has no effect if a parameter was set by a user at the time
46 * of the call
47 * - `FORCE`: forcibly set a parameter; unconditionally overrides previous values
48 * - `USER`: forcibly set a parameter; unconditionally overrides previous values and marks this
49 * parameter as set by the user. This affects future `set_...()` calls using the `DEFAULT` flag
50 * value and results of `parameters_set_by_user()`.
51 */
53
54
55//! A class for storing and accessing PISM configuration flags and parameters.
56class Config {
57public:
58 Config(std::shared_ptr<units::System> 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 */
71
72 //! Maximum length of the JSON string (for writing to output files)
73 static int max_length;
74
75 // Import settings from an override file
76 void import_from(const Config &other);
77
78 // Use `realpath()` to resolve relative file names.
79 void resolve_filenames();
80
81 const std::set<std::string>& parameters_set_by_user() const;
82 const std::set<std::string>& parameters_used() const;
83
84 void read(MPI_Comm com, const std::string &filename);
85 std::string filename() const;
86
87 void read(const File &file);
88
89 bool is_set(const std::string &name) const;
90
91 //! Return true if the numeric parameter `name` is set to a value within its valid
92 //! range.
93 bool is_valid_number(const std::string &name) const;
94
95 // doubles
96 typedef std::map<std::string, std::vector<double> > Doubles;
97 Doubles all_doubles() const;
98
99 double get_number(const std::string &name, UseFlag flag = REMEMBER_THIS_USE) const;
100 double get_number(const std::string &name, const std::string &units,
101 UseFlag flag = REMEMBER_THIS_USE) const;
102 std::vector<double> get_numbers(const std::string &name, UseFlag flag = REMEMBER_THIS_USE) const;
103 std::vector<double> get_numbers(const std::string &name, const std::string &units,
104 UseFlag flag = REMEMBER_THIS_USE) const;
105
106 void set_number(const std::string &name, double value, ConfigSettingFlag flag = CONFIG_FORCE);
107 void set_numbers(const std::string &name, const std::vector<double> &values,
109
110 // strings
111 typedef std::map<std::string, std::string> Strings;
112 Strings all_strings() const;
113
114 std::string get_string(const std::string &name, UseFlag flag = REMEMBER_THIS_USE) const;
115 void set_string(const std::string &name, const std::string &value, ConfigSettingFlag flag = CONFIG_FORCE);
116
117 // flags
118 typedef std::map<std::string, bool> Flags;
119 Flags all_flags() const;
120
121 std::set<std::string> keys() const;
122
123 bool get_flag(const std::string& name, UseFlag flag = REMEMBER_THIS_USE) const;
124 void set_flag(const std::string& name, bool value, ConfigSettingFlag flag = CONFIG_FORCE);
125
126 std::string doc(const std::string &parameter) const;
127 std::string units(const std::string &parameter) const;
128 std::string type(const std::string &parameter) const;
129 std::string option(const std::string &parameter) const;
130 std::string choices(const std::string &parameter) const;
131 std::pair<bool, double> valid_min(const std::string &parameter) const;
132 std::pair<bool, double> valid_max(const std::string &parameter) const;
133
134 std::shared_ptr<units::System> unit_system() const;
135
136 std::string json() const;
137 // Implementations
138protected:
139 virtual void read_impl(const File &nc) = 0;
140
141 virtual bool is_set_impl(const std::string &name) const = 0;
142
143 virtual Doubles all_doubles_impl() const = 0;
144 virtual double get_number_impl(const std::string &name) const = 0;
145 virtual std::vector<double> get_numbers_impl(const std::string &name) const = 0;
146
147 virtual void set_number_impl(const std::string &name, double value) = 0;
148 virtual void set_numbers_impl(const std::string &name,
149 const std::vector<double> &values) = 0;
150
151 virtual Strings all_strings_impl() const = 0;
152 virtual std::string get_string_impl(const std::string &name) const = 0;
153 virtual void set_string_impl(const std::string &name, const std::string &value) = 0;
154
155 virtual Flags all_flags_impl() const = 0;
156
157 virtual bool get_flag_impl(const std::string& name) const = 0;
158 virtual void set_flag_impl(const std::string& name, bool value) = 0;
159private:
160 struct Impl;
162};
163
164std::shared_ptr<Config> config_from_options(MPI_Comm com, std::shared_ptr<units::System> unit_system);
165
166//! Set configuration parameters using command-line options.
167void set_config_from_options(Config &config);
168
169//! Set one parameter using command-line options.
170void set_parameter_from_options(Config &config, const std::string &name);
171
172//! Set one flag parameter using command-line options.
173void set_flag_from_option(Config &config,
174 const std::string &option,const std::string &parameter);
175
176//! Set one scalar parameter using command-line options.
177void set_number_from_option(Config &config,
178 const std::string &option, const std::string &parameter);
179
180//! Set one free-form string parameter using command-line options.
181void set_string_from_option(Config &config,
182 const std::string &option, const std::string &parameter);
183
184//! Set one keyword parameter using command-line options.
186 const std::string &option, const std::string &parameter,
187 const std::string &choices);
188
189//! Report configuration parameters to `stdout`.
190void print_config(const Logger &log, int verbosity_threshhold, const Config &config);
191
192//! Report unused configuration parameters to `stdout`.
193void print_unused_parameters(const Logger &log, int verbosity_threshhold,
194 const Config &config);
195
197
198} // end of namespace pism
199
200#endif /* _PISM_CONFIG_H_ */
virtual bool is_set_impl(const std::string &name) const =0
std::map< std::string, std::string > Strings
Definition Config.hh:111
const std::set< std::string > & parameters_used() const
Definition Config.cc:152
bool is_set(const std::string &name) const
Definition Config.cc:156
std::string choices(const std::string &parameter) const
Definition Config.cc:868
virtual Strings all_strings_impl() const =0
std::set< std::string > keys() const
Definition Config.cc:830
std::pair< bool, double > valid_max(const std::string &parameter) const
Definition Config.cc:879
std::map< std::string, std::vector< double > > Doubles
Definition Config.hh:96
void set_string(const std::string &name, const std::string &value, ConfigSettingFlag flag=CONFIG_FORCE)
Definition Config.cc:329
double get_number(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
Definition Config.cc:188
virtual void set_numbers_impl(const std::string &name, const std::vector< double > &values)=0
Flags all_flags() const
Definition Config.cc:347
std::vector< double > get_numbers(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
Definition Config.cc:257
virtual void read_impl(const File &nc)=0
virtual Flags all_flags_impl() const =0
virtual std::vector< double > get_numbers_impl(const std::string &name) const =0
Impl * m_impl
Definition Config.hh:161
const std::set< std::string > & parameters_set_by_user() const
Definition Config.cc:148
virtual void set_flag_impl(const std::string &name, bool value)=0
void read(MPI_Comm com, const std::string &filename)
Definition Config.cc:74
bool is_valid_number(const std::string &name) const
Definition Config.cc:164
virtual void set_string_impl(const std::string &name, const std::string &value)=0
std::shared_ptr< units::System > unit_system() const
Definition Config.cc:70
std::string units(const std::string &parameter) const
Definition Config.cc:852
void import_from(const Config &other)
Definition Config.cc:91
std::string json() const
Definition Config.cc:891
void set_flag(const std::string &name, bool value, ConfigSettingFlag flag=CONFIG_FORCE)
Definition Config.cc:358
virtual std::string get_string_impl(const std::string &name) const =0
std::map< std::string, bool > Flags
Definition Config.hh:118
std::string get_string(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
Definition Config.cc:322
std::string type(const std::string &parameter) const
Definition Config.cc:856
virtual ~Config()
Definition Config.cc:66
virtual Doubles all_doubles_impl() const =0
virtual void set_number_impl(const std::string &name, double value)=0
bool get_flag(const std::string &name, UseFlag flag=REMEMBER_THIS_USE) const
Definition Config.cc:351
void set_number(const std::string &name, double value, ConfigSettingFlag flag=CONFIG_FORCE)
Definition Config.cc:283
std::string option(const std::string &parameter) const
Definition Config.cc:860
std::string filename() const
Returns the name of the file used to initialize the database.
Definition Config.cc:87
Strings all_strings() const
Definition Config.cc:318
void set_numbers(const std::string &name, const std::vector< double > &values, ConfigSettingFlag flag=CONFIG_FORCE)
Definition Config.cc:300
static int max_length
Maximum length of the JSON string (for writing to output files)
Definition Config.hh:73
Doubles all_doubles() const
Definition Config.cc:160
std::string doc(const std::string &parameter) const
Definition Config.cc:848
UseFlag
Flag used by get_...() methods.
Definition Config.hh:70
@ FORGET_THIS_USE
Definition Config.hh:70
@ REMEMBER_THIS_USE
Definition Config.hh:70
std::pair< bool, double > valid_min(const std::string &parameter) const
Definition Config.cc:872
virtual double get_number_impl(const std::string &name) const =0
virtual bool get_flag_impl(const std::string &name) const =0
void resolve_filenames()
Definition Config.cc:125
A class for storing and accessing PISM configuration flags and parameters.
Definition Config.hh:56
High-level PISM I/O class.
Definition File.hh:57
A basic logging class.
Definition Logger.hh:40
void set_config_from_options(Config &config)
Set configuration parameters using command-line options.
Definition Config.cc:672
void set_number_from_option(Config &config, const std::string &option, const std::string &parameter)
Sets a configuration parameter from a command-line option.
Definition Config.cc:582
void set_string_from_option(Config &config, const std::string &option, const std::string &parameter)
Set one free-form string parameter using command-line options.
Definition Config.cc:600
std::shared_ptr< Config > config_from_options(MPI_Comm com, units::System::Ptr unit_system)
Create a configuration database using command-line options.
Definition Config.cc:803
void set_flag_from_option(Config &config, const std::string &option, const std::string &parameter_name)
Get a flag from a command-line option.
Definition Config.cc:528
VariableMetadata config_metadata(const Config &config)
Definition Config.cc:939
ConfigSettingFlag
Flag used by set_...() methods.
Definition Config.hh:52
@ CONFIG_USER
Definition Config.hh:52
@ CONFIG_DEFAULT
Definition Config.hh:52
@ CONFIG_FORCE
Definition Config.hh:52
void print_unused_parameters(const Logger &log, int verbosity_threshhold, const Config &config)
Report unused configuration parameters to stdout.
Definition Config.cc:480
void set_keyword_from_option(Config &config, const std::string &option, const std::string &parameter, const std::string &choices)
Set a keyword parameter from a command-line option.
Definition Config.cc:615
void set_parameter_from_options(Config &config, const std::string &name)
Set one parameter using command-line options.
Definition Config.cc:626
void print_config(const Logger &log, int verbosity_threshhold, const Config &config)
Report configuration parameters to stdout.
Definition Config.cc:387