129 libmesh_error_msg_if(!in_stream.good(),
"ERROR: Input file not good.");
146 old_line = current_line;
149 std::getline(in_stream, current_line);
157 current_line.erase(std::remove_if(current_line.begin(), current_line.end(),
158 [](
unsigned char const c){return std::isspace(c);}),
176 libmesh_error_msg_if(!found_node,
177 "ERROR: The Nodes section must come before the Elements section of the UNV file!");
190 libmesh_error_msg_if(!found_node || !found_elem,
191 "ERROR: The Nodes and Elements sections must come before the Groups section of the UNV file!");
199 if (found_node && found_elem && found_group)
211 libmesh_error_msg(
"Stream is bad! Perhaps the file does not exist?");
216 libmesh_error_msg_if(!found_node,
"ERROR: Could not find nodes!");
217 libmesh_error_msg_if(!found_elem,
"ERROR: Could not find elements!");
228 "Cannot open dimension "
230 <<
" mesh file when configured without "
243 for (
const auto & elem :
mesh.element_ptr_range())
244 if (elem->dim() < max_dim)
431 typedef std::unordered_multimap<dof_id_type, Elem *> map_type;
432 map_type provide_bcs;
439 in_file >> group_number;
441 if (group_number == -1)
454 unsigned num_entities;
455 std::string group_name;
458 in_file >> dummy >> dummy >> dummy >> dummy >> dummy >> dummy
462 in_file >> group_name;
468 is_subdomain_group =
false,
469 is_sideset_group =
false;
485 unsigned entity_type_code, entity_tag, dummy;
486 for (
unsigned entity=0; entity<num_entities; ++entity)
488 in_file >> entity_type_code >> entity_tag >> dummy >> dummy;
490 if (entity_type_code != 8)
491 libMesh::err <<
"Warning, unrecognized entity type code = "
501 unsigned libmesh_elem_id = it->second;
507 if (group_elem->
dim() < max_dim)
509 is_sideset_group =
true;
515 libmesh_error_msg_if(group_elem->
dim()+1 != max_dim,
516 "ERROR: Expected boundary element of dimension "
517 << max_dim-1 <<
" but got " << group_elem->
dim());
522 restrict_int<subdomain_id_type>(group_number);
525 provide_bcs.emplace(group_elem->
key(), group_elem);
529 else if (group_elem->
dim() == max_dim)
531 is_subdomain_group =
true;
533 restrict_int<subdomain_id_type>(group_number);
537 libmesh_error_msg(
"ERROR: Found an elem with dim=" \
538 << group_elem->
dim() <<
" > " <<
"max_dim=" << +max_dim);
541 libMesh::err <<
"WARNING: UNV Element " << entity_tag <<
" not found while parsing groups." << std::endl;
546 if (is_sideset_group)
548 (cast_int<boundary_id_type>(group_number)) = group_name;
550 if (is_subdomain_group)
552 (cast_int<subdomain_id_type>(group_number), group_name);
557 for (
auto & elem :
mesh.active_element_ptr_range())
558 if (elem->dim() == max_dim)
559 for (
auto sn : elem->side_index_range())
560 for (
const auto & pr :
as_range(provide_bcs.equal_range (elem->key(sn))))
570 std::unique_ptr<Elem> side (elem->build_side_ptr(sn));
573 Elem * lower_dim_elem = pr.second;
576 if (*lower_dim_elem == *side)
944 fe_descriptor_id = 0,
945 phys_prop_tab_dummy = 2,
946 mat_prop_tab_dummy = 1,
962 unsigned int assign_elem_nodes[20];
964 unsigned int n_elem_written=0;
969 for (
const auto & elem :
mesh.element_ptr_range())
971 switch (elem->type())
976 fe_descriptor_id = 41;
977 assign_elem_nodes[0] = 0;
978 assign_elem_nodes[1] = 2;
979 assign_elem_nodes[2] = 1;
985 fe_descriptor_id = 42;
986 assign_elem_nodes[0] = 0;
987 assign_elem_nodes[1] = 5;
988 assign_elem_nodes[2] = 2;
989 assign_elem_nodes[3] = 4;
990 assign_elem_nodes[4] = 1;
991 assign_elem_nodes[5] = 3;
997 fe_descriptor_id = 44;
998 assign_elem_nodes[0] = 0;
999 assign_elem_nodes[1] = 3;
1000 assign_elem_nodes[2] = 2;
1001 assign_elem_nodes[3] = 1;
1007 fe_descriptor_id = 45;
1008 assign_elem_nodes[0] = 0;
1009 assign_elem_nodes[1] = 7;
1010 assign_elem_nodes[2] = 3;
1011 assign_elem_nodes[3] = 6;
1012 assign_elem_nodes[4] = 2;
1013 assign_elem_nodes[5] = 5;
1014 assign_elem_nodes[6] = 1;
1015 assign_elem_nodes[7] = 4;
1021 fe_descriptor_id = 300;
1022 assign_elem_nodes[0] = 0;
1023 assign_elem_nodes[1] = 7;
1024 assign_elem_nodes[2] = 3;
1025 assign_elem_nodes[3] = 6;
1026 assign_elem_nodes[4] = 2;
1027 assign_elem_nodes[5] = 5;
1028 assign_elem_nodes[6] = 1;
1029 assign_elem_nodes[7] = 4;
1030 assign_elem_nodes[8] = 8;
1036 fe_descriptor_id = 111;
1037 assign_elem_nodes[0] = 0;
1038 assign_elem_nodes[1] = 1;
1039 assign_elem_nodes[2] = 2;
1040 assign_elem_nodes[3] = 3;
1046 fe_descriptor_id = 112;
1047 assign_elem_nodes[0] = 0;
1048 assign_elem_nodes[1] = 1;
1049 assign_elem_nodes[2] = 2;
1050 assign_elem_nodes[3] = 3;
1051 assign_elem_nodes[4] = 4;
1052 assign_elem_nodes[5] = 5;
1058 fe_descriptor_id = 115;
1059 assign_elem_nodes[0] = 0;
1060 assign_elem_nodes[1] = 4;
1061 assign_elem_nodes[2] = 5;
1062 assign_elem_nodes[3] = 1;
1063 assign_elem_nodes[4] = 3;
1064 assign_elem_nodes[5] = 7;
1065 assign_elem_nodes[6] = 6;
1066 assign_elem_nodes[7] = 2;
1072 fe_descriptor_id = 116;
1073 assign_elem_nodes[ 0] = 0;
1074 assign_elem_nodes[ 1] = 12;
1075 assign_elem_nodes[ 2] = 4;
1076 assign_elem_nodes[ 3] = 16;
1077 assign_elem_nodes[ 4] = 5;
1078 assign_elem_nodes[ 5] = 13;
1079 assign_elem_nodes[ 6] = 1;
1080 assign_elem_nodes[ 7] = 8;
1082 assign_elem_nodes[ 8] = 11;
1083 assign_elem_nodes[ 9] = 19;
1084 assign_elem_nodes[10] = 17;
1085 assign_elem_nodes[11] = 9;
1087 assign_elem_nodes[12] = 3;
1088 assign_elem_nodes[13] = 15;
1089 assign_elem_nodes[14] = 7;
1090 assign_elem_nodes[15] = 18;
1091 assign_elem_nodes[16] = 6;
1092 assign_elem_nodes[17] = 14;
1093 assign_elem_nodes[18] = 2;
1094 assign_elem_nodes[19] = 10;
1102 fe_descriptor_id = 118;
1103 assign_elem_nodes[0] = 0;
1104 assign_elem_nodes[1] = 4;
1105 assign_elem_nodes[2] = 1;
1106 assign_elem_nodes[3] = 5;
1107 assign_elem_nodes[4] = 2;
1108 assign_elem_nodes[5] = 6;
1109 assign_elem_nodes[6] = 7;
1110 assign_elem_nodes[7] = 8;
1111 assign_elem_nodes[8] = 9;
1112 assign_elem_nodes[9] = 3;
1117 libmesh_error_msg(
"ERROR: Element type = " <<
Utility::enum_to_string(elem->type()) <<
" not supported in " <<
"UNVIO!");
1122 out_file << std::setw(10) << elem_id
1123 << std::setw(10) << fe_descriptor_id
1124 << std::setw(10) << phys_prop_tab_dummy
1125 << std::setw(10) << mat_prop_tab_dummy
1126 << std::setw(10) << color_dummy
1127 << std::setw(10) << elem->n_nodes()
1130 for (
auto j : elem->node_index_range())
1135 const Node * node_in_unv_order = elem->node_ptr(assign_elem_nodes[j]);
1144 out_file << std::setw(10) << node_id;
1153 libMesh::out <<
" Finished writing " << n_elem_written <<
" elements" << std::endl;
1156 out_file <<
" -1\n";
1163 std::ifstream in_stream(file_name.c_str());
1165 libmesh_error_msg_if(!in_stream.good(),
"Error opening UNV data file.");
1167 std::string olds, news, dummy;
1171 in_stream >> olds >> news;
1174 while (((olds !=
"-1") || (news ==
"-1")) && !in_stream.eof())
1180 if (in_stream.eof())
1188 for (
unsigned int i=0; i<3; i++)
1189 std::getline(in_stream, dummy);
1195 unsigned int dataset_location;
1196 in_stream >> dataset_location;
1199 libmesh_error_msg_if(dataset_location != 1,
"ERROR: Currently only Data at nodes is supported.");
1202 for (
unsigned int i=0; i<6; i++)
1203 std::getline(in_stream, dummy);
1209 data_characteristic,
1214 unsigned int data_type;
1217 unsigned int num_vals_per_node;
1219 in_stream >> model_type
1221 >> data_characteristic
1224 >> num_vals_per_node;
1227 for (
unsigned int i=0; i<5; i++)
1228 std::getline(in_stream, dummy);
1233 std::vector<Number> values;
1237 in_stream >> f_n_id;
1245 values.resize(num_vals_per_node);
1248 for (
unsigned int data_cnt=0; data_cnt<num_vals_per_node; data_cnt++)
1256 if (data_type == 2 || data_type == 4)
1261#ifdef LIBMESH_USE_COMPLEX_NUMBERS
1262 values[data_cnt] =
Complex(std::atof(buf.c_str()), 0.);
1264 values[data_cnt] = std::atof(buf.c_str());
1268 else if (data_type == 5 || data_type == 6)
1270#ifdef LIBMESH_USE_COMPLEX_NUMBERS
1271 Real re_val, im_val;
1278 re_val = std::atof(buf.c_str());
1281 im_val = std::atof(buf.c_str());
1285 re_val = std::atof(buf.c_str());
1286 in_stream >> im_val;
1289 values[data_cnt] =
Complex(re_val,im_val);
1292 libmesh_error_msg(
"ERROR: Complex data only supported when libMesh is configured with --enable-complex!");
1297 libmesh_error_msg(
"ERROR: Data type not supported.");