@@ -869,71 +869,171 @@ void load_rb_eim_evaluation_data(RBEIMEvaluation & rb_eim_evaluation,
869869 }
870870
871871 unsigned int n_elems = rb_eim_evaluation_reader .getNElems ();
872- // Elem id to local index map
872+ bool build_elem_id_to_local_index_map = false;
873+ // Interpolation points JxW all qp values
873874 {
874- auto elem_id_to_local_index_list =
875- rb_eim_evaluation_reader .getElemIdToLocalIndex ();
875+ auto interpolation_points_list_outer =
876+ rb_eim_evaluation_reader .getInterpolationJxWAllQp ();
876877
877- if (elem_id_to_local_index_list .size () > 0 )
878+ if (interpolation_points_list_outer .size () > 0 )
878879 {
879- libmesh_error_msg_if (elem_id_to_local_index_list .size () != n_elems ,
880- "Size error while reading the eim elem id to local index map." );
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." );
881884
882- for (unsigned int i = 0 ; i < n_elems ; ++ i )
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+ // Backward compatibility for existing qp based training data
898+ // As we read in data for all qp, we only select the first one for elems
899+ // (when we encounter the elem for the first time).
900+ else
883901 {
884- 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 ());
902+ // We use the JxW_all_qp to determine whether or not we need to build
903+ // the elem_id_to_local_index_map in backward compatibility mode as the map
904+ // will be empty when deserializing (old training data format) and it
905+ // is not always needed (optional). If JxW is provided then elem_id_to_local_index_map
906+ // is needed. This flag is only used in backward compatibility mode but not
907+ // in the most recent training data format.
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+ }
885933 }
886934 }
887935 }
888936
889- // Interpolation points JxW all qp values
937+ // Interpolation points phi_i all qp values
890938 {
891939 auto interpolation_points_list_outer =
892- rb_eim_evaluation_reader .getInterpolationJxWAllQp ();
940+ rb_eim_evaluation_reader .getInterpolationPhiValuesAllQp ();
893941
894942 if (interpolation_points_list_outer .size () > 0 )
895943 {
896- libmesh_error_msg_if (interpolation_points_list_outer .size () != n_elems ,
897- "Size error while reading the eim JxW values." );
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." );
898948
899- for (unsigned int i = 0 ; i < n_elems ; ++ i )
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 ());
954+ for (auto j : index_range (phi_i_all_qp ))
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 ());
959+ for (auto k : index_range (phi_i_all_qp [j ]))
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+ // Backward compatibility for existing qp based training data
966+ // As we read in data for all qp, we only select the first one for elems
967+ // (when we encounter the elem for the first time).
968+ else
900969 {
901- auto interpolation_points_list_inner = interpolation_points_list_outer [i ];
970+ auto interpolation_points_elem_id_list =
971+ rb_eim_evaluation_reader .getInterpolationElemId ();
972+ std ::set < dof_id_type > added_elem_id ;
902973
903- std ::vector < Real > JxW (interpolation_points_list_inner .size ());
904- for (unsigned int j = 0 ; j < JxW .size (); j ++ )
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 )
905978 {
906- JxW [j ] = interpolation_points_list_inner [j ];
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 ());
986+ for (auto j : index_range (phi_i_all_qp ))
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 ());
991+ for (auto k : index_range (phi_i_all_qp [j ]))
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+ }
907996 }
908- rb_eim_evaluation .add_interpolation_points_JxW_all_qp (JxW );
909997 }
910998 }
911999 }
9121000
913- // Interpolation points phi_i all qp values
1001+ // Elem id to local index map
9141002 {
915- auto interpolation_points_list_outer =
916- rb_eim_evaluation_reader .getInterpolationPhiValuesAllQp ();
1003+ auto elem_id_to_local_index_list =
1004+ rb_eim_evaluation_reader .getElemIdToLocalIndex ();
9171005
918- if (interpolation_points_list_outer .size () > 0 )
1006+ if (elem_id_to_local_index_list .size () > 0 )
9191007 {
920- libmesh_error_msg_if (interpolation_points_list_outer .size () != n_elems ,
921- "Size error while reading the eim phi_i all qp values ." );
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 ." );
9221010
9231011 for (unsigned int i = 0 ; i < n_elems ; ++ i )
9241012 {
925- auto interpolation_points_list_middle = interpolation_points_list_outer [i ];
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+ // Create elem id to local index map if non-existent in training data set but
1017+ // required for backward compatibility purposes.
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 ;
9261024
927- std ::vector < std ::vector < Real >> phi_i_all_qp (interpolation_points_list_middle .size ());
928- for (auto j : index_range (phi_i_all_qp ))
929- {
930- auto interpolation_points_list_inner = interpolation_points_list_middle [j ];
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." );
9311027
932- phi_i_all_qp [j ].resize (interpolation_points_list_inner .size ());
933- for (auto k : index_range (phi_i_all_qp [j ]))
934- phi_i_all_qp [j ][k ] = interpolation_points_list_inner [k ];
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 ;
9351036 }
936- rb_eim_evaluation .add_interpolation_points_phi_i_all_qp (phi_i_all_qp );
9371037 }
9381038 }
9391039 }
@@ -945,33 +1045,89 @@ void load_rb_eim_evaluation_data(RBEIMEvaluation & rb_eim_evaluation,
9451045
9461046 if (elem_center_dxyzdxi .size () > 0 )
9471047 {
948- libmesh_error_msg_if (elem_center_dxyzdxi .size () != n_elems ,
949- "Size error while reading the eim elem center tangent derivative dxyzdxi." );
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." );
9501052
951- Point dxyzdxi_buffer ;
952- for (const auto i : make_range (n_elems ))
1053+ Point dxyzdxi_buffer ;
1054+ for (const auto i : make_range (n_elems ))
1055+ {
1056+ load_point (elem_center_dxyzdxi [i ], dxyzdxi_buffer );
1057+ rb_eim_evaluation .add_elem_center_dxyzdxi (dxyzdxi_buffer );
1058+ }
1059+ }
1060+ // Backward compatibility for existing qp based training data
1061+ // As we read in data for all qp, we only select the first one for elems
1062+ // (when we encounter the elem for the first time).
1063+ else
9531064 {
954- load_point (elem_center_dxyzdxi [i ], dxyzdxi_buffer );
955- rb_eim_evaluation .add_elem_center_dxyzdxi (dxyzdxi_buffer );
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+ }
9561084 }
9571085 }
9581086 }
9591087
960- // Dxyzdxi at the element center for the element that contains each interpolation point.
1088+ // Dxyzdeta at the element center for the element that contains each interpolation point.
9611089 {
9621090 auto elem_center_dxyzdeta =
9631091 rb_eim_evaluation_reader .getInterpolationDxyzDetaElem ();
9641092
9651093 if (elem_center_dxyzdeta .size () > 0 )
9661094 {
967- libmesh_error_msg_if (elem_center_dxyzdeta .size () != n_elems ,
968- "Size error while reading the eim elem center tangent derivative dxyzdeta." );
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." );
9691099
970- Point dxyzdeta_buffer ;
971- for (const auto i : make_range (n_elems ))
1100+ Point dxyzdeta_buffer ;
1101+ for (const auto i : make_range (n_elems ))
1102+ {
1103+ load_point (elem_center_dxyzdeta [i ], dxyzdeta_buffer );
1104+ rb_eim_evaluation .add_elem_center_dxyzdeta (dxyzdeta_buffer );
1105+ }
1106+ }
1107+ // Backward compatibility for existing qp based training data
1108+ // As we read in data for all qp, we only select the first one for elems
1109+ // (when we encounter the elem for the first time).
1110+ else
9721111 {
973- load_point (elem_center_dxyzdeta [i ], dxyzdeta_buffer );
974- rb_eim_evaluation .add_elem_center_dxyzdeta (dxyzdeta_buffer );
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+ }
9751131 }
9761132 }
9771133 }
@@ -983,12 +1139,38 @@ void load_rb_eim_evaluation_data(RBEIMEvaluation & rb_eim_evaluation,
9831139
9841140 if (interpolation_points_qrule_order_list .size () > 0 )
9851141 {
986- libmesh_error_msg_if (interpolation_points_qrule_order_list .size () != n_elems ,
987- "Size error while reading the eim elem qrule order." );
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." );
9881146
989- for (unsigned int i = 0 ; i < n_elems ; ++ i )
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+ // Backward compatibility for existing qp based training data.
1153+ // As we read in data for all qp, we only select the first one for elems
1154+ // (when we encounter the elem for the first time).
1155+ else
9901156 {
991- rb_eim_evaluation .add_interpolation_points_qrule_order (static_cast < Order > (interpolation_points_qrule_order_list [i ]));
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+ }
9921174 }
9931175 }
9941176 }
0 commit comments