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
 
  224   (std::istream& f, mesh& m, 
int deprecate=0,
 
  225    std::map<std::string, size_type> *region_map=NULL,
 
  226    std::set<size_type> *lower_dim_convex_rg=NULL,
 
  227    bool add_all_element_type = 
false,
 
  228    bool remove_last_dimension = 
true,
 
  229    std::map<
size_type, std::set<size_type>> *nodal_map = NULL,
 
  230    bool remove_duplicated_nodes = 
true) {
 
  231     gmm::stream_standard_locale sl(f);
 
  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);
 
  330     for (
size_type block=0; block < nb_block; ++block) {
 
  331       unsigned dimr, type, region;
 
  333         f >> dimr >> region >> type >> nb_cv;
 
  334         if (reg.is_in(region)) {
 
  335           GMM_WARNING2(
"Two regions share the same number, " 
  336                        "the region numbering is modified");
 
  337           while (reg.is_in(region)) region += 5;
 
  343         cvlst.push_back(gmsh_cv_info());
 
  344         gmsh_cv_info &ci = cvlst.back();
 
  348         unsigned cv_nb_nodes;
 
  350           if (
int(version) == 2) { 
 
  353             GMM_ASSERT1(nbtags > 0 && nbtags <= 3,
 
  354                         "Number of tags " << nbtags << 
" is not managed.");
 
  356             if (nbtags > 1) f >> dummy;
 
  357             if (nbtags > 2) f >> dummy;
 
  361           cv_nb_nodes = unsigned(ci.nodes.size());
 
  362         } 
else if (
int(version) == 1) {
 
  363           f >> type >> region >> dummy >> cv_nb_nodes;
 
  365           ci.nodes.resize(cv_nb_nodes);
 
  371         for (
size_type i=0; i < cv_nb_nodes; ++i) {
 
  374           const auto it = msh_node_2_getfem_node.find(j);
 
  375           GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
 
  376                       "Invalid node ID " << j << 
" in gmsh element " 
  378           ci.nodes[i] = it->second;
 
  384         std::vector<size_type> tmp_nodes(ci.nodes);
 
  387           ci.nodes[2] = tmp_nodes[3];
 
  388           ci.nodes[3] = tmp_nodes[2];
 
  393           ci.nodes[2] = tmp_nodes[3];
 
  394           ci.nodes[3] = tmp_nodes[2];
 
  397           ci.nodes[6] = tmp_nodes[7];
 
  398           ci.nodes[7] = tmp_nodes[6];
 
  402           ci.nodes[1] = tmp_nodes[2];
 
  403           ci.nodes[2] = tmp_nodes[1];
 
  409           ci.nodes[1] = tmp_nodes[2];
 
  410           ci.nodes[2] = tmp_nodes[1];
 
  414           ci.nodes[1] = tmp_nodes[3];
 
  415           ci.nodes[2] = tmp_nodes[1];
 
  416           ci.nodes[3] = tmp_nodes[5];
 
  418           ci.nodes[5] = tmp_nodes[2];
 
  422           ci.nodes[1] = tmp_nodes[4];
 
  423           ci.nodes[2] = tmp_nodes[1];
 
  424           ci.nodes[3] = tmp_nodes[7];
 
  425           ci.nodes[4] = tmp_nodes[8];
 
  427           ci.nodes[6] = tmp_nodes[3];
 
  428           ci.nodes[7] = tmp_nodes[6];
 
  429           ci.nodes[8] = tmp_nodes[2];
 
  433           ci.nodes[1] = tmp_nodes[4];
 
  434           ci.nodes[2] = tmp_nodes[1];
 
  435           ci.nodes[3] = tmp_nodes[6];
 
  436           ci.nodes[4] = tmp_nodes[5];
 
  437           ci.nodes[5] = tmp_nodes[2];
 
  438           ci.nodes[6] = tmp_nodes[7];
 
  439           ci.nodes[7] = tmp_nodes[9];
 
  441           ci.nodes[9] = tmp_nodes[3];
 
  445           ci.nodes[1] = tmp_nodes[8];
 
  446           ci.nodes[2] = tmp_nodes[1];
 
  447           ci.nodes[3] = tmp_nodes[9];
 
  448           ci.nodes[4] = tmp_nodes[20];
 
  449           ci.nodes[5] = tmp_nodes[11];
 
  450           ci.nodes[6] = tmp_nodes[3];
 
  451           ci.nodes[7] = tmp_nodes[13];
 
  452           ci.nodes[8] = tmp_nodes[2];
 
  453           ci.nodes[9] = tmp_nodes[10];
 
  454           ci.nodes[10] = tmp_nodes[21];
 
  455           ci.nodes[11] = tmp_nodes[12];
 
  456           ci.nodes[12] = tmp_nodes[22];
 
  457           ci.nodes[13] = tmp_nodes[26];
 
  458           ci.nodes[14] = tmp_nodes[23];
 
  460           ci.nodes[16] = tmp_nodes[24];
 
  461           ci.nodes[17] = tmp_nodes[14];
 
  462           ci.nodes[18] = tmp_nodes[4];
 
  463           ci.nodes[19] = tmp_nodes[16];
 
  464           ci.nodes[20] = tmp_nodes[5];
 
  465           ci.nodes[21] = tmp_nodes[17];
 
  466           ci.nodes[22] = tmp_nodes[25];
 
  467           ci.nodes[23] = tmp_nodes[18];
 
  468           ci.nodes[24] = tmp_nodes[7];
 
  469           ci.nodes[25] = tmp_nodes[19];
 
  470           ci.nodes[26] = tmp_nodes[6];
 
  474           ci.nodes[1] = tmp_nodes[4];
 
  475           ci.nodes[2] = tmp_nodes[1];
 
  476           ci.nodes[3] = tmp_nodes[7];
 
  477           ci.nodes[4] = tmp_nodes[5];
 
  478           ci.nodes[5] = tmp_nodes[3];
 
  479           ci.nodes[6] = tmp_nodes[6];
 
  480           ci.nodes[7] = tmp_nodes[2];
 
  484           ci.nodes[1] = tmp_nodes[8];
 
  485           ci.nodes[2] = tmp_nodes[1];
 
  486           ci.nodes[3] = tmp_nodes[9];
 
  487           ci.nodes[4] = tmp_nodes[11];
 
  488           ci.nodes[5] = tmp_nodes[3];
 
  489           ci.nodes[6] = tmp_nodes[13];
 
  490           ci.nodes[7] = tmp_nodes[2];
 
  491           ci.nodes[8] = tmp_nodes[10];
 
  492           ci.nodes[9] = tmp_nodes[12];
 
  493           ci.nodes[10] = tmp_nodes[15];
 
  494           ci.nodes[11] = tmp_nodes[14];
 
  495           ci.nodes[12] = tmp_nodes[4];
 
  496           ci.nodes[13] = tmp_nodes[16];
 
  497           ci.nodes[14] = tmp_nodes[5];
 
  498           ci.nodes[15] = tmp_nodes[17];
 
  499           ci.nodes[16] = tmp_nodes[18];
 
  500           ci.nodes[17] = tmp_nodes[7];
 
  501           ci.nodes[18] = tmp_nodes[19];
 
  502           ci.nodes[19] = tmp_nodes[6];
 
  506           ci.nodes[1] = tmp_nodes[2];
 
  507           ci.nodes[2] = tmp_nodes[3];
 
  508           ci.nodes[3] = tmp_nodes[1];
 
  512           ci.nodes[1] = tmp_nodes[3];
 
  513           ci.nodes[2] = tmp_nodes[4];
 
  514           ci.nodes[3] = tmp_nodes[1];
 
  515           ci.nodes[4] = tmp_nodes[8];
 
  516           ci.nodes[5] = tmp_nodes[9];
 
  517           ci.nodes[6] = tmp_nodes[5];
 
  519           ci.nodes[8] = tmp_nodes[6];
 
  520           ci.nodes[9] = tmp_nodes[2];
 
  524           ci.nodes[1]  = tmp_nodes[3];
 
  525           ci.nodes[2]  = tmp_nodes[4];
 
  526           ci.nodes[3]  = tmp_nodes[5];
 
  527           ci.nodes[4]  = tmp_nodes[1];
 
  528           ci.nodes[5]  = tmp_nodes[11];
 
  529           ci.nodes[6]  = tmp_nodes[12];
 
  530           ci.nodes[7]  = tmp_nodes[13];
 
  531           ci.nodes[8]  = tmp_nodes[6];
 
  532           ci.nodes[9]  = tmp_nodes[10];
 
  533           ci.nodes[10] = tmp_nodes[14];
 
  534           ci.nodes[11] = tmp_nodes[7];
 
  535           ci.nodes[12] = tmp_nodes[9];
 
  536           ci.nodes[13] = tmp_nodes[8];
 
  537           ci.nodes[14] = tmp_nodes[2];
 
  541           ci.nodes[1]  = tmp_nodes[2];
 
  542           ci.nodes[2]  = tmp_nodes[3];
 
  543           ci.nodes[3]  = tmp_nodes[4];
 
  544           ci.nodes[4]  = tmp_nodes[1];
 
  550     nb_cv = cvlst.size();
 
  552       std::sort(cvlst.begin(), cvlst.end());
 
  553       if (cvlst.front().type == 15) {
 
  554         GMM_WARNING2(
"Only nodes defined in the mesh! No elements are added.");
 
  558       unsigned N = cvlst.front().pgt->dim();
 
  561         gmsh_cv_info &ci = cvlst[cv];
 
  562         bool is_node = (ci.type == 15);
 
  563         unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
 
  569           size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
 
  571           m.region(ci.region).add(ic);
 
  578           if (lower_dim_convex_rg != NULL &&
 
  579               lower_dim_convex_rg->find(ci.region) != lower_dim_convex_rg->end()
 
  581               size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
 
  582               cvok = 
true; m.region(ci.region).add(ic);
 
  586             bgeot::mesh_structure::ind_cv_ct ct=m.convex_to_point(ci.nodes[0]);
 
  587             for (bgeot::mesh_structure::ind_cv_ct::const_iterator
 
  588                    it = ct.begin(); it != ct.end(); ++it) {
 
  589               if (m.structure_of_convex(*it)->dim() == ci_dim + 1) {
 
  591                      face < m.structure_of_convex(*it)->nb_faces(); ++face) {
 
  592                   if (m.is_convex_face_having_points(*it, face,
 
  595                     m.region(ci.region).add(*it,face);
 
  601             if (is_node && (nodal_map != NULL)) {
 
  602               for (
auto i : ci.nodes) (*nodal_map)[ci.region].insert(i);
 
  607                 if (nodal_map == NULL){
 
  608                   GMM_WARNING2(
"gmsh import ignored a node id: " 
  609                                << ci.id << 
" region :" << ci.region <<
 
  610                                " point is not added explicitly as an element.");
 
  613               else if (add_all_element_type) {
 
  614                 size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
 
  615                 m.region(ci.region).add(ic);
 
  618                 GMM_WARNING2(
"gmsh import ignored an element of type " 
  620                     " as it does not belong to the face of another element");
 
  634   static void import_gid_mesh_file(std::istream& f, mesh& m) {
 
  635     gmm::stream_standard_locale sl(f);
 
  638     enum { LIN,TRI,QUAD,TETR, PRISM, HEX,BADELTYPE } eltype=BADELTYPE;
 
  640     std::map<size_type, size_type> msh_node_2_getfem_node;
 
  641     std::vector<size_type> cv_nodes, getfem_cv_nodes;
 
  642     bool nodes_done = 
false;
 
  644       if (!f.eof()) f >> std::ws;
 
  645       if (f.eof() || !bgeot::read_until(f, 
"MESH")) 
break;
 
  646       std::string selemtype;
 
  647       f >> bgeot::skip(
"DIMENSION") >> dim
 
  648         >> bgeot::skip(
"ELEMTYPE") >> std::ws
 
  650         >> bgeot::skip(
"NNODE") >> nnode;
 
  651       if (bgeot::casecmp(selemtype, 
"linear")==0) { eltype = LIN;  }
 
  652       else if (bgeot::casecmp(selemtype, 
"triangle")==0) { eltype = TRI; }
 
  653       else if (bgeot::casecmp(selemtype, 
"quadrilateral")==0) { eltype = QUAD; }
 
  654       else if (bgeot::casecmp(selemtype, 
"tetrahedra")==0) { eltype = TETR; }
 
  655       else if (bgeot::casecmp(selemtype, 
"prisma")==0) { eltype = PRISM; }
 
  656       else if (bgeot::casecmp(selemtype, 
"hexahedra")==0) { eltype = HEX; }
 
  657       else GMM_ASSERT1(
false, 
"unknown element type '"<< selemtype << 
"'");
 
  658       GMM_ASSERT1(!f.eof(), 
"File ended before coordinates");
 
  659       f >> bgeot::skip(
"COORDINATES");
 
  662         dal::bit_vector gid_nodes_used;
 
  668           if (bgeot::casecmp(ls, 
"END COORDINATES", 15)==0) 
break;
 
  669           std::stringstream s; s << ls;
 
  673           gid_nodes[id].resize(dim); gid_nodes_used.add(
id);
 
  674           for (
size_type i=0; i < dim; ++i) s >> gid_nodes[id][i];
 
  678         GMM_ASSERT1(gid_nodes_used.card() != 0, 
"no nodes in the mesh!");
 
  681         std::vector<bool> direction_useless(3,
true);
 
  682         base_node first_pt = gid_nodes[gid_nodes_used.first()];
 
  683         for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
 
  684           for (
size_type j=0; j < first_pt.size(); ++j) {
 
  685             if (direction_useless[j] && (gmm::abs(gid_nodes[ip][j]-first_pt[j]) > 1e-13))
 
  686               direction_useless[j] = 
false;
 
  690         for (
size_type j=0; j < dim; ++j) 
if (!direction_useless[j]) dim2++;
 
  691         for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
 
  693           for (
size_type j=0, cnt=0; j < dim; ++j) 
if (!direction_useless[j]) n[cnt++]=gid_nodes[ip][j];
 
  694           msh_node_2_getfem_node[ip] = m.add_point(n);
 
  698       bgeot::read_until(f, 
"ELEMENTS");
 
  700       std::vector<size_type> order(nnode); 
 
  701       for (
size_type i=0; i < nnode; ++i) order[i]=i;
 
  705         if (nnode == 2) pgt = bgeot::simplex_geotrans(1,1);
 
  706         else if (nnode == 3) {
 
  707           pgt = bgeot::simplex_geotrans(1,2); 
 
  708           std::swap(order[1],order[2]);
 
  712         if (nnode == 3) pgt = bgeot::simplex_geotrans(2,1);
 
  713         else if (nnode == 6) { 
 
  714           static size_type lorder[6] = {0,3,1,5,4,2};
 
  715           pgt = bgeot::simplex_geotrans(2,2);
 
  716           std::copy(lorder,lorder+nnode,order.begin());
 
  720         if (nnode == 4) pgt = bgeot::parallelepiped_geotrans(2,1);
 
  721         else if (nnode == 9) {
 
  722           static size_type lorder[9] = {0,4,1, 7,8,5, 3,6,2};
 
  723           pgt = bgeot::parallelepiped_geotrans(2,2);
 
  724           std::copy(lorder,lorder+nnode,order.begin());
 
  728         if (nnode == 4) pgt = bgeot::simplex_geotrans(3,1);
 
  729         else if (nnode == 10) { 
 
  730           static size_type lorder[10] = {0,4,1, 7,8, 3, 6, 5, 9, 2};
 
  731           pgt = bgeot::simplex_geotrans(3,2);
 
  732           std::copy(lorder,lorder+nnode,order.begin());
 
  736         if (nnode == 6) pgt = bgeot::prism_geotrans(3,1);
 
  739         if (nnode == 8) pgt = bgeot::parallelepiped_geotrans(3,1);
 
  740         else if (nnode == 27) {
 
  741           static size_type lorder[27] = {0,8,1, 12,21,13, 4,16,5,
 
  742                                          11,20,9, 22,26,24, 19,25,17,
 
  743                                          3,10,2, 15,23,14, 7,18,6};
 
  744           pgt = bgeot::parallelepiped_geotrans(3,2);
 
  745           std::copy(lorder,lorder+nnode,order.begin());
 
  748       default: GMM_ASSERT1(
false, 
""); 
break;
 
  750       GMM_ASSERT1(pgt != NULL, 
"unknown element type " << selemtype
 
  751                   << 
" with " << nnode << 
"nodes");
 
  756         if (bgeot::casecmp(ls, 
"END ELEMENTS", 12)==0) 
break;
 
  757         std::stringstream s; s << ls;
 
  760         cv_nodes.resize(nnode);
 
  764           std::map<size_type, size_type>::iterator
 
  765             it = msh_node_2_getfem_node.find(j);
 
  766           GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
 
  767                       "Invalid node ID " << j << 
" in GiD element " << cv_id);
 
  768           cv_nodes[i] = it->second;
 
  770         getfem_cv_nodes.resize(nnode);
 
  772           getfem_cv_nodes[i] = cv_nodes[order[i]];
 
  778         m.add_convex(pgt, getfem_cv_nodes.begin());
 
  790   static void import_cdb_mesh_file(std::istream& f, mesh& m,
 
  793     std::map<size_type, size_type> cdb_node_2_getfem_node;
 
  794     std::vector<size_type> getfem_cv_nodes;
 
  795     std::vector<std::string> elt_types;
 
  796     std::vector<size_type> elt_cnt;
 
  797     std::vector<dal::bit_vector> regions;
 
  802       std::getline(f,line);
 
  803       pos = line.find_first_not_of(
" ");
 
  804       if (bgeot::casecmp(line.substr(pos,2),
"ET") == 0) {
 
  806         std::string type_name;
 
  807         pos = line.find_first_of(
",")+1;
 
  808         pos2 = line.find_first_of(
",", pos);
 
  809         itype = std::stol(line.substr(pos, pos2-pos));
 
  810         pos = line.find_first_not_of(
" ,\n\r\t", pos2);
 
  811         pos2 = line.find_first_of(
" ,\n\r\t", pos);
 
  812         type_name = line.substr(pos, pos2-pos);
 
  814           = (type_name.find_first_not_of(
"0123456789") == std::string::npos);
 
  815         for (
auto&& c : type_name) c = char(std::toupper(c));
 
  817         if (elt_types.size() < itype+1)
 
  818           elt_types.resize(itype+1);
 
  820         elt_types[itype] = 
"";
 
  822           size_type type_num = std::stol(type_name);
 
  823           if (type_num == 42 || type_num == 82 ||
 
  824               type_num == 182 || type_num == 183)
 
  825             elt_types[itype] = 
"PLANE";
 
  826           else if (type_num == 45 || type_num == 73 || type_num == 87 ||
 
  827                    type_num == 90 || type_num == 92 || type_num == 95 ||
 
  828                    type_num == 162 || type_num == 185 || type_num == 186 ||
 
  829                    type_num == 187 || type_num == 191)
 
  830             elt_types[itype] = 
"SOLID";
 
  831           else if (type_num == 89)
 
  832             elt_types[itype] = 
"VISCO";
 
  834         elt_types[itype].append(type_name);
 
  836       else if (bgeot::casecmp(line.substr(pos,5),
"KEYOP") == 0) {
 
  838         pos = line.find_first_of(
",")+1;
 
  839         pos2 = line.find_first_of(
",", pos);
 
  840         itype = std::stol(line.substr(pos, pos2-pos));
 
  842         pos2 = line.find_first_of(
",", pos);
 
  843         knum = std::stol(line.substr(pos, pos2-pos));
 
  844         keyval = std::stol(line.substr(pos2+1));
 
  845         if (knum == 1 && itype < elt_types.size() &&
 
  846             elt_types[itype].size() == 7 &&
 
  847             bgeot::casecmp(elt_types[itype].substr(0,7),
"MESH200") == 0) {
 
  848           std::stringstream ss;
 
  849           ss << 
"MESH200_" << keyval;
 
  850           elt_types[itype] = ss.str();
 
  853       else if (bgeot::casecmp(line.substr(pos,6),
"NBLOCK") == 0)
 
  858     elt_cnt.resize(elt_types.size());
 
  861     size_type fields1, fieldwidth1, fields2, fieldwidth2; 
 
  863       std::string fortran_fmt; 
 
  864       std::getline(f,fortran_fmt);
 
  865       pos = fortran_fmt.find_first_of(
"(")+1;
 
  866       pos2 = fortran_fmt.find_first_of(
"iI", pos);
 
  867       fields1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
 
  869       pos2 = fortran_fmt.find_first_of(
",", pos);
 
  870       fieldwidth1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
 
  872       pos2 = fortran_fmt.find_first_of(
"eE", pos);
 
  873       fields2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
 
  875       pos2 = fortran_fmt.find_first_of(
".", pos);
 
  876       fieldwidth2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
 
  877       GMM_ASSERT1(fields1 >= 1 && fields2 >= 3 ,
 
  878                   "Ansys mesh import routine requires NBLOCK entries with at least " 
  879                   "1 integer field and 3 float number fields");
 
  885       std::getline(f,line);
 
  886       if (line.compare(0,1,
"N") == 0 || line.compare(0,1,
"!") == 0)
 
  889       nodeid = std::stol(line.substr(0, fieldwidth1));
 
  890       pos = fields1*fieldwidth1;
 
  891       for (
size_type j=0; j < 3; ++j, pos += fieldwidth2)
 
  892         if (pos < line.length())
 
  893           pt[j] = std::stod(line.substr(pos, fieldwidth2));
 
  897       cdb_node_2_getfem_node[nodeid] = m.add_point(pt, -1.);
 
  900     while (bgeot::casecmp(line.substr(0,6),
"EBLOCK") != 0) {
 
  903       std::getline(f,line);
 
  910       std::string fortran_fmt;
 
  911       std::getline(f,fortran_fmt);
 
  913       pos = fortran_fmt.find_first_of(
"(")+1;
 
  914       pos2 = fortran_fmt.find_first_of(
"iI", pos);
 
  915       fieldsno = std::stol(fortran_fmt.substr(pos, pos2-pos));
 
  917       pos2 = fortran_fmt.find_first_of(
")\n", pos);
 
  918       fieldwidth = std::stol(fortran_fmt.substr(pos, pos2-pos));
 
  919       GMM_ASSERT1(fieldsno == 19, 
"Ansys mesh import routine requires EBLOCK " 
  920                                   "entries with 19 fields");
 
  923     size_type II,JJ,KK,LL,MM,NN,OO,PP,QQ,RR,SS,TT,UU,VV,WW,XX,YY,ZZ,AA,BB;
 
  925       GMM_ASSERT1(!f.eof(), 
"File ended before all elements could be read");
 
  927       std::getline(f,line);
 
  929         long int ii = std::stol(line.substr(0,fieldwidth));
 
  935       itype = std::stol(line.substr(fieldwidth,fieldwidth));
 
  936       nodesno = std::stol(line.substr(8*fieldwidth,fieldwidth));
 
  937       line = line.substr(11*fieldwidth);
 
  939       if (imat_filt != 
size_type(-1) && imat != imat_filt) { 
 
  941           std::getline(f,line);
 
  945       if (nodesno >= 1) II = std::stol(line.substr(0,fieldwidth));
 
  946       if (nodesno >= 2) JJ = std::stol(line.substr(1*fieldwidth,fieldwidth));
 
  947       if (nodesno >= 3) KK = std::stol(line.substr(2*fieldwidth,fieldwidth));
 
  948       if (nodesno >= 4) LL = std::stol(line.substr(3*fieldwidth,fieldwidth));
 
  949       if (nodesno >= 5) MM = std::stol(line.substr(4*fieldwidth,fieldwidth));
 
  950       if (nodesno >= 6) NN = std::stol(line.substr(5*fieldwidth,fieldwidth));
 
  951       if (nodesno >= 7) OO = std::stol(line.substr(6*fieldwidth,fieldwidth));
 
  952       if (nodesno >= 8) PP = std::stol(line.substr(7*fieldwidth,fieldwidth));
 
  954         std::getline(f,line);
 
  955         if (nodesno >= 9) QQ = std::stol(line.substr(0,fieldwidth));
 
  956         if (nodesno >= 10) RR = std::stol(line.substr(1*fieldwidth,fieldwidth));
 
  957         if (nodesno >= 11) SS = std::stol(line.substr(2*fieldwidth,fieldwidth));
 
  958         if (nodesno >= 12) TT = std::stol(line.substr(3*fieldwidth,fieldwidth));
 
  959         if (nodesno >= 13) UU = std::stol(line.substr(4*fieldwidth,fieldwidth));
 
  960         if (nodesno >= 14) VV = std::stol(line.substr(5*fieldwidth,fieldwidth));
 
  961         if (nodesno >= 15) WW = std::stol(line.substr(6*fieldwidth,fieldwidth));
 
  962         if (nodesno >= 16) XX = std::stol(line.substr(7*fieldwidth,fieldwidth));
 
  963         if (nodesno >= 17) YY = std::stol(line.substr(8*fieldwidth,fieldwidth));
 
  964         if (nodesno >= 18) ZZ = std::stol(line.substr(9*fieldwidth,fieldwidth));
 
  965         if (nodesno >= 19) AA = std::stol(line.substr(10*fieldwidth,fieldwidth));
 
  966         if (nodesno >= 20) BB = std::stol(line.substr(11*fieldwidth,fieldwidth));
 
  969       if (imat+1 > regions.size())
 
  970         regions.resize(imat+1);
 
  974         std::string eltname(
"MESH200_4");
 
  975         if (elt_types.size() > itype && elt_types[itype].size() > 0)
 
  976           eltname = elt_types[itype];
 
  978         if (eltname.compare(
"MESH200_4") == 0) {
 
  979           getfem_cv_nodes.resize(3);
 
  980           getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
  981           getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
 
  982           getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
 
  983           regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,1),
 
  984                                          getfem_cv_nodes.begin()));
 
  985           if (itype < elt_cnt.size())
 
  989           GMM_WARNING2(
"Ignoring ANSYS element " << eltname
 
  990                        << 
". Import not supported yet.");
 
  993       else if (nodesno == 4) {
 
  996         std::string eltname(
"MESH200_6");
 
  997         if (elt_types.size() > itype && elt_types[itype].size() > 0)
 
  998           eltname = elt_types[itype];
 
 1000         if (eltname.compare(
"MESH200_6") == 0 ||
 
 1001             eltname.compare(
"PLANE42") == 0 ||
 
 1002             eltname.compare(
"PLANE182") == 0) {
 
 1003           getfem_cv_nodes.resize(4);
 
 1004           getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1005           getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
 
 1006           getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
 
 1007           getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
 
 1008           regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(2,1),
 
 1009                                          getfem_cv_nodes.begin()));
 
 1010           if (itype < elt_cnt.size())
 
 1011             elt_cnt[itype] += 1;
 
 1013         else if (eltname.compare(
"MESH200_8") == 0 ||
 
 1014                  eltname.compare(
"SOLID72") == 0) {
 
 1015           getfem_cv_nodes.resize(4);
 
 1016           getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1017           getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
 
 1018           getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
 
 1019           getfem_cv_nodes[3] = cdb_node_2_getfem_node[LL];
 
 1020           regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
 
 1021                                          getfem_cv_nodes.begin()));
 
 1022           if (itype < elt_cnt.size())
 
 1023             elt_cnt[itype] += 1;
 
 1026       else if (nodesno == 6) {
 
 1028         std::string eltname(
"MESH200_5");
 
 1029         if (elt_types.size() > itype && elt_types[itype].size() > 0)
 
 1030           eltname = elt_types[itype];
 
 1031         if (eltname.compare(
"MESH200_5") == 0 ||
 
 1032             eltname.compare(
"PLANE183") == 0) {
 
 1033           getfem_cv_nodes.resize(6);
 
 1034           getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1035           getfem_cv_nodes[1] = cdb_node_2_getfem_node[LL];
 
 1036           getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1037           getfem_cv_nodes[3] = cdb_node_2_getfem_node[NN];
 
 1038           getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
 
 1039           getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
 
 1040           regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,2),
 
 1041                                          getfem_cv_nodes.begin()));
 
 1042           if (itype < elt_cnt.size())
 
 1043             elt_cnt[itype] += 1;
 
 1046       else if (nodesno == 8) {
 
 1049         std::string eltname(
"MESH200_10");
 
 1050         if (elt_types.size() > itype && elt_types[itype].size() > 0)
 
 1051           eltname = elt_types[itype];
 
 1053         if (eltname.compare(
"MESH200_7") == 0 ||
 
 1054             eltname.compare(
"PLANE82") == 0 ||
 
 1055             eltname.compare(
"PLANE183") == 0) {
 
 1056           if (KK == LL && KK == OO) { 
 
 1057             getfem_cv_nodes.resize(6);
 
 1058             getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1059             getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
 
 1060             getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1061             getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
 
 1062             getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
 
 1063             getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
 
 1064             regions[imat].add(m.add_convex(bgeot::simplex_geotrans(2,2),
 
 1065                                            getfem_cv_nodes.begin()));
 
 1067             getfem_cv_nodes.resize(8);
 
 1068             getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1069             getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
 
 1070             getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1071             getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
 
 1072             getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
 
 1073             getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
 
 1074             getfem_cv_nodes[6] = cdb_node_2_getfem_node[OO];
 
 1075             getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
 
 1076             regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(2),
 
 1077                                            getfem_cv_nodes.begin()));
 
 1079           if (itype < elt_cnt.size())
 
 1080             elt_cnt[itype] += 1;
 
 1082         else if (eltname.compare(
"MESH200_10") == 0 ||
 
 1083                  eltname.compare(
"SOLID45") == 0 ||
 
 1084                  eltname.compare(
"SOLID185") == 0) {
 
 1085           if (KK == LL && OO == PP) {
 
 1086             if (MM == NN && NN == OO) { 
 
 1087               getfem_cv_nodes.resize(4);
 
 1088               getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1089               getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
 
 1090               getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
 
 1091               getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
 
 1092               regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
 
 1093                                              getfem_cv_nodes.begin()));
 
 1096               getfem_cv_nodes.resize(6);
 
 1097               getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1098               getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
 
 1099               getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
 
 1100               getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
 
 1101               getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
 
 1102               getfem_cv_nodes[5] = cdb_node_2_getfem_node[OO];
 
 1103               regions[imat].add(m.add_convex(bgeot::prism_geotrans(3,1),
 
 1104                                              getfem_cv_nodes.begin()));
 
 1108             getfem_cv_nodes.resize(8);
 
 1109             getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1110             getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
 
 1111             getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
 
 1112             getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
 
 1113             getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
 
 1114             getfem_cv_nodes[5] = cdb_node_2_getfem_node[NN];
 
 1115             getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
 
 1116             getfem_cv_nodes[7] = cdb_node_2_getfem_node[OO];
 
 1117             regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(3,1),
 
 1118                                            getfem_cv_nodes.begin()));
 
 1120           if (itype < elt_cnt.size())
 
 1121             elt_cnt[itype] += 1;
 
 1124       else if (nodesno == 10) {
 
 1127         std::string eltname(
"MESH200_9");
 
 1128         if (elt_types.size() > itype && elt_types[itype].size() > 0)
 
 1129           eltname = elt_types[itype];
 
 1131         if (eltname.compare(
"MESH200_9") == 0 ||
 
 1132             eltname.compare(
"SOLID87") == 0 ||
 
 1133             eltname.compare(
"SOLID92") == 0 ||
 
 1134             eltname.compare(
"SOLID162") == 0 ||
 
 1135             eltname.compare(
"SOLID187") == 0) {
 
 1136           getfem_cv_nodes.resize(10);
 
 1137           getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1138           getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
 
 1139           getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1140           getfem_cv_nodes[3] = cdb_node_2_getfem_node[OO];
 
 1141           getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
 
 1142           getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
 
 1143           getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
 
 1144           getfem_cv_nodes[7] = cdb_node_2_getfem_node[QQ];
 
 1145           getfem_cv_nodes[8] = cdb_node_2_getfem_node[RR];
 
 1146           getfem_cv_nodes[9] = cdb_node_2_getfem_node[LL];
 
 1147           regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
 
 1148                                          getfem_cv_nodes.begin()));
 
 1149           if (itype < elt_cnt.size())
 
 1150             elt_cnt[itype] += 1;
 
 1153       else if (nodesno == 20) { 
 
 1156         std::string eltname(
"MESH200_11");
 
 1157         if (elt_types.size() > itype && elt_types[itype].size() > 0)
 
 1158           eltname = elt_types[itype];
 
 1160         if (eltname.compare(
"MESH200_11") == 0 ||
 
 1161             eltname.compare(
"VISCO89") == 0 ||
 
 1162             eltname.compare(
"SOLID90") == 0 ||
 
 1163             eltname.compare(
"SOLID95") == 0 ||
 
 1164             eltname.compare(
"SOLID186") == 0 ||
 
 1165             eltname.compare(
"SOLID191") == 0) {
 
 1166           if (KK == LL && MM == NN && NN == OO && OO == PP) { 
 
 1167             getfem_cv_nodes.resize(10);
 
 1168             getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1169             getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
 
 1170             getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1171             getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
 
 1172             getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
 
 1173             getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
 
 1174             getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
 
 1175             getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
 
 1176             getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
 
 1177             getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
 
 1178             regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
 
 1179                                            getfem_cv_nodes.begin()));
 
 1180             if (itype < elt_cnt.size())
 
 1181               elt_cnt[itype] += 1;
 
 1182           } 
else if (MM == NN && NN == OO && OO == PP) { 
 
 1183             getfem_cv_nodes.resize(13);
 
 1184             getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1185             getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
 
 1186             getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1187             getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
 
 1188             getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
 
 1189             getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
 
 1190             getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
 
 1191             getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
 
 1192             getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
 
 1193             getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
 
 1194             getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
 
 1195             getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
 
 1196             getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
 
 1197             regions[imat].add(m.add_convex(bgeot::pyramid_Q2_incomplete_geotrans(),
 
 1198                                            getfem_cv_nodes.begin()));
 
 1199             if (itype < elt_cnt.size())
 
 1200               elt_cnt[itype] += 1;
 
 1202           } 
else if (KK == LL && OO == PP) { 
 
 1203             getfem_cv_nodes.resize(15);
 
 1204             getfem_cv_nodes[0]  = cdb_node_2_getfem_node[II];
 
 1205             getfem_cv_nodes[1]  = cdb_node_2_getfem_node[QQ];
 
 1206             getfem_cv_nodes[2]  = cdb_node_2_getfem_node[JJ];
 
 1207             getfem_cv_nodes[3]  = cdb_node_2_getfem_node[TT];
 
 1208             getfem_cv_nodes[4]  = cdb_node_2_getfem_node[RR];
 
 1209             getfem_cv_nodes[5]  = cdb_node_2_getfem_node[LL];
 
 1210             getfem_cv_nodes[6]  = cdb_node_2_getfem_node[YY];
 
 1211             getfem_cv_nodes[7]  = cdb_node_2_getfem_node[ZZ];
 
 1212             getfem_cv_nodes[8]  = cdb_node_2_getfem_node[AA];
 
 1213             getfem_cv_nodes[9]  = cdb_node_2_getfem_node[MM];
 
 1214             getfem_cv_nodes[10] = cdb_node_2_getfem_node[UU];
 
 1215             getfem_cv_nodes[11] = cdb_node_2_getfem_node[NN];
 
 1216             getfem_cv_nodes[12] = cdb_node_2_getfem_node[XX];
 
 1217             getfem_cv_nodes[13] = cdb_node_2_getfem_node[VV];
 
 1218             getfem_cv_nodes[14] = cdb_node_2_getfem_node[OO];
 
 1219             regions[imat].add(m.add_convex
 
 1220                               (bgeot::prism_incomplete_P2_geotrans(),
 
 1221                                getfem_cv_nodes.begin()));
 
 1222             if (itype < elt_cnt.size())
 
 1223               elt_cnt[itype] += 1;
 
 1225             getfem_cv_nodes.resize(20);
 
 1226             getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
 
 1227             getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
 
 1228             getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
 
 1229             getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
 
 1230             getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
 
 1231             getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
 
 1232             getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
 
 1233             getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
 
 1234             getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
 
 1235             getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
 
 1236             getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
 
 1237             getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
 
 1238             getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
 
 1239             getfem_cv_nodes[13] = cdb_node_2_getfem_node[UU];
 
 1240             getfem_cv_nodes[14] = cdb_node_2_getfem_node[NN];
 
 1241             getfem_cv_nodes[15] = cdb_node_2_getfem_node[XX];
 
 1242             getfem_cv_nodes[16] = cdb_node_2_getfem_node[VV];
 
 1243             getfem_cv_nodes[17] = cdb_node_2_getfem_node[PP];
 
 1244             getfem_cv_nodes[18] = cdb_node_2_getfem_node[WW];
 
 1245             getfem_cv_nodes[19] = cdb_node_2_getfem_node[OO];
 
 1246             regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(3),
 
 1247                                            getfem_cv_nodes.begin()));
 
 1248             if (itype < elt_cnt.size())
 
 1249               elt_cnt[itype] += 1;
 
 1255     int nonempty_regions=0;
 
 1256     for (
size_type i=0; i < regions.size(); ++i)
 
 1257       if (regions[i].card() > 0)
 
 1260     if (nonempty_regions > 1)
 
 1261       for (
size_type i=0; i < regions.size(); ++i)
 
 1262         if (regions[i].card() > 0)
 
 1263           m.region(i).add(regions[i]);
 
 1265     for (
size_type i=1; i < elt_types.size(); ++i)
 
 1267         cout << 
"Imported " << elt_cnt[i] << 
" " << elt_types[i] << 
" elements." << endl;
 
 1268     cout << 
"Imported " << m.convex_index().card() << 
" elements in total." << endl;
 
 1273   static double round_to_nth_significant_number(
double x, 
int ndec) {
 
 1275     double s = (x < 0 ? -1 : 1);
 
 1276     double pdec = pow(10.,
double(ndec));
 
 1277     if (x == 0) 
return 0.;
 
 1279     while (x > 1) { x /= 10.0; p*=10; }
 
 1280     while (x < 0.1) { x *= 10.0; p/=10; }
 
 1282     x = s * (floor(x * pdec + 0.5) / pdec) * p;
 
 1288   static void import_noboite_mesh_file(std::istream& f, mesh& m) {
 
 1290     using namespace std;
 
 1291     gmm::stream_standard_locale sl(f);
 
 1293     ofstream fichier_GiD(
"noboite_to_GiD.gid",    ios::out | ios::trunc );  
 
 1295     fichier_GiD << 
"MESH    dimension 3 ElemType Tetrahedra  Nnode 4"<<endl;
 
 1298     int i,NE,NP,ligne_debut_NP;
 
 1306     ligne_debut_NP=NE*4/6+3;
 
 1311     for (i=1; i<=ligne_debut_NP; i++){
 
 1312       getline(f, contenu);
 
 1319     fichier_GiD << 
"Coordinates" <<endl;
 
 1321     for (i=1; i<=NP; i++){
 
 1322       float coor_x,coor_y,coor_z;
 
 1324       fichier_GiD << i<<
" ";
 
 1326       f>>coor_x >>coor_y >>coor_z;
 
 1327       fichier_GiD<<coor_x<<
" " <<coor_y <<
" "<<coor_z <<endl;
 
 1331     fichier_GiD << 
"end coordinates" <<endl<<endl;
 
 1338     f.seekg(0, ios::beg);
 
 1339     for (i=1; i<=3; i++){
 
 1340       getline(f, contenu);
 
 1344     fichier_GiD << 
"Elements" <<endl;
 
 1346     for (i=1; i<=NE; i++){
 
 1347       float elem_1,elem_2,elem_3,elem_4;
 
 1349       fichier_GiD << i<<
" ";
 
 1350       f>>elem_1>>elem_2>>elem_3>>elem_4;
 
 1351       fichier_GiD<<elem_1<<
" " <<elem_2 <<
" "<<elem_3<<
" "<<elem_4<<
" 1"<<endl;
 
 1354     fichier_GiD << 
"end elements" <<endl<<endl;
 
 1359         fichier_GiD.close();  
 
 1362       cerr << 
"Erreur à l'ouverture !" << endl;
 
 1370       cerr << 
"Erreur à l'ouverture !" << endl;
 
 1374     ifstream fichier1_GiD(
"noboite_to_GiD.gid", ios::in);
 
 1375     import_gid_mesh_file(fichier1_GiD, m);
 
 1384   static void import_am_fmt_mesh_file(std::istream& f, mesh& m) {
 
 1385     gmm::stream_standard_locale sl(f);
 
 1387     std::vector<size_type> tri;
 
 1390     f >> nbs >> nbt; bgeot::read_until(f,
"\n");
 
 1392     for (
size_type i=0; i < nbt*3; ++i) f >> tri[i];
 
 1396       P[0]=round_to_nth_significant_number(P[0],6); 
 
 1397       P[1]=round_to_nth_significant_number(P[1],6);
 
 1399       GMM_ASSERT1(jj == j, 
"ouch");
 
 1402       m.add_triangle(tri[i]-1,tri[i+1]-1,tri[i+2]-1);
 
 1409   static void import_emc2_mesh_file(std::istream& f, mesh& m) {
 
 1410     gmm::stream_standard_locale sl(f);
 
 1412     std::vector<size_type> tri;
 
 1415     bgeot::read_until(f,
"Vertices");
 
 1418       f >> P[0] >> P[1] >> dummy;
 
 1420       GMM_ASSERT1(jj == j, 
"ouch");
 
 1426       if (ls.find(
"Triangles")+1) {
 
 1429           f >> ip[0] >> ip[1] >> ip[2] >> dummy; ip[0]--; ip[1]--; ip[2]--;
 
 1430           m.add_triangle(ip[0],ip[1],ip[2]);
 
 1432       } 
else if (ls.find(
"Quadrangles")+1) {
 
 1435           f >> ip[0] >> ip[1] >> ip[2] >> ip[3] >> dummy; ip[0]--; ip[1]--; ip[2]--; ip[3]--;
 
 1436           m.add_parallelepiped(2, &ip[0]);
 
 1438       } 
else if (ls.find(
"End")+1) 
break;
 
 1442   void import_mesh(
const std::string& filename, 
const std::string& format,
 
 1447       if (bgeot::casecmp(format,
"structured")==0)
 
 1449       else if (bgeot::casecmp(format,
"structured_ball")==0)
 
 1451       else if (bgeot::casecmp(format,
"structured_ball_shell")==0)
 
 1454       std::ifstream f(filename.c_str());
 
 1455       GMM_ASSERT1(f.good(), 
"can't open file " << filename);
 
 1457       f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
 
 1461     catch (std::logic_error& exc) {
 
 1465     catch (std::ios_base::failure& exc) {
 
 1467       GMM_ASSERT1(
false, 
"error while importing " << format
 
 1468                   << 
" mesh file \"" << filename << 
"\" : " << exc.what());
 
 1470     catch (std::runtime_error& exc) {
 
 1477                         std::map<std::string, size_type> ®ion_map,
 
 1478                         bool remove_last_dimension,
 
 1479                         std::map<
size_type, std::set<size_type>> *nodal_map,
 
 1480                         bool remove_duplicated_nodes)
 
 1482     import_gmsh_mesh_file(f, m, 0, ®ion_map, 
nullptr, 
false, remove_last_dimension, nodal_map,
 
 1483                           remove_duplicated_nodes);
 
 1487                         bool add_all_element_type,
 
 1488                         std::set<size_type> *lower_dim_convex_rg,
 
 1489                         std::map<std::string, size_type> *region_map,
 
 1490                         bool remove_last_dimension,
 
 1491                         std::map<
size_type, std::set<size_type>> *nodal_map,
 
 1492                         bool remove_duplicated_nodes)
 
 1494     import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, add_all_element_type,
 
 1495                           remove_last_dimension, nodal_map, remove_duplicated_nodes);
 
 1499                         bool add_all_element_type,
 
 1500                         std::set<size_type> *lower_dim_convex_rg,
 
 1501                         std::map<std::string, size_type> *region_map,
 
 1502                         bool remove_last_dimension,
 
 1503                         std::map<
size_type, std::set<size_type>> *nodal_map,
 
 1504                         bool remove_duplicated_nodes)
 
 1508       std::ifstream f(filename.c_str());
 
 1509       GMM_ASSERT1(f.good(), 
"can't open file " << filename);
 
 1511       f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
 
 1512       import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, add_all_element_type,
 
 1513                             remove_last_dimension, nodal_map, remove_duplicated_nodes);
 
 1516     catch (std::logic_error& exc) {
 
 1520     catch (std::ios_base::failure& exc) {
 
 1522       GMM_ASSERT1(
false, 
"error while importing " << 
"gmsh" 
 1523                   << 
" mesh file \"" << filename << 
"\" : " << exc.what());
 
 1525     catch (std::runtime_error& exc) {
 
 1532     mesh& m, std::map<std::string, size_type> ®ion_map,
 
 1533     bool remove_last_dimension,
 
 1534     std::map<
size_type, std::set<size_type>> *nodal_map,
 
 1535     bool remove_duplicated_nodes) {
 
 1536     import_mesh_gmsh(filename, m, 
false, NULL, ®ion_map, remove_last_dimension, nodal_map,
 
 1537                      remove_duplicated_nodes);
 
 1540   void import_mesh(std::istream& f, 
const std::string& format,
 
 1542     if (bgeot::casecmp(format,
"gmsh")==0)
 
 1543       import_gmsh_mesh_file(f,m);
 
 1544     else if (bgeot::casecmp(format,
"gmsh_with_lower_dim_elt")==0)
 
 1545       import_gmsh_mesh_file(f,m,0,NULL,NULL,
true);
 
 1546     else if (bgeot::casecmp(format,
"gmshv2")==0)
 
 1547       import_gmsh_mesh_file(f,m,2);
 
 1548     else if (bgeot::casecmp(format,
"gid")==0)
 
 1549       import_gid_mesh_file(f,m);
 
 1550     else if (bgeot::casecmp(format,
"noboite")==0)
 
 1551       import_noboite_mesh_file(f,m);
 
 1552     else if (bgeot::casecmp(format,
"am_fmt")==0)
 
 1553       import_am_fmt_mesh_file(f,m);
 
 1554     else if (bgeot::casecmp(format,
"emc2_mesh")==0)
 
 1555       import_emc2_mesh_file(f,m);
 
 1556     else if (bgeot::casecmp(format,
"cdb")==0)
 
 1557       import_cdb_mesh_file(f,m);
 
 1558     else if (bgeot::casecmp(format.substr(0,4),
"cdb:")==0) {
 
 1563         imat = std::stol(format.substr(4), &sz);
 
 1564         success = (sz == format.substr(4).size() && imat != 
size_type(-1));
 
 1565       } 
catch (
const std::invalid_argument&) {
 
 1567       } 
catch (
const std::out_of_range&) {
 
 1571         import_cdb_mesh_file(f,m,imat);
 
 1572       else GMM_ASSERT1(
false, 
"cannot import " 
 1573                        << format << 
" mesh type : wrong cdb mesh type input");
 
 1575     else GMM_ASSERT1(
false, 
"cannot import " 
 1576                      << format << 
" mesh type : unknown mesh type");
 
 1579   void import_mesh(
const std::string& filename, mesh& msh) {
 
 1580     size_type pos = filename.find_last_of(
":");
 
 1581     if (pos != std::string::npos)
 
 1584       msh.read_from_file(filename);
 
 1588     bool is_flat = 
true;
 
 1589     unsigned N = m.dim(); 
if (N < 1) 
return;
 
 1590     for (dal::bv_visitor i(m.points().index()); !i.finished(); ++i)
 
 1591       if (m.points()[i][N-1] != 0) is_flat = 0;
 
 1593       base_matrix M(N-1,N);
 
 1594       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.