libMesh
Loading...
Searching...
No Matches
Classes | Functions
libMesh::RBDataSerialization Namespace Reference

Classes

class  RBEIMEvaluationSerialization
 This class serializes an RBEIMEvaluation object using the Cap'n Proto library. More...
 
class  RBEvaluationSerialization
 This class serializes an RBEvaluation object using the Cap'n Proto library. More...
 
class  RBSCMEvaluationSerialization
 This class serializes an RBSCMEvaluation object using the Cap'n Proto library. More...
 
class  TransientRBEvaluationSerialization
 This class serializes a TransientRBEvaluation object using the Cap'n Proto library. More...
 

Functions

void add_parameter_ranges_to_builder (const RBParametrized &rb_evaluation, RBData::ParameterRanges::Builder &parameter_ranges, RBData::DiscreteParameterList::Builder &discrete_parameters_list)
 Add parameter ranges for continuous and discrete parameters.
 
template<typename RBEvaluationBuilderNumber >
void add_rb_evaluation_data_to_builder (RBEvaluation &rb_eval, RBEvaluationBuilderNumber &rb_eval_builder)
 Add data for an RBEvaluation to the builder.
 
template<typename RBEvaluationBuilderNumber , typename TransRBEvaluationBuilderNumber >
void add_transient_rb_evaluation_data_to_builder (TransientRBEvaluation &trans_rb_eval, RBEvaluationBuilderNumber &rb_eval_builder, TransRBEvaluationBuilderNumber &trans_rb_eval_builder)
 Add data for a TransientRBEvaluation to the builder.
 
template<typename RBEIMEvaluationBuilderNumber >
void add_rb_eim_evaluation_data_to_builder (RBEIMEvaluation &rb_eim_eval, RBEIMEvaluationBuilderNumber &rb_eim_eval_builder)
 Add data for an RBEIMEvaluation to the builder.
 
void add_rb_scm_evaluation_data_to_builder (RBSCMEvaluation &rb_scm_eval, RBData::RBSCMEvaluation::Builder &rb_scm_eval_builder)
 Add data for an RBSCMEvaluation to the builder.
 
void add_point_to_builder (const Point &point, RBData::Point3D::Builder point_builder)
 Helper function that adds point data.
 

Function Documentation

◆ add_parameter_ranges_to_builder()

void libMesh::RBDataSerialization::add_parameter_ranges_to_builder ( const RBParametrized rb_evaluation,
RBData::ParameterRanges::Builder &  parameter_ranges,
RBData::DiscreteParameterList::Builder &  discrete_parameters_list 
)

Add parameter ranges for continuous and discrete parameters.

Definition at line 258 of file rb_data_serialization.C.

261{
262 // Continuous parameters
263 {
264 unsigned int n_continuous_parameters = rb_evaluation.get_n_continuous_params();
265 auto names = parameter_ranges_list.initNames(n_continuous_parameters);
266 auto mins = parameter_ranges_list.initMinValues(n_continuous_parameters);
267 auto maxs = parameter_ranges_list.initMaxValues(n_continuous_parameters);
268
269 const RBParameters & parameters_min = rb_evaluation.get_parameters_min();
270 const RBParameters & parameters_max = rb_evaluation.get_parameters_max();
271
272 // We could loop over either parameters_min or parameters_max, they should have the same keys.
273 unsigned int count = 0;
274 for (const auto & [key, val] : parameters_min)
275 if (!rb_evaluation.is_discrete_parameter(key))
276 {
277 names.set(count, key);
278 mins.set(count, parameters_min.get_value(key));
279 maxs.set(count, parameters_max.get_value(key));
280 ++count;
281 }
282
283 libmesh_error_msg_if(count != n_continuous_parameters, "Mismatch in number of continuous parameters");
284 }
285
286 // Discrete parameters
287 {
288 unsigned int n_discrete_parameters = rb_evaluation.get_n_discrete_params();
289 auto names = discrete_parameters_list.initNames(n_discrete_parameters);
290 auto values_outer = discrete_parameters_list.initValues(n_discrete_parameters);
291
292 const std::map<std::string, std::vector<Real>> & discrete_parameters =
293 rb_evaluation.get_discrete_parameter_values();
294
295 unsigned int count = 0;
296 for (const auto & discrete_parameter : discrete_parameters)
297 {
298 names.set(count, discrete_parameter.first);
299
300 const std::vector<Real> & values = discrete_parameter.second;
301 unsigned int n_values = values.size();
302
303 values_outer.init(count, n_values);
304 auto values_inner = values_outer[count];
305 for (unsigned int i=0; i<n_values; ++i)
306 {
307 values_inner.set(i, values[i]);
308 }
309
310 ++count;
311 }
312
313 libmesh_error_msg_if(count != n_discrete_parameters, "Mismatch in number of discrete parameters");
314 }
315}
This class is part of the rbOOmit framework.
Real get_value(const std::string &param_name) const
Get the value of the specified parameter, throw an error if it does not exist.
const RBParameters & get_parameters_max() const
Get an RBParameters object that specifies the maximum allowable value for each parameter.
const std::map< std::string, std::vector< Real > > & get_discrete_parameter_values() const
Get a const reference to the discrete parameter values.
const RBParameters & get_parameters_min() const
Get an RBParameters object that specifies the minimum allowable value for each parameter.
unsigned int get_n_continuous_params() const
Get the number of continuous parameters.
unsigned int get_n_discrete_params() const
Get the number of discrete parameters.

References libMesh::RBParametrized::get_discrete_parameter_values(), libMesh::RBParametrized::get_n_continuous_params(), libMesh::RBParametrized::get_n_discrete_params(), libMesh::RBParametrized::get_parameters_max(), libMesh::RBParametrized::get_parameters_min(), libMesh::RBParameters::get_value(), and libMesh::RBParametrized::is_discrete_parameter().

Referenced by add_rb_eim_evaluation_data_to_builder(), add_rb_evaluation_data_to_builder(), and add_rb_scm_evaluation_data_to_builder().

◆ add_point_to_builder()

void libMesh::RBDataSerialization::add_point_to_builder ( const Point point,
RBData::Point3D::Builder  point_builder 
)

Helper function that adds point data.

Definition at line 1007 of file rb_data_serialization.C.

1008{
1009 point_builder.setX(point(0));
1010
1011 if (LIBMESH_DIM >= 2)
1012 point_builder.setY(point(1));
1013
1014 if (LIBMESH_DIM >= 3)
1015 point_builder.setZ(point(2));
1016}

Referenced by add_rb_eim_evaluation_data_to_builder().

◆ add_rb_eim_evaluation_data_to_builder()

template<typename RBEIMEvaluationBuilderNumber >
void libMesh::RBDataSerialization::add_rb_eim_evaluation_data_to_builder ( RBEIMEvaluation rb_eim_eval,
RBEIMEvaluationBuilderNumber &  rb_eim_eval_builder 
)

Add data for an RBEIMEvaluation to the builder.

Templated to deal with both Real and Complex numbers.

Definition at line 592 of file rb_data_serialization.C.

594{
595 // Number of basis functions
596 unsigned int n_bfs = rb_eim_evaluation.get_n_basis_functions();
597 rb_eim_evaluation_builder.setNBfs(n_bfs);
598
599 // EIM interpolation matrix
600 {
601 // We store the lower triangular part of an NxN matrix, the size of which is given by
602 // (N(N + 1))/2
603 unsigned int half_matrix_size = n_bfs*(n_bfs+1)/2;
604
605 auto interpolation_matrix_list =
606 rb_eim_evaluation_builder.initInterpolationMatrix(half_matrix_size);
607 for (unsigned int i=0; i < n_bfs; ++i)
608 for (unsigned int j=0; j <= i; ++j)
609 {
610 unsigned int offset = i*(i+1)/2 + j;
611 set_scalar_in_list(interpolation_matrix_list,
612 offset,
613 rb_eim_evaluation.get_interpolation_matrix()(i,j));
614 }
615 }
616
617 // We check use_eim_error_indicator() and the number of interpolation
618 // points in order to set use_error_indicator. This is because even if
619 // use_error_indicator() is true, we may not be using an error indicator,
620 // e.g. if there are no parameters in the model then we will not use an
621 // error indicator, and we can detect this by comparing the number of
622 // interpolation points with n_bfs.
623 bool use_error_indicator =
624 (rb_eim_evaluation.use_eim_error_indicator() &&
625 (rb_eim_evaluation.get_n_interpolation_points() > n_bfs));
626
627 if (use_error_indicator)
628 {
629 auto error_indicator_data_list =
630 rb_eim_evaluation_builder.initEimErrorIndicatorInterpData(n_bfs);
631 const auto & error_indicator_row =
632 rb_eim_evaluation.get_error_indicator_interpolation_row();
633 for (unsigned int i=0; i < n_bfs; ++i)
634 {
635 set_scalar_in_list(error_indicator_data_list,
636 i,
637 error_indicator_row(i));
638 }
639 }
640
641 // If we're using the EIM error indicator then we store one extra
642 // interpolation point and associated data, hence we increment n_bfs
643 // here so that we write out the extra data below.
644 //
645 // However the interpolation matrix and _error_indicator_interpolation_row
646 // does not include this extra point, which is why we write it out above
647 // before n_bfs is incremented.
648 if (use_error_indicator)
649 n_bfs++;
650
651 libmesh_error_msg_if(n_bfs != rb_eim_evaluation.get_n_interpolation_points(),
652 "Number of basis functions should match number of interpolation points");
653
654 auto parameter_ranges_list =
655 rb_eim_evaluation_builder.initParameterRanges();
656 auto discrete_parameters_list =
657 rb_eim_evaluation_builder.initDiscreteParameters();
658 add_parameter_ranges_to_builder(rb_eim_evaluation,
659 parameter_ranges_list,
660 discrete_parameters_list);
661
662 // Interpolation points
663 {
664 auto interpolation_points_list =
665 rb_eim_evaluation_builder.initInterpolationXyz(n_bfs);
666 for (unsigned int i=0; i < n_bfs; ++i)
667 add_point_to_builder(rb_eim_evaluation.get_interpolation_points_xyz(i),
668 interpolation_points_list[i]);
669 }
670
671 // Interpolation points comps
672 {
673 auto interpolation_points_comp_list =
674 rb_eim_evaluation_builder.initInterpolationComp(n_bfs);
675 for (unsigned int i=0; i<n_bfs; ++i)
676 interpolation_points_comp_list.set(i,
677 rb_eim_evaluation.get_interpolation_points_comp(i));
678 }
679
680 // Interpolation points subdomain IDs
681 {
682 auto interpolation_points_subdomain_id_list =
683 rb_eim_evaluation_builder.initInterpolationSubdomainId(n_bfs);
684 for (unsigned int i=0; i<n_bfs; ++i)
685 interpolation_points_subdomain_id_list.set(i,
686 rb_eim_evaluation.get_interpolation_points_subdomain_id(i));
687 }
688
689 // Interpolation points boundary IDs, relevant if the parametrized function is defined
690 // on mesh sides or nodesets
691 if (rb_eim_evaluation.get_parametrized_function().on_mesh_sides() ||
692 rb_eim_evaluation.get_parametrized_function().on_mesh_nodes())
693 {
694 auto interpolation_points_boundary_id_list =
695 rb_eim_evaluation_builder.initInterpolationBoundaryId(n_bfs);
696 for (unsigned int i=0; i<n_bfs; ++i)
697 interpolation_points_boundary_id_list.set(i,
698 rb_eim_evaluation.get_interpolation_points_boundary_id(i));
699 }
700
701 // Interpolation points element IDs
702 {
703 auto interpolation_points_elem_id_list =
704 rb_eim_evaluation_builder.initInterpolationElemId(n_bfs);
705 for (unsigned int i=0; i<n_bfs; ++i)
706 interpolation_points_elem_id_list.set(i,
707 rb_eim_evaluation.get_interpolation_points_elem_id(i));
708 }
709
710 // Interpolation points node IDs, relevant if the parametrized function is defined on mesh sides
711 if (rb_eim_evaluation.get_parametrized_function().on_mesh_nodes())
712 {
713 auto interpolation_points_node_id_list =
714 rb_eim_evaluation_builder.initInterpolationNodeId(n_bfs);
715 for (unsigned int i=0; i<n_bfs; ++i)
716 interpolation_points_node_id_list.set(i,
717 rb_eim_evaluation.get_interpolation_points_node_id(i));
718 }
719
720 // Interpolation points side indices, relevant if the parametrized function is defined on mesh sides
721 if (rb_eim_evaluation.get_parametrized_function().on_mesh_sides())
722 {
723 auto interpolation_points_side_index_list =
724 rb_eim_evaluation_builder.initInterpolationSideIndex(n_bfs);
725 for (unsigned int i=0; i<n_bfs; ++i)
726 interpolation_points_side_index_list.set(i,
727 rb_eim_evaluation.get_interpolation_points_side_index(i));
728 }
729
730 // Interpolation points quadrature point indices
731 {
732 auto interpolation_points_qp_list =
733 rb_eim_evaluation_builder.initInterpolationQp(n_bfs);
734 for (unsigned int i=0; i<n_bfs; ++i)
735 interpolation_points_qp_list.set(i,
736 rb_eim_evaluation.get_interpolation_points_qp(i));
737 }
738
739 // Interpolation points perturbations
740 {
741 auto interpolation_points_list_outer =
742 rb_eim_evaluation_builder.initInterpolationXyzPerturb(n_bfs);
743 for (unsigned int i=0; i < n_bfs; ++i)
744 {
745 const std::vector<Point> & perturbs = rb_eim_evaluation.get_interpolation_points_xyz_perturbations(i);
746 auto interpolation_points_list_inner = interpolation_points_list_outer.init(i, perturbs.size());
747
748 for (unsigned int j : index_range(perturbs))
749 {
750 add_point_to_builder(perturbs[j], interpolation_points_list_inner[j]);
751 }
752 }
753 }
754
755 unsigned int n_elems = rb_eim_evaluation.get_n_elems();
756 rb_eim_evaluation_builder.setNElems(n_elems);
757 // Elem id to local index map
758 {
759 auto elem_id_to_local_index_list =
760 rb_eim_evaluation_builder.initElemIdToLocalIndex(n_elems);
761 unsigned int counter = 0;
762 for (auto const & [elem_id, local_index] : rb_eim_evaluation.get_elem_id_to_local_index_map())
763 {
764 elem_id_to_local_index_list[counter].setFirst(elem_id);
765 elem_id_to_local_index_list[counter].setSecond(local_index);
766 counter++;
767 }
768 }
769
770 // Interpolation points JxW values at each qp
771 {
772 auto interpolation_points_list_outer =
773 rb_eim_evaluation_builder.initInterpolationJxWAllQp(n_elems);
774 for (unsigned int i=0; i < n_elems; ++i)
775 {
776 const std::vector<Real> & JxW = rb_eim_evaluation.get_interpolation_points_JxW_all_qp(i);
777 auto interpolation_points_list_inner = interpolation_points_list_outer.init(i, JxW.size());
778
779 for (unsigned int j : index_range(JxW))
780 {
781 // Here we can use set() instead of set_scalar_in_list() because
782 // phi stores real-valued data only.
783 interpolation_points_list_inner.set(j, JxW[j]);
784 }
785 }
786 }
787
788 // Interpolation points phi values at each qp
789 {
790 auto interpolation_points_list_outer =
791 rb_eim_evaluation_builder.initInterpolationPhiValuesAllQp(n_elems);
792
793 for (unsigned int i=0; i < n_elems; ++i)
794 {
795 const auto & phi_i_all_qp = rb_eim_evaluation.get_interpolation_points_phi_i_all_qp(i);
796 auto interpolation_points_list_middle = interpolation_points_list_outer.init(i, phi_i_all_qp.size());
797
798 for (unsigned int j : index_range(phi_i_all_qp))
799 {
800 auto interpolation_points_list_inner = interpolation_points_list_middle.init(j, phi_i_all_qp[j].size());
801
802 for (auto k : index_range(phi_i_all_qp[j]))
803 interpolation_points_list_inner.set(k, phi_i_all_qp[j][k]);
804 }
805 }
806 }
807
808 // Dxyzdxi at the element center for the element that contains each interpolation point.
809 {
810 auto dxyzdxi_elem_center =
811 rb_eim_evaluation_builder.initInterpolationDxyzDxiElem(n_elems);
812 for (auto i : make_range(n_elems))
813 {
814 add_point_to_builder(rb_eim_evaluation.get_elem_center_dxyzdxi(i), dxyzdxi_elem_center[i]);
815 }
816 }
817
818 // Dxyzdeta at the element center for the element that contains each interpolation point.
819 {
820 auto dxyzdeta_elem_center =
821 rb_eim_evaluation_builder.initInterpolationDxyzDetaElem(n_elems);
822 for (auto i : make_range(n_elems))
823 {
824 add_point_to_builder(rb_eim_evaluation.get_elem_center_dxyzdeta(i), dxyzdeta_elem_center[i]);
825 }
826 }
827
828 // Quadrature rule order associated to the element that contains each interpolation point.
829 {
830 auto interpolation_points_qrule_order_list =
831 rb_eim_evaluation_builder.initInterpolationQruleOrder(n_elems);
832 for (unsigned int i=0; i<n_elems; ++i)
833 interpolation_points_qrule_order_list.set(i,
834 rb_eim_evaluation.get_interpolation_points_qrule_order(i));
835 }
836
837 // Element type for the element that contains each interpolation point
838 {
839 auto interpolation_points_elem_type_list =
840 rb_eim_evaluation_builder.initInterpolationElemType(n_bfs);
841 for (unsigned int i=0; i<n_bfs; ++i)
842 interpolation_points_elem_type_list.set(i,
843 rb_eim_evaluation.get_interpolation_points_elem_type(i));
844 }
845
846 unsigned int n_properties = rb_eim_evaluation.get_n_properties();
847 // Property map used to store generic properties by flaging entites like elements, nodes etc...
848 {
849 auto interpolation_points_property_list =
850 rb_eim_evaluation_builder.initPropertyMap(n_properties);
851 unsigned int property_counter = 0;
852 for (const auto& [property_name, entity_ids] : rb_eim_evaluation.get_rb_property_map())
853 {
854 interpolation_points_property_list[property_counter].setName(property_name);
855
856 unsigned int entity_counter = 0;
857 auto property_entity_ids = interpolation_points_property_list[property_counter].initEntityIds(entity_ids.size());
858 for (const auto entity_id : entity_ids)
859 {
860 property_entity_ids.set(entity_counter, entity_id);
861 entity_counter++;
862 }
863 property_counter++;
864 }
865 }
866
867 // Optionally store EIM solutions for the training set
868 if (rb_eim_evaluation.get_parametrized_function().is_lookup_table)
869 {
870 const std::vector<DenseVector<Number>> & eim_solutions = rb_eim_evaluation.get_eim_solutions_for_training_set();
871
872 auto eim_rhs_list_outer =
873 rb_eim_evaluation_builder.initEimSolutionsForTrainingSet(eim_solutions.size());
874 for (auto i : make_range(eim_solutions.size()))
875 {
876 const DenseVector<Number> & values = eim_solutions[i];
877 auto eim_rhs_list_inner = eim_rhs_list_outer.init(i, values.size());
878
879 for (auto j : index_range(values))
880 {
881 set_scalar_in_list(eim_rhs_list_inner,
882 j,
883 values(j));
884 }
885 }
886 }
887
888 // The shape function values at the interpolation points. This can be used to evaluate nodal data
889 // at EIM interpolation points, which are at quadrature points.
890 {
891 auto interpolation_points_list_outer =
892 rb_eim_evaluation_builder.initInterpolationPhiValues(n_bfs);
893 for (unsigned int i=0; i < n_bfs; ++i)
894 {
895 const std::vector<Real> & phi_i_qp_vec = rb_eim_evaluation.get_interpolation_points_phi_i_qp(i);
896 auto interpolation_points_list_inner = interpolation_points_list_outer.init(i, phi_i_qp_vec.size());
897
898 for (unsigned int j : index_range(phi_i_qp_vec))
899 {
900 // Here we can use set() instead of set_scalar_in_list() because
901 // phi stores real-valued data only.
902 interpolation_points_list_inner.set(j, phi_i_qp_vec[j]);
903 }
904 }
905 }
906
907 // Initialize EIM spatial indices for the interpolation points, and if there are
908 // any spatial indices then we store them in the buffer.
909 rb_eim_evaluation.initialize_interpolation_points_spatial_indices();
910 if (rb_eim_evaluation.get_n_interpolation_points_spatial_indices() > 0)
911 {
912 libmesh_error_msg_if(n_bfs != rb_eim_evaluation.get_n_interpolation_points_spatial_indices(),
913 "Error: Number of spatial indices should match number of EIM basis functions");
914
915 auto interpolation_points_spatial_indices_builder =
916 rb_eim_evaluation_builder.initInterpolationSpatialIndices(n_bfs);
917 for (unsigned int i=0; i<n_bfs; ++i)
918 {
919 const std::vector<unsigned int> & spatial_indices =
920 rb_eim_evaluation.get_interpolation_points_spatial_indices(i);
921 unsigned int n_spatial_indices = spatial_indices.size();
922
923 auto spatial_indices_builder =
924 interpolation_points_spatial_indices_builder.init(i, n_spatial_indices);
925
926 for (auto j : make_range(n_spatial_indices))
927 {
928 spatial_indices_builder.set(j, spatial_indices[j]);
929 }
930 }
931 }
932}
void add_point_to_builder(const Point &point, RBData::Point3D::Builder point_builder)
Helper function that adds point data.
void add_parameter_ranges_to_builder(const RBParametrized &rb_evaluation, RBData::ParameterRanges::Builder &parameter_ranges, RBData::DiscreteParameterList::Builder &discrete_parameters_list)
Add parameter ranges for continuous and discrete parameters.
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition int_range.h:153
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...
Definition int_range.h:176

References add_parameter_ranges_to_builder(), add_point_to_builder(), libMesh::RBEIMEvaluation::get_eim_solutions_for_training_set(), libMesh::RBEIMEvaluation::get_elem_center_dxyzdeta(), libMesh::RBEIMEvaluation::get_elem_center_dxyzdxi(), libMesh::RBEIMEvaluation::get_elem_id_to_local_index_map(), libMesh::RBEIMEvaluation::get_error_indicator_interpolation_row(), libMesh::RBEIMEvaluation::get_interpolation_matrix(), libMesh::RBEIMEvaluation::get_interpolation_points_boundary_id(), libMesh::RBEIMEvaluation::get_interpolation_points_comp(), libMesh::RBEIMEvaluation::get_interpolation_points_elem_id(), libMesh::RBEIMEvaluation::get_interpolation_points_elem_type(), libMesh::RBEIMEvaluation::get_interpolation_points_JxW_all_qp(), libMesh::RBEIMEvaluation::get_interpolation_points_node_id(), libMesh::RBEIMEvaluation::get_interpolation_points_phi_i_all_qp(), libMesh::RBEIMEvaluation::get_interpolation_points_phi_i_qp(), libMesh::RBEIMEvaluation::get_interpolation_points_qp(), libMesh::RBEIMEvaluation::get_interpolation_points_qrule_order(), libMesh::RBEIMEvaluation::get_interpolation_points_side_index(), libMesh::RBEIMEvaluation::get_interpolation_points_spatial_indices(), libMesh::RBEIMEvaluation::get_interpolation_points_subdomain_id(), libMesh::RBEIMEvaluation::get_interpolation_points_xyz(), libMesh::RBEIMEvaluation::get_interpolation_points_xyz_perturbations(), libMesh::RBEIMEvaluation::get_n_basis_functions(), libMesh::RBEIMEvaluation::get_n_elems(), libMesh::RBEIMEvaluation::get_n_interpolation_points(), libMesh::RBEIMEvaluation::get_n_interpolation_points_spatial_indices(), libMesh::RBEIMEvaluation::get_n_properties(), libMesh::RBEIMEvaluation::get_parametrized_function(), libMesh::RBEIMEvaluation::get_rb_property_map(), libMesh::index_range(), libMesh::RBEIMEvaluation::initialize_interpolation_points_spatial_indices(), libMesh::RBParametrizedFunction::is_lookup_table, libMesh::make_range(), libMesh::RBParametrizedFunction::on_mesh_nodes(), libMesh::RBParametrizedFunction::on_mesh_sides(), libMesh::DenseVector< T >::size(), and libMesh::RBEIMEvaluation::use_eim_error_indicator().

Referenced by libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file().

◆ add_rb_evaluation_data_to_builder()

template<typename RBEvaluationBuilderNumber >
void libMesh::RBDataSerialization::add_rb_evaluation_data_to_builder ( RBEvaluation rb_eval,
RBEvaluationBuilderNumber &  rb_eval_builder 
)

Add data for an RBEvaluation to the builder.

Definition at line 318 of file rb_data_serialization.C.

320{
321 const RBThetaExpansion & rb_theta_expansion = rb_eval.get_rb_theta_expansion();
322
323 unsigned int n_F_terms = rb_theta_expansion.get_n_F_terms();
324 unsigned int n_A_terms = rb_theta_expansion.get_n_A_terms();
325
326 // Number of basis functions
327 unsigned int n_bfs = rb_eval.get_n_basis_functions();
328 rb_evaluation_builder.setNBfs(n_bfs);
329
330 // Fq representor inner-product data
331 {
332 unsigned int Q_f_hat = n_F_terms*(n_F_terms+1)/2;
333
334 auto fq_innerprods_list = rb_evaluation_builder.initFqInnerprods(Q_f_hat);
335
336 for (unsigned int i=0; i<Q_f_hat; i++)
337 set_scalar_in_list(fq_innerprods_list,
338 i,
339 rb_eval.Fq_representor_innerprods[i]);
340 }
341
342 // FqAq representor inner-product data
343 {
344 auto fq_aq_innerprods_list =
345 rb_evaluation_builder.initFqAqInnerprods(n_F_terms*n_A_terms*n_bfs);
346
347 for (unsigned int q_f=0; q_f < n_F_terms; ++q_f)
348 for (unsigned int q_a=0; q_a < n_A_terms; ++q_a)
349 for (unsigned int i=0; i < n_bfs; ++i)
350 {
351 unsigned int offset = q_f*n_A_terms*n_bfs + q_a*n_bfs + i;
352 set_scalar_in_list(
353 fq_aq_innerprods_list, offset,
354 rb_eval.Fq_Aq_representor_innerprods[q_f][q_a][i]);
355 }
356 }
357
358 // AqAq representor inner-product data
359 {
360 unsigned int Q_a_hat = n_A_terms*(n_A_terms+1)/2;
361 auto aq_aq_innerprods_list =
362 rb_evaluation_builder.initAqAqInnerprods(Q_a_hat*n_bfs*n_bfs);
363
364 for (unsigned int i=0; i < Q_a_hat; ++i)
365 for (unsigned int j=0; j < n_bfs; ++j)
366 for (unsigned int l=0; l < n_bfs; ++l)
367 {
368 unsigned int offset = i*n_bfs*n_bfs + j*n_bfs + l;
369 set_scalar_in_list(
370 aq_aq_innerprods_list,
371 offset,
372 rb_eval.Aq_Aq_representor_innerprods[i][j][l]);
373 }
374 }
375
376 // Output dual inner-product data, and output vectors
377 {
378 unsigned int n_outputs = rb_theta_expansion.get_n_outputs();
379 auto output_innerprod_outer = rb_evaluation_builder.initOutputDualInnerprods(n_outputs);
380 auto output_vector_outer = rb_evaluation_builder.initOutputVectors(n_outputs);
381
382 for (unsigned int output_id=0; output_id < n_outputs; ++output_id)
383 {
384 unsigned int n_output_terms = rb_theta_expansion.get_n_output_terms(output_id);
385
386 {
387 unsigned int Q_l_hat = n_output_terms*(n_output_terms+1)/2;
388 auto output_innerprod_inner = output_innerprod_outer.init(output_id, Q_l_hat);
389 for (unsigned int q=0; q < Q_l_hat; ++q)
390 {
391 set_scalar_in_list(
392 output_innerprod_inner, q, rb_eval.output_dual_innerprods[output_id][q]);
393 }
394 }
395
396 {
397 auto output_vector_middle = output_vector_outer.init(output_id, n_output_terms);
398 for (unsigned int q_l=0; q_l<n_output_terms; ++q_l)
399 {
400 auto output_vector_inner = output_vector_middle.init(q_l, n_bfs);
401 for (unsigned int j=0; j<n_bfs; ++j)
402 {
403 set_scalar_in_list(
404 output_vector_inner, j, rb_eval.RB_output_vectors[output_id][q_l](j));
405 }
406 }
407 }
408 }
409 }
410
411 // Fq vectors and Aq matrices
412 {
413 unsigned int n_F_terms = rb_theta_expansion.get_n_F_terms();
414 unsigned int n_A_terms = rb_theta_expansion.get_n_A_terms();
415
416 auto rb_fq_vectors_outer_list = rb_evaluation_builder.initRbFqVectors(n_F_terms);
417 for (unsigned int q_f=0; q_f < n_F_terms; ++q_f)
418 {
419 auto rb_fq_vectors_inner_list = rb_fq_vectors_outer_list.init(q_f, n_bfs);
420 for (unsigned int i=0; i<n_bfs; i++)
421 set_scalar_in_list(rb_fq_vectors_inner_list, i, rb_eval.RB_Fq_vector[q_f](i));
422 }
423
424 auto rb_Aq_matrices_outer_list = rb_evaluation_builder.initRbAqMatrices(n_A_terms);
425 for (unsigned int q_a=0; q_a < n_A_terms; ++q_a)
426 {
427 auto rb_Aq_matrices_inner_list = rb_Aq_matrices_outer_list.init(q_a, n_bfs*n_bfs);
428 for (unsigned int i=0; i < n_bfs; ++i)
429 for (unsigned int j=0; j < n_bfs; ++j)
430 {
431 unsigned int offset = i*n_bfs+j;
432 set_scalar_in_list(rb_Aq_matrices_inner_list, offset, rb_eval.RB_Aq_vector[q_a](i,j));
433 }
434 }
435 }
436
437 // Inner-product matrix
438 if (rb_eval.compute_RB_inner_product)
439 {
440 auto rb_inner_product_matrix_list =
441 rb_evaluation_builder.initRbInnerProductMatrix(n_bfs*n_bfs);
442
443 for (unsigned int i=0; i < n_bfs; ++i)
444 for (unsigned int j=0; j < n_bfs; ++j)
445 {
446 unsigned int offset = i*n_bfs + j;
447 set_scalar_in_list(
448 rb_inner_product_matrix_list,
449 offset,
450 rb_eval.RB_inner_product_matrix(i,j) );
451 }
452 }
453
454 auto parameter_ranges_list =
455 rb_evaluation_builder.initParameterRanges();
456 auto discrete_parameters_list =
457 rb_evaluation_builder.initDiscreteParameters();
459 parameter_ranges_list,
460 discrete_parameters_list);
461}
DenseMatrix< Number > RB_inner_product_matrix
The inner product matrix.
std::vector< Number > Fq_representor_innerprods
Vectors storing the residual representor inner products to be used in computing the residuals online.
bool compute_RB_inner_product
Boolean flag to indicate whether we compute the RB_inner_product_matrix.
std::vector< std::vector< std::vector< Number > > > Aq_Aq_representor_innerprods
virtual unsigned int get_n_basis_functions() const
Get the current number of basis functions.
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< std::vector< DenseVector< Number > > > RB_output_vectors
The vectors storing the RB output vectors.
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
std::vector< std::vector< Number > > output_dual_innerprods
The vector storing the dual norm inner product terms for each output.
std::vector< DenseVector< Number > > RB_Fq_vector
Dense vector for the RHS.
std::vector< DenseMatrix< Number > > RB_Aq_vector
Dense matrices for the RB computations.
This class stores the set of RBTheta functor objects that define the "parameter-dependent expansion" ...
unsigned int get_n_F_terms() const
Get Q_f, the number of terms in the affine expansion for the right-hand side.
unsigned int get_n_A_terms() const
Get Q_a, the number of terms in the affine expansion for the bilinear form.
unsigned int get_n_output_terms(unsigned int output_index) const
Get the number of affine terms associated with the specified output.
unsigned int get_n_outputs() const
Get n_outputs, the number output functionals.

References add_parameter_ranges_to_builder(), libMesh::RBEvaluation::Aq_Aq_representor_innerprods, libMesh::RBEvaluation::compute_RB_inner_product, libMesh::RBEvaluation::Fq_Aq_representor_innerprods, libMesh::RBEvaluation::Fq_representor_innerprods, libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::RBThetaExpansion::get_n_output_terms(), libMesh::RBThetaExpansion::get_n_outputs(), libMesh::RBEvaluation::get_rb_theta_expansion(), libMesh::RBEvaluation::output_dual_innerprods, libMesh::RBEvaluation::RB_Aq_vector, libMesh::RBEvaluation::RB_Fq_vector, libMesh::RBEvaluation::RB_inner_product_matrix, and libMesh::RBEvaluation::RB_output_vectors.

Referenced by add_transient_rb_evaluation_data_to_builder(), and libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file().

◆ add_rb_scm_evaluation_data_to_builder()

void libMesh::RBDataSerialization::add_rb_scm_evaluation_data_to_builder ( RBSCMEvaluation rb_scm_eval,
RBData::RBSCMEvaluation::Builder &  rb_scm_eval_builder 
)

Add data for an RBSCMEvaluation to the builder.

Unlike the other functions above, this does not need to be templated because an RBSCMEvaluation only stores Real values, and hence doesn't depend on whether we're using complex numbers or not.

Definition at line 935 of file rb_data_serialization.C.

937{
938 auto parameter_ranges_list =
939 rb_scm_eval_builder.initParameterRanges();
940 auto discrete_parameters_list =
941 rb_scm_eval_builder.initDiscreteParameters();
943 parameter_ranges_list,
944 discrete_parameters_list);
945
946 {
947 libmesh_error_msg_if(rb_scm_eval.B_min.size() != rb_scm_eval.get_rb_theta_expansion().get_n_A_terms(),
948 "Size error while writing B_min");
949 auto b_min_list = rb_scm_eval_builder.initBMin( rb_scm_eval.B_min.size() );
950 for (auto i : index_range(rb_scm_eval.B_min))
951 b_min_list.set(i, rb_scm_eval.get_B_min(i));
952 }
953
954 {
955 libmesh_error_msg_if(rb_scm_eval.B_max.size() != rb_scm_eval.get_rb_theta_expansion().get_n_A_terms(),
956 "Size error while writing B_max");
957
958 auto b_max_list = rb_scm_eval_builder.initBMax( rb_scm_eval.B_max.size() );
959 for (auto i : index_range(rb_scm_eval.B_max))
960 b_max_list.set(i, rb_scm_eval.get_B_max(i));
961 }
962
963 {
964 auto cj_stability_vector =
965 rb_scm_eval_builder.initCJStabilityVector( rb_scm_eval.C_J_stability_vector.size() );
966 for (auto i : index_range(rb_scm_eval.C_J_stability_vector))
967 cj_stability_vector.set(i, rb_scm_eval.get_C_J_stability_constraint(i));
968 }
969
970 {
971 auto cj_parameters_outer =
972 rb_scm_eval_builder.initCJ( rb_scm_eval.C_J.size() );
973
974 for (auto i : index_range(rb_scm_eval.C_J))
975 {
976 auto cj_parameters_inner =
977 cj_parameters_outer.init(i, rb_scm_eval.C_J[i].n_parameters());
978
979 unsigned int count = 0;
980 for (const auto & [key, val] : rb_scm_eval.C_J[i])
981 {
982 cj_parameters_inner[count].setName(key);
983 cj_parameters_inner[count].setValue(val);
984 count++;
985 }
986
987 }
988 }
989
990 {
991 unsigned int n_C_J_values = rb_scm_eval.C_J.size();
992 unsigned int n_A_terms = rb_scm_eval.get_rb_theta_expansion().get_n_A_terms();
993 unsigned int n_values = n_C_J_values*n_A_terms;
994 auto scm_ub_vectors =
995 rb_scm_eval_builder.initScmUbVectors( n_values );
996
997 for (unsigned int i=0; i<n_C_J_values; i++)
998 for (unsigned int j=0; j<n_A_terms; j++)
999 {
1000 unsigned int offset = i*n_A_terms + j;
1001 scm_ub_vectors.set(offset, rb_scm_eval.get_SCM_UB_vector(i,j));
1002 }
1003 }
1004}
std::vector< Real > B_max
Real get_SCM_UB_vector(unsigned int j, unsigned int q)
Get entries of SCM_UB_vector, which stores the vector y, corresponding to the minimizing eigenvectors...
RBThetaExpansion & get_rb_theta_expansion()
Get a reference to the rb_theta_expansion.
std::vector< Real > C_J_stability_vector
Vector storing the (truth) stability values at the parameters in C_J.
std::vector< Real > B_min
B_min, B_max define the bounding box.
std::vector< RBParameters > C_J
Vector storing the greedily selected parameters during SCM training.

References add_parameter_ranges_to_builder(), libMesh::RBSCMEvaluation::B_max, libMesh::RBSCMEvaluation::B_min, libMesh::RBSCMEvaluation::C_J, libMesh::RBSCMEvaluation::C_J_stability_vector, libMesh::RBSCMEvaluation::get_B_max(), libMesh::RBSCMEvaluation::get_B_min(), libMesh::RBSCMEvaluation::get_C_J_stability_constraint(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBSCMEvaluation::get_rb_theta_expansion(), libMesh::RBSCMEvaluation::get_SCM_UB_vector(), and libMesh::index_range().

Referenced by libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

◆ add_transient_rb_evaluation_data_to_builder()

template<typename RBEvaluationBuilderNumber , typename TransRBEvaluationBuilderNumber >
void libMesh::RBDataSerialization::add_transient_rb_evaluation_data_to_builder ( TransientRBEvaluation trans_rb_eval,
RBEvaluationBuilderNumber &  rb_eval_builder,
TransRBEvaluationBuilderNumber &  trans_rb_eval_builder 
)

Add data for a TransientRBEvaluation to the builder.

Templated to deal with both Real and Complex numbers.

Definition at line 464 of file rb_data_serialization.C.

467{
468 add_rb_evaluation_data_to_builder(trans_rb_eval, rb_eval_builder);
469
470 trans_rb_eval_builder.setDeltaT(trans_rb_eval.get_delta_t());
471 trans_rb_eval_builder.setEulerTheta(trans_rb_eval.get_euler_theta());
472 trans_rb_eval_builder.setNTimeSteps(trans_rb_eval.get_n_time_steps());
473 trans_rb_eval_builder.setTimeStep(trans_rb_eval.get_time_step());
474
475 unsigned int n_bfs = trans_rb_eval.get_n_basis_functions();
476
477 // L2-inner-product matrix
478 {
479 auto rb_L2_matrix_list =
480 trans_rb_eval_builder.initRbL2Matrix(n_bfs*n_bfs);
481
482 for (unsigned int i=0; i<n_bfs; ++i)
483 for (unsigned int j=0; j<n_bfs; ++j)
484 {
485 unsigned int offset = i*n_bfs + j;
486 set_scalar_in_list(rb_L2_matrix_list,
487 offset,
488 trans_rb_eval.RB_L2_matrix(i,j));
489 }
490 }
491
492 TransientRBThetaExpansion & trans_theta_expansion =
493 cast_ref<TransientRBThetaExpansion &>(trans_rb_eval.get_rb_theta_expansion());
494 unsigned int n_M_terms = trans_theta_expansion.get_n_M_terms();
495 // Mq matrices
496 {
497 auto rb_Mq_matrices_outer_list = trans_rb_eval_builder.initRbMqMatrices(n_M_terms);
498 for (unsigned int q_m=0; q_m < n_M_terms; ++q_m)
499 {
500 auto rb_Mq_matrices_inner_list = rb_Mq_matrices_outer_list.init(q_m, n_bfs*n_bfs);
501 for (unsigned int i=0; i < n_bfs; ++i)
502 for (unsigned int j=0; j < n_bfs; ++j)
503 {
504 unsigned int offset = i*n_bfs+j;
505 set_scalar_in_list(rb_Mq_matrices_inner_list,
506 offset,
507 trans_rb_eval.RB_M_q_vector[q_m](i,j));
508 }
509 }
510 }
511
512 // The initial condition and L2 error at t=0.
513 // We store the values for each RB space of dimension (0,...,n_basis_functions).
514 {
515 auto initial_l2_errors_builder =
516 trans_rb_eval_builder.initInitialL2Errors(n_bfs);
517 auto initial_conditions_outer_list =
518 trans_rb_eval_builder.initInitialConditions(n_bfs);
519
520 for (unsigned int i=0; i<n_bfs; i++)
521 {
522 initial_l2_errors_builder.set(i, trans_rb_eval.initial_L2_error_all_N[i]);
523
524 auto initial_conditions_inner_list =
525 initial_conditions_outer_list.init(i, i+1);
526 for (unsigned int j=0; j<=i; j++)
527 {
528 set_scalar_in_list(initial_conditions_inner_list,
529 j,
530 trans_rb_eval.RB_initial_condition_all_N[i](j));
531 }
532 }
533 }
534
535 // FqMq representor inner-product data
536 {
537 unsigned int n_F_terms = trans_theta_expansion.get_n_F_terms();
538 auto fq_mq_innerprods_list =
539 trans_rb_eval_builder.initFqMqInnerprods(n_F_terms*n_M_terms*n_bfs);
540
541 for (unsigned int q_f=0; q_f<n_F_terms; ++q_f)
542 for (unsigned int q_m=0; q_m<n_M_terms; ++q_m)
543 for (unsigned int i=0; i<n_bfs; ++i)
544 {
545 unsigned int offset = q_f*n_M_terms*n_bfs + q_m*n_bfs + i;
546 set_scalar_in_list(fq_mq_innerprods_list,
547 offset,
548 trans_rb_eval.Fq_Mq_representor_innerprods[q_f][q_m][i]);
549 }
550 }
551
552 // MqMq representor inner-product data
553 {
554 unsigned int Q_m_hat = n_M_terms*(n_M_terms+1)/2;
555 auto mq_mq_innerprods_list =
556 trans_rb_eval_builder.initMqMqInnerprods(Q_m_hat*n_bfs*n_bfs);
557
558 for (unsigned int i=0; i < Q_m_hat; ++i)
559 for (unsigned int j=0; j < n_bfs; ++j)
560 for (unsigned int l=0; l < n_bfs; ++l)
561 {
562 unsigned int offset = i*n_bfs*n_bfs + j*n_bfs + l;
563 set_scalar_in_list(mq_mq_innerprods_list,
564 offset,
565 trans_rb_eval.Mq_Mq_representor_innerprods[i][j][l]);
566 }
567 }
568
569 // AqMq representor inner-product data
570 {
571 unsigned int n_A_terms = trans_theta_expansion.get_n_A_terms();
572
573 auto aq_mq_innerprods_list =
574 trans_rb_eval_builder.initAqMqInnerprods(n_A_terms*n_M_terms*n_bfs*n_bfs);
575
576 for (unsigned int q_a=0; q_a<n_A_terms; q_a++)
577 for (unsigned int q_m=0; q_m<n_M_terms; q_m++)
578 for (unsigned int i=0; i<n_bfs; i++)
579 for (unsigned int j=0; j<n_bfs; j++)
580 {
581 unsigned int offset =
582 q_a*(n_M_terms*n_bfs*n_bfs) + q_m*(n_bfs*n_bfs) + i*n_bfs + j;
583 set_scalar_in_list(aq_mq_innerprods_list,
584 offset,
585 trans_rb_eval.Aq_Mq_representor_innerprods[q_a][q_m][i][j]);
586 }
587 }
588
589}
Real get_delta_t() const
Get/set delta_t, the time-step size.
Real get_euler_theta() const
Get/set euler_theta, parameter that determines the temporal discretization.
unsigned int get_n_time_steps() const
Get/set the total number of time-steps.
unsigned int get_time_step() const
Get/set the current time-step.
std::vector< std::vector< std::vector< std::vector< Number > > > > Aq_Mq_representor_innerprods
std::vector< std::vector< std::vector< Number > > > Mq_Mq_representor_innerprods
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.
DenseMatrix< Number > RB_L2_matrix
Dense RB L2 matrix.
std::vector< Real > initial_L2_error_all_N
Vector storing initial L2 error for all 1 <= N <= RB_size.
std::vector< DenseMatrix< Number > > RB_M_q_vector
Dense matrices for the RB mass matrices.
std::vector< DenseVector< Number > > RB_initial_condition_all_N
The RB initial conditions (i.e.
void add_rb_evaluation_data_to_builder(RBEvaluation &rb_eval, RBEvaluationBuilderNumber &rb_eval_builder)
Add data for an RBEvaluation to the builder.

References add_rb_evaluation_data_to_builder(), libMesh::TransientRBEvaluation::Aq_Mq_representor_innerprods, libMesh::TransientRBEvaluation::Fq_Mq_representor_innerprods, libMesh::RBTemporalDiscretization::get_delta_t(), libMesh::RBTemporalDiscretization::get_euler_theta(), libMesh::RBThetaExpansion::get_n_A_terms(), libMesh::RBEvaluation::get_n_basis_functions(), libMesh::RBThetaExpansion::get_n_F_terms(), libMesh::TransientRBThetaExpansion::get_n_M_terms(), libMesh::RBTemporalDiscretization::get_n_time_steps(), libMesh::RBEvaluation::get_rb_theta_expansion(), libMesh::RBTemporalDiscretization::get_time_step(), libMesh::TransientRBEvaluation::initial_L2_error_all_N, libMesh::TransientRBEvaluation::Mq_Mq_representor_innerprods, libMesh::TransientRBEvaluation::RB_initial_condition_all_N, libMesh::TransientRBEvaluation::RB_L2_matrix, and libMesh::TransientRBEvaluation::RB_M_q_vector.

Referenced by libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file().