20 #include "libmesh/libmesh_config.h"    21 #if defined(LIBMESH_HAVE_CAPNPROTO)    24 #include "libmesh/rb_eim_evaluation.h"    25 #include "libmesh/string_to_enum.h"    26 #include "libmesh/elem.h"    27 #include "libmesh/mesh.h"    28 #include "libmesh/rb_data_deserialization.h"    29 #include "libmesh/transient_rb_theta_expansion.h"    30 #include "libmesh/transient_rb_evaluation.h"    31 #include "libmesh/rb_eim_evaluation.h"    32 #include "libmesh/rb_scm_evaluation.h"    33 #include "libmesh/rb_parametrized_function.h"    34 #include "libmesh/libmesh_logging.h"    37 #include "capnp/serialize.h"    38 #include "capnp/serialize-packed.h"       41 #ifdef LIBMESH_HAVE_UNISTD_H    61 #ifdef LIBMESH_USE_COMPLEX_NUMBERS    70 namespace RBDataDeserialization
    83                                                  bool read_error_bound_data,
    86   LOG_SCOPE(
"read_from_file()", 
"RBEvaluationDeserialization");
    88   int fd = open(path.c_str(), O_RDONLY);
    89   libmesh_error_msg_if(!fd, 
"Couldn't open the buffer file: " + path);
    92   capnp::ReaderOptions reader_options;
    93   reader_options.traversalLimitInWords = std::numeric_limits<uint64_t>::max();
    95   std::unique_ptr<capnp::InputStreamMessageReader> message;
   100         message = std::make_unique<capnp::PackedFdMessageReader>(fd, reader_options);
   102         message = std::make_unique<capnp::StreamFdMessageReader>(fd, reader_options);
   106       libmesh_error_msg(
"Failed to open capnp buffer");
   109 #ifndef LIBMESH_USE_COMPLEX_NUMBERS   110   RBData::RBEvaluationReal::Reader rb_eval_reader =
   111     message->getRoot<RBData::RBEvaluationReal>();
   113   RBData::RBEvaluationComplex::Reader rb_eval_reader =
   114     message->getRoot<RBData::RBEvaluationComplex>();
   119   int error = close(fd);
   120   libmesh_error_msg_if(error, 
"Error closing a read-only file descriptor: " + path);
   130   _trans_rb_eval(trans_rb_eval)
   136                                                           bool read_error_bound_data,
   139   LOG_SCOPE(
"read_from_file()", 
"TransientRBEvaluationDeserialization");
   141   int fd = open(path.c_str(), O_RDONLY);
   142   libmesh_error_msg_if(!fd, 
"Couldn't open the buffer file: " + path);
   145   capnp::ReaderOptions reader_options;
   146   reader_options.traversalLimitInWords = std::numeric_limits<uint64_t>::max();
   148   std::unique_ptr<capnp::InputStreamMessageReader> message;
   152         message = std::make_unique<capnp::PackedFdMessageReader>(fd, reader_options);
   154         message = std::make_unique<capnp::StreamFdMessageReader>(fd, reader_options);
   158       libmesh_error_msg(
"Failed to open capnp buffer");
   161 #ifndef LIBMESH_USE_COMPLEX_NUMBERS   162   RBData::TransientRBEvaluationReal::Reader trans_rb_eval_reader =
   163     message->getRoot<RBData::TransientRBEvaluationReal>();
   164   RBData::RBEvaluationReal::Reader rb_eval_reader =
   165     trans_rb_eval_reader.getRbEvaluation();
   167   RBData::TransientRBEvaluationComplex::Reader trans_rb_eval_reader =
   168     message->getRoot<RBData::TransientRBEvaluationComplex>();
   169   RBData::RBEvaluationComplex::Reader rb_eval_reader =
   170     trans_rb_eval_reader.getRbEvaluation();
   175                                     trans_rb_eval_reader,
   176                                     read_error_bound_data);
   178   int error = close(fd);
   179   libmesh_error_msg_if(error, 
"Error closing a read-only file descriptor: " + path);
   189   _rb_eim_eval(rb_eim_eval)
   197   LOG_SCOPE(
"read_from_file()", 
"RBEIMEvaluationDeserialization");
   199   int fd = open(path.c_str(), O_RDONLY);
   200   libmesh_error_msg_if(!fd, 
"Couldn't open the buffer file: " + path);
   203   capnp::ReaderOptions reader_options;
   204   reader_options.traversalLimitInWords = std::numeric_limits<uint64_t>::max();
   206   std::unique_ptr<capnp::InputStreamMessageReader> message;
   210         message = std::make_unique<capnp::PackedFdMessageReader>(fd, reader_options);
   212         message = std::make_unique<capnp::StreamFdMessageReader>(fd, reader_options);
   216       libmesh_error_msg(
"Failed to open capnp buffer");
   219 #ifndef LIBMESH_USE_COMPLEX_NUMBERS   220   RBData::RBEIMEvaluationReal::Reader rb_eim_eval_reader =
   221     message->getRoot<RBData::RBEIMEvaluationReal>();
   223   RBData::RBEIMEvaluationComplex::Reader rb_eim_eval_reader =
   224     message->getRoot<RBData::RBEIMEvaluationComplex>();
   230   int error = close(fd);
   231   libmesh_error_msg_if(error, 
"Error closing a read-only file descriptor: " + path);
   241 #if defined(LIBMESH_HAVE_SLEPC) && (LIBMESH_HAVE_GLPK)   245   _rb_scm_eval(rb_scm_eval)
   253   LOG_SCOPE(
"read_from_file()", 
"RBSCMEvaluationDeserialization");
   255   int fd = open(path.c_str(), O_RDONLY);
   256   libmesh_error_msg_if(!fd, 
"Couldn't open the buffer file: " + path);
   259   capnp::ReaderOptions reader_options;
   260   reader_options.traversalLimitInWords = std::numeric_limits<uint64_t>::max();
   262   std::unique_ptr<capnp::InputStreamMessageReader> message;
   266         message = std::make_unique<capnp::PackedFdMessageReader>(fd, reader_options);
   268         message = std::make_unique<capnp::StreamFdMessageReader>(fd, reader_options);
   272       libmesh_error_msg(
"Failed to open capnp buffer");
   275   RBData::RBSCMEvaluation::Reader rb_scm_eval_reader =
   276     message->getRoot<RBData::RBSCMEvaluation>();
   281   int error = close(fd);
   282   libmesh_error_msg_if(error, 
"Error closing a read-only file descriptor: " + path);
   285 #endif // LIBMESH_HAVE_SLEPC && LIBMESH_HAVE_GLPK   293                            RBData::ParameterRanges::Reader & parameter_ranges,
   294                            RBData::DiscreteParameterList::Reader & discrete_parameters_list)
   301   std::map<std::string, std::vector<Real>> discrete_parameter_values;
   308 #ifdef LIBMESH_ENABLE_EXCEPTIONS   312     const auto & parameter_names = parameter_ranges.getNames();
   313     for (
auto i : 
make_range(parameter_names.size()))
   315         parameters_min.
set_value(parameter_names[i], parameter_ranges.getMinValues()[i]);
   316         parameters_max.
set_value(parameter_names[i], parameter_ranges.getMaxValues()[i]);
   320     const auto & discrete_names = discrete_parameters_list.getNames();
   321     for (
auto i : 
make_range(discrete_names.size()))
   323         const auto & value_list = discrete_parameters_list.getValues()[i];
   324         unsigned int n_values = value_list.size();
   325         std::vector<Real> values(n_values);
   326         for (
unsigned int j=0; j<n_values; ++j)
   327           values[j] = value_list[j];
   329         discrete_parameter_values[discrete_names[i]] = values;
   332 #ifdef LIBMESH_ENABLE_EXCEPTIONS   333   catch (std::exception & e)
   335     libmesh_error_msg(
"Error loading parameter ranges from capnp reader.\n"   336                       "This usually means that the training data either doesn't exist or is out of date.\n"   337                       "Detailed information about the error is below:\n\n" << e.what() << 
"\n");
   343                                       discrete_parameter_values);
   346 template <
typename RBEvaluationReaderNumber>
   348                              RBEvaluationReaderNumber & rb_evaluation_reader,
   349                              bool read_error_bound_data)
   352   unsigned int n_bfs = rb_evaluation_reader.getNBfs();
   357   auto parameter_ranges =
   358     rb_evaluation_reader.getParameterRanges();
   359   auto discrete_parameters_list =
   360     rb_evaluation_reader.getDiscreteParameters();
   364                         discrete_parameters_list);
   371   if (read_error_bound_data)
   376         unsigned int Q_f_hat = n_F_terms*(n_F_terms+1)/2;
   378         auto fq_innerprods_list = rb_evaluation_reader.getFqInnerprods();
   379         libmesh_error_msg_if(fq_innerprods_list.size() != Q_f_hat,
   380                              "Size error while reading Fq representor norm data from buffer.");
   382         for (
unsigned int i=0; i < Q_f_hat; ++i)
   388         auto fq_aq_innerprods_list = rb_evaluation_reader.getFqAqInnerprods();
   389         libmesh_error_msg_if(fq_aq_innerprods_list.size() != n_F_terms*n_A_terms*n_bfs,
   390                              "Size error while reading Fq-Aq representor norm data from buffer.");
   392         for (
unsigned int q_f=0; q_f<n_F_terms; ++q_f)
   393           for (
unsigned int q_a=0; q_a<n_A_terms; ++q_a)
   394             for (
unsigned int i=0; i<n_bfs; ++i)
   396                 unsigned int offset = q_f*n_A_terms*n_bfs + q_a*n_bfs + i;
   398                   load_scalar_value(fq_aq_innerprods_list[offset]);
   404         unsigned int Q_a_hat = n_A_terms*(n_A_terms+1)/2;
   405         auto aq_aq_innerprods_list = rb_evaluation_reader.getAqAqInnerprods();
   406         libmesh_error_msg_if(aq_aq_innerprods_list.size() != Q_a_hat*n_bfs*n_bfs,
   407                              "Size error while reading Aq-Aq representor norm data from buffer.");
   409         for (
unsigned int i=0; i<Q_a_hat; ++i)
   410           for (
unsigned int j=0; j<n_bfs; ++j)
   411             for (
unsigned int l=0; l<n_bfs; ++l)
   413                 unsigned int offset = i*n_bfs*n_bfs + j*n_bfs + l;
   415                   load_scalar_value(aq_aq_innerprods_list[offset]);
   422         auto output_innerprod_outer = rb_evaluation_reader.getOutputDualInnerprods();
   424         libmesh_error_msg_if(output_innerprod_outer.size() != n_outputs,
   425                              "Incorrect number of outputs detected in the buffer");
   427         for (
unsigned int output_id=0; output_id<n_outputs; ++output_id)
   431             unsigned int Q_l_hat = n_output_terms*(n_output_terms+1)/2;
   432             auto output_innerprod_inner = output_innerprod_outer[output_id];
   434             libmesh_error_msg_if(output_innerprod_inner.size() != Q_l_hat,
   435                                  "Incorrect number of output terms detected in the buffer");
   437             for (
unsigned int q=0; q<Q_l_hat; ++q)
   440                   load_scalar_value(output_innerprod_inner[q]);
   449     auto output_vector_outer = rb_evaluation_reader.getOutputVectors();
   451     libmesh_error_msg_if(output_vector_outer.size() != n_outputs,
   452                          "Incorrect number of outputs detected in the buffer");
   454     for (
unsigned int output_id=0; output_id<n_outputs; ++output_id)
   458         auto output_vector_middle = output_vector_outer[output_id];
   459         libmesh_error_msg_if(output_vector_middle.size() != n_output_terms,
   460                              "Incorrect number of output terms detected in the buffer");
   462         for (
unsigned int q_l=0; q_l<n_output_terms; ++q_l)
   464             auto output_vectors_inner_list = output_vector_middle[q_l];
   466             libmesh_error_msg_if(output_vectors_inner_list.size() != n_bfs,
   467                                  "Incorrect number of output terms detected in the buffer");
   469             for (
unsigned int j=0; j<n_bfs; ++j)
   472                   load_scalar_value(output_vectors_inner_list[j]);
   480     auto rb_fq_vectors_outer_list = rb_evaluation_reader.getRbFqVectors();
   481     libmesh_error_msg_if(rb_fq_vectors_outer_list.size() != n_F_terms,
   482                          "Incorrect number of Fq vectors detected in the buffer");
   484     for (
unsigned int q_f=0; q_f<n_F_terms; ++q_f)
   486         auto rb_fq_vectors_inner_list = rb_fq_vectors_outer_list[q_f];
   487         libmesh_error_msg_if(rb_fq_vectors_inner_list.size() != n_bfs,
   488                              "Incorrect Fq vector size detected in the buffer");
   490         for (
unsigned int i=0; i < n_bfs; ++i)
   493               load_scalar_value(rb_fq_vectors_inner_list[i]);
   497     auto rb_Aq_matrices_outer_list = rb_evaluation_reader.getRbAqMatrices();
   498     libmesh_error_msg_if(rb_Aq_matrices_outer_list.size() != n_A_terms,
   499                          "Incorrect number of Aq matrices detected in the buffer");
   501     for (
unsigned int q_a=0; q_a<n_A_terms; ++q_a)
   503         auto rb_Aq_matrices_inner_list = rb_Aq_matrices_outer_list[q_a];
   504         libmesh_error_msg_if(rb_Aq_matrices_inner_list.size() != n_bfs*n_bfs,
   505                              "Incorrect Aq matrix size detected in the buffer");
   507         for (
unsigned int i=0; i<n_bfs; ++i)
   508           for (
unsigned int j=0; j<n_bfs; ++j)
   510               unsigned int offset = i*n_bfs+j;
   512                 load_scalar_value(rb_Aq_matrices_inner_list[offset]);
   520       auto rb_inner_product_matrix_list =
   521         rb_evaluation_reader.getRbInnerProductMatrix();
   523       libmesh_error_msg_if(rb_inner_product_matrix_list.size() != n_bfs*n_bfs,
   524                            "Size error while reading the inner product matrix.");
   526       for (
unsigned int i=0; i<n_bfs; ++i)
   527         for (
unsigned int j=0; j<n_bfs; ++j)
   529             unsigned int offset = i*n_bfs + j;
   531               load_scalar_value(rb_inner_product_matrix_list[offset]);
   536 template <
typename RBEvaluationReaderNumber, 
typename TransRBEvaluationReaderNumber>
   538                                        RBEvaluationReaderNumber & rb_eval_reader,
   539                                        TransRBEvaluationReaderNumber & trans_rb_eval_reader,
   540                                        bool read_error_bound_data)
   544                           read_error_bound_data);
   546   trans_rb_eval.
set_delta_t( trans_rb_eval_reader.getDeltaT() );
   549   trans_rb_eval.
set_time_step( trans_rb_eval_reader.getTimeStep() );
   551   unsigned int n_bfs = rb_eval_reader.getNBfs();
   557   unsigned int n_M_terms = trans_theta_expansion.
get_n_M_terms();
   561     auto rb_L2_matrix_list =
   562       trans_rb_eval_reader.getRbL2Matrix();
   564     libmesh_error_msg_if(rb_L2_matrix_list.size() != n_bfs*n_bfs,
   565                          "Size error while reading the L2 matrix.");
   567     for (
unsigned int i=0; i<n_bfs; ++i)
   568       for (
unsigned int j=0; j<n_bfs; ++j)
   570           unsigned int offset = i*n_bfs + j;
   572             load_scalar_value(rb_L2_matrix_list[offset]);
   578     auto rb_Mq_matrices_outer_list = trans_rb_eval_reader.getRbMqMatrices();
   580     libmesh_error_msg_if(rb_Mq_matrices_outer_list.size() != n_M_terms,
   581                          "Incorrect number of Mq matrices detected in the buffer");
   583     for (
unsigned int q_m=0; q_m < n_M_terms; ++q_m)
   585         auto rb_Mq_matrices_inner_list = rb_Mq_matrices_outer_list[q_m];
   586         libmesh_error_msg_if(rb_Mq_matrices_inner_list.size() != n_bfs*n_bfs,
   587                              "Incorrect Mq matrix size detected in the buffer");
   589         for (
unsigned int i=0; i<n_bfs; ++i)
   590           for (
unsigned int j=0; j<n_bfs; ++j)
   592               unsigned int offset = i*n_bfs+j;
   594                 load_scalar_value(rb_Mq_matrices_inner_list[offset]);
   601     auto initial_l2_errors_reader =
   602       trans_rb_eval_reader.getInitialL2Errors();
   603     libmesh_error_msg_if(initial_l2_errors_reader.size() != n_bfs,
   604                          "Incorrect number of initial L2 error terms detected in the buffer");
   606     auto initial_conditions_outer_list =
   607       trans_rb_eval_reader.getInitialConditions();
   608     libmesh_error_msg_if(initial_conditions_outer_list.size() != n_bfs,
   609                          "Incorrect number of outer initial conditions detected in the buffer");
   611     for (
unsigned int i=0; i<n_bfs; i++)
   614           initial_l2_errors_reader[i];
   616         auto initial_conditions_inner_list = initial_conditions_outer_list[i];
   617         libmesh_error_msg_if(initial_conditions_inner_list.size() != (i+1),
   618                              "Incorrect number of inner initial conditions detected in the buffer");
   620         for (
unsigned int j=0; j<=i; j++)
   623               load_scalar_value(initial_conditions_inner_list[j]);
   629   if (read_error_bound_data)
   633         auto fq_mq_innerprods_list = trans_rb_eval_reader.getFqMqInnerprods();
   634         libmesh_error_msg_if(fq_mq_innerprods_list.size() != n_F_terms*n_M_terms*n_bfs,
   635                              "Size error while reading Fq-Mq representor data from buffer.");
   637         for (
unsigned int q_f=0; q_f<n_F_terms; ++q_f)
   638           for (
unsigned int q_m=0; q_m<n_M_terms; ++q_m)
   639             for (
unsigned int i=0; i<n_bfs; ++i)
   641                 unsigned int offset = q_f*n_M_terms*n_bfs + q_m*n_bfs + i;
   643                   load_scalar_value(fq_mq_innerprods_list[offset]);
   650         unsigned int Q_m_hat = n_M_terms*(n_M_terms+1)/2;
   651         auto mq_mq_innerprods_list = trans_rb_eval_reader.getMqMqInnerprods();
   652         libmesh_error_msg_if(mq_mq_innerprods_list.size() != Q_m_hat*n_bfs*n_bfs,
   653                              "Size error while reading Mq-Mq representor data from buffer.");
   655         for (
unsigned int i=0; i<Q_m_hat; ++i)
   656           for (
unsigned int j=0; j<n_bfs; ++j)
   657             for (
unsigned int l=0; l<n_bfs; ++l)
   659                 unsigned int offset = i*n_bfs*n_bfs + j*n_bfs + l;
   661                   load_scalar_value(mq_mq_innerprods_list[offset]);
   667         auto aq_mq_innerprods_list =
   668           trans_rb_eval_reader.getAqMqInnerprods();
   669         libmesh_error_msg_if(aq_mq_innerprods_list.size() != n_A_terms*n_M_terms*n_bfs*n_bfs,
   670                              "Size error while reading Aq-Mq representor data from buffer.");
   672         for (
unsigned int q_a=0; q_a<n_A_terms; q_a++)
   673           for (
unsigned int q_m=0; q_m<n_M_terms; q_m++)
   674             for (
unsigned int i=0; i<n_bfs; i++)
   675               for (
unsigned int j=0; j<n_bfs; j++)
   677                   unsigned int offset =
   678                     q_a*(n_M_terms*n_bfs*n_bfs) + q_m*(n_bfs*n_bfs) + i*n_bfs + j;
   681                     load_scalar_value(aq_mq_innerprods_list[offset]);
   688 template <
typename RBEIMEvaluationReaderNumber>
   690                                  RBEIMEvaluationReaderNumber & rb_eim_evaluation_reader)
   693   unsigned int n_bfs = rb_eim_evaluation_reader.getNBfs();
   700     auto interpolation_matrix_list = rb_eim_evaluation_reader.getInterpolationMatrix();
   702     libmesh_error_msg_if(interpolation_matrix_list.size() != n_bfs*(n_bfs+1)/2,
   703                          "Size error while reading the eim inner product matrix.");
   705     for (
unsigned int i=0; i<n_bfs; ++i)
   706       for (
unsigned int j=0; j<=i; ++j)
   708           unsigned int offset = i*(i+1)/2 + j;
   710             i,j, load_scalar_value(interpolation_matrix_list[offset]));
   719   if (rb_eim_evaluation_reader.getInterpolationXyz().size() > n_bfs)
   721     auto error_indicator_data_list = rb_eim_evaluation_reader.getEimErrorIndicatorInterpData();
   723     libmesh_error_msg_if(error_indicator_data_list.size() != n_bfs,
   724                          "Size error while reading the eim error indicator data.");
   727     for (
unsigned int i=0; i<n_bfs; ++i)
   728       eim_error_indicator_data(i) = load_scalar_value(error_indicator_data_list[i]);
   740   if (rb_eim_evaluation_reader.getInterpolationXyz().size() > n_bfs)
   743   auto parameter_ranges =
   744     rb_eim_evaluation_reader.getParameterRanges();
   745   auto discrete_parameters_list =
   746     rb_eim_evaluation_reader.getDiscreteParameters();
   750                         discrete_parameters_list);
   754     auto interpolation_points_list =
   755       rb_eim_evaluation_reader.getInterpolationXyz();
   757     libmesh_error_msg_if(interpolation_points_list.size() != n_bfs,
   758                          "Size error while reading the eim interpolation points.");
   760     for (
unsigned int i=0; i<n_bfs; ++i)
   770     auto interpolation_points_comp_list =
   771       rb_eim_evaluation_reader.getInterpolationComp();
   773     libmesh_error_msg_if(interpolation_points_comp_list.size() != n_bfs,
   774                          "Size error while reading the eim interpolation components.");
   776     for (
unsigned int i=0; i<n_bfs; ++i)
   784     auto interpolation_points_subdomain_id_list =
   785       rb_eim_evaluation_reader.getInterpolationSubdomainId();
   787     libmesh_error_msg_if(interpolation_points_subdomain_id_list.size() != n_bfs,
   788                          "Size error while reading the eim interpolation subdomain IDs.");
   790     for (
unsigned int i=0; i<n_bfs; ++i)
   801     auto interpolation_points_boundary_id_list =
   802       rb_eim_evaluation_reader.getInterpolationBoundaryId();
   804     libmesh_error_msg_if(interpolation_points_boundary_id_list.size() != n_bfs,
   805                          "Size error while reading the eim interpolation boundary IDs.");
   807     for (
unsigned int i=0; i<n_bfs; ++i)
   815     auto interpolation_points_elem_id_list =
   816       rb_eim_evaluation_reader.getInterpolationElemId();
   818     libmesh_error_msg_if(interpolation_points_elem_id_list.size() != n_bfs,
   819                          "Size error while reading the eim interpolation element IDs.");
   821     for (
unsigned int i=0; i<n_bfs; ++i)
   830     auto interpolation_points_node_id_list =
   831       rb_eim_evaluation_reader.getInterpolationNodeId();
   833     libmesh_error_msg_if(interpolation_points_node_id_list.size() != n_bfs,
   834                          "Size error while reading the eim interpolation node IDs.");
   836     for (
unsigned int i=0; i<n_bfs; ++i)
   845     auto interpolation_points_side_index_list =
   846       rb_eim_evaluation_reader.getInterpolationSideIndex();
   848     libmesh_error_msg_if(interpolation_points_side_index_list.size() != n_bfs,
   849                          "Size error while reading the eim interpolation side indices.");
   851     for (
unsigned int i=0; i<n_bfs; ++i)
   859     auto interpolation_points_qp_list =
   860       rb_eim_evaluation_reader.getInterpolationQp();
   862     libmesh_error_msg_if(interpolation_points_qp_list.size() != n_bfs,
   863                          "Size error while reading the eim interpolation qps.");
   865     for (
unsigned int i=0; i<n_bfs; ++i)
   871   unsigned int n_elems = rb_eim_evaluation_reader.getNElems();
   872   bool build_elem_id_to_local_index_map = 
false;
   875     auto interpolation_points_list_outer =
   876       rb_eim_evaluation_reader.getInterpolationJxWAllQp();
   878     if (interpolation_points_list_outer.size() > 0)
   882             libmesh_error_msg_if(interpolation_points_list_outer.size() != n_elems,
   883                                  "Size error while reading the eim JxW values.");
   885             for (
unsigned int i=0; i<n_elems; ++i)
   887                 auto interpolation_points_list_inner = interpolation_points_list_outer[i];
   889                 std::vector<Real> JxW(interpolation_points_list_inner.size());
   890                 for (
unsigned int j=0; j<JxW.size(); j++)
   892                     JxW[j] = interpolation_points_list_inner[j];
   908             build_elem_id_to_local_index_map = 
true;
   910             auto interpolation_points_elem_id_list =
   911               rb_eim_evaluation_reader.getInterpolationElemId();
   912             std::set<dof_id_type> added_elem_id;
   914             libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
   915                                  "Size error while reading the eim JxW values.");
   917             for (
unsigned int i=0; i<n_bfs; ++i)
   919                 dof_id_type elem_id = interpolation_points_elem_id_list[i];
   920                 if (
const auto lookup = added_elem_id.find(elem_id); lookup == added_elem_id.end())
   922                     added_elem_id.emplace(elem_id);
   924                     auto interpolation_points_list_inner = interpolation_points_list_outer[i];
   925                     std::vector<Real> JxW(interpolation_points_list_inner.size());
   926                     for (
unsigned int j=0; j<JxW.size(); j++)
   928                         JxW[j] = interpolation_points_list_inner[j];
   939     auto interpolation_points_list_outer =
   940       rb_eim_evaluation_reader.getInterpolationPhiValuesAllQp();
   942     if (interpolation_points_list_outer.size() > 0)
   946             libmesh_error_msg_if(interpolation_points_list_outer.size() != n_elems,
   947                                  "Size error while reading the eim phi_i all qp values.");
   949             for (
unsigned int i=0; i<n_elems; ++i)
   951                 auto interpolation_points_list_middle = interpolation_points_list_outer[i];
   953                 std::vector<std::vector<Real>> phi_i_all_qp(interpolation_points_list_middle.size());
   956                     auto interpolation_points_list_inner = interpolation_points_list_middle[j];
   958                     phi_i_all_qp[j].resize(interpolation_points_list_inner.size());
   960                       phi_i_all_qp[j][k] = interpolation_points_list_inner[k];
   970             auto interpolation_points_elem_id_list =
   971               rb_eim_evaluation_reader.getInterpolationElemId();
   972             std::set<dof_id_type> added_elem_id;
   974             libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
   975                                  "Size error while reading the eim JxW values.");
   977             for (
unsigned int i=0; i<n_bfs; ++i)
   979                 dof_id_type elem_id = interpolation_points_elem_id_list[i];
   980                 if (
const auto lookup = added_elem_id.find(elem_id); lookup == added_elem_id.end())
   982                     added_elem_id.emplace(elem_id);
   984                     auto interpolation_points_list_middle = interpolation_points_list_outer[i];
   985                     std::vector<std::vector<Real>> phi_i_all_qp(interpolation_points_list_middle.size());
   988                         auto interpolation_points_list_inner = interpolation_points_list_middle[j];
   990                         phi_i_all_qp[j].resize(interpolation_points_list_inner.size());
   992                           phi_i_all_qp[j][k] = interpolation_points_list_inner[k];
  1003     auto elem_id_to_local_index_list =
  1004       rb_eim_evaluation_reader.getElemIdToLocalIndex();
  1006     if (elem_id_to_local_index_list.size() > 0)
  1008         libmesh_error_msg_if(elem_id_to_local_index_list.size() != n_elems,
  1009                              "Size error while reading the eim elem id to local index map.");
  1011         for (
unsigned int i=0; i<n_elems; ++i)
  1018     else if (build_elem_id_to_local_index_map)
  1020         auto interpolation_points_elem_id_list =
  1021           rb_eim_evaluation_reader.getInterpolationElemId();
  1022         std::set<dof_id_type> added_elem_id;
  1023         unsigned int local_index = 0;
  1025         libmesh_error_msg_if(interpolation_points_elem_id_list.size() != n_bfs,
  1026                              "Size error while creating the eim elem id to local index map.");
  1028         for (
unsigned int i=0; i<n_bfs; ++i)
  1030             dof_id_type elem_id = interpolation_points_elem_id_list[i];
  1031             if (
const auto lookup = added_elem_id.find(elem_id); lookup == added_elem_id.end())
  1033                 added_elem_id.emplace(elem_id);
  1043     auto elem_center_dxyzdxi =
  1044       rb_eim_evaluation_reader.getInterpolationDxyzDxiElem();
  1046     if (elem_center_dxyzdxi.size() > 0)
  1050             libmesh_error_msg_if(elem_center_dxyzdxi.size() != n_elems,
  1051                                  "Size error while reading the eim elem center tangent derivative dxyzdxi.");
  1053             Point dxyzdxi_buffer;
  1056                 load_point(elem_center_dxyzdxi[i], dxyzdxi_buffer);
  1065             auto interpolation_points_elem_id_list =
  1066               rb_eim_evaluation_reader.getInterpolationElemId();
  1067             std::set<dof_id_type> added_elem_id;
  1069             libmesh_error_msg_if(elem_center_dxyzdxi.size() != n_bfs,
  1070                                  "Size error while reading the eim elem center tangent derivative dxyzdxi.");
  1072             Point dxyzdxi_buffer;
  1073             for (
unsigned int i=0; i<n_bfs; ++i)
  1075                 dof_id_type elem_id = interpolation_points_elem_id_list[i];
  1076                 if (
const auto lookup = added_elem_id.find(elem_id); lookup == added_elem_id.end())
  1078                     added_elem_id.emplace(elem_id);
  1080                     load_point(elem_center_dxyzdxi[i], dxyzdxi_buffer);
  1090     auto elem_center_dxyzdeta =
  1091       rb_eim_evaluation_reader.getInterpolationDxyzDetaElem();
  1093     if (elem_center_dxyzdeta.size() > 0)
  1097             libmesh_error_msg_if(elem_center_dxyzdeta.size() != n_elems,
  1098                                  "Size error while reading the eim elem center tangent derivative dxyzdeta.");
  1100             Point dxyzdeta_buffer;
  1103                 load_point(elem_center_dxyzdeta[i], dxyzdeta_buffer);
  1112             auto interpolation_points_elem_id_list =
  1113               rb_eim_evaluation_reader.getInterpolationElemId();
  1114             std::set<dof_id_type> added_elem_id;
  1116             libmesh_error_msg_if(elem_center_dxyzdeta.size() != n_bfs,
  1117                                  "Size error while reading the eim elem center tangent derivative dxyzdeta.");
  1119             Point dxyzdeta_buffer;
  1120             for (
unsigned int i=0; i<n_bfs; ++i)
  1122                 dof_id_type elem_id = interpolation_points_elem_id_list[i];
  1123                 if (
const auto lookup = added_elem_id.find(elem_id); lookup == added_elem_id.end())
  1125                     added_elem_id.emplace(elem_id);
  1127                     load_point(elem_center_dxyzdeta[i], dxyzdeta_buffer);
  1137     auto interpolation_points_qrule_order_list =
  1138       rb_eim_evaluation_reader.getInterpolationQruleOrder();
  1140     if (interpolation_points_qrule_order_list.size() > 0)
  1144             libmesh_error_msg_if(interpolation_points_qrule_order_list.size() != n_elems,
  1145                                  "Size error while reading the eim elem qrule order.");
  1147             for (
unsigned int i=0; i<n_elems; ++i)
  1157             auto interpolation_points_elem_id_list =
  1158               rb_eim_evaluation_reader.getInterpolationElemId();
  1159             std::set<dof_id_type> added_elem_id;
  1161             libmesh_error_msg_if(interpolation_points_qrule_order_list.size() != n_bfs,
  1162                                  "Size error while reading the eim elem qrule order.");
  1164             for (
unsigned int i=0; i<n_bfs; ++i)
  1166                 dof_id_type elem_id = interpolation_points_elem_id_list[i];
  1167                 if (
const auto lookup = added_elem_id.find(elem_id); lookup == added_elem_id.end())
  1169                     added_elem_id.emplace(elem_id);
  1180     auto interpolation_points_elem_type_list =
  1181       rb_eim_evaluation_reader.getInterpolationElemType();
  1183     if (interpolation_points_elem_type_list.size() > 0)
  1185         libmesh_error_msg_if(interpolation_points_elem_type_list.size() != n_bfs,
  1186                              "Size error while reading the eim interpolation element types.");
  1188         for (
unsigned int i=0; i<n_bfs; ++i)
  1197     auto interpolation_points_property_list =
  1198       rb_eim_evaluation_reader.getPropertyMap();
  1200     if (interpolation_points_property_list.size() > 0)
  1202         unsigned int n_properties = interpolation_points_property_list.size();
  1203         for (
unsigned int i=0; i<n_properties; ++i)
  1205             std::string property_name = interpolation_points_property_list[i].getName();
  1206             const auto entity_ids_list = interpolation_points_property_list[i].getEntityIds();
  1207             std::set<dof_id_type> entity_ids_set;
  1208             for (
unsigned int j=0; j<entity_ids_list.size(); ++j)
  1210               entity_ids_set.insert(static_cast<dof_id_type>(entity_ids_list[j]));
  1219     auto interpolation_points_list_outer =
  1220       rb_eim_evaluation_reader.getInterpolationXyzPerturb();
  1222     libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
  1223                          "Size error while reading the eim interpolation points.");
  1225     for (
unsigned int i=0; i<n_bfs; ++i)
  1227         auto interpolation_points_list_inner = interpolation_points_list_outer[i];
  1229         std::vector<Point> perturbs(interpolation_points_list_inner.size());
  1230         for (
unsigned int j=0; j<perturbs.size(); j++)
  1232             load_point(interpolation_points_list_inner[j], perturbs[j]);
  1241       auto eim_rhs_list_outer =
  1242         rb_eim_evaluation_reader.getEimSolutionsForTrainingSet();
  1245       eim_solutions.clear();
  1246       eim_solutions.resize(eim_rhs_list_outer.size());
  1248       for (
auto i : 
make_range(eim_rhs_list_outer.size()))
  1250           auto eim_rhs_list_inner = eim_rhs_list_outer[i];
  1255               values(j) = load_scalar_value(eim_rhs_list_inner[j]);
  1257           eim_solutions[i] = values;
  1264     auto interpolation_points_list_outer =
  1265       rb_eim_evaluation_reader.getInterpolationPhiValues();
  1267     libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
  1268                          "Size error while reading the eim interpolation points.");
  1270     for (
unsigned int i=0; i<n_bfs; ++i)
  1272         auto interpolation_points_list_inner = interpolation_points_list_outer[i];
  1274         std::vector<Real> phi_i_qp(interpolation_points_list_inner.size());
  1275         for (
unsigned int j=0; j<phi_i_qp.size(); j++)
  1277             phi_i_qp[j] = interpolation_points_list_inner[j];
  1286     auto interpolation_points_list_outer =
  1287       rb_eim_evaluation_reader.getInterpolationSpatialIndices();
  1289     for (
unsigned int i=0; i<interpolation_points_list_outer.size(); ++i)
  1291         auto interpolation_points_list_inner = interpolation_points_list_outer[i];
  1293         std::vector<unsigned int> spatial_indices(interpolation_points_list_inner.size());
  1294         for (
unsigned int j=0; j<spatial_indices.size(); j++)
  1296             spatial_indices[j] = interpolation_points_list_inner[j];
  1305 #if defined(LIBMESH_HAVE_SLEPC) && (LIBMESH_HAVE_GLPK)  1307                                  RBData::RBSCMEvaluation::Reader & rb_scm_evaluation_reader)
  1309   auto parameter_ranges =
  1310     rb_scm_evaluation_reader.getParameterRanges();
  1311   auto discrete_parameters_list =
  1312     rb_scm_evaluation_reader.getDiscreteParameters();
  1315                         discrete_parameters_list);
  1320     auto b_min_list = rb_scm_evaluation_reader.getBMin();
  1322     libmesh_error_msg_if(b_min_list.size() != n_A_terms,
  1323                          "Size error while reading B_min");
  1325     rb_scm_eval.
B_min.clear();
  1326     for (
unsigned int i=0; i<n_A_terms; i++)
  1327       rb_scm_eval.
B_min.push_back(b_min_list[i]);
  1331     auto b_max_list = rb_scm_evaluation_reader.getBMax();
  1333     libmesh_error_msg_if(b_max_list.size() != n_A_terms,
  1334                          "Size error while reading B_max");
  1336     rb_scm_eval.
B_max.clear();
  1337     for (
unsigned int i=0; i<n_A_terms; i++)
  1338       rb_scm_eval.
B_max.push_back(b_max_list[i]);
  1342     auto cJ_stability_vector =
  1343       rb_scm_evaluation_reader.getCJStabilityVector();
  1346     for (
const auto & val : cJ_stability_vector)
  1351     auto cJ_parameters_outer =
  1352       rb_scm_evaluation_reader.getCJ();
  1354     rb_scm_eval.
C_J.resize(cJ_parameters_outer.size());
  1355     for (
auto i : 
make_range(cJ_parameters_outer.size()))
  1357         auto cJ_parameters_inner =
  1358           cJ_parameters_outer[i];
  1360         for (
auto j : 
make_range(cJ_parameters_inner.size()))
  1362             std::string param_name = cJ_parameters_inner[j].getName();
  1363             Real param_value = cJ_parameters_inner[j].getValue();
  1364             rb_scm_eval.
C_J[i].set_value(param_name, param_value);
  1370     auto scm_ub_vectors =
  1371       rb_scm_evaluation_reader.getScmUbVectors();
  1374     unsigned int n_C_J_values = rb_scm_evaluation_reader.getCJ().size();
  1376     libmesh_error_msg_if(scm_ub_vectors.size() != n_C_J_values*n_A_terms,
  1377                          "Size mismatch in SCB UB vectors");
  1380     for (
unsigned int i=0; i<n_C_J_values; i++)
  1383         for (
unsigned int j=0; j<n_A_terms; j++)
  1385             unsigned int offset = i*n_A_terms + j;
  1393 #endif // LIBMESH_HAVE_SLEPC && LIBMESH_HAVE_GLPK  1399   point(0) = point_reader.getX();
  1401   if (LIBMESH_DIM >= 2)
  1402     point(1) = point_reader.getY();
  1404   if (LIBMESH_DIM >= 3)
  1405     point(2) = point_reader.getZ();
  1414 #endif // #if defined(LIBMESH_HAVE_CAPNPROTO) std::vector< Real > B_min
B_min, B_max define the bounding box. 
std::vector< std::vector< std::vector< Number > > > Mq_Mq_representor_innerprods
void add_rb_property_map_entry(std::string &property_name, std::set< dof_id_type > &entity_ids)
void read_from_file(const std::string &path, bool read_error_bound_data, bool use_packing=false)
Read the Cap'n'Proto buffer from disk. 
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix. 
void add_interpolation_points_boundary_id(boundary_id_type b_id)
RBSCMEvaluation & _rb_scm_eval
The RBSCMEvaluation object we will read into. 
void set_delta_t(const Real delta_t_in)
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side. 
void set_interpolation_matrix_entry(unsigned int i, unsigned int j, Number value)
Set entry of the EIM interpolation matrix. 
virtual void resize_data_structures(const unsigned int Nmax, bool resize_error_bound_data=true)
Resize and clear the data vectors corresponding to the value of Nmax. 
void read_from_file(const std::string &path, bool use_packing=false)
Read the Cap'n'Proto buffer from disk. 
std::vector< DenseMatrix< Number > > RB_M_q_vector
Dense matrices for the RB mass matrices. 
void load_rb_evaluation_data(RBEvaluation &rb_evaluation, RBEvaluationReaderNumber &rb_evaluation_reader, bool read_error_bound_data)
Load an RB evaluation from a corresponding reader structure in the buffer. 
DenseMatrix< Number > RB_inner_product_matrix
The inner product matrix. 
void add_interpolation_points_elem_id(dof_id_type elem_id)
void load_rb_scm_evaluation_data(RBSCMEvaluation &rb_scm_eval, RBData::RBSCMEvaluation::Reader &rb_scm_eval_reader)
Load an SCM RB evaluation from a corresponding reader structure in the buffer. 
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form. 
This class is part of the rbOOmit framework. 
void load_transient_rb_evaluation_data(TransientRBEvaluation &trans_rb_eval, RBEvaluationReaderNumber &rb_evaluation_reader, TransRBEvaluationReaderNumber &trans_rb_eval_reader, bool read_error_bound_data)
Load an RB evaluation from a corresponding reader structure in the buffer. 
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output. 
The libMesh namespace provides an interface to certain functionality in the library. 
const std::vector< DenseVector< Number > > & get_eim_solutions_for_training_set() const
Return a const reference to the EIM solutions for the parameters in the training set. 
void initialize_param_fn_spatial_indices()
The Online counterpart of initialize_interpolation_points_spatial_indices(). 
void add_interpolation_points_xyz_perturbations(const std::vector< Point > &perturbs)
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion. 
std::vector< Real > B_max
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals. 
virtual ~RBSCMEvaluationDeserialization()
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. 
void set_time_step(const unsigned int k)
RBSCMEvaluationDeserialization(RBSCMEvaluation &trans_rb_eval)
Initialize a new buffer using the structure from the Cap'n'Proto schema described in rb_data...
std::vector< DenseVector< Number > > RB_Fq_vector
Dense vector for the RHS. 
bool is_lookup_table
Boolean to indicate if this parametrized function is defined based on a lookup table or not...
RBEvaluationDeserialization(RBEvaluation &rb_eval)
Initialize a new buffer using the structure from the Cap'n'Proto schema described in rb_data...
std::vector< Real > initial_L2_error_all_N
Vector storing initial L2 error for all 1 <= N <= RB_size. 
void resize_data_structures(const unsigned int Nmax)
Resize the data structures for storing data associated with this object. 
std::vector< RBParameters > C_J
Vector storing the greedily selected parameters during SCM training. 
void set_n_basis_functions(unsigned int n_bfs)
Set the number of basis functions. 
void load_parameter_ranges(RBParametrized &rb_evaluation, RBData::ParameterRanges::Reader ¶meter_ranges, RBData::DiscreteParameterList::Reader &discrete_parameters_list)
Load parameter ranges and discrete parameter values into an RBEvaluation from the corresponding struc...
void add_elem_id_local_index_map_entry(dof_id_type elem_id, unsigned int local_index)
virtual unsigned int get_n_M_terms() const
Get Q_m, the number of terms in the affine expansion for the mass operator. 
virtual ~RBEIMEvaluationDeserialization()
void read_from_file(const std::string &path, bool read_error_bound_data, bool use_packing=false)
Read the Cap'n'Proto buffer from disk. 
void load_rb_eim_evaluation_data(RBEIMEvaluation &rb_eim_eval, RBEIMEvaluationReaderNumber &rb_eim_eval_reader)
Load an EIM RB evaluation from a corresponding reader structure in the buffer. 
void add_interpolation_points_side_index(unsigned int side_index)
std::vector< std::vector< std::vector< Number > > > Fq_Mq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
bool on_mesh_nodes() const
RBEIMEvaluation & _rb_eim_eval
The RBEIMEvaluation object we will read into. 
void add_interpolation_points_phi_i_all_qp(const std::vector< std::vector< Real >> &phi_i_all_qp)
void add_interpolation_points_phi_i_qp(const std::vector< Real > &phi_i_qp)
virtual void set_n_basis_functions(unsigned int n_bfs)
Set the number of basis functions. 
This class is part of the rbOOmit framework. 
void add_elem_center_dxyzdeta(const Point &dxyzdxi)
RBEIMEvaluationDeserialization(RBEIMEvaluation &trans_rb_eval)
Initialize a new buffer using the structure from the Cap'n'Proto schema described in rb_data...
virtual ~RBEvaluationDeserialization()
std::vector< std::vector< std::vector< Number > > > Fq_Aq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online...
std::vector< DenseVector< Number > > RB_initial_condition_all_N
The RB initial conditions (i.e. 
This class is part of the rbOOmit framework. 
void add_interpolation_points_subdomain_id(subdomain_id_type sbd_id)
std::vector< DenseMatrix< Number > > RB_Aq_vector
Dense matrices for the RB computations. 
void add_interpolation_points_node_id(dof_id_type node_id)
void add_interpolation_points_xyz(Point p)
Set the data associated with EIM interpolation points. 
void add_interpolation_points_qrule_order(Order qrule_order)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void load_point(RBData::Point3D::Reader point_reader, Point &point)
Helper function that loads point data. 
void add_interpolation_points_JxW_all_qp(const std::vector< Real > &JxW_all_qp)
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output. 
void set_value(const std::string ¶m_name, Real value)
Set the value of the specified parameter. 
void read_from_file(const std::string &path, bool use_packing=false)
Read the Cap'n'Proto buffer from disk. 
This class is part of the rbOOmit framework. 
void set_error_indicator_interpolation_row(const DenseVector< Number > &error_indicator_row)
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...
void set_euler_theta(const Real euler_theta_in)
TransientRBEvaluation & _trans_rb_eval
The TransientRBEvaluation object that we will read into. 
void add_interpolation_points_comp(unsigned int comp)
RBEvaluation & _rb_eval
The RBEvaluation object that we will read into. 
std::vector< std::vector< std::vector< std::vector< Number > > > > Aq_Mq_representor_innerprods
bool on_mesh_sides() const
void set_n_time_steps(const unsigned int K)
virtual ~TransientRBEvaluationDeserialization()
void add_interpolation_points_qp(unsigned int qp)
TransientRBEvaluationDeserialization(TransientRBEvaluation &trans_rb_eval)
Initialize a new buffer using the structure from the Cap'n'Proto schema described in rb_data...
RBParametrizedFunction & get_parametrized_function()
Get a reference to the parametrized function. 
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. 
void add_interpolation_points_spatial_indices(const std::vector< unsigned int > &spatial_indices)
This class enables evaluation of an Empirical Interpolation Method (EIM) approximation. 
A Point defines a location in LIBMESH_DIM dimensional Real space. 
void add_elem_center_dxyzdxi(const Point &dxyzdxi)
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion. 
DenseMatrix< Number > RB_L2_matrix
Dense RB L2 matrix. 
void add_interpolation_points_elem_type(ElemType elem_type)
This class is part of the rbOOmit framework. 
std::vector< std::vector< std::vector< Number > > > Aq_Aq_representor_innerprods
std::vector< std::vector< DenseVector< Number > > > RB_output_vectors
The vectors storing the RB output vectors.