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>    72   libmesh_error_msg_if(!
rb_theta_expansion, 
"Error: rb_theta_expansion hasn't been initialized yet");
    79   libmesh_error_msg_if(j >= 
C_J_stability_vector.size(), 
"Error: Input parameter j is too large in set_C_J_stability_constraint.");
    90   libmesh_error_msg_if(j >= 
C_J_stability_vector.size(), 
"Error: Input parameter j is too large in get_C_J_stability_constraint.");
    98   libmesh_error_msg_if(j >= 
SCM_UB_vectors.size(), 
"Error: We must have j < J in set_SCM_UB_vector.");
   101   libmesh_error_msg_if(q >= 
SCM_UB_vectors[0].size(), 
"Error: q is too large in set_SCM_UB_vector.");
   109   libmesh_error_msg_if(j >= 
SCM_UB_vectors.size(), 
"Error: We must have j < J in get_SCM_UB_vector.");
   110   libmesh_error_msg_if(q >= 
SCM_UB_vectors[0].size(), 
"Error: q is too large in get_SCM_UB_vector.");
   117   libmesh_error_msg_if(j >= 
C_J.size(), 
"Error: Input parameter j is too large in get_C_J.");
   124   libmesh_error_msg_if(q >= 
B_min.size(), 
"Error: q is too large in get_B_min.");
   132   libmesh_error_msg_if(q >= 
B_max.size(), 
"Error: q is too large in get_B_max.");
   139   libmesh_error_msg_if(q >= 
B_min.size(), 
"Error: q is too large in set_B_min.");
   141   B_min[q] = B_min_val;
   146   libmesh_error_msg_if(q >= 
B_max.size(), 
"Error: q is too large in set_B_max.");
   148   B_max[q] = B_max_val;
   153   LOG_SCOPE(
"get_SCM_LB()", 
"RBSCMEvaluation");
   157   lp = glp_create_prob();
   158   glp_set_obj_dir(lp,GLP_MIN);
   171           glp_set_col_bnds(lp, q+1, GLP_FR, 0., 0.);
   176           glp_set_col_bnds(lp, q+1, GLP_DB, 
double(
B_min[q]), 
double(
B_max[q]));
   187   unsigned int n_rows = cast_int<unsigned int>(
C_J.size());
   188   glp_add_rows(lp, n_rows);
   194   std::vector<int> ia(matrix_size+1);
   195   std::vector<int> ja(matrix_size+1);
   196   std::vector<double> ar(matrix_size+1);
   197   unsigned int count=0;
   198   for (
unsigned int m=0; m<n_rows; m++)
   225   glp_load_matrix(lp, matrix_size, ia.data(), ja.data(), ar.data());
   240   glp_init_smcp(&parm);
   241   parm.msg_lev = GLP_MSG_ERR;
   242   parm.meth = GLP_DUAL;
   246   glp_simplex(lp, &parm);
   248   Real min_J_obj = glp_get_obj_val(lp);
   269   LOG_SCOPE(
"get_SCM_UB()", 
"RBSCMEvaluation");
   274   unsigned int n_rows = cast_int<unsigned int>(
C_J.size());
   281   for (
unsigned int m=0; m<n_rows; m++)
   291       if ((m==0) || (J_obj < min_J_obj))
   316                                                          const bool write_binary_data)
   318   LOG_SCOPE(
"legacy_write_offline_data_to_files()", 
"RBSCMEvaluation");
   323       if (
mkdir(directory_name.c_str(), 0777) == -1)
   325           libMesh::out << 
"In RBSCMEvaluation::write_offline_data_to_files, directory "   326                        << directory_name << 
" already exists, overwriting contents." << std::endl;
   333       const std::string suffix = write_binary_data ? 
".xdr" : 
".dat";
   336       std::ostringstream file_name;
   340       file_name << directory_name << 
"/parameter_ranges" << suffix;
   341       std::string continuous_param_file_name = file_name.str();
   345       file_name << directory_name << 
"/discrete_parameter_values" << suffix;
   346       std::string discrete_param_file_name = file_name.str();
   349                                     discrete_param_file_name,
   354       file_name << directory_name << 
"/B_min" << suffix;
   355       Xdr B_min_out(file_name.str(), mode);
   360           B_min_out << B_min_i;
   367       file_name << directory_name << 
"/B_max" << suffix;
   368       Xdr B_max_out(file_name.str(), mode);
   373           B_max_out << B_max_i;
   379       file_name << directory_name << 
"/C_J_length" << suffix;
   380       Xdr C_J_length_out(file_name.str(), mode);
   382       unsigned int C_J_length = cast_int<unsigned int>(
C_J.size());
   383       C_J_length_out << C_J_length;
   384       C_J_length_out.
close();
   388       file_name << directory_name << 
"/C_J_stability_vector" << suffix;
   389       Xdr C_J_stability_vector_out(file_name.str(), mode);
   394           C_J_stability_vector_out << C_J_stability_constraint_i;
   396       C_J_stability_vector_out.close();
   400       file_name << directory_name << 
"/C_J" << suffix;
   401       Xdr C_J_out(file_name.str(), mode);
   403       for (
const auto & param : 
C_J)
   404         for (
const auto & pr : param)
   405           for (
const auto & value_vector : pr.second)
   409               libmesh_error_msg_if(value_vector.size() != 1,
   410                                    "Error: multi-value RB parameters are not yet supported here.");
   411               Real param_value = value_vector[0];
   412               C_J_out << param_value;
   418       file_name << directory_name << 
"/SCM_UB_vectors" << suffix;
   419       Xdr SCM_UB_vectors_out(file_name.str(), mode);
   425             SCM_UB_vectors_out << SCM_UB_vector_ij;
   427       SCM_UB_vectors_out.close();
   433                                                           const bool read_binary_data)
   435   LOG_SCOPE(
"legacy_read_offline_data_from_files()", 
"RBSCMEvaluation");
   441   const std::string suffix = read_binary_data ? 
".xdr" : 
".dat";
   444   std::ostringstream file_name;
   448   file_name << directory_name << 
"/parameter_ranges" << suffix;
   449   std::string continuous_param_file_name = file_name.str();
   453   file_name << directory_name << 
"/discrete_parameter_values" << suffix;
   454   std::string discrete_param_file_name = file_name.str();
   456                                  discrete_param_file_name,
   462   file_name << directory_name << 
"/B_min" << suffix;
   463   Xdr B_min_in(file_name.str(), mode);
   469       B_min_in >> B_min_val;
   470       B_min.push_back(B_min_val);
   478   file_name << directory_name << 
"/B_max" << suffix;
   479   Xdr B_max_in(file_name.str(), mode);
   485       B_max_in >> B_max_val;
   486       B_max.push_back(B_max_val);
   491   file_name << directory_name << 
"/C_J_length" << suffix;
   492   Xdr C_J_length_in(file_name.str(), mode);
   494   unsigned int C_J_length;
   495   C_J_length_in >> C_J_length;
   496   C_J_length_in.
close();
   500   file_name << directory_name << 
"/C_J_stability_vector" << suffix;
   501   Xdr C_J_stability_vector_in(file_name.str(), mode);
   504   for (
unsigned int i=0; i<C_J_length; i++)
   506       Real C_J_stability_val;
   507       C_J_stability_vector_in >> C_J_stability_val;
   510   C_J_stability_vector_in.close();
   514   file_name << directory_name << 
"/C_J" << suffix;
   515   Xdr C_J_in(file_name.str(), mode);
   518   C_J.resize( C_J_length );
   519   for (
auto & params : 
C_J)
   522         const std::string & param_name = pr.first;
   524         C_J_in >> param_value;
   525         params.set_value(param_name, param_value);
   532   file_name << directory_name << 
"/SCM_UB_vectors" << suffix;
   533   Xdr SCM_UB_vectors_in(file_name.str(), mode);
   545   SCM_UB_vectors_in.close();
   550 #endif // LIBMESH_HAVE_SLEPC && LIBMESH_HAVE_GLPK 
std::vector< Real > B_min
B_min, B_max define the bounding box. 
virtual Real get_SCM_UB()
Evaluate single SCM upper bound. 
virtual Number eval_A_theta(unsigned int q, const RBParameters &mu) const
Evaluate theta_q_a at the current parameter. 
void set_rb_theta_expansion(RBThetaExpansion &rb_theta_expansion_in)
Set the RBThetaExpansion object. 
void set_SCM_UB_vector(unsigned int j, unsigned int q, Real y_q)
Set entries of SCM_UB_vector, which stores the vector y, corresponding to the minimizing eigenvectors...
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. 
Real get_B_min(unsigned int i) const
Get B_min and B_max. 
void close()
Closes the file if it is open. 
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form. 
int mkdir(const char *pathname)
Create a directory. 
virtual void save_current_parameters()
Helper function to save current_parameters in saved_parameters. 
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. 
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion. 
std::vector< Real > B_max
virtual void legacy_read_offline_data_from_files(const std::string &directory_name="offline_data", const bool read_binary_data=true)
Read in the saved Offline reduced basis data to initialize the system for Online solves. 
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
std::vector< std::vector< Real > > SCM_UB_vectors
This matrix stores the infimizing vectors y_1( ),...,y_Q_a( ), for each  in C_J, which are used in co...
std::vector< Real > C_J_stability_vector
Vector storing the (truth) stability values at the parameters in C_J. 
virtual Real get_SCM_LB()
Evaluate single SCM lower bound. 
XdrMODE
Defines an enum for read/write mode in Xdr format. 
const RBParameters & get_C_J_entry(unsigned int j)
Get entry of C_J. 
virtual void reload_current_parameters()
Helper function to (re)load current_parameters from saved_parameters. 
std::vector< RBParameters > C_J
Vector storing the greedily selected parameters during SCM training. 
RBThetaExpansion * rb_theta_expansion
A pointer to to the object that stores the theta expansion. 
void set_B_min(unsigned int i, Real B_min_val)
Set B_min and B_max. 
void set_C_J_stability_constraint(unsigned int j, Real stability_constraint_in)
Set stability constraints (i.e. 
RBSCMEvaluation(const Parallel::Communicator &comm)
Constructor. 
virtual void legacy_write_offline_data_to_files(const std::string &directory_name="offline_data", const bool write_binary_data=true)
Write out all the data to text files in order to segregate the Offline stage from the Online stage...
const RBParameters & get_parameters() const
Get the current parameters. 
This class is part of the rbOOmit framework. 
An object whose state is distributed along a set of processors. 
This class implements a C++ interface to the XDR (eXternal Data Representation) format. 
virtual void set_current_parameters_from_C_J(unsigned int C_J_index)
Set parameters based on values saved in "C_J". 
bool set_parameters(const RBParameters ¶ms)
Set the current parameters to params The parameters are checked for validity; an error is thrown if t...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void set_B_max(unsigned int i, Real B_max_val)
Real get_C_J_stability_constraint(unsigned int j) const
Get stability constraints (i.e. 
Real get_B_max(unsigned int i) const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
virtual ~RBSCMEvaluation()
Destructor. 
processor_id_type processor_id() const
RBParameters saved_parameters
Vector in which to save a parameter set. 
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Real get_SCM_UB_vector(unsigned int j, unsigned int q)
Get entries of SCM_UB_vector, which stores the vector y, corresponding to the minimizing eigenvectors...