Load an EIM RB evaluation from a corresponding reader structure in the buffer.
Templated to deal with both Real and Complex numbers.
691{
692
693 unsigned int n_bfs = rb_eim_evaluation_reader.getNBfs();
694 rb_eim_evaluation.set_n_basis_functions(n_bfs);
695
696 rb_eim_evaluation.resize_data_structures(n_bfs);
697
698
699 {
700 auto interpolation_matrix_list = rb_eim_evaluation_reader.getInterpolationMatrix();
701
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.");
704
705 for (unsigned int i=0; i<n_bfs; ++i)
706 for (unsigned int j=0; j<=i; ++j)
707 {
708 unsigned int offset = i*(i+1)/2 + j;
709 rb_eim_evaluation.set_interpolation_matrix_entry(
710 i,j, load_scalar_value(interpolation_matrix_list[offset]));
711 }
712 }
713
714
715
716
717
718
719 if (rb_eim_evaluation_reader.getInterpolationXyz().size() > n_bfs)
720 {
721 auto error_indicator_data_list = rb_eim_evaluation_reader.getEimErrorIndicatorInterpData();
722
723 libmesh_error_msg_if(error_indicator_data_list.size() != n_bfs,
724 "Size error while reading the eim error indicator data.");
725
726 DenseVector<Number> eim_error_indicator_data(n_bfs);
727 for (unsigned int i=0; i<n_bfs; ++i)
728 eim_error_indicator_data(i) = load_scalar_value(error_indicator_data_list[i]);
729
730 rb_eim_evaluation.set_error_indicator_interpolation_row(eim_error_indicator_data);
731 }
732
733
734
735
736
737
738
739
740 if (rb_eim_evaluation_reader.getInterpolationXyz().size() > n_bfs)
741 n_bfs++;
742
743 auto parameter_ranges =
744 rb_eim_evaluation_reader.getParameterRanges();
745 auto discrete_parameters_list =
746 rb_eim_evaluation_reader.getDiscreteParameters();
747
749 parameter_ranges,
750 discrete_parameters_list);
751
752
753 {
754 auto interpolation_points_list =
755 rb_eim_evaluation_reader.getInterpolationXyz();
756
757 libmesh_error_msg_if(interpolation_points_list.size() != n_bfs,
758 "Size error while reading the eim interpolation points.");
759
760 for (unsigned int i=0; i<n_bfs; ++i)
761 {
762 Point p;
764 rb_eim_evaluation.add_interpolation_points_xyz(p);
765 }
766 }
767
768
769 {
770 auto interpolation_points_comp_list =
771 rb_eim_evaluation_reader.getInterpolationComp();
772
773 libmesh_error_msg_if(interpolation_points_comp_list.size() != n_bfs,
774 "Size error while reading the eim interpolation components.");
775
776 for (unsigned int i=0; i<n_bfs; ++i)
777 {
778 rb_eim_evaluation.add_interpolation_points_comp(interpolation_points_comp_list[i]);
779 }
780 }
781
782
783 {
784 auto interpolation_points_subdomain_id_list =
785 rb_eim_evaluation_reader.getInterpolationSubdomainId();
786
787 libmesh_error_msg_if(interpolation_points_subdomain_id_list.size() != n_bfs,
788 "Size error while reading the eim interpolation subdomain IDs.");
789
790 for (unsigned int i=0; i<n_bfs; ++i)
791 {
792 rb_eim_evaluation.add_interpolation_points_subdomain_id(interpolation_points_subdomain_id_list[i]);
793 }
794 }
795
796
797
798 if (rb_eim_evaluation.get_parametrized_function().on_mesh_sides() ||
799 rb_eim_evaluation.get_parametrized_function().on_mesh_nodes())
800 {
801 auto interpolation_points_boundary_id_list =
802 rb_eim_evaluation_reader.getInterpolationBoundaryId();
803
804 libmesh_error_msg_if(interpolation_points_boundary_id_list.size() != n_bfs,
805 "Size error while reading the eim interpolation boundary IDs.");
806
807 for (unsigned int i=0; i<n_bfs; ++i)
808 {
809 rb_eim_evaluation.add_interpolation_points_boundary_id(interpolation_points_boundary_id_list[i]);
810 }
811 }
812
813
814 {
815 auto interpolation_points_elem_id_list =
816 rb_eim_evaluation_reader.getInterpolationElemId();
817
818 libmesh_error_msg_if(interpolation_points_elem_id_list.size() != n_bfs,
819 "Size error while reading the eim interpolation element IDs.");
820
821 for (unsigned int i=0; i<n_bfs; ++i)
822 {
823 rb_eim_evaluation.add_interpolation_points_elem_id(interpolation_points_elem_id_list[i]);
824 }
825 }
826
827
828 if (rb_eim_evaluation.get_parametrized_function().on_mesh_nodes())
829 {
830 auto interpolation_points_node_id_list =
831 rb_eim_evaluation_reader.getInterpolationNodeId();
832
833 libmesh_error_msg_if(interpolation_points_node_id_list.size() != n_bfs,
834 "Size error while reading the eim interpolation node IDs.");
835
836 for (unsigned int i=0; i<n_bfs; ++i)
837 {
838 rb_eim_evaluation.add_interpolation_points_node_id(interpolation_points_node_id_list[i]);
839 }
840 }
841
842
843 if (rb_eim_evaluation.get_parametrized_function().on_mesh_sides())
844 {
845 auto interpolation_points_side_index_list =
846 rb_eim_evaluation_reader.getInterpolationSideIndex();
847
848 libmesh_error_msg_if(interpolation_points_side_index_list.size() != n_bfs,
849 "Size error while reading the eim interpolation side indices.");
850
851 for (unsigned int i=0; i<n_bfs; ++i)
852 {
853 rb_eim_evaluation.add_interpolation_points_side_index(interpolation_points_side_index_list[i]);
854 }
855 }
856
857
858 {
859 auto interpolation_points_qp_list =
860 rb_eim_evaluation_reader.getInterpolationQp();
861
862 libmesh_error_msg_if(interpolation_points_qp_list.size() != n_bfs,
863 "Size error while reading the eim interpolation qps.");
864
865 for (unsigned int i=0; i<n_bfs; ++i)
866 {
867 rb_eim_evaluation.add_interpolation_points_qp(interpolation_points_qp_list[i]);
868 }
869 }
870
871 unsigned int n_elems = rb_eim_evaluation_reader.getNElems();
872 bool build_elem_id_to_local_index_map = false;
873
874 {
875 auto interpolation_points_list_outer =
876 rb_eim_evaluation_reader.getInterpolationJxWAllQp();
877
878 if (interpolation_points_list_outer.size() > 0)
879 {
880 if (n_elems != 0)
881 {
882 libmesh_error_msg_if(interpolation_points_list_outer.size() != n_elems,
883 "Size error while reading the eim JxW values.");
884
885 for (unsigned int i=0; i<n_elems; ++i)
886 {
887 auto interpolation_points_list_inner = interpolation_points_list_outer[i];
888
889 std::vector<Real> JxW(interpolation_points_list_inner.size());
890 for (unsigned int j=0; j<JxW.size(); j++)
891 {
892 JxW[j] = interpolation_points_list_inner[j];
893 }
894 rb_eim_evaluation.add_interpolation_points_JxW_all_qp(JxW);
895 }
896 }
897
898
899
900 else
901 {
902
903
904
905
906
907
908 build_elem_id_to_local_index_map = true;
909
910 auto interpolation_points_elem_id_list =
911 rb_eim_evaluation_reader.getInterpolationElemId();
912 std::set<dof_id_type> added_elem_id;
913
914 libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
915 "Size error while reading the eim JxW values.");
916
917 for (unsigned int i=0; i<n_bfs; ++i)
918 {
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())
921 {
922 added_elem_id.emplace(elem_id);
923
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++)
927 {
928 JxW[j] = interpolation_points_list_inner[j];
929 }
930 rb_eim_evaluation.add_interpolation_points_JxW_all_qp(JxW);
931 }
932 }
933 }
934 }
935 }
936
937
938 {
939 auto interpolation_points_list_outer =
940 rb_eim_evaluation_reader.getInterpolationPhiValuesAllQp();
941
942 if (interpolation_points_list_outer.size() > 0)
943 {
944 if (n_elems != 0)
945 {
946 libmesh_error_msg_if(interpolation_points_list_outer.size() != n_elems,
947 "Size error while reading the eim phi_i all qp values.");
948
949 for (unsigned int i=0; i<n_elems; ++i)
950 {
951 auto interpolation_points_list_middle = interpolation_points_list_outer[i];
952
953 std::vector<std::vector<Real>> phi_i_all_qp(interpolation_points_list_middle.size());
955 {
956 auto interpolation_points_list_inner = interpolation_points_list_middle[j];
957
958 phi_i_all_qp[j].resize(interpolation_points_list_inner.size());
960 phi_i_all_qp[j][k] = interpolation_points_list_inner[k];
961 }
962 rb_eim_evaluation.add_interpolation_points_phi_i_all_qp(phi_i_all_qp);
963 }
964 }
965
966
967
968 else
969 {
970 auto interpolation_points_elem_id_list =
971 rb_eim_evaluation_reader.getInterpolationElemId();
972 std::set<dof_id_type> added_elem_id;
973
974 libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
975 "Size error while reading the eim JxW values.");
976
977 for (unsigned int i=0; i<n_bfs; ++i)
978 {
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())
981 {
982 added_elem_id.emplace(elem_id);
983
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());
987 {
988 auto interpolation_points_list_inner = interpolation_points_list_middle[j];
989
990 phi_i_all_qp[j].resize(interpolation_points_list_inner.size());
992 phi_i_all_qp[j][k] = interpolation_points_list_inner[k];
993 }
994 rb_eim_evaluation.add_interpolation_points_phi_i_all_qp(phi_i_all_qp);
995 }
996 }
997 }
998 }
999 }
1000
1001
1002 {
1003 auto elem_id_to_local_index_list =
1004 rb_eim_evaluation_reader.getElemIdToLocalIndex();
1005
1006 if (elem_id_to_local_index_list.size() > 0)
1007 {
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.");
1010
1011 for (unsigned int i=0; i<n_elems; ++i)
1012 {
1013 rb_eim_evaluation.add_elem_id_local_index_map_entry(elem_id_to_local_index_list[i].getFirst(), elem_id_to_local_index_list[i].getSecond());
1014 }
1015 }
1016
1017
1018 else if (build_elem_id_to_local_index_map)
1019 {
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;
1024
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.");
1027
1028 for (unsigned int i=0; i<n_bfs; ++i)
1029 {
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())
1032 {
1033 added_elem_id.emplace(elem_id);
1034 rb_eim_evaluation.add_elem_id_local_index_map_entry(elem_id, local_index);
1035 ++local_index;
1036 }
1037 }
1038 }
1039 }
1040
1041
1042 {
1043 auto elem_center_dxyzdxi =
1044 rb_eim_evaluation_reader.getInterpolationDxyzDxiElem();
1045
1046 if (elem_center_dxyzdxi.size() > 0)
1047 {
1048 if (n_elems != 0)
1049 {
1050 libmesh_error_msg_if(elem_center_dxyzdxi.size() != n_elems,
1051 "Size error while reading the eim elem center tangent derivative dxyzdxi.");
1052
1053 Point dxyzdxi_buffer;
1055 {
1056 load_point(elem_center_dxyzdxi[i], dxyzdxi_buffer);
1057 rb_eim_evaluation.add_elem_center_dxyzdxi(dxyzdxi_buffer);
1058 }
1059 }
1060
1061
1062
1063 else
1064 {
1065 auto interpolation_points_elem_id_list =
1066 rb_eim_evaluation_reader.getInterpolationElemId();
1067 std::set<dof_id_type> added_elem_id;
1068
1069 libmesh_error_msg_if(elem_center_dxyzdxi.size() != n_bfs,
1070 "Size error while reading the eim elem center tangent derivative dxyzdxi.");
1071
1072 Point dxyzdxi_buffer;
1073 for (unsigned int i=0; i<n_bfs; ++i)
1074 {
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())
1077 {
1078 added_elem_id.emplace(elem_id);
1079
1080 load_point(elem_center_dxyzdxi[i], dxyzdxi_buffer);
1081 rb_eim_evaluation.add_elem_center_dxyzdxi(dxyzdxi_buffer);
1082 }
1083 }
1084 }
1085 }
1086 }
1087
1088
1089 {
1090 auto elem_center_dxyzdeta =
1091 rb_eim_evaluation_reader.getInterpolationDxyzDetaElem();
1092
1093 if (elem_center_dxyzdeta.size() > 0)
1094 {
1095 if (n_elems != 0)
1096 {
1097 libmesh_error_msg_if(elem_center_dxyzdeta.size() != n_elems,
1098 "Size error while reading the eim elem center tangent derivative dxyzdeta.");
1099
1100 Point dxyzdeta_buffer;
1102 {
1103 load_point(elem_center_dxyzdeta[i], dxyzdeta_buffer);
1104 rb_eim_evaluation.add_elem_center_dxyzdeta(dxyzdeta_buffer);
1105 }
1106 }
1107
1108
1109
1110 else
1111 {
1112 auto interpolation_points_elem_id_list =
1113 rb_eim_evaluation_reader.getInterpolationElemId();
1114 std::set<dof_id_type> added_elem_id;
1115
1116 libmesh_error_msg_if(elem_center_dxyzdeta.size() != n_bfs,
1117 "Size error while reading the eim elem center tangent derivative dxyzdeta.");
1118
1119 Point dxyzdeta_buffer;
1120 for (unsigned int i=0; i<n_bfs; ++i)
1121 {
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())
1124 {
1125 added_elem_id.emplace(elem_id);
1126
1127 load_point(elem_center_dxyzdeta[i], dxyzdeta_buffer);
1128 rb_eim_evaluation.add_elem_center_dxyzdeta(dxyzdeta_buffer);
1129 }
1130 }
1131 }
1132 }
1133 }
1134
1135
1136 {
1137 auto interpolation_points_qrule_order_list =
1138 rb_eim_evaluation_reader.getInterpolationQruleOrder();
1139
1140 if (interpolation_points_qrule_order_list.size() > 0)
1141 {
1142 if (n_elems != 0)
1143 {
1144 libmesh_error_msg_if(interpolation_points_qrule_order_list.size() != n_elems,
1145 "Size error while reading the eim elem qrule order.");
1146
1147 for (unsigned int i=0; i<n_elems; ++i)
1148 {
1149 rb_eim_evaluation.add_interpolation_points_qrule_order(
static_cast<Order>(interpolation_points_qrule_order_list[i]));
1150 }
1151 }
1152
1153
1154
1155 else
1156 {
1157 auto interpolation_points_elem_id_list =
1158 rb_eim_evaluation_reader.getInterpolationElemId();
1159 std::set<dof_id_type> added_elem_id;
1160
1161 libmesh_error_msg_if(interpolation_points_qrule_order_list.size() != n_bfs,
1162 "Size error while reading the eim elem qrule order.");
1163
1164 for (unsigned int i=0; i<n_bfs; ++i)
1165 {
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())
1168 {
1169 added_elem_id.emplace(elem_id);
1170
1171 rb_eim_evaluation.add_interpolation_points_qrule_order(
static_cast<Order>(interpolation_points_qrule_order_list[i]));
1172 }
1173 }
1174 }
1175 }
1176 }
1177
1178
1179 {
1180 auto interpolation_points_elem_type_list =
1181 rb_eim_evaluation_reader.getInterpolationElemType();
1182
1183 if (interpolation_points_elem_type_list.size() > 0)
1184 {
1185 libmesh_error_msg_if(interpolation_points_elem_type_list.size() != n_bfs,
1186 "Size error while reading the eim interpolation element types.");
1187
1188 for (unsigned int i=0; i<n_bfs; ++i)
1189 {
1190 rb_eim_evaluation.add_interpolation_points_elem_type(
static_cast<ElemType>(interpolation_points_elem_type_list[i]));
1191 }
1192 }
1193 }
1194
1195
1196 {
1197 auto interpolation_points_property_list =
1198 rb_eim_evaluation_reader.getPropertyMap();
1199
1200 if (interpolation_points_property_list.size() > 0)
1201 {
1202 unsigned int n_properties = interpolation_points_property_list.size();
1203 for (unsigned int i=0; i<n_properties; ++i)
1204 {
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)
1209 {
1210 entity_ids_set.insert(
static_cast<dof_id_type>(entity_ids_list[j]));
1211 }
1212 rb_eim_evaluation.add_rb_property_map_entry(property_name, entity_ids_set);
1213 }
1214 }
1215 }
1216
1217
1218 {
1219 auto interpolation_points_list_outer =
1220 rb_eim_evaluation_reader.getInterpolationXyzPerturb();
1221
1222 libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
1223 "Size error while reading the eim interpolation points.");
1224
1225 for (unsigned int i=0; i<n_bfs; ++i)
1226 {
1227 auto interpolation_points_list_inner = interpolation_points_list_outer[i];
1228
1229 std::vector<Point> perturbs(interpolation_points_list_inner.size());
1230 for (unsigned int j=0; j<perturbs.size(); j++)
1231 {
1232 load_point(interpolation_points_list_inner[j], perturbs[j]);
1233 }
1234 rb_eim_evaluation.add_interpolation_points_xyz_perturbations(perturbs);
1235 }
1236 }
1237
1238
1239 if (rb_eim_evaluation.get_parametrized_function().is_lookup_table)
1240 {
1241 auto eim_rhs_list_outer =
1242 rb_eim_evaluation_reader.getEimSolutionsForTrainingSet();
1243
1244 std::vector<DenseVector<Number>> & eim_solutions = rb_eim_evaluation.get_eim_solutions_for_training_set();
1245 eim_solutions.clear();
1246 eim_solutions.resize(eim_rhs_list_outer.size());
1247
1248 for (
auto i :
make_range(eim_rhs_list_outer.size()))
1249 {
1250 auto eim_rhs_list_inner = eim_rhs_list_outer[i];
1251
1252 DenseVector<Number> values(eim_rhs_list_inner.size());
1254 {
1255 values(j) = load_scalar_value(eim_rhs_list_inner[j]);
1256 }
1257 eim_solutions[i] = values;
1258 }
1259 }
1260
1261
1262
1263 {
1264 auto interpolation_points_list_outer =
1265 rb_eim_evaluation_reader.getInterpolationPhiValues();
1266
1267 libmesh_error_msg_if(interpolation_points_list_outer.size() != n_bfs,
1268 "Size error while reading the eim interpolation points.");
1269
1270 for (unsigned int i=0; i<n_bfs; ++i)
1271 {
1272 auto interpolation_points_list_inner = interpolation_points_list_outer[i];
1273
1274 std::vector<Real> phi_i_qp(interpolation_points_list_inner.size());
1275 for (unsigned int j=0; j<phi_i_qp.size(); j++)
1276 {
1277 phi_i_qp[j] = interpolation_points_list_inner[j];
1278 }
1279 rb_eim_evaluation.add_interpolation_points_phi_i_qp(phi_i_qp);
1280 }
1281 }
1282
1283
1284
1285 {
1286 auto interpolation_points_list_outer =
1287 rb_eim_evaluation_reader.getInterpolationSpatialIndices();
1288
1289 for (unsigned int i=0; i<interpolation_points_list_outer.size(); ++i)
1290 {
1291 auto interpolation_points_list_inner = interpolation_points_list_outer[i];
1292
1293 std::vector<unsigned int> spatial_indices(interpolation_points_list_inner.size());
1294 for (unsigned int j=0; j<spatial_indices.size(); j++)
1295 {
1296 spatial_indices[j] = interpolation_points_list_inner[j];
1297 }
1298 rb_eim_evaluation.add_interpolation_points_spatial_indices(spatial_indices);
1299 }
1300
1301 rb_eim_evaluation.initialize_param_fn_spatial_indices();
1302 }
1303}
void load_point(RBData::Point3D::Reader point_reader, Point &point)
Helper function that loads point data.
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...
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
ElemType
Defines an enum for geometric element types.