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.