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)