Skip to content

Commit c544498

Browse files
authored
Merge pull request #4043 from apicard95/alexisp/rb_eim_data_backward_compatibility
Add backward compatibility for older RB-EIM data (read-only)
2 parents 65d7bda + 49debc0 commit c544498

1 file changed

Lines changed: 232 additions & 50 deletions

File tree

src/reduced_basis/rb_data_deserialization.C

Lines changed: 232 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)