21 #include "libmesh/xdr_cxx.h"
24 #include "libmesh/rb_parametrized.h"
40 parameters_initialized(false)
62 const std::map<std::string, std::vector<Real>> & discrete_parameter_values)
66 const std::string err_string =
"Error: Invalid mu_min/mu_max in RBParameters constructor.";
69 libmesh_error_msg(err_string);
73 for (
const auto & pr : mu_min_in)
75 const std::string & param_name = pr.first;
76 if (mu_min_in.get_value(param_name) > mu_max_in.
get_value(param_name))
77 libmesh_error_msg(err_string);
86 for (
const auto & pr : discrete_parameter_values)
88 if (pr.second.empty())
89 libmesh_error_msg(
"Error: List of discrete parameters for " << pr.first <<
" is empty.");
91 Real min_val = *std::min_element(pr.second.begin(), pr.second.end());
92 Real max_val = *std::max_element(pr.second.begin(), pr.second.end());
94 libmesh_assert_less_equal(min_val,max_val);
118 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_n_params");
128 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_n_continuous_params");
138 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_n_discrete_params");
140 return cast_int<unsigned int>
147 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_parameter_names");
149 std::set<std::string> parameter_names;
152 return parameter_names;
158 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::set_current_parameters");
169 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_current_parameters");
177 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_parameters_min");
185 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_parameters_max");
193 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_parameter_min");
201 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_parameter_max");
209 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::print_current_parameters");
215 const std::string & discrete_param_file_name,
216 const bool write_binary_data)
223 const bool write_binary_data)
229 Xdr parameter_ranges_out(file_name, mode);
231 parameter_ranges_out << n_continuous_params;
235 std::string param_name = pr.first;
238 Real param_value = pr.second;
239 parameter_ranges_out << param_name << param_value;
245 std::string param_name = pr.first;
248 Real param_value = pr.second;
249 parameter_ranges_out << param_name << param_value;
252 parameter_ranges_out.
close();
256 const bool write_binary_data)
264 Xdr discrete_parameters_out(file_name, mode);
266 discrete_parameters_out << n_discrete_params;
270 std::string param_name = pr.first;
271 unsigned int n_discrete_values = cast_int<unsigned int>
273 discrete_parameters_out << param_name << n_discrete_values;
275 for (
unsigned int i=0; i<n_discrete_values; i++)
277 Real discrete_value = pr.second[i];
278 discrete_parameters_out << discrete_value;
285 const std::string & discrete_param_file_name,
286 const bool read_binary_data)
295 std::map<std::string, std::vector<Real>> discrete_parameter_values_in;
298 discrete_parameter_values_in);
304 const bool read_binary_data,
312 Xdr parameter_ranges_in(file_name, mode);
313 unsigned int n_continuous_params;
314 parameter_ranges_in >> n_continuous_params;
316 for (
unsigned int i=0; i<n_continuous_params; i++)
318 std::string param_name;
321 parameter_ranges_in >> param_name;
322 parameter_ranges_in >> param_value;
324 param_min.
set_value(param_name, param_value);
326 for (
unsigned int i=0; i<n_continuous_params; i++)
328 std::string param_name;
331 parameter_ranges_in >> param_name;
332 parameter_ranges_in >> param_value;
334 param_max.
set_value(param_name, param_value);
337 parameter_ranges_in.
close();
341 const bool read_binary_data,
342 std::map<std::string, std::vector<Real>> & discrete_parameter_values)
345 std::ifstream check_if_file_exists(file_name.c_str());
346 if (check_if_file_exists.good())
352 Xdr discrete_parameter_values_in(file_name, mode);
353 unsigned int n_discrete_params;
354 discrete_parameter_values_in >> n_discrete_params;
356 for (
unsigned int i=0; i<n_discrete_params; i++)
358 std::string param_name;
359 discrete_parameter_values_in >> param_name;
361 unsigned int n_discrete_values;
362 discrete_parameter_values_in >> n_discrete_values;
364 std::vector<Real> discrete_values(n_discrete_values);
365 for (
auto & val : discrete_values)
366 discrete_parameter_values_in >> val;
368 discrete_parameter_values[param_name] = discrete_values;
376 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::is_discrete_parameter");
384 libmesh_error_msg(
"Error: parameters not initialized in RBParametrized::get_discrete_parameter_values");
393 libMesh::out <<
"Discrete parameter " << pr.first <<
", values: ";
395 const std::vector<Real> & values = pr.second;
396 for (
const auto &
value : values)
405 libmesh_error_msg(
"Error: Number of parameters don't match");
410 for (
const auto & pr : params)
412 const std::string & param_name = pr.first;
427 libMesh::out <<
"Warning: parameter is outside parameter range" << std::endl;
435 if (list_of_values.empty())
436 libmesh_error_msg(
"Error: list_of_values is empty.");
438 Real min_distance = std::numeric_limits<Real>::max();
439 Real closest_val = 0.;
440 for (
const auto & current_value : list_of_values)
446 closest_val = current_value;
459 if (rel_error <= tol)
467 return (abs_error <= tol);