20 #include "libmesh/libmesh_config.h" 
   21 #if defined(LIBMESH_HAVE_CAPNPROTO) 
   24 #include "libmesh/rb_data_serialization.h" 
   25 #include "libmesh/rb_eim_evaluation.h" 
   26 #include "libmesh/enum_to_string.h" 
   27 #include "libmesh/transient_rb_theta_expansion.h" 
   28 #include "libmesh/rb_evaluation.h" 
   29 #include "libmesh/transient_rb_evaluation.h" 
   30 #include "libmesh/rb_eim_evaluation.h" 
   31 #include "libmesh/rb_scm_evaluation.h" 
   32 #include "libmesh/elem.h" 
   33 #include "libmesh/int_range.h" 
   36 #include <capnp/serialize.h> 
   54 template <
typename T, 
typename U>
 
   55 void set_scalar_in_list(T list, 
unsigned int i, U 
value)
 
   57 #ifdef LIBMESH_USE_COMPLEX_NUMBERS 
   67 namespace RBDataSerialization
 
   84   LOG_SCOPE(
"write_to_file()", 
"RBEvaluationSerialization");
 
   88       capnp::MallocMessageBuilder message;
 
   90 #ifndef LIBMESH_USE_COMPLEX_NUMBERS 
   91       RBData::RBEvaluationReal::Builder rb_eval_builder =
 
   92         message.initRoot<RBData::RBEvaluationReal>();
 
   94       RBData::RBEvaluationComplex::Builder rb_eval_builder =
 
   95         message.initRoot<RBData::RBEvaluationComplex>();
 
  100       int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0664);
 
  102         libmesh_error_msg(
"Error opening a write-only file descriptor to " + path);
 
  104       capnp::writeMessageToFd(fd, message);
 
  106       int error = close(fd);
 
  108         libmesh_error_msg(
"Error closing a write-only file descriptor to " + path);
 
  119   _trans_rb_eval(trans_rb_eval)
 
  129   LOG_SCOPE(
"write_to_file()", 
"TransientRBEvaluationSerialization");
 
  133       capnp::MallocMessageBuilder message;
 
  135 #ifndef LIBMESH_USE_COMPLEX_NUMBERS 
  136       RBData::TransientRBEvaluationReal::Builder trans_rb_eval_builder =
 
  137         message.initRoot<RBData::TransientRBEvaluationReal>();
 
  138       RBData::RBEvaluationReal::Builder rb_eval_builder =
 
  139         trans_rb_eval_builder.initRbEvaluation();
 
  141       RBData::TransientRBEvaluationComplex::Builder trans_rb_eval_builder =
 
  142         message.initRoot<RBData::TransientRBEvaluationComplex>();
 
  143       RBData::RBEvaluationComplex::Builder rb_eval_builder =
 
  144         trans_rb_eval_builder.initRbEvaluation();
 
  149                                                   trans_rb_eval_builder);
 
  151       int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0664);
 
  153         libmesh_error_msg(
"Error opening a write-only file descriptor to " + path);
 
  155       capnp::writeMessageToFd(fd, message);
 
  157       int error = close(fd);
 
  159         libmesh_error_msg(
"Error closing a write-only file descriptor to " + path);
 
  170   _rb_eim_eval(rb_eim_eval)
 
  180   LOG_SCOPE(
"write_to_file()", 
"RBEIMEvaluationSerialization");
 
  184       capnp::MallocMessageBuilder message;
 
  186 #ifndef LIBMESH_USE_COMPLEX_NUMBERS 
  187       RBData::RBEIMEvaluationReal::Builder rb_eim_eval_builder =
 
  188         message.initRoot<RBData::RBEIMEvaluationReal>();
 
  189       RBData::RBEvaluationReal::Builder rb_eval_builder =
 
  190         rb_eim_eval_builder.initRbEvaluation();
 
  192       RBData::RBEIMEvaluationComplex::Builder rb_eim_eval_builder =
 
  193         message.initRoot<RBData::RBEIMEvaluationComplex>();
 
  194       RBData::RBEvaluationComplex::Builder rb_eval_builder =
 
  195         rb_eim_eval_builder.initRbEvaluation();
 
  200                                             rb_eim_eval_builder);
 
  202       int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0664);
 
  204         libmesh_error_msg(
"Error opening a write-only file descriptor to " + path);
 
  206       capnp::writeMessageToFd(fd, message);
 
  208       int error = close(fd);
 
  210         libmesh_error_msg(
"Error closing a write-only file descriptor to " + path);
 
  219 #if defined(LIBMESH_HAVE_SLEPC) && (LIBMESH_HAVE_GLPK) 
  223   _rb_scm_eval(rb_scm_eval)
 
  233   LOG_SCOPE(
"write_to_file()", 
"RBSCMEvaluationSerialization");
 
  237       capnp::MallocMessageBuilder message;
 
  239       RBData::RBSCMEvaluation::Builder rb_scm_eval_builder =
 
  240         message.initRoot<RBData::RBSCMEvaluation>();
 
  244       int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0664);
 
  246         libmesh_error_msg(
"Error opening a write-only file descriptor to " + path);
 
  248       capnp::writeMessageToFd(fd, message);
 
  250       int error = close(fd);
 
  252         libmesh_error_msg(
"Error closing a write-only file descriptor to " + path);
 
  256 #endif // LIBMESH_HAVE_SLEPC && LIBMESH_HAVE_GLPK 
  264                                      RBData::ParameterRanges::Builder & parameter_ranges_list,
 
  265                                      RBData::DiscreteParameterList::Builder & discrete_parameters_list)
 
  270     auto names = parameter_ranges_list.initNames(n_continuous_parameters);
 
  271     auto mins = parameter_ranges_list.initMinValues(n_continuous_parameters);
 
  272     auto maxs = parameter_ranges_list.initMaxValues(n_continuous_parameters);
 
  278     unsigned int count = 0;
 
  279     for (
const auto & parameter_name : parameter_names)
 
  283             names.set(count, parameter_name);
 
  284             mins.set(count, parameters_min.
get_value(parameter_name));
 
  285             maxs.set(count, parameters_max.
get_value(parameter_name));
 
  291     if (count != n_continuous_parameters)
 
  292       libmesh_error_msg(
"Mismatch in number of continuous parameters");
 
  298     auto names = discrete_parameters_list.initNames(n_discrete_parameters);
 
  299     auto values_outer = discrete_parameters_list.initValues(n_discrete_parameters);
 
  301     const std::map<std::string, std::vector<Real>> & discrete_parameters =
 
  304     unsigned int count = 0;
 
  305     for (
const auto & discrete_parameter : discrete_parameters)
 
  307         names.set(count, discrete_parameter.first);
 
  309         const std::vector<Real> & values = discrete_parameter.second;
 
  310         unsigned int n_values = values.size();
 
  312         values_outer.init(count, n_values);
 
  313         auto values_inner = values_outer[count];
 
  314         for (
unsigned int i=0; i<n_values; ++i)
 
  316             values_inner.set(i, values[i]);
 
  322     if (count != n_discrete_parameters)
 
  323       libmesh_error_msg(
"Mismatch in number of discrete parameters");
 
  327 template <
typename RBEvaluationBuilderNumber>
 
  329                                        RBEvaluationBuilderNumber & rb_evaluation_builder)
 
  338   rb_evaluation_builder.setNBfs(n_bfs);
 
  342     unsigned int Q_f_hat = n_F_terms*(n_F_terms+1)/2;
 
  344     auto fq_innerprods_list = rb_evaluation_builder.initFqInnerprods(Q_f_hat);
 
  346     for (
unsigned int i=0; i<Q_f_hat; i++)
 
  347       set_scalar_in_list(fq_innerprods_list,
 
  354     auto fq_aq_innerprods_list =
 
  355       rb_evaluation_builder.initFqAqInnerprods(n_F_terms*n_A_terms*n_bfs);
 
  357     for (
unsigned int q_f=0; q_f < n_F_terms; ++q_f)
 
  358       for (
unsigned int q_a=0; q_a < n_A_terms; ++q_a)
 
  359         for (
unsigned int i=0; i < n_bfs; ++i)
 
  361             unsigned int offset = q_f*n_A_terms*n_bfs + q_a*n_bfs + i;
 
  363                                fq_aq_innerprods_list, offset,
 
  370     unsigned int Q_a_hat = n_A_terms*(n_A_terms+1)/2;
 
  371     auto aq_aq_innerprods_list =
 
  372       rb_evaluation_builder.initAqAqInnerprods(Q_a_hat*n_bfs*n_bfs);
 
  374     for (
unsigned int i=0; i < Q_a_hat; ++i)
 
  375       for (
unsigned int j=0; j < n_bfs; ++j)
 
  376         for (
unsigned int l=0; l < n_bfs; ++l)
 
  378             unsigned int offset = i*n_bfs*n_bfs + j*n_bfs + l;
 
  380                                aq_aq_innerprods_list,
 
  389     auto output_innerprod_outer = rb_evaluation_builder.initOutputDualInnerprods(n_outputs);
 
  390     auto output_vector_outer = rb_evaluation_builder.initOutputVectors(n_outputs);
 
  392     for (
unsigned int output_id=0; output_id < n_outputs; ++output_id)
 
  397           unsigned int Q_l_hat = n_output_terms*(n_output_terms+1)/2;
 
  398           auto output_innerprod_inner = output_innerprod_outer.init(output_id, Q_l_hat);
 
  399           for (
unsigned int q=0; q < Q_l_hat; ++q)
 
  407           auto output_vector_middle = output_vector_outer.init(output_id, n_output_terms);
 
  408           for (
unsigned int q_l=0; q_l<n_output_terms; ++q_l)
 
  410               auto output_vector_inner = output_vector_middle.init(q_l, n_bfs);
 
  411               for (
unsigned int j=0; j<n_bfs; ++j)
 
  426     auto rb_fq_vectors_outer_list = rb_evaluation_builder.initRbFqVectors(n_F_terms);
 
  427     for (
unsigned int q_f=0; q_f < n_F_terms; ++q_f)
 
  429         auto rb_fq_vectors_inner_list = rb_fq_vectors_outer_list.init(q_f, n_bfs);
 
  430         for (
unsigned int i=0; i<n_bfs; i++)
 
  431           set_scalar_in_list(rb_fq_vectors_inner_list, i, rb_eval.
RB_Fq_vector[q_f](i));
 
  434     auto rb_Aq_matrices_outer_list = rb_evaluation_builder.initRbAqMatrices(n_A_terms);
 
  435     for (
unsigned int q_a=0; q_a < n_A_terms; ++q_a)
 
  437         auto rb_Aq_matrices_inner_list = rb_Aq_matrices_outer_list.init(q_a, n_bfs*n_bfs);
 
  438         for (
unsigned int i=0; i < n_bfs; ++i)
 
  439           for (
unsigned int j=0; j < n_bfs; ++j)
 
  441               unsigned int offset = i*n_bfs+j;
 
  442               set_scalar_in_list(rb_Aq_matrices_inner_list, offset, rb_eval.
RB_Aq_vector[q_a](i,j));
 
  450       auto rb_inner_product_matrix_list =
 
  451         rb_evaluation_builder.initRbInnerProductMatrix(n_bfs*n_bfs);
 
  453       for (
unsigned int i=0; i < n_bfs; ++i)
 
  454         for (
unsigned int j=0; j < n_bfs; ++j)
 
  456             unsigned int offset = i*n_bfs + j;
 
  458                                rb_inner_product_matrix_list,
 
  464   auto parameter_ranges_list =
 
  465     rb_evaluation_builder.initParameterRanges();
 
  466   auto discrete_parameters_list =
 
  467     rb_evaluation_builder.initDiscreteParameters();
 
  469                                   parameter_ranges_list,
 
  470                                   discrete_parameters_list);
 
  473 template <
typename RBEvaluationBuilderNumber, 
typename TransRBEvaluationBuilderNumber>
 
  475                                                  RBEvaluationBuilderNumber & rb_eval_builder,
 
  476                                                  TransRBEvaluationBuilderNumber & trans_rb_eval_builder)
 
  480   trans_rb_eval_builder.setDeltaT(trans_rb_eval.
get_delta_t());
 
  483   trans_rb_eval_builder.setTimeStep(trans_rb_eval.
get_time_step());
 
  489     auto rb_L2_matrix_list =
 
  490       trans_rb_eval_builder.initRbL2Matrix(n_bfs*n_bfs);
 
  492     for (
unsigned int i=0; i<n_bfs; ++i)
 
  493       for (
unsigned int j=0; j<n_bfs; ++j)
 
  495           unsigned int offset = i*n_bfs + j;
 
  496           set_scalar_in_list(rb_L2_matrix_list,
 
  504   unsigned int n_M_terms = trans_theta_expansion.
get_n_M_terms();
 
  507     auto rb_Mq_matrices_outer_list = trans_rb_eval_builder.initRbMqMatrices(n_M_terms);
 
  508     for (
unsigned int q_m=0; q_m < n_M_terms; ++q_m)
 
  510         auto rb_Mq_matrices_inner_list = rb_Mq_matrices_outer_list.init(q_m, n_bfs*n_bfs);
 
  511         for (
unsigned int i=0; i < n_bfs; ++i)
 
  512           for (
unsigned int j=0; j < n_bfs; ++j)
 
  514               unsigned int offset = i*n_bfs+j;
 
  515               set_scalar_in_list(rb_Mq_matrices_inner_list,
 
  525     auto initial_l2_errors_builder =
 
  526       trans_rb_eval_builder.initInitialL2Errors(n_bfs);
 
  527     auto initial_conditions_outer_list =
 
  528       trans_rb_eval_builder.initInitialConditions(n_bfs);
 
  530     for (
unsigned int i=0; i<n_bfs; i++)
 
  534         auto initial_conditions_inner_list =
 
  535           initial_conditions_outer_list.init(i, i+1);
 
  536         for (
unsigned int j=0; j<=i; j++)
 
  538             set_scalar_in_list(initial_conditions_inner_list,
 
  547     unsigned int n_F_terms = trans_theta_expansion.
get_n_F_terms();
 
  548     auto fq_mq_innerprods_list =
 
  549       trans_rb_eval_builder.initFqMqInnerprods(n_F_terms*n_M_terms*n_bfs);
 
  551     for (
unsigned int q_f=0; q_f<n_F_terms; ++q_f)
 
  552       for (
unsigned int q_m=0; q_m<n_M_terms; ++q_m)
 
  553         for (
unsigned int i=0; i<n_bfs; ++i)
 
  555             unsigned int offset = q_f*n_M_terms*n_bfs + q_m*n_bfs + i;
 
  556             set_scalar_in_list(fq_mq_innerprods_list,
 
  564     unsigned int Q_m_hat = n_M_terms*(n_M_terms+1)/2;
 
  565     auto mq_mq_innerprods_list =
 
  566       trans_rb_eval_builder.initMqMqInnerprods(Q_m_hat*n_bfs*n_bfs);
 
  568     for (
unsigned int i=0; i < Q_m_hat; ++i)
 
  569       for (
unsigned int j=0; j < n_bfs; ++j)
 
  570         for (
unsigned int l=0; l < n_bfs; ++l)
 
  572             unsigned int offset = i*n_bfs*n_bfs + j*n_bfs + l;
 
  573             set_scalar_in_list(mq_mq_innerprods_list,
 
  581     unsigned int n_A_terms = trans_theta_expansion.
get_n_A_terms();
 
  583     auto aq_mq_innerprods_list =
 
  584       trans_rb_eval_builder.initAqMqInnerprods(n_A_terms*n_M_terms*n_bfs*n_bfs);
 
  586     for (
unsigned int q_a=0; q_a<n_A_terms; q_a++)
 
  587       for (
unsigned int q_m=0; q_m<n_M_terms; q_m++)
 
  588         for (
unsigned int i=0; i<n_bfs; i++)
 
  589           for (
unsigned int j=0; j<n_bfs; j++)
 
  591               unsigned int offset =
 
  592                 q_a*(n_M_terms*n_bfs*n_bfs) + q_m*(n_bfs*n_bfs) + i*n_bfs + j;
 
  593               set_scalar_in_list(aq_mq_innerprods_list,
 
  601 template <
typename RBEvaluationBuilderNumber, 
typename RBEIMEvaluationBuilderNumber>
 
  603                                            RBEvaluationBuilderNumber & rb_evaluation_builder,
 
  604                                            RBEIMEvaluationBuilderNumber & rb_eim_evaluation_builder)
 
  614     unsigned int half_matrix_size = n_bfs*(n_bfs+1)/2;
 
  616     auto interpolation_matrix_list =
 
  617       rb_eim_evaluation_builder.initInterpolationMatrix(half_matrix_size);
 
  618     for (
unsigned int i=0; i < n_bfs; ++i)
 
  619       for (
unsigned int j=0; j <= i; ++j)
 
  621           unsigned int offset = i*(i+1)/2 + j;
 
  622           set_scalar_in_list(interpolation_matrix_list,
 
  630     auto interpolation_points_list =
 
  631       rb_eim_evaluation_builder.initInterpolationPoints(n_bfs);
 
  632     for (
unsigned int i=0; i < n_bfs; ++i)
 
  634                            interpolation_points_list[i]);
 
  639     auto interpolation_points_var_list =
 
  640       rb_eim_evaluation_builder.initInterpolationPointsVar(n_bfs);
 
  641     for (
unsigned int i=0; i<n_bfs; ++i)
 
  642       interpolation_points_var_list.set(i,
 
  648     unsigned int n_interpolation_elems =
 
  650     auto interpolation_points_elem_list =
 
  651       rb_eim_evaluation_builder.initInterpolationPointsElems(n_interpolation_elems);
 
  653     if (n_interpolation_elems != n_bfs)
 
  654       libmesh_error_msg(
"The number of elements should match the number of basis functions");
 
  656     for (
unsigned int i=0; i<n_interpolation_elems; ++i)
 
  659         auto mesh_elem_builder = interpolation_points_elem_list[i];
 
  665 #if defined(LIBMESH_HAVE_SLEPC) && (LIBMESH_HAVE_GLPK) 
  667                                            RBData::RBSCMEvaluation::Builder & rb_scm_eval_builder)
 
  669   auto parameter_ranges_list =
 
  670     rb_scm_eval_builder.initParameterRanges();
 
  671   auto discrete_parameters_list =
 
  672     rb_scm_eval_builder.initDiscreteParameters();
 
  674                                   parameter_ranges_list,
 
  675                                   discrete_parameters_list);
 
  679       libmesh_error_msg(
"Size error while writing B_min");
 
  680     auto b_min_list = rb_scm_eval_builder.initBMin( rb_scm_eval.
B_min.size() );
 
  682       b_min_list.set(i, rb_scm_eval.
get_B_min(i));
 
  687       libmesh_error_msg(
"Size error while writing B_max");
 
  689     auto b_max_list = rb_scm_eval_builder.initBMax( rb_scm_eval.
B_max.size() );
 
  691       b_max_list.set(i, rb_scm_eval.
get_B_max(i));
 
  695     auto cj_stability_vector =
 
  702     auto cj_parameters_outer =
 
  703       rb_scm_eval_builder.initCJ( rb_scm_eval.
C_J.size() );
 
  707         auto cj_parameters_inner =
 
  708           cj_parameters_outer.init(i, rb_scm_eval.
C_J[i].n_parameters());
 
  710         unsigned int count = 0;
 
  711         for (
const auto & pr : rb_scm_eval.
C_J[i])
 
  713             cj_parameters_inner[count].setName( pr.first );
 
  714             cj_parameters_inner[count].setValue( pr.second );
 
  722     unsigned int n_C_J_values = rb_scm_eval.
C_J.size();
 
  724     unsigned int n_values = n_C_J_values*n_A_terms;
 
  725     auto scm_ub_vectors =
 
  726       rb_scm_eval_builder.initScmUbVectors( n_values );
 
  728     for (
unsigned int i=0; i<n_C_J_values; i++)
 
  729       for (
unsigned int j=0; j<n_A_terms; j++)
 
  731           unsigned int offset = i*n_A_terms + j;
 
  736 #endif // LIBMESH_HAVE_SLEPC && LIBMESH_HAVE_GLPK 
  740   point_builder.setX(point(0));
 
  742   if (LIBMESH_DIM >= 2)
 
  743     point_builder.setY(point(1));
 
  745   if (LIBMESH_DIM >= 3)
 
  746     point_builder.setZ(point(2));
 
  753   mesh_elem_builder.setType(elem_type_string.c_str());
 
  756   unsigned int n_points = elem.
n_nodes();
 
  757   auto mesh_elem_point_list = mesh_elem_builder.initPoints(n_points);
 
  759   for (
unsigned int j=0; j < n_points; ++j)
 
  771 #endif // #if defined(LIBMESH_HAVE_CAPNPROTO)