21 #include "libmesh/int_range.h" 22 #include "libmesh/simple_range.h" 23 #include "libmesh/xdr_cxx.h" 26 #include "libmesh/rb_parametrized.h" 39 parameters_initialized(false)
55 const std::map<std::string, std::vector<Real>> & discrete_parameter_values)
59 "Error: Invalid mu_min/mu_max in initialize_parameters(), different number of parameters.");
60 libmesh_error_msg_if(mu_min_in.
n_samples() != 1 ||
62 "Error: Invalid mu_min/mu_max in initialize_parameters(), only 1 sample supported.");
68 libmesh_error_msg_if((*pr_min).second > (*pr_max).second,
69 "Error: Invalid mu_min/mu_max in RBParameters constructor.");
75 for (
const auto & [
name, vals] : discrete_parameter_values)
77 libmesh_error_msg_if(vals.empty(),
"Error: List of discrete parameters for " <<
name <<
" is empty.");
79 Real min_val = *std::min_element(vals.begin(), vals.end());
80 Real max_val = *std::max_element(vals.begin(), vals.end());
82 libmesh_assert_less_equal(min_val, max_val);
105 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_n_params");
114 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_n_continuous_params");
123 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_n_discrete_params");
125 return cast_int<unsigned int>
131 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::set_parameters");
145 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_parameters");
152 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_parameters_min");
159 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_parameters_max");
166 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_parameter_min");
173 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_parameter_max");
180 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::print_current_parameters");
186 const std::string & discrete_param_file_name,
187 const bool write_binary_data)
194 const bool write_binary_data)
200 Xdr parameter_ranges_out(file_name, mode);
202 parameter_ranges_out << n_continuous_params;
210 std::string param_name = pr.first;
214 parameter_ranges_out << param_name << param_value;
219 std::string param_name = pr.first;
223 parameter_ranges_out << param_name << param_value;
227 parameter_ranges_out.
close();
231 const bool write_binary_data)
239 Xdr discrete_parameters_out(file_name, mode);
241 discrete_parameters_out << n_discrete_params;
249 std::string param_name = pr.first;
250 auto n_discrete_values = cast_int<unsigned int>(pr.second.size());
251 discrete_parameters_out << param_name << n_discrete_values;
253 for (
unsigned int i=0; i<n_discrete_values; i++)
255 Real discrete_value = pr.second[i];
256 discrete_parameters_out << discrete_value;
263 const std::string & discrete_param_file_name,
264 const bool read_binary_data)
273 std::map<std::string, std::vector<Real>> discrete_parameter_values_in;
276 discrete_parameter_values_in);
282 const bool read_binary_data,
290 Xdr parameter_ranges_in(file_name, mode);
291 unsigned int n_continuous_params;
292 parameter_ranges_in >> n_continuous_params;
294 for (
unsigned int i=0; i<n_continuous_params; i++)
296 std::string param_name;
299 parameter_ranges_in >> param_name;
300 parameter_ranges_in >> param_value;
302 param_min.
set_value(param_name, param_value);
304 for (
unsigned int i=0; i<n_continuous_params; i++)
306 std::string param_name;
309 parameter_ranges_in >> param_name;
310 parameter_ranges_in >> param_value;
312 param_max.
set_value(param_name, param_value);
315 parameter_ranges_in.
close();
319 const bool read_binary_data,
320 std::map<std::string, std::vector<Real>> & discrete_parameter_values)
323 std::ifstream check_if_file_exists(file_name.c_str());
324 if (check_if_file_exists.good())
330 Xdr discrete_parameter_values_in(file_name, mode);
331 unsigned int n_discrete_params;
332 discrete_parameter_values_in >> n_discrete_params;
334 for (
unsigned int i=0; i<n_discrete_params; i++)
336 std::string param_name;
337 discrete_parameter_values_in >> param_name;
339 unsigned int n_discrete_values;
340 discrete_parameter_values_in >> n_discrete_values;
342 std::vector<Real> discrete_values(n_discrete_values);
343 for (
auto & val : discrete_values)
344 discrete_parameter_values_in >> val;
346 discrete_parameter_values[param_name] = discrete_values;
354 "Error: parameters not initialized in RBParametrized::is_discrete_parameter");
361 libmesh_error_msg_if(!
parameters_initialized,
"Error: parameters not initialized in RBParametrized::get_discrete_parameter_values");
372 for (
const auto &
value : values)
382 "Error: Number of parameters don't match; found " 386 bool is_valid =
true;
387 std::string prev_param_name =
"";
388 for (
const auto & [param_name, sample_vec] : params)
390 std::size_t sample_idx = 0;
393 for (
const auto & value_vec : sample_vec)
395 for (
const auto &
value : value_vec)
399 const bool outside_range = ((value < min_value) || (value > max_value));
400 is_valid = is_valid && !outside_range;
403 libMesh::out <<
"Warning: parameter " << param_name <<
" value=" 404 <<
value <<
" outside acceptable range: (" 405 << min_value <<
", " << max_value <<
")";
416 const bool is_value_discrete =
420 is_valid = is_valid && is_value_discrete;
422 libMesh::out <<
"Warning: parameter " << param_name <<
" value=" 423 <<
value <<
" is not in discrete value list.";
434 libmesh_error_msg_if(list_of_values.empty(),
"Error: list_of_values is empty.");
436 Real min_distance = std::numeric_limits<Real>::max();
437 Real closest_val = 0.;
438 for (
const auto & current_value : list_of_values)
444 closest_val = current_value;
456 Real rel_error = std::abs(
value - closest_value) / std::abs(
value);
457 if (rel_error <= tol)
464 Real abs_error = std::abs(
value - closest_value);
465 return (abs_error <= tol);
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Real get_value(const std::string ¶m_name) const
Get the value of the specified parameter, throw an error if it does not exist.
virtual void clear()
Clear all the data structures associated with the system.
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
void write_parameter_data_to_files(const std::string &continuous_param_file_name, const std::string &discrete_param_file_name, const bool write_binary_data)
Write out the parameter ranges to files.
void read_parameter_ranges_from_file(const std::string &file_name, const bool read_binary, RBParameters ¶m_min, RBParameters ¶m_max)
Read in the parameter ranges from file.
static constexpr Real TOLERANCE
const_iterator begin_serialized() const
Get const_iterator access to the parameters stored in this RBParameters object.
Real get_parameter_min(const std::string ¶m_name) const
Get minimum allowable value of parameter param_name.
Real get_parameter_max(const std::string ¶m_name) const
Get maximum allowable value of parameter param_name.
void write_discrete_parameter_values_to_file(const std::string &file_name, const bool write_binary_data)
Write out the discrete parameter values to file.
void close()
Closes the file if it is open.
const RBParameters & get_parameters_max() const
Get an RBParameters object that specifies the maximum allowable value for each parameter.
virtual ~RBParametrized()
void read_discrete_parameter_values_from_file(const std::string &file_name, const bool read_binary_data, std::map< std::string, std::vector< Real >> &discrete_parameter_values_in)
Read in the discrete parameter values from file, if we have any.
void read_parameter_data_from_files(const std::string &continuous_param_file_name, const std::string &discrete_param_file_name, const bool read_binary_data)
Read in the parameter ranges from files.
The libMesh namespace provides an interface to certain functionality in the library.
static Real get_closest_value(Real value, const std::vector< Real > &list_of_values)
void print(unsigned precision=6, int max_values=5) const
Print the parameters.
Real distance(const Point &p)
static bool is_value_in_list(Real value, const std::vector< Real > &list_of_values, Real tol)
Helper function to check if the specified value is in the list of values (within a tolerance given by...
unsigned int get_n_discrete_params() const
Get the number of discrete parameters.
XdrMODE
Defines an enum for read/write mode in Xdr format.
RBParameters parameters_min
Vectors that define the ranges (min and max) for the parameters.
unsigned int n_parameters() const
Get the number of parameters that have been added.
const RBParameters & get_parameters_min() const
Get an RBParameters object that specifies the minimum allowable value for each parameter.
void write_parameter_ranges_to_file(const std::string &file_name, const bool write_binary)
Write out the parameter ranges to file.
RBParametrized()
Constructor.
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.
const RBParameters & get_parameters() const
Get the current parameters.
void print_parameters() const
Print the current parameters.
This class is part of the rbOOmit framework.
std::map< std::string, std::vector< Real > > _discrete_parameter_values
Map that defines the allowable values of any discrete parameters.
unsigned int get_n_continuous_params() const
Get the number of continuous parameters.
bool verbose_mode
Public boolean to toggle verbose mode.
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
bool set_parameters(const RBParameters ¶ms)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
unsigned int n_samples() const
Returns the number of samples stored for all parameters.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void set_value(const std::string ¶m_name, Real value)
Set the value of the specified parameter.
This class is part of the rbOOmit framework.
void clear()
Clear this object.
const_iterator end_serialized() const
RBParameters parameters_max
bool check_if_valid_params(const RBParameters ¶ms) const
Helper function to check that params is valid:
void initialize_parameters(const RBParameters &mu_min_in, const RBParameters &mu_max_in, const std::map< std::string, std::vector< Real >> &discrete_parameter_values)
Initialize the parameter ranges and set current_parameters.
unsigned int get_n_params() const
Get the number of parameters.
bool is_discrete_parameter(const std::string &mu_name) const
Is parameter mu_name discrete?
void print_discrete_parameter_values() const
Print out all the discrete parameter values.
RBParameters parameters
Vector storing the current parameters.