21 #include "libmesh/libmesh_config.h"
25 #if defined(LIBMESH_HAVE_SLEPC) && (LIBMESH_HAVE_GLPK)
28 #include "libmesh/rb_scm_evaluation.h"
29 #include "libmesh/rb_theta_expansion.h"
32 #include "libmesh/dof_map.h"
33 #include "libmesh/equation_systems.h"
34 #include "libmesh/getpot.h"
35 #include "libmesh/int_range.h"
36 #include "libmesh/libmesh_logging.h"
37 #include "libmesh/numeric_vector.h"
38 #include "libmesh/sparse_matrix.h"
39 #include "libmesh/xdr_cxx.h"
42 #include <sys/types.h>
75 libmesh_error_msg(
"Error: rb_theta_expansion hasn't been initialized yet");
83 libmesh_error_msg(
"Error: Input parameter j is too large in set_C_J_stability_constraint.");
95 libmesh_error_msg(
"Error: Input parameter j is too large in get_C_J_stability_constraint.");
104 libmesh_error_msg(
"Error: We must have j < J in set_SCM_UB_vector.");
108 libmesh_error_msg(
"Error: q is too large in set_SCM_UB_vector.");
117 libmesh_error_msg(
"Error: We must have j < J in get_SCM_UB_vector.");
120 libmesh_error_msg(
"Error: q is too large in get_SCM_UB_vector.");
128 libmesh_error_msg(
"Error: Input parameter j is too large in get_C_J.");
135 if (q >=
B_min.size())
136 libmesh_error_msg(
"Error: q is too large in get_B_min.");
144 if (q >=
B_max.size())
145 libmesh_error_msg(
"Error: q is too large in get_B_max.");
152 if (q >=
B_min.size())
153 libmesh_error_msg(
"Error: q is too large in set_B_min.");
155 B_min[q] = B_min_val;
160 if (q >=
B_max.size())
161 libmesh_error_msg(
"Error: q is too large in set_B_max.");
163 B_max[q] = B_max_val;
168 LOG_SCOPE(
"get_SCM_LB()",
"RBSCMEvaluation");
172 lp = glp_create_prob();
173 glp_set_obj_dir(lp,GLP_MIN);
186 glp_set_col_bnds(lp, q+1, GLP_FR, 0., 0.);
191 glp_set_col_bnds(lp, q+1, GLP_DB,
B_min[q],
B_max[q]);
202 unsigned int n_rows = cast_int<unsigned int>(
C_J.size());
203 glp_add_rows(lp, n_rows);
209 std::vector<int> ia(matrix_size+1);
210 std::vector<int> ja(matrix_size+1);
211 std::vector<double> ar(matrix_size+1);
212 unsigned int count=0;
213 for (
unsigned int m=0; m<n_rows; m++)
240 glp_load_matrix(lp, matrix_size, ia.data(), ja.data(), ar.data());
255 glp_init_smcp(&parm);
256 parm.msg_lev = GLP_MSG_ERR;
257 parm.meth = GLP_DUAL;
261 glp_simplex(lp, &parm);
263 Real min_J_obj = glp_get_obj_val(lp);
284 LOG_SCOPE(
"get_SCM_UB()",
"RBSCMEvaluation");
289 unsigned int n_rows = cast_int<unsigned int>(
C_J.size());
296 for (
unsigned int m=0; m<n_rows; m++)
306 if ((m==0) || (J_obj < min_J_obj))
331 const bool write_binary_data)
333 LOG_SCOPE(
"legacy_write_offline_data_to_files()",
"RBSCMEvaluation");
338 if (
mkdir(directory_name.c_str(), 0777) == -1)
340 libMesh::out <<
"In RBSCMEvaluation::write_offline_data_to_files, directory "
341 << directory_name <<
" already exists, overwriting contents." << std::endl;
348 const std::string suffix = write_binary_data ?
".xdr" :
".dat";
351 std::ostringstream file_name;
355 file_name << directory_name <<
"/parameter_ranges" << suffix;
356 std::string continuous_param_file_name = file_name.str();
360 file_name << directory_name <<
"/discrete_parameter_values" << suffix;
361 std::string discrete_param_file_name = file_name.str();
364 discrete_param_file_name,
369 file_name << directory_name <<
"/B_min" << suffix;
370 Xdr B_min_out(file_name.str(), mode);
375 B_min_out << B_min_i;
382 file_name << directory_name <<
"/B_max" << suffix;
383 Xdr B_max_out(file_name.str(), mode);
388 B_max_out << B_max_i;
394 file_name << directory_name <<
"/C_J_length" << suffix;
395 Xdr C_J_length_out(file_name.str(), mode);
397 unsigned int C_J_length = cast_int<unsigned int>(
C_J.size());
398 C_J_length_out << C_J_length;
399 C_J_length_out.
close();
403 file_name << directory_name <<
"/C_J_stability_vector" << suffix;
404 Xdr C_J_stability_vector_out(file_name.str(), mode);
409 C_J_stability_vector_out << C_J_stability_constraint_i;
411 C_J_stability_vector_out.close();
415 file_name << directory_name <<
"/C_J" << suffix;
416 Xdr C_J_out(file_name.str(), mode);
418 for (
auto & param :
C_J)
419 for (
const auto & item : param)
423 Real param_value = item.second;
424 C_J_out << param_value;
430 file_name << directory_name <<
"/SCM_UB_vectors" << suffix;
431 Xdr SCM_UB_vectors_out(file_name.str(), mode);
437 SCM_UB_vectors_out << SCM_UB_vector_ij;
439 SCM_UB_vectors_out.close();
445 const bool read_binary_data)
447 LOG_SCOPE(
"legacy_read_offline_data_from_files()",
"RBSCMEvaluation");
453 const std::string suffix = read_binary_data ?
".xdr" :
".dat";
456 std::ostringstream file_name;
460 file_name << directory_name <<
"/parameter_ranges" << suffix;
461 std::string continuous_param_file_name = file_name.str();
465 file_name << directory_name <<
"/discrete_parameter_values" << suffix;
466 std::string discrete_param_file_name = file_name.str();
468 discrete_param_file_name,
474 file_name << directory_name <<
"/B_min" << suffix;
475 Xdr B_min_in(file_name.str(), mode);
481 B_min_in >> B_min_val;
482 B_min.push_back(B_min_val);
490 file_name << directory_name <<
"/B_max" << suffix;
491 Xdr B_max_in(file_name.str(), mode);
497 B_max_in >> B_max_val;
498 B_max.push_back(B_max_val);
503 file_name << directory_name <<
"/C_J_length" << suffix;
504 Xdr C_J_length_in(file_name.str(), mode);
506 unsigned int C_J_length;
507 C_J_length_in >> C_J_length;
508 C_J_length_in.
close();
512 file_name << directory_name <<
"/C_J_stability_vector" << suffix;
513 Xdr C_J_stability_vector_in(file_name.str(), mode);
516 for (
unsigned int i=0; i<C_J_length; i++)
518 Real C_J_stability_val;
519 C_J_stability_vector_in >> C_J_stability_val;
522 C_J_stability_vector_in.close();
526 file_name << directory_name <<
"/C_J" << suffix;
527 Xdr C_J_in(file_name.str(), mode);
530 C_J.resize( C_J_length );
531 for (
auto & params :
C_J)
534 const std::string & param_name = pr.first;
536 C_J_in >> param_value;
537 params.set_value(param_name, param_value);
544 file_name << directory_name <<
"/SCM_UB_vectors" << suffix;
545 Xdr SCM_UB_vectors_in(file_name.str(), mode);
557 SCM_UB_vectors_in.close();
562 #endif // LIBMESH_HAVE_SLEPC && LIBMESH_HAVE_GLPK