Line data Source code
1 : // rbOOmit: An implementation of the Certified Reduced Basis method. 2 : // Copyright (C) 2009, 2010 David J. Knezevic 3 : 4 : // This file is part of rbOOmit. 5 : 6 : // rbOOmit is free software; you can redistribute it and/or 7 : // modify it under the terms of the GNU Lesser General Public 8 : // License as published by the Free Software Foundation; either 9 : // version 2.1 of the License, or (at your option) any later version. 10 : 11 : // rbOOmit 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 GNU 14 : // Lesser General Public License for more details. 15 : 16 : // You should have received a copy of the GNU Lesser General Public 17 : // License along with this library; if not, write to the Free Software 18 : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 : 20 : #ifndef LIBMESH_RB_PARAMETRIZED_H 21 : #define LIBMESH_RB_PARAMETRIZED_H 22 : 23 : // rbOOmit includes 24 : #include "libmesh/rb_parameters.h" 25 : 26 : // libMesh includes 27 : #include "libmesh/reference_counted_object.h" 28 : 29 : // C++ includes 30 : #include <cstddef> 31 : #include <vector> 32 : 33 : namespace libMesh 34 : { 35 : 36 : /** 37 : * This class is part of the rbOOmit framework. 38 : * 39 : * This class defines basic functionality of 40 : * a parametrized object. 41 : * 42 : * \author David J. Knezevic 43 : * \date 2011 44 : */ 45 68 : class RBParametrized : public ReferenceCountedObject<RBParametrized> 46 : { 47 : public: 48 : 49 : /** 50 : * Constructor. 51 : */ 52 : RBParametrized (); 53 : 54 : /** 55 : * Special functions. 56 : * - This simple class can be default copy/move constructed/assigned. 57 : * - Destructor is defaulted out-of-line. 58 : */ 59 : RBParametrized (RBParametrized &&) = default; 60 : RBParametrized & operator= (RBParametrized &&) = default; 61 : RBParametrized (const RBParametrized &) = default; 62 : RBParametrized & operator= (const RBParametrized &) = default; 63 : virtual ~RBParametrized (); 64 : 65 : /** 66 : * Clear all the data structures associated with 67 : * the system. 68 : */ 69 : virtual void clear (); 70 : 71 : /** 72 : * Initialize the parameter ranges and set current_parameters. 73 : * Parameter ranges are inclusive. 74 : * The input min/max RBParameters should have exactly 1 sample each. 75 : * Vector-valued samples are not currently supported for the min/max 76 : * parameters or for discrete parameters. 77 : */ 78 : void initialize_parameters(const RBParameters & mu_min_in, 79 : const RBParameters & mu_max_in, 80 : const std::map<std::string, std::vector<Real>> & discrete_parameter_values); 81 : 82 : /** 83 : * Initialize the parameter ranges and set current_parameters. 84 : */ 85 : void initialize_parameters(const RBParametrized & rb_parametrized); 86 : 87 : /** 88 : * Get the number of parameters. 89 : */ 90 : unsigned int get_n_params() const; 91 : 92 : /** 93 : * Get the number of continuous parameters. 94 : */ 95 : unsigned int get_n_continuous_params() const; 96 : 97 : /** 98 : * Get the number of discrete parameters. 99 : */ 100 : unsigned int get_n_discrete_params() const; 101 : 102 : #ifdef LIBMESH_ENABLE_DEPRECATED 103 : /** 104 : * Get a set that stores the parameter names. 105 : * 106 : * \deprecated to avoid making it too easy to create copies that in 107 : * most circumstances aren't needed. If this functionality really 108 : * is required, call get_parameters_min().get_parameters_map() and 109 : * loop over the keys directly. 110 : */ 111 : std::set<std::string> get_parameter_names() const; 112 : #endif // LIBMESH_ENABLE_DEPRECATED 113 : 114 : /** 115 : * Get the current parameters. 116 : */ 117 : const RBParameters & get_parameters() const; 118 : 119 : /** 120 : * Set the current parameters to \p params 121 : * The parameters are checked for validity; an error is thrown if 122 : * the number of parameters or samples is different than expected. 123 : * We \return a boolean true if the new parameters are within the min/max 124 : * range, and false otherwise (but the parameters are set regardless). 125 : * Enabling the "verbose_mode" flag will also print more details. 126 : */ 127 : bool set_parameters(const RBParameters & params); 128 : 129 : /** 130 : * Get an RBParameters object that specifies the minimum allowable value 131 : * for each parameter. 132 : */ 133 : const RBParameters & get_parameters_min() const; 134 : 135 : /** 136 : * Get an RBParameters object that specifies the maximum allowable value 137 : * for each parameter. 138 : */ 139 : const RBParameters & get_parameters_max() const; 140 : 141 : /** 142 : * Get minimum allowable value of parameter \p param_name. 143 : */ 144 : Real get_parameter_min(const std::string & param_name) const; 145 : 146 : /** 147 : * Get maximum allowable value of parameter \p param_name. 148 : */ 149 : Real get_parameter_max(const std::string & param_name) const; 150 : 151 : /** 152 : * Print the current parameters. 153 : */ 154 : void print_parameters() const; 155 : 156 : /** 157 : * Write out the parameter ranges to files. 158 : */ 159 : void write_parameter_data_to_files(const std::string & continuous_param_file_name, 160 : const std::string & discrete_param_file_name, 161 : const bool write_binary_data); 162 : 163 : /** 164 : * Read in the parameter ranges from files. 165 : */ 166 : void read_parameter_data_from_files(const std::string & continuous_param_file_name, 167 : const std::string & discrete_param_file_name, 168 : const bool read_binary_data); 169 : 170 : /** 171 : * Is parameter \p mu_name discrete? 172 : */ 173 : bool is_discrete_parameter(const std::string & mu_name) const; 174 : 175 : /** 176 : * Get a const reference to the discrete parameter values. 177 : */ 178 : const std::map<std::string, std::vector<Real>> & get_discrete_parameter_values() const; 179 : 180 : /** 181 : * Print out all the discrete parameter values. 182 : */ 183 : void print_discrete_parameter_values() const; 184 : 185 : /** 186 : * \returns The closest entry to \p value from \p list_of_values. 187 : */ 188 : static Real get_closest_value(Real value, const std::vector<Real> & list_of_values); 189 : 190 : /** 191 : * Public boolean to toggle verbose mode. 192 : */ 193 : bool verbose_mode; 194 : 195 : private: 196 : 197 : /** 198 : * Write out the parameter ranges to file. 199 : */ 200 : void write_parameter_ranges_to_file(const std::string & file_name, 201 : const bool write_binary); 202 : 203 : /** 204 : * Write out the discrete parameter values to file. 205 : */ 206 : void write_discrete_parameter_values_to_file(const std::string & file_name, 207 : const bool write_binary_data); 208 : 209 : /** 210 : * Read in the parameter ranges from file. Initialize parameters 211 : * to the "minimum" parameter values. 212 : */ 213 : void read_parameter_ranges_from_file(const std::string & file_name, 214 : const bool read_binary, 215 : RBParameters & param_min, 216 : RBParameters & param_max); 217 : 218 : /** 219 : * Read in the discrete parameter values from file, if we have any. 220 : */ 221 : void read_discrete_parameter_values_from_file(const std::string & file_name, 222 : const bool read_binary_data, 223 : std::map<std::string, std::vector<Real>> & discrete_parameter_values_in); 224 : 225 : /** 226 : * Helper function to check that \p params is valid: 227 : * - same number of parameters (error) 228 : * - parameter values are within the min/max range (warning) 229 : * - discrete values are correctly discrete within tolerance (warning) 230 : * Warnings are only printed if "verbose_mode" is true. 231 : */ 232 : bool check_if_valid_params(const RBParameters & params) const; 233 : 234 : /** 235 : * Helper function to check if the specified value 236 : * is in the list of values (within a tolerance given 237 : * by \p tol). 238 : */ 239 : static bool is_value_in_list(Real value, const std::vector<Real> & list_of_values, Real tol); 240 : 241 : //--------------- PRIVATE DATA MEMBERS ---------------// 242 : 243 : /** 244 : * Flag indicating whether the parameters have been initialized. 245 : */ 246 : bool parameters_initialized; 247 : 248 : /** 249 : * Vector storing the current parameters. 250 : */ 251 : RBParameters parameters; 252 : 253 : /** 254 : * Vectors that define the ranges (min and max) for the parameters. 255 : */ 256 : RBParameters parameters_min; 257 : RBParameters parameters_max; 258 : 259 : /** 260 : * Map that defines the allowable values of any discrete parameters. 261 : */ 262 : std::map<std::string, std::vector<Real>> _discrete_parameter_values; 263 : }; 264 : 265 : } // namespace libMesh 266 : 267 : 268 : #endif // LIBMESH_RB_PARAMETRIZED_H