tConfigInterface.hh - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch) (HTM) 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_ */