34 unsigned id, type, region;
36 std::vector<size_type> nodes;
40 pgt = bgeot::simplex_geotrans(1,1);
43 pgt = bgeot::simplex_geotrans(2,1);
46 pgt = bgeot::parallelepiped_geotrans(2,1);
49 pgt = bgeot::simplex_geotrans(3,1);
52 pgt = bgeot::parallelepiped_geotrans(3,1);
55 pgt = bgeot::prism_geotrans(3,1);
58 pgt = bgeot::pyramid_QK_geotrans(1);
61 pgt = bgeot::simplex_geotrans(1,2);
64 pgt = bgeot::simplex_geotrans(2,2);
67 pgt = bgeot::parallelepiped_geotrans(2,2);
70 pgt = bgeot::simplex_geotrans(3,2);
73 pgt = bgeot::parallelepiped_geotrans(3,2);
76 pgt = bgeot::prism_geotrans(3,2);
79 pgt = bgeot::pyramid_QK_geotrans(2);
82 GMM_WARNING2(
"ignoring point element");
85 pgt = bgeot::Q2_incomplete_geotrans(2);
88 pgt = bgeot::Q2_incomplete_geotrans(3);
91 pgt = bgeot::prism_incomplete_P2_geotrans();
94 pgt = bgeot::pyramid_Q2_incomplete_geotrans();
97 pgt = bgeot::simplex_geotrans(1,3);
100 pgt = bgeot::simplex_geotrans(2,3);
103 pgt = bgeot::simplex_geotrans(2, 4);
106 pgt = bgeot::simplex_geotrans(1, 4);
110 GMM_ASSERT1(
false,
"gmsh element type " << type <<
" is unknown.");
115 void set_nb_nodes() {
189 GMM_ASSERT1(
false,
"the gmsh element type " << type <<
" is unknown..");
194 bool operator<(
const gmsh_cv_info& other)
const {
195 unsigned this_dim = (type == 15) ? 0 : pgt->dim();
196 unsigned other_dim = (other.type == 15) ? 0 : other.pgt->dim();
197 if (this_dim == other_dim)
return region < other.region;
198 return this_dim > other_dim;
204 std::map<std::string, size_type> region_map;
205 bgeot::read_until(f,
"$PhysicalNames");
209 std::string region_name;
210 for (
size_type region_cnt=0; region_cnt < nb_regions; ++ region_cnt) {
212 std::getline(f, region_name);
214 size_t pos = region_name.find_first_of(
"\"");
215 if (pos != region_name.npos) {
216 region_name.erase(0, pos+1);
217 pos = region_name.find_last_of(
"\"");
218 region_name.erase(pos);
220 region_map[region_name] = ri;
246 static void import_gmsh_mesh_file
247 (std::istream& f, mesh& m,
int deprecate=0,
248 std::map<std::string, size_type> *region_map=NULL,
249 std::set<size_type> *lower_dim_convex_rg=NULL,
250 bool add_all_element_type =
false,
251 bool remove_last_dimension =
true,
252 std::map<
size_type, std::set<size_type>> *nodal_map = NULL,
253 bool remove_duplicated_nodes =
true) {
254 gmm::stream_standard_locale sl(f);
260 GMM_WARNING4(
"" << endl
261 <<
" deprecate: " << endl
262 <<
" static void" << endl
263 <<
" import_gmsh_mesh_file(std::istream& f,"
264 <<
" mesh& , int version)" << endl
265 <<
" replace with:" << endl
266 <<
" static void" << endl
267 <<
" import_gmsh_mesh_file(std::istream& f,"
275 if (bgeot::casecmp(header,
"$MeshFormat")==0)
277 else if (bgeot::casecmp(header,
"$NOD")==0)
280 GMM_ASSERT1(
false,
"can't read Gmsh format: " << header);
283 if (region_map != NULL) {
290 bgeot::read_until(f,
"$Nodes");
295 if (version >= 4.05) {
296 f >> nb_block >> nb_node; bgeot::read_until(f,
"\n");
297 }
else if (version >= 4.) {
298 f >> nb_block >> nb_node;
305 std::map<size_type, size_type> msh_node_2_getfem_node;
306 std::vector<size_type> inds(nb_node);
307 for (
size_type block=0; block < nb_block; ++block) {
309 f >> dummy >> dummy >> dummy >> nb_node;
312 inds.resize(nb_node);
313 if (version >= 4.05) {
314 for (
size_type node_cnt=0; node_cnt < nb_node; ++node_cnt)
318 for (
size_type node_cnt=0; node_cnt < nb_node; ++node_cnt) {
321 if (version < 4.05) f >> node_id;
else node_id = inds[node_cnt];
323 f >> n[0] >> n[1] >> n[2];
324 msh_node_2_getfem_node[node_id]
325 = m.add_point(n, remove_duplicated_nodes ? 0. : -1.);
330 bgeot::read_until(f,
"$Endnodes");
332 bgeot::read_until(f,
"$ENDNOD");
336 bgeot::read_until(f,
"$Elements");
338 bgeot::read_until(f,
"$ELM");
341 if (version >= 4.05) {
342 f >> nb_block >> nb_cv; bgeot::read_until(f,
"\n");
343 }
else if (version >= 4.) {
344 f >> nb_block >> nb_cv;
351 std::vector<gmsh_cv_info> cvlst; cvlst.reserve(nb_cv);
353 for (
size_type block=0; block < nb_block; ++block) {
354 unsigned dimr, type, region;
356 f >> dimr >> region >> type >> nb_cv;
357 if (reg.is_in(region)) {
358 GMM_WARNING2(
"Two regions share the same number, "
359 "the region numbering is modified");
360 while (reg.is_in(region)) region += 5;
366 cvlst.push_back(gmsh_cv_info());
367 gmsh_cv_info &ci = cvlst.back();
371 unsigned cv_nb_nodes;
373 if (
int(version) == 2) {
376 GMM_ASSERT1(nbtags > 0 && nbtags <= 3,
377 "Number of tags " << nbtags <<
" is not managed.");
379 if (nbtags > 1) f >> dummy;
380 if (nbtags > 2) f >> dummy;
384 cv_nb_nodes = unsigned(ci.nodes.size());
385 }
else if (
int(version) == 1) {
386 f >> type >> region >> dummy >> cv_nb_nodes;
388 ci.nodes.resize(cv_nb_nodes);
394 for (
size_type i=0; i < cv_nb_nodes; ++i) {
397 const auto it = msh_node_2_getfem_node.find(j);
398 GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
399 "Invalid node ID " << j <<
" in gmsh element "
401 ci.nodes[i] = it->second;
407 std::vector<size_type> tmp_nodes(ci.nodes);
410 ci.nodes[2] = tmp_nodes[3];
411 ci.nodes[3] = tmp_nodes[2];
416 ci.nodes[2] = tmp_nodes[3];
417 ci.nodes[3] = tmp_nodes[2];
420 ci.nodes[6] = tmp_nodes[7];
421 ci.nodes[7] = tmp_nodes[6];
428 ci.nodes[1] = tmp_nodes[2];
429 ci.nodes[2] = tmp_nodes[1];
435 ci.nodes[1] = tmp_nodes[2];
436 ci.nodes[2] = tmp_nodes[1];
440 ci.nodes[1] = tmp_nodes[3];
441 ci.nodes[2] = tmp_nodes[1];
442 ci.nodes[3] = tmp_nodes[5];
444 ci.nodes[5] = tmp_nodes[2];
448 ci.nodes[1] = tmp_nodes[4];
449 ci.nodes[2] = tmp_nodes[1];
450 ci.nodes[3] = tmp_nodes[7];
451 ci.nodes[4] = tmp_nodes[8];
453 ci.nodes[6] = tmp_nodes[3];
454 ci.nodes[7] = tmp_nodes[6];
455 ci.nodes[8] = tmp_nodes[2];
459 ci.nodes[1] = tmp_nodes[4];
460 ci.nodes[2] = tmp_nodes[1];
461 ci.nodes[3] = tmp_nodes[6];
462 ci.nodes[4] = tmp_nodes[5];
463 ci.nodes[5] = tmp_nodes[2];
464 ci.nodes[6] = tmp_nodes[7];
465 ci.nodes[7] = tmp_nodes[9];
467 ci.nodes[9] = tmp_nodes[3];
471 ci.nodes[1] = tmp_nodes[8];
472 ci.nodes[2] = tmp_nodes[1];
473 ci.nodes[3] = tmp_nodes[9];
474 ci.nodes[4] = tmp_nodes[20];
475 ci.nodes[5] = tmp_nodes[11];
476 ci.nodes[6] = tmp_nodes[3];
477 ci.nodes[7] = tmp_nodes[13];
478 ci.nodes[8] = tmp_nodes[2];
479 ci.nodes[9] = tmp_nodes[10];
480 ci.nodes[10] = tmp_nodes[21];
481 ci.nodes[11] = tmp_nodes[12];
482 ci.nodes[12] = tmp_nodes[22];
483 ci.nodes[13] = tmp_nodes[26];
484 ci.nodes[14] = tmp_nodes[23];
486 ci.nodes[16] = tmp_nodes[24];
487 ci.nodes[17] = tmp_nodes[14];
488 ci.nodes[18] = tmp_nodes[4];
489 ci.nodes[19] = tmp_nodes[16];
490 ci.nodes[20] = tmp_nodes[5];
491 ci.nodes[21] = tmp_nodes[17];
492 ci.nodes[22] = tmp_nodes[25];
493 ci.nodes[23] = tmp_nodes[18];
494 ci.nodes[24] = tmp_nodes[7];
495 ci.nodes[25] = tmp_nodes[19];
496 ci.nodes[26] = tmp_nodes[6];
500 ci.nodes[1] = tmp_nodes[6];
501 ci.nodes[2] = tmp_nodes[1];
502 ci.nodes[3] = tmp_nodes[7];
503 ci.nodes[4] = tmp_nodes[9];
504 ci.nodes[5] = tmp_nodes[2];
505 ci.nodes[6] = tmp_nodes[8];
506 ci.nodes[7] = tmp_nodes[15];
507 ci.nodes[8] = tmp_nodes[10];
508 ci.nodes[9] = tmp_nodes[16];
509 ci.nodes[10] = tmp_nodes[17];
511 ci.nodes[12] = tmp_nodes[3];
512 ci.nodes[13] = tmp_nodes[12];
513 ci.nodes[14] = tmp_nodes[4];
514 ci.nodes[15] = tmp_nodes[13];
515 ci.nodes[16] = tmp_nodes[14];
516 ci.nodes[17] = tmp_nodes[5];
520 ci.nodes[1] = tmp_nodes[5];
521 ci.nodes[2] = tmp_nodes[1];
522 ci.nodes[3] = tmp_nodes[6];
523 ci.nodes[4] = tmp_nodes[13];
524 ci.nodes[5] = tmp_nodes[8];
525 ci.nodes[6] = tmp_nodes[3];
526 ci.nodes[7] = tmp_nodes[10];
527 ci.nodes[8] = tmp_nodes[2];
528 ci.nodes[9] = tmp_nodes[7];
529 ci.nodes[10] = tmp_nodes[9];
530 ci.nodes[11] = tmp_nodes[12];
531 ci.nodes[12] = tmp_nodes[11];
532 ci.nodes[13] = tmp_nodes[4];
536 ci.nodes[1] = tmp_nodes[4];
537 ci.nodes[2] = tmp_nodes[1];
538 ci.nodes[3] = tmp_nodes[7];
539 ci.nodes[4] = tmp_nodes[5];
540 ci.nodes[5] = tmp_nodes[3];
541 ci.nodes[6] = tmp_nodes[6];
542 ci.nodes[7] = tmp_nodes[2];
546 ci.nodes[1] = tmp_nodes[8];
547 ci.nodes[2] = tmp_nodes[1];
548 ci.nodes[3] = tmp_nodes[9];
549 ci.nodes[4] = tmp_nodes[11];
550 ci.nodes[5] = tmp_nodes[3];
551 ci.nodes[6] = tmp_nodes[13];
552 ci.nodes[7] = tmp_nodes[2];
553 ci.nodes[8] = tmp_nodes[10];
554 ci.nodes[9] = tmp_nodes[12];
555 ci.nodes[10] = tmp_nodes[15];
556 ci.nodes[11] = tmp_nodes[14];
557 ci.nodes[12] = tmp_nodes[4];
558 ci.nodes[13] = tmp_nodes[16];
559 ci.nodes[14] = tmp_nodes[5];
560 ci.nodes[15] = tmp_nodes[17];
561 ci.nodes[16] = tmp_nodes[18];
562 ci.nodes[17] = tmp_nodes[7];
563 ci.nodes[18] = tmp_nodes[19];
564 ci.nodes[19] = tmp_nodes[6];
568 ci.nodes[1] = tmp_nodes[6];
569 ci.nodes[2] = tmp_nodes[1];
570 ci.nodes[3] = tmp_nodes[7];
571 ci.nodes[4] = tmp_nodes[9];
572 ci.nodes[5] = tmp_nodes[2];
573 ci.nodes[6] = tmp_nodes[8];
574 ci.nodes[7] = tmp_nodes[10];
575 ci.nodes[8] = tmp_nodes[11];
576 ci.nodes[9] = tmp_nodes[3];
577 ci.nodes[10] = tmp_nodes[12];
578 ci.nodes[11] = tmp_nodes[4];
579 ci.nodes[12] = tmp_nodes[13];
580 ci.nodes[13] = tmp_nodes[14];
581 ci.nodes[14] = tmp_nodes[5];
585 ci.nodes[1] = tmp_nodes[5];
586 ci.nodes[2] = tmp_nodes[1];
587 ci.nodes[3] = tmp_nodes[6];
588 ci.nodes[4] = tmp_nodes[8];
589 ci.nodes[5] = tmp_nodes[3];
590 ci.nodes[6] = tmp_nodes[10];
591 ci.nodes[7] = tmp_nodes[2];
592 ci.nodes[8] = tmp_nodes[7];
594 ci.nodes[10] = tmp_nodes[12];
596 ci.nodes[12] = tmp_nodes[4];
600 ci.nodes[1] = tmp_nodes[2];
601 ci.nodes[2] = tmp_nodes[3];
602 ci.nodes[3] = tmp_nodes[1];
606 ci.nodes[1] = tmp_nodes[3];
607 ci.nodes[2] = tmp_nodes[4];
608 ci.nodes[3] = tmp_nodes[1];
609 ci.nodes[4] = tmp_nodes[8];
610 ci.nodes[5] = tmp_nodes[9];
611 ci.nodes[6] = tmp_nodes[5];
613 ci.nodes[8] = tmp_nodes[6];
614 ci.nodes[9] = tmp_nodes[2];
618 ci.nodes[1] = tmp_nodes[3];
619 ci.nodes[2] = tmp_nodes[4];
620 ci.nodes[3] = tmp_nodes[5];
621 ci.nodes[4] = tmp_nodes[1];
622 ci.nodes[5] = tmp_nodes[11];
623 ci.nodes[6] = tmp_nodes[12];
624 ci.nodes[7] = tmp_nodes[13];
625 ci.nodes[8] = tmp_nodes[6];
626 ci.nodes[9] = tmp_nodes[10];
627 ci.nodes[10] = tmp_nodes[14];
628 ci.nodes[11] = tmp_nodes[7];
629 ci.nodes[12] = tmp_nodes[9];
630 ci.nodes[13] = tmp_nodes[8];
631 ci.nodes[14] = tmp_nodes[2];
635 ci.nodes[1] = tmp_nodes[2];
636 ci.nodes[2] = tmp_nodes[3];
637 ci.nodes[3] = tmp_nodes[4];
638 ci.nodes[4] = tmp_nodes[1];
644 nb_cv = cvlst.size();
646 std::sort(cvlst.begin(), cvlst.end());
647 if (cvlst.front().type == 15) {
648 GMM_WARNING2(
"Only nodes defined in the mesh! No elements are added.");
652 unsigned N = cvlst.front().pgt->dim();
655 gmsh_cv_info &ci = cvlst[cv];
656 bool is_node = (ci.type == 15);
657 unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
663 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
665 m.region(ci.region).add(ic);
672 if (lower_dim_convex_rg != NULL &&
673 lower_dim_convex_rg->find(ci.region) != lower_dim_convex_rg->end()
675 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
676 cvok =
true; m.region(ci.region).add(ic);
680 bgeot::mesh_structure::ind_cv_ct ct=m.convex_to_point(ci.nodes[0]);
681 for (bgeot::mesh_structure::ind_cv_ct::const_iterator
682 it = ct.begin(); it != ct.end(); ++it) {
683 if (m.structure_of_convex(*it)->dim() == ci_dim + 1) {
685 face < m.structure_of_convex(*it)->nb_faces(); ++face) {
686 if (m.is_convex_face_having_points(*it, face,
689 m.region(ci.region).add(*it,face);
695 if (is_node && (nodal_map != NULL)) {
696 for (
auto i : ci.nodes) (*nodal_map)[ci.region].insert(i);
701 if (nodal_map == NULL){
702 GMM_WARNING2(
"gmsh import ignored a node id: "
703 << ci.id <<
" region :" << ci.region <<
704 " point is not added explicitly as an element.");
707 else if (add_all_element_type) {
708 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
709 m.region(ci.region).add(ic);
712 GMM_WARNING2(
"gmsh import ignored an element of type "
714 " as it does not belong to the face of another element");
728 static void import_gid_mesh_file(std::istream& f, mesh& m) {
729 gmm::stream_standard_locale sl(f);
732 enum { LIN,TRI,QUAD,TETR, PRISM, HEX,BADELTYPE } eltype=BADELTYPE;
734 std::map<size_type, size_type> msh_node_2_getfem_node;
735 std::vector<size_type> cv_nodes, getfem_cv_nodes;
736 bool nodes_done =
false;
738 if (!f.eof()) f >> std::ws;
739 if (f.eof() || !bgeot::read_until(f,
"MESH"))
break;
740 std::string selemtype;
741 f >> bgeot::skip(
"DIMENSION") >> dim
742 >> bgeot::skip(
"ELEMTYPE") >> std::ws
744 >> bgeot::skip(
"NNODE") >> nnode;
745 if (bgeot::casecmp(selemtype,
"linear")==0) { eltype = LIN; }
746 else if (bgeot::casecmp(selemtype,
"triangle")==0) { eltype = TRI; }
747 else if (bgeot::casecmp(selemtype,
"quadrilateral")==0) { eltype = QUAD; }
748 else if (bgeot::casecmp(selemtype,
"tetrahedra")==0) { eltype = TETR; }
749 else if (bgeot::casecmp(selemtype,
"prisma")==0) { eltype = PRISM; }
750 else if (bgeot::casecmp(selemtype,
"hexahedra")==0) { eltype = HEX; }
751 else GMM_ASSERT1(
false,
"unknown element type '"<< selemtype <<
"'");
752 GMM_ASSERT1(!f.eof(),
"File ended before coordinates");
753 f >> bgeot::skip(
"COORDINATES");
756 dal::bit_vector gid_nodes_used;
762 if (bgeot::casecmp(ls,
"END COORDINATES", 15)==0)
break;
763 std::stringstream s; s << ls;
767 gid_nodes[id].resize(dim); gid_nodes_used.add(
id);
768 for (
size_type i=0; i < dim; ++i) s >> gid_nodes[id][i];
772 GMM_ASSERT1(gid_nodes_used.card() != 0,
"no nodes in the mesh!");
775 std::vector<bool> direction_useless(3,
true);
776 base_node first_pt = gid_nodes[gid_nodes_used.first()];
777 for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
778 for (
size_type j=0; j < first_pt.size(); ++j) {
779 if (direction_useless[j] && (gmm::abs(gid_nodes[ip][j]-first_pt[j]) > 1e-13))
780 direction_useless[j] =
false;
784 for (
size_type j=0; j < dim; ++j)
if (!direction_useless[j]) dim2++;
785 for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
787 for (
size_type j=0, cnt=0; j < dim; ++j)
if (!direction_useless[j]) n[cnt++]=gid_nodes[ip][j];
788 msh_node_2_getfem_node[ip] = m.add_point(n);
792 bgeot::read_until(f,
"ELEMENTS");
794 std::vector<size_type> order(nnode);
795 for (
size_type i=0; i < nnode; ++i) order[i]=i;
799 if (nnode == 2) pgt = bgeot::simplex_geotrans(1,1);
800 else if (nnode == 3) {
801 pgt = bgeot::simplex_geotrans(1,2);
802 std::swap(order[1],order[2]);
806 if (nnode == 3) pgt = bgeot::simplex_geotrans(2,1);
807 else if (nnode == 6) {
808 static size_type lorder[6] = {0,3,1,5,4,2};
809 pgt = bgeot::simplex_geotrans(2,2);
810 std::copy(lorder,lorder+nnode,order.begin());
814 if (nnode == 4) pgt = bgeot::parallelepiped_geotrans(2,1);
815 else if (nnode == 9) {
816 static size_type lorder[9] = {0,4,1, 7,8,5, 3,6,2};
817 pgt = bgeot::parallelepiped_geotrans(2,2);
818 std::copy(lorder,lorder+nnode,order.begin());
822 if (nnode == 4) pgt = bgeot::simplex_geotrans(3,1);
823 else if (nnode == 10) {
824 static size_type lorder[10] = {0,4,1, 7,8, 3, 6, 5, 9, 2};
825 pgt = bgeot::simplex_geotrans(3,2);
826 std::copy(lorder,lorder+nnode,order.begin());
830 if (nnode == 6) pgt = bgeot::prism_geotrans(3,1);
833 if (nnode == 8) pgt = bgeot::parallelepiped_geotrans(3,1);
834 else if (nnode == 27) {
835 static size_type lorder[27] = {0,8,1, 12,21,13, 4,16,5,
836 11,20,9, 22,26,24, 19,25,17,
837 3,10,2, 15,23,14, 7,18,6};
838 pgt = bgeot::parallelepiped_geotrans(3,2);
839 std::copy(lorder,lorder+nnode,order.begin());
842 default: GMM_ASSERT1(
false,
"");
break;
844 GMM_ASSERT1(pgt != NULL,
"unknown element type " << selemtype
845 <<
" with " << nnode <<
"nodes");
850 if (bgeot::casecmp(ls,
"END ELEMENTS", 12)==0)
break;
851 std::stringstream s; s << ls;
854 cv_nodes.resize(nnode);
858 std::map<size_type, size_type>::iterator
859 it = msh_node_2_getfem_node.find(j);
860 GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
861 "Invalid node ID " << j <<
" in GiD element " << cv_id);
862 cv_nodes[i] = it->second;
864 getfem_cv_nodes.resize(nnode);
866 getfem_cv_nodes[i] = cv_nodes[order[i]];
872 m.add_convex(pgt, getfem_cv_nodes.begin());
884 static void import_cdb_mesh_file(std::istream& f, mesh& m,
887 std::map<size_type, size_type> cdb_node_2_getfem_node;
888 std::vector<size_type> getfem_cv_nodes;
889 std::vector<std::string> elt_types;
890 std::vector<size_type> elt_cnt;
891 std::vector<dal::bit_vector> regions;
896 std::getline(f,line);
897 pos = line.find_first_not_of(
" ");
898 if (bgeot::casecmp(line.substr(pos,2),
"ET") == 0) {
900 std::string type_name;
901 pos = line.find_first_of(
",")+1;
902 pos2 = line.find_first_of(
",", pos);
903 itype = std::stol(line.substr(pos, pos2-pos));
904 pos = line.find_first_not_of(
" ,\n\r\t", pos2);
905 pos2 = line.find_first_of(
" ,\n\r\t", pos);
906 type_name = line.substr(pos, pos2-pos);
908 = (type_name.find_first_not_of(
"0123456789") == std::string::npos);
909 for (
auto&& c : type_name) c = char(std::toupper(c));
911 if (elt_types.size() < itype+1)
912 elt_types.resize(itype+1);
914 elt_types[itype] =
"";
916 size_type type_num = std::stol(type_name);
917 if (type_num == 42 || type_num == 82 ||
918 type_num == 182 || type_num == 183)
919 elt_types[itype] =
"PLANE";
920 else if (type_num == 45 || type_num == 73 || type_num == 87 ||
921 type_num == 90 || type_num == 92 || type_num == 95 ||
922 type_num == 162 || type_num == 185 || type_num == 186 ||
923 type_num == 187 || type_num == 191)
924 elt_types[itype] =
"SOLID";
925 else if (type_num == 89)
926 elt_types[itype] =
"VISCO";
928 elt_types[itype].append(type_name);
930 else if (bgeot::casecmp(line.substr(pos,5),
"KEYOP") == 0) {
932 pos = line.find_first_of(
",")+1;
933 pos2 = line.find_first_of(
",", pos);
934 itype = std::stol(line.substr(pos, pos2-pos));
936 pos2 = line.find_first_of(
",", pos);
937 knum = std::stol(line.substr(pos, pos2-pos));
938 keyval = std::stol(line.substr(pos2+1));
939 if (knum == 1 && itype < elt_types.size() &&
940 elt_types[itype].size() == 7 &&
941 bgeot::casecmp(elt_types[itype].substr(0,7),
"MESH200") == 0) {
942 std::stringstream ss;
943 ss <<
"MESH200_" << keyval;
944 elt_types[itype] = ss.str();
947 else if (bgeot::casecmp(line.substr(pos,6),
"NBLOCK") == 0)
952 elt_cnt.resize(elt_types.size());
955 size_type fields1, fieldwidth1, fields2, fieldwidth2;
957 std::string fortran_fmt;
958 std::getline(f,fortran_fmt);
959 pos = fortran_fmt.find_first_of(
"(")+1;
960 pos2 = fortran_fmt.find_first_of(
"iI", pos);
961 fields1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
963 pos2 = fortran_fmt.find_first_of(
",", pos);
964 fieldwidth1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
966 pos2 = fortran_fmt.find_first_of(
"eE", pos);
967 fields2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
969 pos2 = fortran_fmt.find_first_of(
".", pos);
970 fieldwidth2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
971 GMM_ASSERT1(fields1 >= 1 && fields2 >= 3 ,
972 "Ansys mesh import routine requires NBLOCK entries with at least "
973 "1 integer field and 3 float number fields");
979 std::getline(f,line);
980 if (line.compare(0,1,
"N") == 0 || line.compare(0,1,
"!") == 0)
983 nodeid = std::stol(line.substr(0, fieldwidth1));
984 pos = fields1*fieldwidth1;
985 for (
size_type j=0; j < 3; ++j, pos += fieldwidth2)
986 if (pos < line.length())
987 pt[j] = std::stod(line.substr(pos, fieldwidth2));
991 cdb_node_2_getfem_node[nodeid] = m.add_point(pt, -1.);
994 while (bgeot::casecmp(line.substr(0,6),
"EBLOCK") != 0) {
997 std::getline(f,line);
1004 std::string fortran_fmt;
1005 std::getline(f,fortran_fmt);
1007 pos = fortran_fmt.find_first_of(
"(")+1;
1008 pos2 = fortran_fmt.find_first_of(
"iI", pos);
1009 fieldsno = std::stol(fortran_fmt.substr(pos, pos2-pos));
1011 pos2 = fortran_fmt.find_first_of(
")\n", pos);
1012 fieldwidth = std::stol(fortran_fmt.substr(pos, pos2-pos));
1013 GMM_ASSERT1(fieldsno == 19,
"Ansys mesh import routine requires EBLOCK "
1014 "entries with 19 fields");
1017 size_type II,JJ,KK,LL,MM,NN,OO,PP,QQ,RR,SS,TT,UU,VV,WW,XX,YY,ZZ,AA,BB;
1019 GMM_ASSERT1(!f.eof(),
"File ended before all elements could be read");
1021 std::getline(f,line);
1023 long int ii = std::stol(line.substr(0,fieldwidth));
1029 itype = std::stol(line.substr(fieldwidth,fieldwidth));
1030 nodesno = std::stol(line.substr(8*fieldwidth,fieldwidth));
1031 line = line.substr(11*fieldwidth);
1033 if (imat_filt !=
size_type(-1) && imat != imat_filt) {
1035 std::getline(f,line);
1039 if (nodesno >= 1) II = std::stol(line.substr(0,fieldwidth));
1040 if (nodesno >= 2) JJ = std::stol(line.substr(1*fieldwidth,fieldwidth));
1041 if (nodesno >= 3) KK = std::stol(line.substr(2*fieldwidth,fieldwidth));
1042 if (nodesno >= 4) LL = std::stol(line.substr(3*fieldwidth,fieldwidth));
1043 if (nodesno >= 5) MM = std::stol(line.substr(4*fieldwidth,fieldwidth));
1044 if (nodesno >= 6) NN = std::stol(line.substr(5*fieldwidth,fieldwidth));
1045 if (nodesno >= 7) OO = std::stol(line.substr(6*fieldwidth,fieldwidth));
1046 if (nodesno >= 8) PP = std::stol(line.substr(7*fieldwidth,fieldwidth));
1048 std::getline(f,line);
1049 if (nodesno >= 9) QQ = std::stol(line.substr(0,fieldwidth));
1050 if (nodesno >= 10) RR = std::stol(line.substr(1*fieldwidth,fieldwidth));
1051 if (nodesno >= 11) SS = std::stol(line.substr(2*fieldwidth,fieldwidth));
1052 if (nodesno >= 12) TT = std::stol(line.substr(3*fieldwidth,fieldwidth));
1053 if (nodesno >= 13) UU = std::stol(line.substr(4*fieldwidth,fieldwidth));
1054 if (nodesno >= 14) VV = std::stol(line.substr(5*fieldwidth,fieldwidth));
1055 if (nodesno >= 15) WW = std::stol(line.substr(6*fieldwidth,fieldwidth));
1056 if (nodesno >= 16) XX = std::stol(line.substr(7*fieldwidth,fieldwidth));
1057 if (nodesno >= 17) YY = std::stol(line.substr(8*fieldwidth,fieldwidth));
1058 if (nodesno >= 18) ZZ = std::stol(line.substr(9*fieldwidth,fieldwidth));
1059 if (nodesno >= 19) AA = std::stol(line.substr(10*fieldwidth,fieldwidth));
1060 if (nodesno >= 20) BB = std::stol(line.substr(11*fieldwidth,fieldwidth));
1063 if (imat+1 > regions.size())
1064 regions.resize(imat+1);
1068 std::string eltname(
"MESH200_4");
1069 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1070 eltname = elt_types[itype];
1072 if (eltname.compare(
"MESH200_4") == 0) {
1073 getfem_cv_nodes.resize(3);
1074 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1075 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1076 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1077 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,1),
1078 getfem_cv_nodes.begin()));
1079 if (itype < elt_cnt.size())
1080 elt_cnt[itype] += 1;
1083 GMM_WARNING2(
"Ignoring ANSYS element " << eltname
1084 <<
". Import not supported yet.");
1087 else if (nodesno == 4) {
1090 std::string eltname(
"MESH200_6");
1091 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1092 eltname = elt_types[itype];
1094 if (eltname.compare(
"MESH200_6") == 0 ||
1095 eltname.compare(
"PLANE42") == 0 ||
1096 eltname.compare(
"PLANE182") == 0) {
1097 getfem_cv_nodes.resize(4);
1098 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1099 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1100 getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
1101 getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
1102 regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(2,1),
1103 getfem_cv_nodes.begin()));
1104 if (itype < elt_cnt.size())
1105 elt_cnt[itype] += 1;
1107 else if (eltname.compare(
"MESH200_8") == 0 ||
1108 eltname.compare(
"SOLID72") == 0) {
1109 getfem_cv_nodes.resize(4);
1110 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1111 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1112 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1113 getfem_cv_nodes[3] = cdb_node_2_getfem_node[LL];
1114 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
1115 getfem_cv_nodes.begin()));
1116 if (itype < elt_cnt.size())
1117 elt_cnt[itype] += 1;
1120 else if (nodesno == 6) {
1122 std::string eltname(
"MESH200_5");
1123 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1124 eltname = elt_types[itype];
1125 if (eltname.compare(
"MESH200_5") == 0 ||
1126 eltname.compare(
"PLANE183") == 0) {
1127 getfem_cv_nodes.resize(6);
1128 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1129 getfem_cv_nodes[1] = cdb_node_2_getfem_node[LL];
1130 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1131 getfem_cv_nodes[3] = cdb_node_2_getfem_node[NN];
1132 getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
1133 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1134 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,2),
1135 getfem_cv_nodes.begin()));
1136 if (itype < elt_cnt.size())
1137 elt_cnt[itype] += 1;
1140 else if (nodesno == 8) {
1143 std::string eltname(
"MESH200_10");
1144 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1145 eltname = elt_types[itype];
1147 if (eltname.compare(
"MESH200_7") == 0 ||
1148 eltname.compare(
"PLANE82") == 0 ||
1149 eltname.compare(
"PLANE183") == 0) {
1150 if (KK == LL && KK == OO) {
1151 getfem_cv_nodes.resize(6);
1152 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1153 getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
1154 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1155 getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
1156 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1157 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1158 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,2),
1159 getfem_cv_nodes.begin()));
1161 getfem_cv_nodes.resize(8);
1162 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1163 getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
1164 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1165 getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
1166 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1167 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1168 getfem_cv_nodes[6] = cdb_node_2_getfem_node[OO];
1169 getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
1170 regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(2),
1171 getfem_cv_nodes.begin()));
1173 if (itype < elt_cnt.size())
1174 elt_cnt[itype] += 1;
1176 else if (eltname.compare(
"MESH200_10") == 0 ||
1177 eltname.compare(
"SOLID45") == 0 ||
1178 eltname.compare(
"SOLID185") == 0) {
1179 if (KK == LL && OO == PP) {
1180 if (MM == NN && NN == OO) {
1181 getfem_cv_nodes.resize(4);
1182 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1183 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1184 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1185 getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
1186 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
1187 getfem_cv_nodes.begin()));
1190 getfem_cv_nodes.resize(6);
1191 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1192 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1193 getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
1194 getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
1195 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1196 getfem_cv_nodes[5] = cdb_node_2_getfem_node[OO];
1197 regions[imat].add(m.add_convex(bgeot::prism_geotrans(3,1),
1198 getfem_cv_nodes.begin()));
1202 getfem_cv_nodes.resize(8);
1203 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1204 getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
1205 getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
1206 getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
1207 getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
1208 getfem_cv_nodes[5] = cdb_node_2_getfem_node[NN];
1209 getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
1210 getfem_cv_nodes[7] = cdb_node_2_getfem_node[OO];
1211 regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(3,1),
1212 getfem_cv_nodes.begin()));
1214 if (itype < elt_cnt.size())
1215 elt_cnt[itype] += 1;
1218 else if (nodesno == 10) {
1221 std::string eltname(
"MESH200_9");
1222 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1223 eltname = elt_types[itype];
1225 if (eltname.compare(
"MESH200_9") == 0 ||
1226 eltname.compare(
"SOLID87") == 0 ||
1227 eltname.compare(
"SOLID92") == 0 ||
1228 eltname.compare(
"SOLID162") == 0 ||
1229 eltname.compare(
"SOLID187") == 0) {
1230 getfem_cv_nodes.resize(10);
1231 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1232 getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
1233 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1234 getfem_cv_nodes[3] = cdb_node_2_getfem_node[OO];
1235 getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
1236 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1237 getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
1238 getfem_cv_nodes[7] = cdb_node_2_getfem_node[QQ];
1239 getfem_cv_nodes[8] = cdb_node_2_getfem_node[RR];
1240 getfem_cv_nodes[9] = cdb_node_2_getfem_node[LL];
1241 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
1242 getfem_cv_nodes.begin()));
1243 if (itype < elt_cnt.size())
1244 elt_cnt[itype] += 1;
1247 else if (nodesno == 20) {
1250 std::string eltname(
"MESH200_11");
1251 if (elt_types.size() > itype && elt_types[itype].size() > 0)
1252 eltname = elt_types[itype];
1254 if (eltname.compare(
"MESH200_11") == 0 ||
1255 eltname.compare(
"VISCO89") == 0 ||
1256 eltname.compare(
"SOLID90") == 0 ||
1257 eltname.compare(
"SOLID95") == 0 ||
1258 eltname.compare(
"SOLID186") == 0 ||
1259 eltname.compare(
"SOLID191") == 0) {
1260 if (KK == LL && MM == NN && NN == OO && OO == PP) {
1261 getfem_cv_nodes.resize(10);
1262 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1263 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1264 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1265 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1266 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1267 getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
1268 getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
1269 getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
1270 getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
1271 getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
1272 regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
1273 getfem_cv_nodes.begin()));
1274 if (itype < elt_cnt.size())
1275 elt_cnt[itype] += 1;
1276 }
else if (MM == NN && NN == OO && OO == PP) {
1277 getfem_cv_nodes.resize(13);
1278 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1279 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1280 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1281 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1282 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1283 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1284 getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
1285 getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
1286 getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
1287 getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
1288 getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
1289 getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
1290 getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
1291 regions[imat].add(m.add_convex(bgeot::pyramid_Q2_incomplete_geotrans(),
1292 getfem_cv_nodes.begin()));
1293 if (itype < elt_cnt.size())
1294 elt_cnt[itype] += 1;
1296 }
else if (KK == LL && OO == PP) {
1297 getfem_cv_nodes.resize(15);
1298 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1299 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1300 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1301 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1302 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1303 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1304 getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
1305 getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
1306 getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
1307 getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
1308 getfem_cv_nodes[10] = cdb_node_2_getfem_node[UU];
1309 getfem_cv_nodes[11] = cdb_node_2_getfem_node[NN];
1310 getfem_cv_nodes[12] = cdb_node_2_getfem_node[XX];
1311 getfem_cv_nodes[13] = cdb_node_2_getfem_node[VV];
1312 getfem_cv_nodes[14] = cdb_node_2_getfem_node[OO];
1313 regions[imat].add(m.add_convex
1314 (bgeot::prism_incomplete_P2_geotrans(),
1315 getfem_cv_nodes.begin()));
1316 if (itype < elt_cnt.size())
1317 elt_cnt[itype] += 1;
1319 getfem_cv_nodes.resize(20);
1320 getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
1321 getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
1322 getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
1323 getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
1324 getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
1325 getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
1326 getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
1327 getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
1328 getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
1329 getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
1330 getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
1331 getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
1332 getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
1333 getfem_cv_nodes[13] = cdb_node_2_getfem_node[UU];
1334 getfem_cv_nodes[14] = cdb_node_2_getfem_node[NN];
1335 getfem_cv_nodes[15] = cdb_node_2_getfem_node[XX];
1336 getfem_cv_nodes[16] = cdb_node_2_getfem_node[VV];
1337 getfem_cv_nodes[17] = cdb_node_2_getfem_node[PP];
1338 getfem_cv_nodes[18] = cdb_node_2_getfem_node[WW];
1339 getfem_cv_nodes[19] = cdb_node_2_getfem_node[OO];
1340 regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(3),
1341 getfem_cv_nodes.begin()));
1342 if (itype < elt_cnt.size())
1343 elt_cnt[itype] += 1;
1349 int nonempty_regions=0;
1350 for (
size_type i=0; i < regions.size(); ++i)
1351 if (regions[i].card() > 0)
1354 if (nonempty_regions > 1)
1355 for (
size_type i=0; i < regions.size(); ++i)
1356 if (regions[i].card() > 0)
1357 m.region(i).add(regions[i]);
1359 for (
size_type i=1; i < elt_types.size(); ++i)
1361 cout <<
"Imported " << elt_cnt[i] <<
" " << elt_types[i] <<
" elements." << endl;
1362 cout <<
"Imported " << m.convex_index().card() <<
" elements in total." << endl;
1367 static double round_to_nth_significant_number(
double x,
int ndec) {
1369 double s = (x < 0 ? -1 : 1);
1370 double pdec = pow(10.,
double(ndec));
1371 if (x == 0)
return 0.;
1373 while (x > 1) { x /= 10.0; p*=10; }
1374 while (x < 0.1) { x *= 10.0; p/=10; }
1376 x = s * (floor(x * pdec + 0.5) / pdec) * p;
1382 static void import_noboite_mesh_file(std::istream& f, mesh& m) {
1384 using namespace std;
1385 gmm::stream_standard_locale sl(f);
1387 ofstream fichier_GiD(
"noboite_to_GiD.gid", ios::out | ios::trunc );
1389 fichier_GiD <<
"MESH dimension 3 ElemType Tetrahedra Nnode 4"<<endl;
1392 int i,NE,NP,ligne_debut_NP;
1400 ligne_debut_NP=NE*4/6+3;
1405 for (i=1; i<=ligne_debut_NP; i++){
1406 getline(f, contenu);
1413 fichier_GiD <<
"Coordinates" <<endl;
1415 for (i=1; i<=NP; i++){
1416 float coor_x,coor_y,coor_z;
1418 fichier_GiD << i<<
" ";
1420 f>>coor_x >>coor_y >>coor_z;
1421 fichier_GiD<<coor_x<<
" " <<coor_y <<
" "<<coor_z <<endl;
1425 fichier_GiD <<
"end coordinates" <<endl<<endl;
1432 f.seekg(0, ios::beg);
1433 for (i=1; i<=3; i++){
1434 getline(f, contenu);
1438 fichier_GiD <<
"Elements" <<endl;
1440 for (i=1; i<=NE; i++){
1441 float elem_1,elem_2,elem_3,elem_4;
1443 fichier_GiD << i<<
" ";
1444 f>>elem_1>>elem_2>>elem_3>>elem_4;
1445 fichier_GiD<<elem_1<<
" " <<elem_2 <<
" "<<elem_3<<
" "<<elem_4<<
" 1"<<endl;
1448 fichier_GiD <<
"end elements" <<endl<<endl;
1453 fichier_GiD.close();
1456 cerr <<
"Erreur à l'ouverture !" << endl;
1464 cerr <<
"Erreur à l'ouverture !" << endl;
1468 ifstream fichier1_GiD(
"noboite_to_GiD.gid", ios::in);
1469 import_gid_mesh_file(fichier1_GiD, m);
1478 static void import_am_fmt_mesh_file(std::istream& f, mesh& m) {
1479 gmm::stream_standard_locale sl(f);
1481 std::vector<size_type> tri;
1484 f >> nbs >> nbt; bgeot::read_until(f,
"\n");
1486 for (
size_type i=0; i < nbt*3; ++i) f >> tri[i];
1490 P[0]=round_to_nth_significant_number(P[0],6);
1491 P[1]=round_to_nth_significant_number(P[1],6);
1493 GMM_ASSERT1(jj == j,
"ouch");
1496 m.add_triangle(tri[i]-1,tri[i+1]-1,tri[i+2]-1);
1503 static void import_emc2_mesh_file(std::istream& f, mesh& m) {
1504 gmm::stream_standard_locale sl(f);
1506 std::vector<size_type> tri;
1509 bgeot::read_until(f,
"Vertices");
1512 f >> P[0] >> P[1] >> dummy;
1514 GMM_ASSERT1(jj == j,
"ouch");
1520 if (ls.find(
"Triangles")+1) {
1523 f >> ip[0] >> ip[1] >> ip[2] >> dummy; ip[0]--; ip[1]--; ip[2]--;
1524 m.add_triangle(ip[0],ip[1],ip[2]);
1526 }
else if (ls.find(
"Quadrangles")+1) {
1529 f >> ip[0] >> ip[1] >> ip[2] >> ip[3] >> dummy; ip[0]--; ip[1]--; ip[2]--; ip[3]--;
1530 m.add_parallelepiped(2, &ip[0]);
1532 }
else if (ls.find(
"End")+1)
break;
1536 void import_mesh(
const std::string& filename,
const std::string& format,
1541 if (bgeot::casecmp(format,
"structured")==0)
1543 else if (bgeot::casecmp(format,
"structured_ball")==0)
1545 else if (bgeot::casecmp(format,
"structured_ball_shell")==0)
1548 std::ifstream f(filename.c_str());
1549 GMM_ASSERT1(f.good(),
"can't open file " << filename);
1551 f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
1555 catch (std::logic_error& exc) {
1559 catch (std::ios_base::failure& exc) {
1561 GMM_ASSERT1(
false,
"error while importing " << format
1562 <<
" mesh file \"" << filename <<
"\" : " << exc.what());
1564 catch (std::runtime_error& exc) {
1571 std::map<std::string, size_type> ®ion_map,
1572 bool remove_last_dimension,
1573 std::map<
size_type, std::set<size_type>> *nodal_map,
1574 bool remove_duplicated_nodes)
1576 import_gmsh_mesh_file(f, m, 0, ®ion_map,
nullptr,
false, remove_last_dimension, nodal_map,
1577 remove_duplicated_nodes);
1581 bool add_all_element_type,
1582 std::set<size_type> *lower_dim_convex_rg,
1583 std::map<std::string, size_type> *region_map,
1584 bool remove_last_dimension,
1585 std::map<
size_type, std::set<size_type>> *nodal_map,
1586 bool remove_duplicated_nodes)
1588 import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, add_all_element_type,
1589 remove_last_dimension, nodal_map, remove_duplicated_nodes);
1593 bool add_all_element_type,
1594 std::set<size_type> *lower_dim_convex_rg,
1595 std::map<std::string, size_type> *region_map,
1596 bool remove_last_dimension,
1597 std::map<
size_type, std::set<size_type>> *nodal_map,
1598 bool remove_duplicated_nodes)
1602 std::ifstream f(filename.c_str());
1603 GMM_ASSERT1(f.good(),
"can't open file " << filename);
1605 f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
1606 import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, add_all_element_type,
1607 remove_last_dimension, nodal_map, remove_duplicated_nodes);
1610 catch (std::logic_error& exc) {
1614 catch (std::ios_base::failure& exc) {
1616 GMM_ASSERT1(
false,
"error while importing " <<
"gmsh"
1617 <<
" mesh file \"" << filename <<
"\" : " << exc.what());
1619 catch (std::runtime_error& exc) {
1626 mesh& m, std::map<std::string, size_type> ®ion_map,
1627 bool remove_last_dimension,
1628 std::map<
size_type, std::set<size_type>> *nodal_map,
1629 bool remove_duplicated_nodes) {
1630 import_mesh_gmsh(filename, m,
false, NULL, ®ion_map, remove_last_dimension, nodal_map,
1631 remove_duplicated_nodes);
1634 void import_mesh(std::istream& f,
const std::string& format,
1636 if (bgeot::casecmp(format,
"gmsh")==0)
1637 import_gmsh_mesh_file(f,m);
1638 else if (bgeot::casecmp(format,
"gmsh_with_lower_dim_elt")==0)
1639 import_gmsh_mesh_file(f,m,0,NULL,NULL,
true);
1640 else if (bgeot::casecmp(format,
"gmshv2")==0)
1641 import_gmsh_mesh_file(f,m,2);
1642 else if (bgeot::casecmp(format,
"gid")==0)
1643 import_gid_mesh_file(f,m);
1644 else if (bgeot::casecmp(format,
"noboite")==0)
1645 import_noboite_mesh_file(f,m);
1646 else if (bgeot::casecmp(format,
"am_fmt")==0)
1647 import_am_fmt_mesh_file(f,m);
1648 else if (bgeot::casecmp(format,
"emc2_mesh")==0)
1649 import_emc2_mesh_file(f,m);
1650 else if (bgeot::casecmp(format,
"cdb")==0)
1651 import_cdb_mesh_file(f,m);
1652 else if (bgeot::casecmp(format.substr(0,4),
"cdb:")==0) {
1657 imat = std::stol(format.substr(4), &sz);
1658 success = (sz == format.substr(4).size() && imat !=
size_type(-1));
1659 }
catch (
const std::invalid_argument&) {
1661 }
catch (
const std::out_of_range&) {
1665 import_cdb_mesh_file(f,m,imat);
1666 else GMM_ASSERT1(
false,
"cannot import "
1667 << format <<
" mesh type : wrong cdb mesh type input");
1669 else GMM_ASSERT1(
false,
"cannot import "
1670 << format <<
" mesh type : unknown mesh type");
1673 void import_mesh(
const std::string& filename, mesh& msh) {
1674 size_type pos = filename.find_last_of(
":");
1675 if (pos != std::string::npos)
1678 msh.read_from_file(filename);
1682 bool is_flat =
true;
1683 unsigned N = m.dim();
if (N < 1)
return;
1684 for (dal::bv_visitor i(m.points().index()); !i.finished(); ++i)
1685 if (m.points()[i][N-1] != 0) is_flat = 0;
1687 base_matrix M(N-1,N);
1688 for (
unsigned i=0; i < N-1; ++i) M(i,i) = 1;
Describe a mesh (collection of convexes (elements) and points).
void transformation(const base_matrix &)
apply the given matrix transformation to each mesh node.
void clear()
Erase the mesh.
Import mesh files from various formats.
Define a getfem::getfem_mesh object.
gmm::uint16_type short_type
used as the common short type integer in the library
std::string name_of_geometric_trans(pgeometric_trans p)
Get the string name of a geometric transformation.
size_t size_type
used as the common size type in the library
std::shared_ptr< const bgeot::geometric_trans > pgeometric_trans
pointer type for a geometric transformation
GEneric Tool for Finite Element Methods.
void regular_mesh(mesh &m, const std::string &st)
Build a regular mesh parametrized by the string st.
void regular_ball_mesh(mesh &m, const std::string &st)
Build a regular mesh on a ball, parametrized by the string st.
void maybe_remove_last_dimension(mesh &msh)
for gmsh and gid meshes, the mesh nodes are always 3D, so for a 2D mesh the z-component of nodes shou...
void import_mesh(const std::string &filename, const std::string &format, mesh &m)
imports a mesh file.
void import_mesh_gmsh(const std::string &filename, mesh &m, std::map< std::string, size_type > ®ion_map, bool remove_last_dimension=true, std::map< size_type, std::set< size_type >> *nodal_map=NULL, bool remove_duplicated_nodes=true)
Import a mesh file in format generated by Gmsh.
void regular_ball_shell_mesh(mesh &m, const std::string &st)
Build a regular mesh on a ball shell, parametrized by the string st.
std::map< std::string, size_type > read_region_names_from_gmsh_mesh_file(std::istream &f)
for gmsh meshes, create table linking region name to region_id.