35 unsigned id, type, region;
37 std::vector<size_type> nodes;
41 pgt = bgeot::simplex_geotrans(1,1);
44 pgt = bgeot::simplex_geotrans(2,1);
47 pgt = bgeot::parallelepiped_geotrans(2,1);
50 pgt = bgeot::simplex_geotrans(3,1);
53 pgt = bgeot::parallelepiped_geotrans(3,1);
56 pgt = bgeot::prism_geotrans(3,1);
59 pgt = bgeot::pyramid_QK_geotrans(1);
62 pgt = bgeot::simplex_geotrans(1,2);
65 pgt = bgeot::simplex_geotrans(2,2);
68 pgt = bgeot::parallelepiped_geotrans(2,2);
71 pgt = bgeot::simplex_geotrans(3,2);
74 pgt = bgeot::parallelepiped_geotrans(3,2);
77 GMM_WARNING2(
"ignoring point element");
80 pgt = bgeot::Q2_incomplete_geotrans(2);
83 pgt = bgeot::Q2_incomplete_geotrans(3);
86 pgt = bgeot::simplex_geotrans(1,3);
89 pgt = bgeot::simplex_geotrans(2,3);
92 pgt = bgeot::simplex_geotrans(2, 4);
95 pgt = bgeot::simplex_geotrans(1, 4);
99 GMM_ASSERT1(
false,
"gmsh element type " << type <<
" is unknown.");
104 void set_nb_nodes() {
166 GMM_ASSERT1(
false,
"the gmsh element type " << type <<
" is unknown..");
171 bool operator<(
const gmsh_cv_info& other)
const {
172 unsigned this_dim = (type == 15) ? 0 : pgt->dim();
173 unsigned other_dim = (other.type == 15) ? 0 : other.pgt->dim();
174 if (this_dim == other_dim)
return region < other.region;
175 return this_dim > other_dim;
181 std::map<std::string, size_type> region_map;
182 bgeot::read_until(f,
"$PhysicalNames");
186 std::string region_name;
187 for (
size_type region_cnt=0; region_cnt < nb_regions; ++ region_cnt) {
189 std::getline(f, region_name);
191 size_t pos = region_name.find_first_of(
"\"");
192 if (pos != region_name.npos) {
193 region_name.erase(0, pos+1);
194 pos = region_name.find_last_of(
"\"");
195 region_name.erase(pos);
197 region_map[region_name] = ri;
223 static void import_gmsh_mesh_file(std::istream& f, mesh& m,
int deprecate=0,
224 std::map<std::string, size_type> *region_map=NULL,
225 std::set<size_type> *lower_dim_convex_rg=NULL,
226 bool add_all_element_type =
false,
227 bool remove_last_dimension =
true,
228 std::map<
size_type, std::set<size_type>> *nodal_map = NULL,
229 bool remove_duplicated_nodes =
true)
231 gmm::stream_standard_locale sl(f);
233 GMM_WARNING3(
" All regions must have different number!");
237 GMM_WARNING4(
"" << endl
238 <<
" deprecate: " << endl
239 <<
" static void" << endl
240 <<
" import_gmsh_mesh_file(std::istream& f,"
241 <<
" mesh& , int version)" << endl
242 <<
" replace with:" << endl
243 <<
" static void" << endl
244 <<
" import_gmsh_mesh_file(std::istream& f,"
252 if (bgeot::casecmp(header,
"$MeshFormat")==0)
254 else if (bgeot::casecmp(header,
"$NOD")==0)
257 GMM_ASSERT1(
false,
"can't read Gmsh format: " << header);
260 if (region_map != NULL) {
267 bgeot::read_until(f,
"$Nodes");
272 if (version >= 4.05) {
273 f >> nb_block >> nb_node; bgeot::read_until(f,
"\n");
274 }
else if (version >= 4.) {
275 f >> nb_block >> nb_node;
282 std::map<size_type, size_type> msh_node_2_getfem_node;
283 std::vector<size_type> inds(nb_node);
284 for (
size_type block=0; block < nb_block; ++block) {
286 f >> dummy >> dummy >> dummy >> nb_node;
289 inds.resize(nb_node);
290 if (version >= 4.05) {
291 for (
size_type node_cnt=0; node_cnt < nb_node; ++node_cnt)
295 for (
size_type node_cnt=0; node_cnt < nb_node; ++node_cnt) {
298 if (version < 4.05) f >> node_id;
else node_id = inds[node_cnt];
300 f >> n[0] >> n[1] >> n[2];
301 msh_node_2_getfem_node[node_id]
302 = m.add_point(n, remove_duplicated_nodes ? 0. : -1.);
307 bgeot::read_until(f,
"$Endnodes");
309 bgeot::read_until(f,
"$ENDNOD");
313 bgeot::read_until(f,
"$Elements");
315 bgeot::read_until(f,
"$ELM");
318 if (version >= 4.05) {
319 f >> nb_block >> nb_cv; bgeot::read_until(f,
"\n");
320 }
else if (version >= 4.) {
321 f >> nb_block >> nb_cv;
328 std::vector<gmsh_cv_info> cvlst; cvlst.reserve(nb_cv);
329 for (
size_type block=0; block < nb_block; ++block) {
330 unsigned type, region;
332 f >> region >> dummy >> type >> nb_cv;
338 cvlst.push_back(gmsh_cv_info());
339 gmsh_cv_info &ci = cvlst.back();
343 unsigned cv_nb_nodes;
345 if (
int(version) == 2) {
348 GMM_ASSERT1(nbtags > 0 && nbtags <= 3,
349 "Number of tags " << nbtags <<
" is not managed.");
351 if (nbtags > 1) f >> dummy;
352 if (nbtags > 2) f >> dummy;
356 cv_nb_nodes = unsigned(ci.nodes.size());
357 }
else if (
int(version) == 1) {
358 f >> type >> region >> dummy >> cv_nb_nodes;
360 ci.nodes.resize(cv_nb_nodes);
366 for (
size_type i=0; i < cv_nb_nodes; ++i) {
369 const auto it = msh_node_2_getfem_node.find(j);
370 GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
371 "Invalid node ID " << j <<
" in gmsh element "
373 ci.nodes[i] = it->second;
379 std::vector<size_type> tmp_nodes(ci.nodes);
382 ci.nodes[2] = tmp_nodes[3];
383 ci.nodes[3] = tmp_nodes[2];
388 ci.nodes[2] = tmp_nodes[3];
389 ci.nodes[3] = tmp_nodes[2];
392 ci.nodes[6] = tmp_nodes[7];
393 ci.nodes[7] = tmp_nodes[6];
397 ci.nodes[1] = tmp_nodes[2];
398 ci.nodes[2] = tmp_nodes[1];
404 ci.nodes[1] = tmp_nodes[2];
405 ci.nodes[2] = tmp_nodes[1];
409 ci.nodes[1] = tmp_nodes[3];
410 ci.nodes[2] = tmp_nodes[1];
411 ci.nodes[3] = tmp_nodes[5];
413 ci.nodes[5] = tmp_nodes[2];
417 ci.nodes[1] = tmp_nodes[4];
418 ci.nodes[2] = tmp_nodes[1];
419 ci.nodes[3] = tmp_nodes[7];
420 ci.nodes[4] = tmp_nodes[8];
422 ci.nodes[6] = tmp_nodes[3];
423 ci.nodes[7] = tmp_nodes[6];
424 ci.nodes[8] = tmp_nodes[2];
428 ci.nodes[1] = tmp_nodes[4];
429 ci.nodes[2] = tmp_nodes[1];
430 ci.nodes[3] = tmp_nodes[6];
431 ci.nodes[4] = tmp_nodes[5];
432 ci.nodes[5] = tmp_nodes[2];
433 ci.nodes[6] = tmp_nodes[7];
434 ci.nodes[7] = tmp_nodes[9];
436 ci.nodes[9] = tmp_nodes[3];
440 ci.nodes[1] = tmp_nodes[8];
441 ci.nodes[2] = tmp_nodes[1];
442 ci.nodes[3] = tmp_nodes[9];
443 ci.nodes[4] = tmp_nodes[20];
444 ci.nodes[5] = tmp_nodes[11];
445 ci.nodes[6] = tmp_nodes[3];
446 ci.nodes[7] = tmp_nodes[13];
447 ci.nodes[8] = tmp_nodes[2];
448 ci.nodes[9] = tmp_nodes[10];
449 ci.nodes[10] = tmp_nodes[21];
450 ci.nodes[11] = tmp_nodes[12];
451 ci.nodes[12] = tmp_nodes[22];
452 ci.nodes[13] = tmp_nodes[26];
453 ci.nodes[14] = tmp_nodes[23];
455 ci.nodes[16] = tmp_nodes[24];
456 ci.nodes[17] = tmp_nodes[14];
457 ci.nodes[18] = tmp_nodes[4];
458 ci.nodes[19] = tmp_nodes[16];
459 ci.nodes[20] = tmp_nodes[5];
460 ci.nodes[21] = tmp_nodes[17];
461 ci.nodes[22] = tmp_nodes[25];
462 ci.nodes[23] = tmp_nodes[18];
463 ci.nodes[24] = tmp_nodes[7];
464 ci.nodes[25] = tmp_nodes[19];
465 ci.nodes[26] = tmp_nodes[6];
469 ci.nodes[1] = tmp_nodes[4];
470 ci.nodes[2] = tmp_nodes[1];
471 ci.nodes[3] = tmp_nodes[7];
472 ci.nodes[4] = tmp_nodes[5];
473 ci.nodes[5] = tmp_nodes[3];
474 ci.nodes[6] = tmp_nodes[6];
475 ci.nodes[7] = tmp_nodes[2];
479 ci.nodes[1] = tmp_nodes[8];
480 ci.nodes[2] = tmp_nodes[1];
481 ci.nodes[3] = tmp_nodes[9];
482 ci.nodes[4] = tmp_nodes[11];
483 ci.nodes[5] = tmp_nodes[3];
484 ci.nodes[6] = tmp_nodes[13];
485 ci.nodes[7] = tmp_nodes[2];
486 ci.nodes[8] = tmp_nodes[10];
487 ci.nodes[9] = tmp_nodes[12];
488 ci.nodes[10] = tmp_nodes[15];
489 ci.nodes[11] = tmp_nodes[14];
490 ci.nodes[12] = tmp_nodes[4];
491 ci.nodes[13] = tmp_nodes[16];
492 ci.nodes[14] = tmp_nodes[5];
493 ci.nodes[15] = tmp_nodes[17];
494 ci.nodes[16] = tmp_nodes[18];
495 ci.nodes[17] = tmp_nodes[7];
496 ci.nodes[18] = tmp_nodes[19];
497 ci.nodes[19] = tmp_nodes[6];
501 ci.nodes[1] = tmp_nodes[2];
502 ci.nodes[2] = tmp_nodes[3];
503 ci.nodes[3] = tmp_nodes[1];
507 ci.nodes[1] = tmp_nodes[3];
508 ci.nodes[2] = tmp_nodes[4];
509 ci.nodes[3] = tmp_nodes[1];
510 ci.nodes[4] = tmp_nodes[8];
511 ci.nodes[5] = tmp_nodes[9];
512 ci.nodes[6] = tmp_nodes[5];
514 ci.nodes[8] = tmp_nodes[6];
515 ci.nodes[9] = tmp_nodes[2];
519 ci.nodes[1] = tmp_nodes[3];
520 ci.nodes[2] = tmp_nodes[4];
521 ci.nodes[3] = tmp_nodes[5];
522 ci.nodes[4] = tmp_nodes[1];
523 ci.nodes[5] = tmp_nodes[11];
524 ci.nodes[6] = tmp_nodes[12];
525 ci.nodes[7] = tmp_nodes[13];
526 ci.nodes[8] = tmp_nodes[6];
527 ci.nodes[9] = tmp_nodes[10];
528 ci.nodes[10] = tmp_nodes[14];
529 ci.nodes[11] = tmp_nodes[7];
530 ci.nodes[12] = tmp_nodes[9];
531 ci.nodes[13] = tmp_nodes[8];
532 ci.nodes[14] = tmp_nodes[2];
536 ci.nodes[1] = tmp_nodes[2];
537 ci.nodes[2] = tmp_nodes[3];
538 ci.nodes[3] = tmp_nodes[4];
539 ci.nodes[4] = tmp_nodes[1];
545 nb_cv = cvlst.size();
547 std::sort(cvlst.begin(), cvlst.end());
548 if (cvlst.front().type == 15){
549 GMM_WARNING2(
"Only nodes defined in the mesh! No elements are added.");
553 unsigned N = cvlst.front().pgt->dim();
556 gmsh_cv_info &ci = cvlst[cv];
557 bool is_node = (ci.type == 15);
558 unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
564 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
566 m.region(ci.region).add(ic);
573 if (lower_dim_convex_rg != NULL &&
574 lower_dim_convex_rg->find(ci.region) != lower_dim_convex_rg->end() &&
576 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin()); cvok =
true;
577 m.region(ci.region).add(ic);
581 bgeot::mesh_structure::ind_cv_ct ct = m.convex_to_point(ci.nodes[0]);
582 for (bgeot::mesh_structure::ind_cv_ct::const_iterator
583 it = ct.begin(); it != ct.end(); ++it) {
585 face < m.structure_of_convex(*it)->nb_faces(); ++face) {
586 if (m.is_convex_face_having_points(*it,face,
589 m.region(ci.region).add(*it,face);
594 if (is_node && (nodal_map != NULL))
596 for (
auto i : ci.nodes) (*nodal_map)[ci.region].insert(i);
603 if (nodal_map == NULL){
604 GMM_WARNING2(
"gmsh import ignored a node id: "
605 << ci.id <<
" region :" << ci.region <<
606 " point is not added explicitly as an element.");
609 else if (add_all_element_type){
610 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
611 m.region(ci.region).add(ic);
615 GMM_WARNING2(
"gmsh import ignored an element of type "
617 " as it does not belong to the face of another element");
631 static void import_gid_mesh_file(std::istream& f, mesh& m) {
632 gmm::stream_standard_locale sl(f);
635 enum { LIN,TRI,QUAD,TETR, PRISM, HEX,BADELTYPE } eltype=BADELTYPE;
637 std::map<size_type, size_type> msh_node_2_getfem_node;
638 std::vector<size_type> cv_nodes, getfem_cv_nodes;
639 bool nodes_done =
false;
641 if (!f.eof()) f >> std::ws;
642 if (f.eof() || !bgeot::read_until(f,
"MESH"))
break;
643 std::string selemtype;
644 f >> bgeot::skip(
"DIMENSION") >> dim
645 >> bgeot::skip(
"ELEMTYPE") >> std::ws
647 >> bgeot::skip(
"NNODE") >> nnode;
648 if (bgeot::casecmp(selemtype,
"linear")==0) { eltype = LIN; }
649 else if (bgeot::casecmp(selemtype,
"triangle")==0) { eltype = TRI; }
650 else if (bgeot::casecmp(selemtype,
"quadrilateral")==0) { eltype = QUAD; }
651 else if (bgeot::casecmp(selemtype,
"tetrahedra")==0) { eltype = TETR; }
652 else if (bgeot::casecmp(selemtype,
"prisma")==0) { eltype = PRISM; }
653 else if (bgeot::casecmp(selemtype,
"hexahedra")==0) { eltype = HEX; }
654 else GMM_ASSERT1(
false,
"unknown element type '"<< selemtype <<
"'");
655 GMM_ASSERT1(!f.eof(),
"File ended before coordinates");
656 f >> bgeot::skip(
"COORDINATES");
659 dal::bit_vector gid_nodes_used;
665 if (bgeot::casecmp(ls,
"END COORDINATES", 15)==0)
break;
666 std::stringstream s; s << ls;
670 gid_nodes[id].resize(dim); gid_nodes_used.add(
id);
671 for (
size_type i=0; i < dim; ++i) s >> gid_nodes[id][i];
675 GMM_ASSERT1(gid_nodes_used.card() != 0,
"no nodes in the mesh!");
678 std::vector<bool> direction_useless(3,
true);
679 base_node first_pt = gid_nodes[gid_nodes_used.first()];
680 for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
681 for (
size_type j=0; j < first_pt.size(); ++j) {
682 if (direction_useless[j] && (gmm::abs(gid_nodes[ip][j]-first_pt[j]) > 1e-13))
683 direction_useless[j] =
false;
687 for (
size_type j=0; j < dim; ++j)
if (!direction_useless[j]) dim2++;
688 for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
690 for (
size_type j=0, cnt=0; j < dim; ++j)
if (!direction_useless[j]) n[cnt++]=gid_nodes[ip][j];
691 msh_node_2_getfem_node[ip] = m.add_point(n);
695 bgeot::read_until(f,
"ELEMENTS");
697 std::vector<size_type> order(nnode);
698 for (
size_type i=0; i < nnode; ++i) order[i]=i;
702 if (nnode == 2) pgt = bgeot::simplex_geotrans(1,1);
703 else if (nnode == 3) {
704 pgt = bgeot::simplex_geotrans(1,2);
705 std::swap(order[1],order[2]);
709 if (nnode == 3) pgt = bgeot::simplex_geotrans(2,1);
710 else if (nnode == 6) {
711 static size_type lorder[6] = {0,3,1,5,4,2};
712 pgt = bgeot::simplex_geotrans(2,2);
713 std::copy(lorder,lorder+nnode,order.begin());
717 if (nnode == 4) pgt = bgeot::parallelepiped_geotrans(2,1);
718 else if (nnode == 9) {
719 static size_type lorder[9] = {0,4,1, 7,8,5, 3,6,2};
720 pgt = bgeot::parallelepiped_geotrans(2,2);
721 std::copy(lorder,lorder+nnode,order.begin());
725 if (nnode == 4) pgt = bgeot::simplex_geotrans(3,1);
726 else if (nnode == 10) {
727 static size_type lorder[10] = {0,4,1, 7,8, 3, 6, 5, 9, 2};
728 pgt = bgeot::simplex_geotrans(3,2);
729 std::copy(lorder,lorder+nnode,order.begin());
733 if (nnode == 6) pgt = bgeot::prism_geotrans(3,1);
736 if (nnode == 8) pgt = bgeot::parallelepiped_geotrans(3,1);
737 else if (nnode == 27) {
738 static size_type lorder[27] = {0,8,1, 12,21,13, 4,16,5,
739 11,20,9, 22,26,24, 19,25,17,
740 3,10,2, 15,23,14, 7,18,6};
741 pgt = bgeot::parallelepiped_geotrans(3,2);
742 std::copy(lorder,lorder+nnode,order.begin());
745 default: GMM_ASSERT1(
false,
"");
break;
747 GMM_ASSERT1(pgt != NULL,
"unknown element type " << selemtype
748 <<
" with " << nnode <<
"nodes");
753 if (bgeot::casecmp(ls,
"END ELEMENTS", 12)==0)
break;
754 std::stringstream s; s << ls;
757 cv_nodes.resize(nnode);
761 std::map<size_type, size_type>::iterator
762 it = msh_node_2_getfem_node.find(j);
763 GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
764 "Invalid node ID " << j <<
" in GiD element " << cv_id);
765 cv_nodes[i] = it->second;
767 getfem_cv_nodes.resize(nnode);
769 getfem_cv_nodes[i] = cv_nodes[order[i]];
775 m.add_convex(pgt, getfem_cv_nodes.begin());
787 static void import_cdb_mesh_file(std::istream& f, mesh& m,
790 std::map<size_type, size_type> cdb_node_2_getfem_node;
791 std::vector<size_type> getfem_cv_nodes;
792 std::vector<std::string> elt_types;
793 std::vector<size_type> elt_cnt;
794 std::vector<dal::bit_vector> regions;
799 std::getline(f,line);
800 pos = line.find_first_not_of(
" ");
801 if (bgeot::casecmp(line.substr(pos,2),
"ET") == 0) {
803 std::string type_name;
804 pos = line.find_first_of(
",")+1;
805 pos2 = line.find_first_of(
",", pos);
806 itype = std::stol(line.substr(pos, pos2-pos));
807 pos = line.find_first_not_of(
" ,\n\r\t", pos2);
808 pos2 = line.find_first_of(
" ,\n\r\t", pos);
809 type_name = line.substr(pos, pos2-pos);
811 = (type_name.find_first_not_of(
"0123456789") == std::string::npos);
812 for (
auto&& c : type_name) c = char(std::toupper(c));
814 if (elt_types.size() < itype+1)
815 elt_types.resize(itype+1);
817 elt_types[itype] =
"";
819 size_type type_num = std::stol(type_name);
820 if (type_num == 42 || type_num == 82 ||
821 type_num == 182 || type_num == 183)
822 elt_types[itype] =
"PLANE";
823 else if (type_num == 45 || type_num == 73 || type_num == 87 ||
824 type_num == 90 || type_num == 92 || type_num == 95 ||
825 type_num == 162 || type_num == 185 || type_num == 186 ||
826 type_num == 187 || type_num == 191)
827 elt_types[itype] =
"SOLID";
828 else if (type_num == 89)
829 elt_types[itype] =
"VISCO";
831 elt_types[itype].append(type_name);
833 else if (bgeot::casecmp(line.substr(pos,5),
"KEYOP") == 0) {
835 pos = line.find_first_of(
",")+1;
836 pos2 = line.find_first_of(
",", pos);
837 itype = std::stol(line.substr(pos, pos2-pos));
839 pos2 = line.find_first_of(
",", pos);
840 knum = std::stol(line.substr(pos, pos2-pos));
841 keyval = std::stol(line.substr(pos2+1));
842 if (knum == 1 && itype < elt_types.size() &&
843 elt_types[itype].size() == 7 &&
844 bgeot::casecmp(elt_types[itype].substr(0,7),
"MESH200") == 0) {
845 std::stringstream ss;
846 ss <<
"MESH200_" << keyval;
847 elt_types[itype] = ss.str();
850 else if (bgeot::casecmp(line.substr(pos,6),
"NBLOCK") == 0)
855 elt_cnt.resize(elt_types.size());
858 size_type fields1, fieldwidth1, fields2, fieldwidth2;
860 std::string fortran_fmt;
861 std::getline(f,fortran_fmt);
862 pos = fortran_fmt.find_first_of(
"(")+1;
863 pos2 = fortran_fmt.find_first_of(
"iI", pos);
864 fields1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
866 pos2 = fortran_fmt.find_first_of(
",", pos);
867 fieldwidth1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
869 pos2 = fortran_fmt.find_first_of(
"eE", pos);
870 fields2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
872 pos2 = fortran_fmt.find_first_of(
".", pos);
873 fieldwidth2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
874 GMM_ASSERT1(fields1 >= 1 && fields2 >= 3 ,
875 "Ansys mesh import routine requires NBLOCK entries with at least "
876 "1 integer field and 3 float number fields");
882 std::getline(f,line);
883 if (line.compare(0,1,
"N") == 0 || line.compare(0,1,
"!") == 0)
886 nodeid = std::stol(line.substr(0, fieldwidth1));
887 pos = fields1*fieldwidth1;
888 for (
size_type j=0; j < 3; ++j, pos += fieldwidth2)
889 if (pos < line.length())
890 pt[j] = std::stod(line.substr(pos, fieldwidth2));
894 cdb_node_2_getfem_node[nodeid] = m.add_point(pt, -1.);
897 while (bgeot::casecmp(line.substr(0,6),
"EBLOCK") != 0) {
900 std::getline(f,line);
907 std::string fortran_fmt;
908 std::getline(f,fortran_fmt);
910 pos = fortran_fmt.find_first_of(
"(")+1;
911 pos2 = fortran_fmt.find_first_of(
"iI", pos);
912 fieldsno = std::stol(fortran_fmt.substr(pos, pos2-pos));
914 pos2 = fortran_fmt.find_first_of(
")\n", pos);
915 fieldwidth = std::stol(fortran_fmt.substr(pos, pos2-pos));
916 GMM_ASSERT1(fieldsno == 19,
"Ansys mesh import routine requires EBLOCK "
917 "entries with 19 fields");
920 size_type II,JJ,KK,LL,MM,NN,OO,PP,QQ,RR,SS,TT,UU,VV,WW,XX,YY,ZZ,AA,BB;
922 GMM_ASSERT1(!f.eof(),
"File ended before all elements could be read");
924 std::getline(f,line);
926 long int ii = std::stol(line.substr(0,fieldwidth));
932 itype = std::stol(line.substr(fieldwidth,fieldwidth));
933 nodesno = std::stol(line.substr(8*fieldwidth,fieldwidth));
934 line = line.substr(11*fieldwidth);
936 if (imat_filt !=
size_type(-1) && imat != imat_filt) {
938 std::getline(f,line);
942 if (nodesno >= 1) II = std::stol(line.substr(0,fieldwidth));
943 if (nodesno >= 2) JJ = std::stol(line.substr(1*fieldwidth,fieldwidth));
944 if (nodesno >= 3) KK = std::stol(line.substr(2*fieldwidth,fieldwidth));
945 if (nodesno >= 4) LL = std::stol(line.substr(3*fieldwidth,fieldwidth));
946 if (nodesno >= 5) MM = std::stol(line.substr(4*fieldwidth,fieldwidth));
947 if (nodesno >= 6) NN = std::stol(line.substr(5*fieldwidth,fieldwidth));
948 if (nodesno >= 7) OO = std::stol(line.substr(6*fieldwidth,fieldwidth));
949 if (nodesno >= 8) PP = std::stol(line.substr(7*fieldwidth,fieldwidth));
951 std::getline(f,line);
952 if (nodesno >= 9) QQ = std::stol(line.substr(0,fieldwidth));
953 if (nodesno >= 10) RR = std::stol(line.substr(1*fieldwidth,fieldwidth));
954 if (nodesno >= 11) SS = std::stol(line.substr(2*fieldwidth,fieldwidth));
955 if (nodesno >= 12) TT = std::stol(line.substr(3*fieldwidth,fieldwidth));
956 if (nodesno >= 13) UU = std::stol(line.substr(4*fieldwidth,fieldwidth));
957 if (nodesno >= 14) VV = std::stol(line.substr(5*fieldwidth,fieldwidth));
958 if (nodesno >= 15) WW = std::stol(line.substr(6*fieldwidth,fieldwidth));
959 if (nodesno >= 16) XX = std::stol(line.substr(7*fieldwidth,fieldwidth));
960 if (nodesno >= 17) YY = std::stol(line.substr(8*fieldwidth,fieldwidth));
961 if (nodesno >= 18) ZZ = std::stol(line.substr(9*fieldwidth,fieldwidth));
962 if (nodesno >= 19) AA = std::stol(line.substr(10*fieldwidth,fieldwidth));
963 if (nodesno >= 20) BB = std::stol(line.substr(11*fieldwidth,fieldwidth));
966 if (imat+1 > regions.size())
967 regions.resize(imat+1);
971 std::string eltname(
"MESH200_4");
972 if (elt_types.size() > itype && elt_types[itype].size() > 0)
973 eltname = elt_types[itype];
975 if (eltname.compare(
"MESH200_4") == 0) {
976 getfem_cv_nodes.resize(3);
977 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
978 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
979 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
980 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,1),
981 getfem_cv_nodes.begin()));
982 if (itype < elt_cnt.size())
986 GMM_WARNING2(
"Ignoring ANSYS element " << eltname
987 <<
". Import not supported yet.");
990 else if (nodesno == 4) {
993 std::string eltname(
"MESH200_6");
994 if (elt_types.size() > itype && elt_types[itype].size() > 0)
995 eltname = elt_types[itype];
997 if (eltname.compare(
"MESH200_6") == 0 ||
998 eltname.compare(
"PLANE42") == 0 ||
999 eltname.compare(
"PLANE182") == 0) {
1000 getfem_cv_nodes.resize(4);
1001 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1002 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1003 getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
1004 getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
1005 regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(2,1),
1006 getfem_cv_nodes.begin()));
1007 if (itype < elt_cnt.size())
1008 elt_cnt[itype] += 1;
1010 else if (eltname.compare(
"MESH200_8") == 0 ||
1011 eltname.compare(
"SOLID72") == 0) {
1012 getfem_cv_nodes.resize(4);
1013 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1014 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1015 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1016 getfem_cv_nodes[3] = cdb_node_2_getfem_node[LL];
1017 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
1018 getfem_cv_nodes.begin()));
1019 if (itype < elt_cnt.size())
1020 elt_cnt[itype] += 1;
1023 else if (nodesno == 6) {
1025 std::string eltname(
"MESH200_5");
1026 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1027 eltname = elt_types[itype];
1028 if (eltname.compare(
"MESH200_5") == 0 ||
1029 eltname.compare(
"PLANE183") == 0) {
1030 getfem_cv_nodes.resize(6);
1031 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1032 getfem_cv_nodes[1] = cdb_node_2_getfem_node[LL];
1033 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1034 getfem_cv_nodes[3] = cdb_node_2_getfem_node[NN];
1035 getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
1036 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1037 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,2),
1038 getfem_cv_nodes.begin()));
1039 if (itype < elt_cnt.size())
1040 elt_cnt[itype] += 1;
1043 else if (nodesno == 8) {
1046 std::string eltname(
"MESH200_10");
1047 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1048 eltname = elt_types[itype];
1050 if (eltname.compare(
"MESH200_7") == 0 ||
1051 eltname.compare(
"PLANE82") == 0 ||
1052 eltname.compare(
"PLANE183") == 0) {
1053 if (KK == LL && KK == OO) {
1054 getfem_cv_nodes.resize(6);
1055 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1056 getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
1057 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1058 getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
1059 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1060 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1061 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,2),
1062 getfem_cv_nodes.begin()));
1064 getfem_cv_nodes.resize(8);
1065 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1066 getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
1067 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1068 getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
1069 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1070 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1071 getfem_cv_nodes[6] = cdb_node_2_getfem_node[OO];
1072 getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
1073 regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(2),
1074 getfem_cv_nodes.begin()));
1076 if (itype < elt_cnt.size())
1077 elt_cnt[itype] += 1;
1079 else if (eltname.compare(
"MESH200_10") == 0 ||
1080 eltname.compare(
"SOLID45") == 0 ||
1081 eltname.compare(
"SOLID185") == 0) {
1082 if (KK == LL && OO == PP) {
1083 if (MM == NN && NN == OO) {
1084 getfem_cv_nodes.resize(4);
1085 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1086 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1087 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1088 getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
1089 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
1090 getfem_cv_nodes.begin()));
1093 getfem_cv_nodes.resize(6);
1094 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1095 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1096 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1097 getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
1098 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1099 getfem_cv_nodes[5] = cdb_node_2_getfem_node[OO];
1100 regions[imat].add(m.add_convex(bgeot::prism_geotrans(3,1),
1101 getfem_cv_nodes.begin()));
1105 getfem_cv_nodes.resize(8);
1106 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1107 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1108 getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
1109 getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
1110 getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
1111 getfem_cv_nodes[5] = cdb_node_2_getfem_node[NN];
1112 getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
1113 getfem_cv_nodes[7] = cdb_node_2_getfem_node[OO];
1114 regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(3,1),
1115 getfem_cv_nodes.begin()));
1117 if (itype < elt_cnt.size())
1118 elt_cnt[itype] += 1;
1121 else if (nodesno == 10) {
1124 std::string eltname(
"MESH200_9");
1125 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1126 eltname = elt_types[itype];
1128 if (eltname.compare(
"MESH200_9") == 0 ||
1129 eltname.compare(
"SOLID87") == 0 ||
1130 eltname.compare(
"SOLID92") == 0 ||
1131 eltname.compare(
"SOLID162") == 0 ||
1132 eltname.compare(
"SOLID187") == 0) {
1133 getfem_cv_nodes.resize(10);
1134 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1135 getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
1136 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1137 getfem_cv_nodes[3] = cdb_node_2_getfem_node[OO];
1138 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1139 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1140 getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
1141 getfem_cv_nodes[7] = cdb_node_2_getfem_node[QQ];
1142 getfem_cv_nodes[8] = cdb_node_2_getfem_node[RR];
1143 getfem_cv_nodes[9] = cdb_node_2_getfem_node[LL];
1144 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
1145 getfem_cv_nodes.begin()));
1146 if (itype < elt_cnt.size())
1147 elt_cnt[itype] += 1;
1150 else if (nodesno == 20) {
1153 std::string eltname(
"MESH200_11");
1154 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1155 eltname = elt_types[itype];
1157 if (eltname.compare(
"MESH200_11") == 0 ||
1158 eltname.compare(
"VISCO89") == 0 ||
1159 eltname.compare(
"SOLID90") == 0 ||
1160 eltname.compare(
"SOLID95") == 0 ||
1161 eltname.compare(
"SOLID186") == 0 ||
1162 eltname.compare(
"SOLID191") == 0) {
1163 if (KK == LL && MM == NN && NN == OO && OO == PP) {
1164 getfem_cv_nodes.resize(10);
1165 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1166 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1167 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1168 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1169 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1170 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1171 getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
1172 getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
1173 getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
1174 getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
1175 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
1176 getfem_cv_nodes.begin()));
1177 if (itype < elt_cnt.size())
1178 elt_cnt[itype] += 1;
1179 }
else if (MM == NN && NN == OO && OO == PP) {
1180 getfem_cv_nodes.resize(13);
1181 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1182 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1183 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1184 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1185 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1186 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1187 getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
1188 getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
1189 getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
1190 getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
1191 getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
1192 getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
1193 getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
1194 regions[imat].add(m.add_convex(bgeot::pyramid_Q2_incomplete_geotrans(),
1195 getfem_cv_nodes.begin()));
1196 if (itype < elt_cnt.size())
1197 elt_cnt[itype] += 1;
1199 }
else if (KK == LL && OO == PP) {
1200 getfem_cv_nodes.resize(15);
1201 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1202 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1203 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1204 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1205 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1206 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1207 getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
1208 getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
1209 getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
1210 getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
1211 getfem_cv_nodes[10] = cdb_node_2_getfem_node[UU];
1212 getfem_cv_nodes[11] = cdb_node_2_getfem_node[NN];
1213 getfem_cv_nodes[12] = cdb_node_2_getfem_node[XX];
1214 getfem_cv_nodes[13] = cdb_node_2_getfem_node[VV];
1215 getfem_cv_nodes[14] = cdb_node_2_getfem_node[OO];
1216 regions[imat].add(m.add_convex
1217 (bgeot::prism_incomplete_P2_geotrans(),
1218 getfem_cv_nodes.begin()));
1219 if (itype < elt_cnt.size())
1220 elt_cnt[itype] += 1;
1222 getfem_cv_nodes.resize(20);
1223 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1224 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1225 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1226 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1227 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1228 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1229 getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
1230 getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
1231 getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
1232 getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
1233 getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
1234 getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
1235 getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
1236 getfem_cv_nodes[13] = cdb_node_2_getfem_node[UU];
1237 getfem_cv_nodes[14] = cdb_node_2_getfem_node[NN];
1238 getfem_cv_nodes[15] = cdb_node_2_getfem_node[XX];
1239 getfem_cv_nodes[16] = cdb_node_2_getfem_node[VV];
1240 getfem_cv_nodes[17] = cdb_node_2_getfem_node[PP];
1241 getfem_cv_nodes[18] = cdb_node_2_getfem_node[WW];
1242 getfem_cv_nodes[19] = cdb_node_2_getfem_node[OO];
1243 regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(3),
1244 getfem_cv_nodes.begin()));
1245 if (itype < elt_cnt.size())
1246 elt_cnt[itype] += 1;
1252 int nonempty_regions=0;
1253 for (
size_type i=0; i < regions.size(); ++i)
1254 if (regions[i].card() > 0)
1257 if (nonempty_regions > 1)
1258 for (
size_type i=0; i < regions.size(); ++i)
1259 if (regions[i].card() > 0)
1260 m.region(i).add(regions[i]);
1262 for (
size_type i=1; i < elt_types.size(); ++i)
1264 cout <<
"Imported " << elt_cnt[i] <<
" " << elt_types[i] <<
" elements." << endl;
1265 cout <<
"Imported " << m.convex_index().card() <<
" elements in total." << endl;
1270 static double round_to_nth_significant_number(
double x,
int ndec) {
1272 double s = (x < 0 ? -1 : 1);
1273 double pdec = pow(10.,
double(ndec));
1274 if (x == 0)
return 0.;
1276 while (x > 1) { x /= 10.0; p*=10; }
1277 while (x < 0.1) { x *= 10.0; p/=10; }
1279 x = s * (floor(x * pdec + 0.5) / pdec) * p;
1285 static void import_noboite_mesh_file(std::istream& f, mesh& m) {
1287 using namespace std;
1288 gmm::stream_standard_locale sl(f);
1290 ofstream fichier_GiD(
"noboite_to_GiD.gid", ios::out | ios::trunc );
1292 fichier_GiD <<
"MESH dimension 3 ElemType Tetrahedra Nnode 4"<<endl;
1295 int i,NE,NP,ligne_debut_NP;
1303 ligne_debut_NP=NE*4/6+3;
1308 for (i=1; i<=ligne_debut_NP; i++){
1309 getline(f, contenu);
1316 fichier_GiD <<
"Coordinates" <<endl;
1318 for (i=1; i<=NP; i++){
1319 float coor_x,coor_y,coor_z;
1321 fichier_GiD << i<<
" ";
1323 f>>coor_x >>coor_y >>coor_z;
1324 fichier_GiD<<coor_x<<
" " <<coor_y <<
" "<<coor_z <<endl;
1328 fichier_GiD <<
"end coordinates" <<endl<<endl;
1335 f.seekg(0, ios::beg);
1336 for (i=1; i<=3; i++){
1337 getline(f, contenu);
1341 fichier_GiD <<
"Elements" <<endl;
1343 for (i=1; i<=NE; i++){
1344 float elem_1,elem_2,elem_3,elem_4;
1346 fichier_GiD << i<<
" ";
1347 f>>elem_1>>elem_2>>elem_3>>elem_4;
1348 fichier_GiD<<elem_1<<
" " <<elem_2 <<
" "<<elem_3<<
" "<<elem_4<<
" 1"<<endl;
1351 fichier_GiD <<
"end elements" <<endl<<endl;
1356 fichier_GiD.close();
1359 cerr <<
"Erreur à l'ouverture !" << endl;
1367 cerr <<
"Erreur à l'ouverture !" << endl;
1371 ifstream fichier1_GiD(
"noboite_to_GiD.gid", ios::in);
1372 import_gid_mesh_file(fichier1_GiD, m);
1381 static void import_am_fmt_mesh_file(std::istream& f, mesh& m) {
1382 gmm::stream_standard_locale sl(f);
1384 std::vector<size_type> tri;
1387 f >> nbs >> nbt; bgeot::read_until(f,
"\n");
1389 for (
size_type i=0; i < nbt*3; ++i) f >> tri[i];
1393 P[0]=round_to_nth_significant_number(P[0],6);
1394 P[1]=round_to_nth_significant_number(P[1],6);
1396 GMM_ASSERT1(jj == j,
"ouch");
1399 m.add_triangle(tri[i]-1,tri[i+1]-1,tri[i+2]-1);
1406 static void import_emc2_mesh_file(std::istream& f, mesh& m) {
1407 gmm::stream_standard_locale sl(f);
1409 std::vector<size_type> tri;
1412 bgeot::read_until(f,
"Vertices");
1415 f >> P[0] >> P[1] >> dummy;
1417 GMM_ASSERT1(jj == j,
"ouch");
1423 if (ls.find(
"Triangles")+1) {
1426 f >> ip[0] >> ip[1] >> ip[2] >> dummy; ip[0]--; ip[1]--; ip[2]--;
1427 m.add_triangle(ip[0],ip[1],ip[2]);
1429 }
else if (ls.find(
"Quadrangles")+1) {
1432 f >> ip[0] >> ip[1] >> ip[2] >> ip[3] >> dummy; ip[0]--; ip[1]--; ip[2]--; ip[3]--;
1433 m.add_parallelepiped(2, &ip[0]);
1435 }
else if (ls.find(
"End")+1)
break;
1439 void import_mesh(
const std::string& filename,
const std::string& format,
1444 if (bgeot::casecmp(format,
"structured")==0)
1446 else if (bgeot::casecmp(format,
"structured_ball")==0)
1448 else if (bgeot::casecmp(format,
"structured_ball_shell")==0)
1451 std::ifstream f(filename.c_str());
1452 GMM_ASSERT1(f.good(),
"can't open file " << filename);
1454 f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
1458 catch (std::logic_error& exc) {
1462 catch (std::ios_base::failure& exc) {
1464 GMM_ASSERT1(
false,
"error while importing " << format
1465 <<
" mesh file \"" << filename <<
"\" : " << exc.what());
1467 catch (std::runtime_error& exc) {
1474 std::map<std::string, size_type> ®ion_map,
1475 bool remove_last_dimension,
1476 std::map<
size_type, std::set<size_type>> *nodal_map,
1477 bool remove_duplicated_nodes)
1479 import_gmsh_mesh_file(f, m, 0, ®ion_map,
nullptr,
false, remove_last_dimension, nodal_map,
1480 remove_duplicated_nodes);
1484 bool add_all_element_type,
1485 std::set<size_type> *lower_dim_convex_rg,
1486 std::map<std::string, size_type> *region_map,
1487 bool remove_last_dimension,
1488 std::map<
size_type, std::set<size_type>> *nodal_map,
1489 bool remove_duplicated_nodes)
1491 import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, add_all_element_type,
1492 remove_last_dimension, nodal_map, remove_duplicated_nodes);
1496 bool add_all_element_type,
1497 std::set<size_type> *lower_dim_convex_rg,
1498 std::map<std::string, size_type> *region_map,
1499 bool remove_last_dimension,
1500 std::map<
size_type, std::set<size_type>> *nodal_map,
1501 bool remove_duplicated_nodes)
1505 std::ifstream f(filename.c_str());
1506 GMM_ASSERT1(f.good(),
"can't open file " << filename);
1508 f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
1509 import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, add_all_element_type,
1510 remove_last_dimension, nodal_map, remove_duplicated_nodes);
1513 catch (std::logic_error& exc) {
1517 catch (std::ios_base::failure& exc) {
1519 GMM_ASSERT1(
false,
"error while importing " <<
"gmsh"
1520 <<
" mesh file \"" << filename <<
"\" : " << exc.what());
1522 catch (std::runtime_error& exc) {
1529 mesh& m, std::map<std::string, size_type> ®ion_map,
1530 bool remove_last_dimension,
1531 std::map<
size_type, std::set<size_type>> *nodal_map,
1532 bool remove_duplicated_nodes) {
1533 import_mesh_gmsh(filename, m,
false, NULL, ®ion_map, remove_last_dimension, nodal_map,
1534 remove_duplicated_nodes);
1537 void import_mesh(std::istream& f,
const std::string& format,
1539 if (bgeot::casecmp(format,
"gmsh")==0)
1540 import_gmsh_mesh_file(f,m);
1541 else if (bgeot::casecmp(format,
"gmshv2")==0)
1542 import_gmsh_mesh_file(f,m,2);
1543 else if (bgeot::casecmp(format,
"gid")==0)
1544 import_gid_mesh_file(f,m);
1545 else if (bgeot::casecmp(format,
"noboite")==0)
1546 import_noboite_mesh_file(f,m);
1547 else if (bgeot::casecmp(format,
"am_fmt")==0)
1548 import_am_fmt_mesh_file(f,m);
1549 else if (bgeot::casecmp(format,
"emc2_mesh")==0)
1550 import_emc2_mesh_file(f,m);
1551 else if (bgeot::casecmp(format,
"cdb")==0)
1552 import_cdb_mesh_file(f,m);
1553 else if (bgeot::casecmp(format.substr(0,4),
"cdb:")==0) {
1558 imat = std::stol(format.substr(4), &sz);
1559 success = (sz == format.substr(4).size() && imat !=
size_type(-1));
1560 }
catch (
const std::invalid_argument&) {
1562 }
catch (
const std::out_of_range&) {
1566 import_cdb_mesh_file(f,m,imat);
1567 else GMM_ASSERT1(
false,
"cannot import "
1568 << format <<
" mesh type : wrong cdb mesh type input");
1570 else GMM_ASSERT1(
false,
"cannot import "
1571 << format <<
" mesh type : unknown mesh type");
1574 void import_mesh(
const std::string& filename, mesh& msh) {
1575 size_type pos = filename.find_last_of(
":");
1576 if (pos != std::string::npos)
1579 msh.read_from_file(filename);
1583 bool is_flat =
true;
1584 unsigned N = m.dim();
if (N < 1)
return;
1585 for (dal::bv_visitor i(m.points().index()); !i.finished(); ++i)
1586 if (m.points()[i][N-1] != 0) is_flat = 0;
1588 base_matrix M(N-1,N);
1589 for (
unsigned i=0; i < N-1; ++i) M(i,i) = 1;