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");
370 libMesh::out <<
"Discrete parameter " << name <<
", 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);
This class is part of the rbOOmit framework.
unsigned int n_parameters() const
Get the number of parameters that have been added.
Real get_value(const std::string ¶m_name) const
Get the value of the specified parameter, throw an error if it does not exist.
void clear()
Clear this object.
Real get_sample_value(const std::string ¶m_name, std::size_t sample_idx) const
Get the value of the specified parameter at the specified sample, throwing an error if it does not ex...
unsigned int n_samples() const
Returns the number of samples stored for all parameters.
const_iterator end_serialized() const
void print(unsigned precision=6, int max_values=5) const
Print the parameters.
const_iterator begin_serialized() const
Get const_iterator access to the parameters stored in this RBParameters object.
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.
RBParametrized()
Constructor.
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.
const RBParameters & get_parameters_max() const
Get an RBParameters object that specifies the maximum allowable value for each parameter.
const RBParameters & get_parameters() const
Get the current parameters.
unsigned int get_n_params() const
Get the number of parameters.
RBParameters parameters_max
bool set_parameters(const RBParameters ¶ms)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
RBParameters parameters
Vector storing the current parameters.
static Real get_closest_value(Real value, const std::vector< Real > &list_of_values)
void write_parameter_ranges_to_file(const std::string &file_name, const bool write_binary)
Write out the parameter ranges to file.
virtual void clear()
Clear all the data structures associated with the system.
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.
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.
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.
RBParameters parameters_min
Vectors that define the ranges (min and max) for the parameters.
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...
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.
std::map< std::string, std::vector< Real > > _discrete_parameter_values
Map that defines the allowable values of any discrete parameters.
Real get_parameter_max(const std::string ¶m_name) const
Get maximum allowable value of parameter param_name.
virtual ~RBParametrized()
void print_discrete_parameter_values() const
Print out all the discrete parameter values.
const RBParameters & get_parameters_min() const
Get an RBParameters object that specifies the minimum allowable value for each parameter.
Real get_parameter_min(const std::string ¶m_name) const
Get minimum allowable value of parameter param_name.
void print_parameters() const
Print the current parameters.
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.
bool check_if_valid_params(const RBParameters ¶ms) const
Helper function to check that params is valid:
bool verbose_mode
Public boolean to toggle verbose mode.
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.
unsigned int get_n_continuous_params() const
Get the number of continuous parameters.
bool parameters_initialized
Flag indicating whether the parameters have been initialized.
bool is_discrete_parameter(const std::string &mu_name) const
Is parameter mu_name discrete?
unsigned int get_n_discrete_params() const
Get the number of discrete parameters.
This class implements a C++ interface to the XDR (eXternal Data Representation) format.
void close()
Closes the file if it is open.
The libMesh namespace provides an interface to certain functionality in the library.
static constexpr Real TOLERANCE
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
XdrMODE
Defines an enum for read/write mode in Xdr format.
Real distance(const Point &p)