getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] (no subject)


From: Konstantinos Poulios
Subject: [Getfem-commits] (no subject)
Date: Sat, 14 Jul 2018 01:37:51 -0400 (EDT)

branch: phuoc
commit ff4b4ca76db4ce94c3140336463047f391178210
Author: Konstantinos Poulios <address@hidden>
Date:   Sat Jul 14 07:37:13 2018 +0200

    Revise vtk import code (not tested)
---
 src/getfem_import.cc | 2872 +++++++++++++++++++++++++-------------------------
 1 file changed, 1424 insertions(+), 1448 deletions(-)

diff --git a/src/getfem_import.cc b/src/getfem_import.cc
index f210366..0939f6f 100644
--- a/src/getfem_import.cc
+++ b/src/getfem_import.cc
@@ -29,272 +29,271 @@
 
 namespace getfem {
 
-/* mesh file from gmsh [http://www.geuz.org/gmsh/]*/
+  /* mesh file from gmsh [http://www.geuz.org/gmsh/]*/
 
-struct gmsh_cv_info {
+  struct gmsh_cv_info {
     unsigned id, type, region;
     bgeot::pgeometric_trans pgt;
     std::vector<size_type> nodes;
     void set_pgt() {
-        switch (type) {
-        case 1: { /* LINE */
-            pgt = bgeot::simplex_geotrans(1,1);
-        } break;
-        case 2: { /* TRIANGLE */
-            pgt = bgeot::simplex_geotrans(2,1);
-        } break;
-        case 3: { /* QUADRANGLE */
-            pgt = bgeot::parallelepiped_geotrans(2,1);
-        } break;
-        case 4: { /* TETRAHEDRON */
-            pgt = bgeot::simplex_geotrans(3,1);
-        } break;
-        case 5: { /* HEXAHEDRON */
-            pgt = bgeot::parallelepiped_geotrans(3,1);
-        } break;
-        case 6: { /* PRISM */
-            pgt = bgeot::prism_geotrans(3,1);
-        } break;
-        case 7: { /* PYRAMID */
-            pgt = bgeot::pyramid_geotrans(1);
-        } break;
-        case 8: { /* 2ND ORDER LINE */
-            pgt = bgeot::simplex_geotrans(1,2);
-        } break;
-        case 9: { /* 2ND ORDER TRIANGLE */
-            pgt = bgeot::simplex_geotrans(2,2);
-        } break;
-        case 10: { /* 2ND ORDER QUADRANGLE */
-            pgt = bgeot::parallelepiped_geotrans(2,2);
-        } break;
-        case 11: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
-            pgt = bgeot::simplex_geotrans(3,2);
-        } break;
-        case 12: { /* 2ND ORDER HEXAHEDRON (27-NODE) */
-            pgt = bgeot::parallelepiped_geotrans(3,2);
-        } break;
-        case 15: { /* POINT */
-            GMM_WARNING2("ignoring point element");
-        } break;
-        case 16: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
-            pgt = bgeot::Q2_incomplete_geotrans(2);
-        } break;
-        case 17: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
-            pgt = bgeot::Q2_incomplete_geotrans(3);
-        } break;
-        case 26: { /* 3RD ORDER LINE */
-            pgt = bgeot::simplex_geotrans(1,3);
-        } break;
-        case 21: { /* 3RD ORDER TRIANGLE */
-            pgt = bgeot::simplex_geotrans(2,3);
-        } break;
-        case 23: { /* 4TH ORDER TRIANGLE */
-            pgt = bgeot::simplex_geotrans(2, 4);
-        } break;
-        case 27: { /* 4TH ORDER LINE */
-            pgt = bgeot::simplex_geotrans(1, 4);
-        } break;
-        default: { /* UNKNOWN .. */
-            /* higher order elements : to be done .. */
-            GMM_ASSERT1(false, "gmsh element type " << type << " is unknown.");
-        } break;
-        }
+      switch (type) {
+      case 1: { /* LINE */
+        pgt = bgeot::simplex_geotrans(1,1);
+      } break;
+      case 2: { /* TRIANGLE */
+        pgt = bgeot::simplex_geotrans(2,1);
+      } break;
+      case 3: { /* QUADRANGLE */
+        pgt = bgeot::parallelepiped_geotrans(2,1);
+      } break;
+      case 4: { /* TETRAHEDRON */
+        pgt = bgeot::simplex_geotrans(3,1);
+      } break;
+      case 5: { /* HEXAHEDRON */
+        pgt = bgeot::parallelepiped_geotrans(3,1);
+      } break;
+      case 6: { /* PRISM */
+        pgt = bgeot::prism_geotrans(3,1);
+      } break;
+      case 7: { /* PYRAMID */
+        pgt = bgeot::pyramid_QK_geotrans(1);
+      } break;
+      case 8: { /* 2ND ORDER LINE */
+        pgt = bgeot::simplex_geotrans(1,2);
+      } break;
+      case 9: { /* 2ND ORDER TRIANGLE */
+        pgt = bgeot::simplex_geotrans(2,2);
+      } break;
+      case 10: { /* 2ND ORDER QUADRANGLE */
+        pgt = bgeot::parallelepiped_geotrans(2,2);
+      } break;
+      case 11: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
+        pgt = bgeot::simplex_geotrans(3,2);
+      } break;
+      case 12: { /* 2ND ORDER HEXAHEDRON (27-NODE) */
+        pgt = bgeot::parallelepiped_geotrans(3,2);
+      } break;
+      case 15: { /* POINT */
+        GMM_WARNING2("ignoring point element");
+      } break;
+      case 16: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
+        pgt = bgeot::Q2_incomplete_geotrans(2);
+      } break;
+      case 17: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
+        pgt = bgeot::Q2_incomplete_geotrans(3);
+      } break;
+      case 26: { /* 3RD ORDER LINE */
+        pgt = bgeot::simplex_geotrans(1,3);
+      } break;
+      case 21: { /* 3RD ORDER TRIANGLE */
+        pgt = bgeot::simplex_geotrans(2,3);
+      } break;
+      case 23: { /* 4TH ORDER TRIANGLE */
+        pgt = bgeot::simplex_geotrans(2, 4);
+      } break;
+      case 27: { /* 4TH ORDER LINE */
+        pgt = bgeot::simplex_geotrans(1, 4);
+      } break;
+      default: { /* UNKNOWN .. */
+        /* higher order elements : to be done .. */
+        GMM_ASSERT1(false, "gmsh element type " << type << " is unknown.");
+      } break;
+      }
     }
 
     void set_nb_nodes() {
-        /* Especially for the gmsh file format version 2.*/
-        switch (type) {
-        case 1: { /* LINE */
-            nodes.resize(2);
-        } break;
-        case 2: { /* TRIANGLE */
-            nodes.resize(3);
-        } break;
-        case 3: { /* QUADRANGLE */
-            nodes.resize(4);
-        } break;
-        case 4: { /* TETRAHEDRON */
-            nodes.resize(4);
-        } break;
-        case 5: { /* HEXAHEDRON */
-            nodes.resize(8);
-        } break;
-        case 6: { /* PRISM */
-            nodes.resize(6);
-        } break;
-        case 7: { /* PYRAMID */
-            nodes.resize(5);
-        } break;
-        case 8: { /* 2ND ORDER LINE */
-            nodes.resize(3);
-        } break;
-        case 9: { /* 2ND ORDER TRIANGLE */
-            nodes.resize(6);
-        } break;
-        case 10: { /* 2ND ORDER QUADRANGLE */
-            nodes.resize(9);
-        } break;
-        case 11: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
-            nodes.resize(10);
-        } break;
-        case 12: { /* 2ND ORDER HEXAHEDRON (27-NODE) */
-            nodes.resize(27);
-        } break;
-        case 15: { /* POINT */
-            nodes.resize(1);
-        } break;
-        case 16: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
-            nodes.resize(8);
-        } break;
-        case 17: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
-            nodes.resize(20);
-        } break;
-        case 26: { /* 3RD ORDER LINE */
-            nodes.resize(4);
-        } break;
-        case 21: { /* 3RD ORDER TRIANGLE */
-            nodes.resize(10);
-        } break;
-        case 23: { /* 4TH ORDER TRIANGLE */
-            nodes.resize(15);
-        } break;
-        case 27: { /* 4TH ORDER LINE */
-            nodes.resize(5);
-        } break;
-        default: { /* UNKNOWN .. */
-            /* higher order elements : to be done .. */
-            GMM_ASSERT1(false, "the gmsh element type " << type << " is 
unknown..");
-        } break;
-        }
+      /* Especially for the gmsh file format version 2.*/
+      switch (type) {
+      case 1: { /* LINE */
+        nodes.resize(2);
+      } break;
+      case 2: { /* TRIANGLE */
+        nodes.resize(3);
+      } break;
+      case 3: { /* QUADRANGLE */
+        nodes.resize(4);
+      } break;
+      case 4: { /* TETRAHEDRON */
+        nodes.resize(4);
+      } break;
+      case 5: { /* HEXAHEDRON */
+        nodes.resize(8);
+      } break;
+      case 6: { /* PRISM */
+        nodes.resize(6);
+      } break;
+      case 7: { /* PYRAMID */
+        nodes.resize(5);
+      } break;
+      case 8: { /* 2ND ORDER LINE */
+        nodes.resize(3);
+      } break;
+      case 9: { /* 2ND ORDER TRIANGLE */
+        nodes.resize(6);
+      } break;
+      case 10: { /* 2ND ORDER QUADRANGLE */
+        nodes.resize(9);
+      } break;
+      case 11: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
+        nodes.resize(10);
+      } break;
+      case 12: { /* 2ND ORDER HEXAHEDRON (27-NODE) */
+        nodes.resize(27);
+      } break;
+      case 15: { /* POINT */
+        nodes.resize(1);
+      } break;
+      case 16: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
+        nodes.resize(8);
+      } break;
+      case 17: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
+        nodes.resize(20);
+      } break;
+      case 26: { /* 3RD ORDER LINE */
+        nodes.resize(4);
+      } break;
+      case 21: { /* 3RD ORDER TRIANGLE */
+        nodes.resize(10);
+      } break;
+      case 23: { /* 4TH ORDER TRIANGLE */
+        nodes.resize(15);
+      } break;
+      case 27: { /* 4TH ORDER LINE */
+        nodes.resize(5);
+      } break;
+      default: { /* UNKNOWN .. */
+        /* higher order elements : to be done .. */
+        GMM_ASSERT1(false, "the gmsh element type " << type << " is 
unknown..");
+      } break;
+      }
     }
 
     bool operator<(const gmsh_cv_info& other) const {
-        unsigned this_dim = (type == 15) ? 0 : pgt->dim();
-        unsigned other_dim = (other.type == 15) ? 0 : other.pgt->dim();
-        if (this_dim == other_dim) return region < other.region;
-        return this_dim > other_dim;
+      unsigned this_dim = (type == 15) ? 0 : pgt->dim();
+      unsigned other_dim = (other.type == 15) ? 0 : other.pgt->dim();
+      if (this_dim == other_dim) return region < other.region;
+      return this_dim > other_dim;
     }
-};
+  };
 
 
-/* vtk mesh file */
+  /* vtk mesh file */
 
-struct vtk_cv_info {
+  struct vtk_cv_info {
     //    unsigned id, type, region;
     unsigned id, type;
     bgeot::pgeometric_trans pgt;
     std::vector<size_type> nodes;
     void set_pgt() {
-        switch (type) {
-        case 3: { /* LINE */
-            pgt = bgeot::simplex_geotrans(1,1);
-        } break;
-        case 5: { /* TRIANGLE */
-            pgt = bgeot::simplex_geotrans(2,1);
-        } break;
-        case 9: { /* QUADRANGLE */
-            pgt = bgeot::parallelepiped_geotrans(2,1);
-        } break;
-        case 10: { /* TETRAHEDRON */
-            pgt = bgeot::simplex_geotrans(3,1);
-        } break;
-        case 12: { /* HEXAHEDRON */
-            pgt = bgeot::parallelepiped_geotrans(3,1);
-        } break;
-        case 13: { /* PRISM */
-            pgt = bgeot::prism_geotrans(3,1);
-        } break;
-        case 14: { /* PYRAMID */
-            pgt = bgeot::pyramid_geotrans(1);
-        } break;
-        case 21: { /* 2ND ORDER LINE */
-            pgt = bgeot::simplex_geotrans(1,2);
-        } break;
-        case 22: { /* 2ND ORDER TRIANGLE */
-            pgt = bgeot::simplex_geotrans(2,2);
-        } break;
-        case 24: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
-            pgt = bgeot::simplex_geotrans(3,2);
-        } break;
-        case 1: { /* POINT */
-            GMM_WARNING2("ignoring point element");
-        } break;
-        case 23: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
-            pgt = bgeot::Q2_incomplete_geotrans(2);
-        } break;
-        case 25: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
-            pgt = bgeot::Q2_incomplete_geotrans(3);
-        } break;
-
-        default: { /* UNKNOWN .. */
-            /* higher order elements : to be done .. */
-            GMM_ASSERT1(false, "gmsh element type " << type << " is unknown.");
-        } break;
-        }
+      switch (type) {
+      case 3: { /* LINE */
+        pgt = bgeot::simplex_geotrans(1,1);
+      } break;
+      case 5: { /* TRIANGLE */
+        pgt = bgeot::simplex_geotrans(2,1);
+      } break;
+      case 9: { /* QUADRANGLE */
+        pgt = bgeot::parallelepiped_geotrans(2,1);
+      } break;
+      case 10: { /* TETRAHEDRON */
+        pgt = bgeot::simplex_geotrans(3,1);
+      } break;
+      case 12: { /* HEXAHEDRON */
+        pgt = bgeot::parallelepiped_geotrans(3,1);
+      } break;
+      case 13: { /* PRISM */
+        pgt = bgeot::prism_geotrans(3,1);
+      } break;
+      case 14: { /* PYRAMID */
+        pgt = bgeot::pyramid_QK_geotrans(1);
+      } break;
+      case 21: { /* 2ND ORDER LINE */
+        pgt = bgeot::simplex_geotrans(1,2);
+      } break;
+      case 22: { /* 2ND ORDER TRIANGLE */
+        pgt = bgeot::simplex_geotrans(2,2);
+      } break;
+      case 24: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
+        pgt = bgeot::simplex_geotrans(3,2);
+      } break;
+      case 1: { /* POINT */
+        GMM_WARNING2("ignoring point element");
+      } break;
+      case 23: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
+        pgt = bgeot::Q2_incomplete_geotrans(2);
+      } break;
+      case 25: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
+        pgt = bgeot::Q2_incomplete_geotrans(3);
+      } break;
+
+      default: { /* UNKNOWN .. */
+        /* higher order elements : to be done .. */
+        GMM_ASSERT1(false, "gmsh element type " << type << " is unknown.");
+      } break;
+      }
     }
 
     void set_nb_nodes() {
-        /* Especially for the gmsh file format version 2.*/
-        switch (type) {
-        case 3: { /* LINE */
-            nodes.resize(2);
-        } break;
-        case 5: { /* TRIANGLE */
-            nodes.resize(3);
-        } break;
-        case 9: { /* QUADRANGLE */
-            nodes.resize(4);
-        } break;
-        case 10: { /* TETRAHEDRON */
-            nodes.resize(4);
-        } break;
-        case 12: { /* HEXAHEDRON */
-            nodes.resize(8);
-        } break;
-        case 13: { /* PRISM */
-            nodes.resize(6);
-        } break;
-        case 14: { /* PYRAMID */
-            nodes.resize(5);
-        } break;
-        case 21: { /* 2ND ORDER LINE */
-            nodes.resize(3);
-        } break;
-        case 22: { /* 2ND ORDER TRIANGLE */
-            nodes.resize(6);
-        } break;
-
-        case 24: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
-            nodes.resize(10);
-        } break;
-
-        case 1: { /* POINT */
-            nodes.resize(1);
-        } break;
-        case 23: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
-            nodes.resize(8);
-        } break;
-        case 25: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
-            nodes.resize(20);
-        } break;
-
-        default: { /* UNKNOWN .. */
-            /* higher order elements : to be done .. */
-            GMM_ASSERT1(false, "the vtk element type " << type << " is 
unknown..");
-        } break;
-        }
+      switch (type) {
+      case 3: { /* LINE */
+        nodes.resize(2);
+      } break;
+      case 5: { /* TRIANGLE */
+        nodes.resize(3);
+      } break;
+      case 9: { /* QUADRANGLE */
+          nodes.resize(4);
+      } break;
+      case 10: { /* TETRAHEDRON */
+        nodes.resize(4);
+      } break;
+      case 12: { /* HEXAHEDRON */
+        nodes.resize(8);
+      } break;
+      case 13: { /* PRISM */
+        nodes.resize(6);
+      } break;
+      case 14: { /* PYRAMID */
+        nodes.resize(5);
+      } break;
+      case 21: { /* 2ND ORDER LINE */
+        nodes.resize(3);
+      } break;
+      case 22: { /* 2ND ORDER TRIANGLE */
+        nodes.resize(6);
+      } break;
+
+      case 24: { /* 2ND ORDER TETRAHEDRON (10-NODE) */
+        nodes.resize(10);
+      } break;
+
+      case 1: { /* POINT */
+        nodes.resize(1);
+      } break;
+      case 23: { /* INCOMPLETE 2ND ORDER QUADRANGLE (8-NODE) */
+        nodes.resize(8);
+      } break;
+      case 25: { /* INCOMPLETE 2ND ORDER HEXAHEDRON (20-NODE) */
+        nodes.resize(20);
+      } break;
+
+      default: { /* UNKNOWN .. */
+        /* higher order elements : to be done .. */
+        GMM_ASSERT1(false, "the vtk element type " << type << " is unknown..");
+      } break;
+      }
     }
 
     bool operator<(const vtk_cv_info& other) const {
-        unsigned this_dim = (type == 15) ? 0 : pgt->dim();
-        unsigned other_dim = (other.type == 15) ? 0 : other.pgt->dim();
-        //if (this_dim == other_dim) return region < other.region;
-        return this_dim > other_dim;
+      unsigned this_dim = (type == 15) ? 0 : pgt->dim();
+      unsigned other_dim = (other.type == 15) ? 0 : other.pgt->dim();
+      //if (this_dim == other_dim) return region < other.region;
+      return this_dim > other_dim;
     }
-};
+  };
 
-std::map<std::string, size_type> 
read_region_names_from_gmsh_mesh_file(std::istream& f)
-{
+  std::map<std::string, size_type> 
read_region_names_from_gmsh_mesh_file(std::istream& f)
+  {
     std::map<std::string, size_type> region_map;
     bgeot::read_until(f, "$PhysicalNames");
     size_type nb_regions;
@@ -302,286 +301,264 @@ std::map<std::string, size_type> 
read_region_names_from_gmsh_mesh_file(std::istr
     size_type rt,ri;
     std::string region_name;
     for (size_type region_cnt=0; region_cnt < nb_regions; ++ region_cnt) {
-        f >> rt >> ri;
-        std::getline(f, region_name);
-        /* trim the string to the quote character front and back*/
-        size_t pos = region_name.find_first_of("\"");
-        if (pos != region_name.npos) {
-            region_name.erase(0, pos+1);
-            pos = region_name.find_last_of("\"");
-            region_name.erase(pos);
-        }
-        region_map[region_name] = ri;
+      f >> rt >> ri;
+      std::getline(f, region_name);
+      /* trim the string to the quote character front and back*/
+      size_t pos = region_name.find_first_of("\"");
+      if (pos != region_name.npos) {
+        region_name.erase(0, pos+1);
+        pos = region_name.find_last_of("\"");
+        region_name.erase(pos);
+      }
+      region_map[region_name] = ri;
     }
 
     return region_map;
-}
+  }
 
 
-//Phuoc
-/*
-   * import ascii vtk mesh file
-   *
-   * for vtk meshes, the mesh nodes are always 3D, so for a 2D mesh
-     if remove_last_dimension == true the z-component of nodes will be removed
+  /*
+     * import ascii vtk mesh file
+     *
+     * for vtk meshes, the mesh nodes are always 3D, so for a 2D mesh
+       if remove_last_dimension == true the z-component of nodes will be 
removed
 
-     Note: should not have the empty line at the end of the vtk mesh file!
-   */
-static void import_vtk_mesh_file(std::istream& f, mesh& m,
+       Note: should not have the empty line at the end of the vtk mesh file!
+  */
+  static void import_vtk_mesh_file(std::istream& f, mesh& m,
                                  bool remove_last_dimension = true,
                                  bool remove_duplicated_nodes = true)
-{
+  {
     /* read the version */
     std::istream &inVTKFile=f;
     std::string line;
     // Part 1
     do
-        std::getline(inVTKFile, line);
+      std::getline(inVTKFile, line);
     while (line == "");
     if (std::string(line,0,23) != "# vtk DataFile Version ")
-    {
-        std::cout << "Error: Unrecognized header in the file "<< std::endl;
-    }
+      std::cout << "Error: Unrecognized header in the file "<< std::endl;
     std::string version(line,23);
 
     // Part 2
     std::string header;
     do
-        std::getline(inVTKFile, header);
-    while(header=="");
-    std::cout << "header: " << header << std::endl;
+      std::getline(inVTKFile, header);
+    while (header=="");
+//    std::cout << "header: " << header << std::endl;
 
     // Part 3
     do
-        std::getline(inVTKFile, line);
-    while(line=="");
+      std::getline(inVTKFile, line);
+    while (line=="");
     bool binary = false;
     if (line == "BINARY" || line == "BINARY\r" )
-    {
-        binary = true;
-    }
+      binary = true;
     else if ( line == "ASCII" || line == "ASCII\r")
-    {
-        binary = false;
-    }
-    else
-    {
-        std::cout << "Error: Unrecognized format in file " << std::endl;
-        return;
+      binary = false;
+    else {
+      std::cout << "Error: Unrecognized format in file " << std::endl;
+      return;
     }
 
-    if(binary)
-    {
-        std::cout << "Not supported binary vtk format for now!" << std::endl;
-        return;
+    if (binary) {
+      std::cout << "Not supported binary vtk format for now!" << std::endl;
+      return;
     }
 
     // Part 4
     do
-        std::getline(inVTKFile, line);
+      std::getline(inVTKFile, line);
     while (line == "");
 
     if (line != "DATASET POLYDATA" && line != "DATASET UNSTRUCTURED_GRID"
-            && line != "DATASET POLYDATA\r" && line != "DATASET 
UNSTRUCTURED_GRID\r" )
-    {
-        std::cout << "Error: Unsupported data type in file " << std::endl;
-    }
+        && line != "DATASET POLYDATA\r" && line != "DATASET 
UNSTRUCTURED_GRID\r" )
+      std::cout << "Error: Unsupported data type in file " << std::endl;
 
     std::map<size_type, size_type> msh_node_2_getfem_node;
     std::vector<vtk_cv_info> cvlst;
-    while(inVTKFile.good())
-    {
-        std::getline(inVTKFile, line);
+    while (inVTKFile.good()) {
+      std::getline(inVTKFile, line);
 
-        if (line.empty()) continue;
-        std::istringstream ln(line);
-        std::string kw;
-        ln >> kw;
+      if (line.empty()) continue;
+      std::istringstream ln(line);
+      std::string kw;
+      ln >> kw;
 
+      if (kw == "POINTS") {
+        size_type nb_node;              std::string typestr;
+        ln >> nb_node >> typestr;
+        std::cout << "Found " << nb_node << " " << typestr << " points" << 
std::endl;
 
-        if (kw == "POINTS")
-        {
-            size_type nb_node;              std::string typestr;
-            ln >> nb_node >> typestr;
-            std::cout << "Found " << nb_node << " " << typestr << " points" << 
std::endl;
+        //cerr << "reading nodes..[nb=" << nb_node << "]\n";
 
-            //cerr << "reading nodes..[nb=" << nb_node << "]\n";
+        size_type node_id=1; // start at 1
+        for (size_type node_cnt=0; node_cnt < nb_node; ++node_cnt) {
 
-            size_type node_id=1; // start at 1
-            for (size_type node_cnt=0; node_cnt < nb_node; ++node_cnt) {
+          std::getline(inVTKFile, line);
+          std::istringstream dataline(line);
 
-                std::getline(inVTKFile, line);
-                std::istringstream dataline(line);
+          base_node n(3); n[0]=n[1]=n[2]=0.0;
+          dataline >> n[0] >> n[1] >> n[2];
 
-                base_node n(3); n[0]=n[1]=n[2]=0.0;
-                dataline >> n[0] >> n[1] >> n[2];
-
-                msh_node_2_getfem_node[node_id] = m.add_point(n, 0.0, 
remove_duplicated_nodes);
-                node_id++;
-            }
+          msh_node_2_getfem_node[node_id] = m.add_point(n, 0.0, 
remove_duplicated_nodes);
+          node_id++;
         }
-        else if (kw == "CELLS")
-        {
-            size_type nb_cv, ni;
-            ln >> nb_cv >> ni;
-            std::cout << "Found " << nb_cv << " cells" << std::endl;
-            cvlst.reserve(nb_cv);
-            unsigned id=0; // element ID starts at 0
-            for (size_type cv=0; cv < nb_cv; ++cv) {
-                std::getline(inVTKFile, line);
-                std::istringstream dataline(line);
-                unsigned cv_nb_nodes;
-                dataline >> cv_nb_nodes;
-                cvlst.push_back(vtk_cv_info());
-                vtk_cv_info &ci = cvlst.back();
-                ci.id = id;
-                // nodes of convex
-                ci.nodes.resize(cv_nb_nodes);
-                for (size_type i=0; i < cv_nb_nodes; ++i) {
-                    size_type j;
-                    dataline >> j;
-                    j++; // Node ID starts at 1 for GetFEM
-                    std::map<size_type, size_type>::iterator it = 
msh_node_2_getfem_node.find(j);
-                    GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
-                                "Invalid node ID " << j << " in vtk element "
-                                << (ci.id + 1));
-                    ci.nodes[i] = it->second;
-                }
-                id++;
-            }
-
+      }
+      else if (kw == "CELLS") {
+        size_type nb_cv, ni;
+        ln >> nb_cv >> ni;
+        std::cout << "Found " << nb_cv << " cells" << std::endl;
+        cvlst.reserve(nb_cv);
+        unsigned id=0; // element ID starts at 0
+        for (size_type cv=0; cv < nb_cv; ++cv) {
+          std::getline(inVTKFile, line);
+          std::istringstream dataline(line);
+          unsigned cv_nb_nodes;
+          dataline >> cv_nb_nodes;
+          cvlst.push_back(vtk_cv_info());
+          vtk_cv_info &ci = cvlst.back();
+          ci.id = id;
+          // nodes of convex
+          ci.nodes.resize(cv_nb_nodes);
+          for (size_type i=0; i < cv_nb_nodes; ++i) {
+            size_type j;
+            dataline >> j;
+            j++; // Node ID starts at 1 for GetFEM
+            std::map<size_type, size_type>::iterator it
+              = msh_node_2_getfem_node.find(j);
+            GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
+                        "Invalid node ID " << j << " in vtk element "
+                        << (ci.id + 1));
+            ci.nodes[i] = it->second;
+          }
+          id++;
         }
-        else if (kw == "CELL_TYPES")
-        {
-            unsigned nb_cv;
-            ln >> nb_cv;
-            for(unsigned cv=0; cv<nb_cv; ++cv)
-            {
-                std::getline(inVTKFile, line);
-                std::istringstream dataline(line);
-                vtk_cv_info &ci = cvlst[cv];
-                unsigned type;
-                dataline >> type;
-                ci.type = type;
-                if(ci.type != 1) ci.set_pgt();
-                // Reordering nodes for certain elements (should be completed 
?)
-                std::vector<size_type> tmp_nodes(ci.nodes);
-                switch(ci.type) {
-                case 9 : { /* QUADRANGLE */
-                    ci.nodes[2] = tmp_nodes[3];
-                    ci.nodes[3] = tmp_nodes[2];
-                } break;
-                case 12 : { /* First order hexaedron */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    //ci.nodes[1] = tmp_nodes[1];
-                    ci.nodes[2] = tmp_nodes[3];
-                    ci.nodes[3] = tmp_nodes[2];
-                    //ci.nodes[4] = tmp_nodes[4];
-                    //ci.nodes[5] = tmp_nodes[5];
-                    ci.nodes[6] = tmp_nodes[7];
-                    ci.nodes[7] = tmp_nodes[6];
-                } break;
-                case 14 : { /* first order pyramid */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    ci.nodes[1] = tmp_nodes[2];
-                    ci.nodes[2] = tmp_nodes[1];
-                    // ci.nodes[3] = tmp_nodes[3];
-                    // ci.nodes[4] = tmp_nodes[4];
-                } break;
-                case 21 : { /* Second order line */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    ci.nodes[1] = tmp_nodes[2];
-                    ci.nodes[2] = tmp_nodes[1];
-                } break;
-                case 22 : { /* Second order triangle */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    ci.nodes[1] = tmp_nodes[3];
-                    ci.nodes[2] = tmp_nodes[1];
-                    ci.nodes[3] = tmp_nodes[5];
-                    //ci.nodes[4] = tmp_nodes[4];
-                    ci.nodes[5] = tmp_nodes[2];
-                } break;
-                case 24: { /* Second order tetrahedron */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    ci.nodes[1] = tmp_nodes[4];
-                    ci.nodes[2] = tmp_nodes[1];
-                    ci.nodes[3] = tmp_nodes[6];
-                    ci.nodes[4] = tmp_nodes[5];
-                    ci.nodes[5] = tmp_nodes[2];
-                    ci.nodes[6] = tmp_nodes[7];
-                    ci.nodes[7] = tmp_nodes[9];
-                    //ci.nodes[8] = tmp_nodes[8];
-                    ci.nodes[9] = tmp_nodes[3];
-                } break;
-                case 23 : { /* Incomplete second order quadrangle */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    ci.nodes[1] = tmp_nodes[4];
-                    ci.nodes[2] = tmp_nodes[1];
-                    ci.nodes[3] = tmp_nodes[7];
-                    ci.nodes[4] = tmp_nodes[5];
-                    ci.nodes[5] = tmp_nodes[3];
-                    ci.nodes[6] = tmp_nodes[6];
-                    ci.nodes[7] = tmp_nodes[2];
-                } break;
-                case 25: { /* Incomplete second order hexahedron */
-                    //ci.nodes[0] = tmp_nodes[0];
-                    ci.nodes[1] = tmp_nodes[8];
-                    ci.nodes[2] = tmp_nodes[1];
-                    ci.nodes[3] = tmp_nodes[9];
-                    ci.nodes[4] = tmp_nodes[11];
-                    ci.nodes[5] = tmp_nodes[3];
-                    ci.nodes[6] = tmp_nodes[13];
-                    ci.nodes[7] = tmp_nodes[2];
-                    ci.nodes[8] = tmp_nodes[10];
-                    ci.nodes[9] = tmp_nodes[12];
-                    ci.nodes[10] = tmp_nodes[15];
-                    ci.nodes[11] = tmp_nodes[14];
-                    ci.nodes[12] = tmp_nodes[4];
-                    ci.nodes[13] = tmp_nodes[16];
-                    ci.nodes[14] = tmp_nodes[5];
-                    ci.nodes[15] = tmp_nodes[17];
-                    ci.nodes[16] = tmp_nodes[18];
-                    ci.nodes[17] = tmp_nodes[7];
-                    ci.nodes[18] = tmp_nodes[19];
-                    ci.nodes[19] = tmp_nodes[6];
-                } break;
-                default: {
-
-                } break;
-
-                }
-            }
+      } else if (kw == "CELL_TYPES") {
+        unsigned nb_cv;
+        ln >> nb_cv;
+        for (unsigned cv=0; cv<nb_cv; ++cv) {
+          std::getline(inVTKFile, line);
+          std::istringstream dataline(line);
+          vtk_cv_info &ci = cvlst[cv];
+          unsigned type;
+          dataline >> type;
+          ci.type = type;
+          if (ci.type != 1) ci.set_pgt();
+            // Reordering nodes for certain elements (should be completed ?)
+            std::vector<size_type> tmp_nodes(ci.nodes);
+            switch(ci.type) {
+            case 9 : { /* QUADRANGLE */
+              ci.nodes[2] = tmp_nodes[3];
+              ci.nodes[3] = tmp_nodes[2];
+            } break;
+            case 12 : { /* First order hexaedron */
+              //ci.nodes[0] = tmp_nodes[0];
+              //ci.nodes[1] = tmp_nodes[1];
+              ci.nodes[2] = tmp_nodes[3];
+              ci.nodes[3] = tmp_nodes[2];
+              //ci.nodes[4] = tmp_nodes[4];
+              //ci.nodes[5] = tmp_nodes[5];
+              ci.nodes[6] = tmp_nodes[7];
+              ci.nodes[7] = tmp_nodes[6];
+            } break;
+            case 14 : { /* first order pyramid */
+              //ci.nodes[0] = tmp_nodes[0];
+              ci.nodes[1] = tmp_nodes[2];
+              ci.nodes[2] = tmp_nodes[1];
+              // ci.nodes[3] = tmp_nodes[3];
+              // ci.nodes[4] = tmp_nodes[4];
+            } break;
+            case 21 : { /* Second order line */
+              //ci.nodes[0] = tmp_nodes[0];
+              ci.nodes[1] = tmp_nodes[2];
+              ci.nodes[2] = tmp_nodes[1];
+            } break;
+            case 22 : { /* Second order triangle */
+              //ci.nodes[0] = tmp_nodes[0];
+              ci.nodes[1] = tmp_nodes[3];
+              ci.nodes[2] = tmp_nodes[1];
+              ci.nodes[3] = tmp_nodes[5];
+              //ci.nodes[4] = tmp_nodes[4];
+              ci.nodes[5] = tmp_nodes[2];
+            } break;
+            case 24: { /* Second order tetrahedron */
+              //ci.nodes[0] = tmp_nodes[0];
+              ci.nodes[1] = tmp_nodes[4];
+              ci.nodes[2] = tmp_nodes[1];
+              ci.nodes[3] = tmp_nodes[6];
+              ci.nodes[4] = tmp_nodes[5];
+              ci.nodes[5] = tmp_nodes[2];
+              ci.nodes[6] = tmp_nodes[7];
+              ci.nodes[7] = tmp_nodes[9];
+              //ci.nodes[8] = tmp_nodes[8];
+              ci.nodes[9] = tmp_nodes[3];
+            } break;
+            case 23 : { /* Incomplete second order quadrangle */
+              //ci.nodes[0] = tmp_nodes[0];
+              ci.nodes[1] = tmp_nodes[4];
+              ci.nodes[2] = tmp_nodes[1];
+              ci.nodes[3] = tmp_nodes[7];
+              ci.nodes[4] = tmp_nodes[5];
+              ci.nodes[5] = tmp_nodes[3];
+              ci.nodes[6] = tmp_nodes[6];
+              ci.nodes[7] = tmp_nodes[2];
+            } break;
+            case 25: { /* Incomplete second order hexahedron */
+              //ci.nodes[0] = tmp_nodes[0];
+              ci.nodes[1] = tmp_nodes[8];
+              ci.nodes[2] = tmp_nodes[1];
+              ci.nodes[3] = tmp_nodes[9];
+              ci.nodes[4] = tmp_nodes[11];
+              ci.nodes[5] = tmp_nodes[3];
+              ci.nodes[6] = tmp_nodes[13];
+              ci.nodes[7] = tmp_nodes[2];
+              ci.nodes[8] = tmp_nodes[10];
+              ci.nodes[9] = tmp_nodes[12];
+              ci.nodes[10] = tmp_nodes[15];
+              ci.nodes[11] = tmp_nodes[14];
+              ci.nodes[12] = tmp_nodes[4];
+              ci.nodes[13] = tmp_nodes[16];
+              ci.nodes[14] = tmp_nodes[5];
+              ci.nodes[15] = tmp_nodes[17];
+              ci.nodes[16] = tmp_nodes[18];
+              ci.nodes[17] = tmp_nodes[7];
+              ci.nodes[18] = tmp_nodes[19];
+              ci.nodes[19] = tmp_nodes[6];
+            } break;
+            default: {
+            } break;
+          }
         }
-        else if (!kw.empty())
-            std::cerr << "WARNING: Unknown keyword " << kw << std::endl;
-
+      } else if (!kw.empty())
+        std::cerr << "WARNING: Unknown keyword " << kw << std::endl;
     }
 
     // add convex
     size_type nb_cv = cvlst.size();
     if (cvlst.size()) {
-        std::sort(cvlst.begin(), cvlst.end());
-        if (cvlst.front().type == 1){
-            GMM_WARNING2("Only nodes defined in the mesh! No elements are 
added.");
-            return;
-        }
-
-        unsigned N = cvlst.front().pgt->dim(); // pgt: pointer geometric 
transformation
-        for (size_type cv=0; cv < nb_cv; ++cv) {
-            bool cvok = false;
-            vtk_cv_info &ci = cvlst[cv];
-            bool is_node = (ci.type == 1);
-            unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
-            //cout << "importing cv dim=" << int(ci.pgt->dim()) << " N=" << N
-            //     << " region: " << ci.region << "\n";
-
-            //main convex import
-            if (ci_dim == N) {
-                size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
-                cvok = true;
-                //m.region(ci.region).add(ic);
-            }
+      std::sort(cvlst.begin(), cvlst.end());
+      if (cvlst.front().type == 1) {
+        GMM_WARNING2("Only nodes defined in the mesh! No elements are added.");
+        return;
+      }
+
+      unsigned N = cvlst.front().pgt->dim(); // pgt: pointer geometric 
transformation
+      for (size_type cv=0; cv < nb_cv; ++cv) {
+        bool cvok = false;
+        vtk_cv_info &ci = cvlst[cv];
+        bool is_node = (ci.type == 1);
+        unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
+        //cout << "importing cv dim=" << int(ci.pgt->dim()) << " N=" << N
+        //     << " region: " << ci.region << "\n";
+
+        //main convex import
+        if (ci_dim == N) {
+          m.add_convex(ci.pgt, ci.nodes.begin());
+          cvok = true;
+          //m.region(ci.region).add(ic);
         }
+      }
     }
 
     std::cout << "import_vtk_mesh_file, read vtk file done!!!" << std::endl;
@@ -590,7 +567,7 @@ static void import_vtk_mesh_file(std::istream& f, mesh& m,
 }
 
 
-/*
+  /*
      Format version 1 [for gmsh version < 2.0].
      structure: $NOD list_of_nodes $ENDNOD $ELT list_of_elt $ENDELT
 
@@ -610,29 +587,29 @@ static void import_vtk_mesh_file(std::istream& f, mesh& m,
      for gmsh and gid meshes, the mesh nodes are always 3D, so for a 2D mesh
      if remove_last_dimension == true the z-component of nodes will be removed
   */
-static void import_gmsh_mesh_file(std::istream& f, mesh& m, int deprecate=0,
-                                  std::map<std::string, size_type> 
*region_map=NULL,
-                                  std::set<size_type> 
*lower_dim_convex_rg=NULL,
-                                  bool add_all_element_type = false,
-                                  bool remove_last_dimension = true,
-                                  std::map<size_type, std::set<size_type>> 
*nodal_map = NULL,
-                                  bool remove_duplicated_nodes = true)
-{
+  static void import_gmsh_mesh_file(std::istream& f, mesh& m, int deprecate=0,
+                                    std::map<std::string, size_type> 
*region_map=NULL,
+                                    std::set<size_type> 
*lower_dim_convex_rg=NULL,
+                                    bool add_all_element_type = false,
+                                    bool remove_last_dimension = true,
+                                    std::map<size_type, std::set<size_type>> 
*nodal_map = NULL,
+                                    bool remove_duplicated_nodes = true)
+  {
     gmm::stream_standard_locale sl(f);
     /* print general warning */
     GMM_WARNING3("  All regions must have different number!");
 
     /* print deprecate warning */
     if (deprecate!=0){
-        GMM_WARNING4("" << endl
-                     << "  deprecate: " << endl
-                     << "   static void" << endl
-                     << "   import_gmsh_mesh_file(std::istream& f,"
-                     << " mesh& , int version)" << endl
-                     << "  replace with:" << endl
-                     << "   static void" << endl
-                     << "   import_gmsh_mesh_file(std::istream& f,"
-                     << " mesh&)");
+      GMM_WARNING4("" << endl
+                << "  deprecate: " << endl
+                << "   static void" << endl
+                << "   import_gmsh_mesh_file(std::istream& f,"
+                << " mesh& , int version)" << endl
+                << "  replace with:" << endl
+                << "   static void" << endl
+                << "   import_gmsh_mesh_file(std::istream& f,"
+                << " mesh&)");
     }
 
     /* read the version */
@@ -640,342 +617,342 @@ static void import_gmsh_mesh_file(std::istream& f, 
mesh& m, int deprecate=0,
     std::string header;
     f >> header;
     if (bgeot::casecmp(header,"$MeshFormat")==0)
-        f >> version;
+      f >> version;
     else if (bgeot::casecmp(header,"$NOD")==0)
-        version = 1;
+      version = 1;
     else
-        GMM_ASSERT1(false, "can't read Gmsh format: " << header);
+      GMM_ASSERT1(false, "can't read Gmsh format: " << header);
 
     /* read the region names */
     if (region_map != NULL) {
-        if (version == 2) {
-            *region_map = read_region_names_from_gmsh_mesh_file(f);
-        }
+      if (version == 2) {
+        *region_map = read_region_names_from_gmsh_mesh_file(f);
+      }
     }
     /* read the node list */
     if (version == 2)
-        bgeot::read_until(f, "$Nodes"); /* Format version 2 */
+      bgeot::read_until(f, "$Nodes"); /* Format version 2 */
 
     size_type nb_node;
     f >> nb_node;
     //cerr << "reading nodes..[nb=" << nb_node << "]\n";
     std::map<size_type, size_type> msh_node_2_getfem_node;
     for (size_type node_cnt=0; node_cnt < nb_node; ++node_cnt) {
-        size_type node_id;
-        base_node n(3); n[0]=n[1]=n[2]=0.0;
-        f >> node_id >> n[0] >> n[1] >> n[2];
-        msh_node_2_getfem_node[node_id] = m.add_point(n, 0.0, 
remove_duplicated_nodes);
+      size_type node_id;
+      base_node n(3); n[0]=n[1]=n[2]=0.0;
+      f >> node_id >> n[0] >> n[1] >> n[2];
+      msh_node_2_getfem_node[node_id] = m.add_point(n, 0.0, 
remove_duplicated_nodes);
     }
 
     if (version == 2)
-        bgeot::read_until(f, "$Endnodes"); /* Format version 2 */
+      bgeot::read_until(f, "$Endnodes"); /* Format version 2 */
     else
-        bgeot::read_until(f, "$ENDNOD");
+      bgeot::read_until(f, "$ENDNOD");
 
     /* read the convexes */
     if (version == 2)
-        bgeot::read_until(f, "$Elements"); /* Format version 2 */
+      bgeot::read_until(f, "$Elements"); /* Format version 2 */
     else
-        bgeot::read_until(f, "$ELM");
+      bgeot::read_until(f, "$ELM");
 
     size_type nb_cv;
     f >> nb_cv;
     std::vector<gmsh_cv_info> cvlst; cvlst.reserve(nb_cv);
     for (size_type cv=0; cv < nb_cv; ++cv) {
-        unsigned id, type, region;
-        unsigned dummy, cv_nb_nodes;
-
-        if (version == 2) { /* Format version 2 */
-            unsigned nbtags, mesh_part;
-            f >> id >> type >> nbtags;
-            if (nbtags == 0 || nbtags > 3)
-                GMM_ASSERT1(false, "Number of tags " << nbtags
-                            << " is not managed.");
-
-            f >> region;
-            if (nbtags > 1) f >> dummy;
-            if (nbtags > 2) f >> mesh_part;
-        }
-        else
-            f >> id >> type >> region >> dummy >> cv_nb_nodes;
-
-        id--; /* gmsh numbering starts at 1 */
-
-        cvlst.push_back(gmsh_cv_info());
-        gmsh_cv_info &ci = cvlst.back();
-        ci.id = id; ci.type = type; ci.region = region;
-
-
-        if (version == 2) { /* For version 2 */
-            ci.set_nb_nodes();
-            cv_nb_nodes = unsigned(ci.nodes.size());
-        }
-        else
-            ci.nodes.resize(cv_nb_nodes);
-
-        // cout << "cv_nb_nodes = " << cv_nb_nodes << endl;
-
-        for (size_type i=0; i < cv_nb_nodes; ++i) {
-            size_type j;
-            f >> j;
-            std::map<size_type, size_type>::iterator
-                    it = msh_node_2_getfem_node.find(j);
-            GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
-                        "Invalid node ID " << j << " in gmsh element "
-                        << (ci.id + 1));
-            ci.nodes[i] = it->second;
-        }
-        if(ci.type != 15) ci.set_pgt();
-        // Reordering nodes for certain elements (should be completed ?)
-        // http://www.geuz.org/gmsh/doc/texinfo/gmsh.html#Node-ordering
-        std::vector<size_type> tmp_nodes(ci.nodes);
-        switch(ci.type) {
-        case 3 : {
-            ci.nodes[2] = tmp_nodes[3];
-            ci.nodes[3] = tmp_nodes[2];
-        } break;
-        case 5 : { /* First order hexaedron */
-            //ci.nodes[0] = tmp_nodes[0];
-            //ci.nodes[1] = tmp_nodes[1];
-            ci.nodes[2] = tmp_nodes[3];
-            ci.nodes[3] = tmp_nodes[2];
-            //ci.nodes[4] = tmp_nodes[4];
-            //ci.nodes[5] = tmp_nodes[5];
-            ci.nodes[6] = tmp_nodes[7];
-            ci.nodes[7] = tmp_nodes[6];
-        } break;
-        case 7 : { /* first order pyramid */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[2];
-            ci.nodes[2] = tmp_nodes[1];
-            // ci.nodes[3] = tmp_nodes[3];
-            // ci.nodes[4] = tmp_nodes[4];
-        } break;
-        case 8 : { /* Second order line */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[2];
-            ci.nodes[2] = tmp_nodes[1];
-        } break;
-        case 9 : { /* Second order triangle */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[3];
-            ci.nodes[2] = tmp_nodes[1];
-            ci.nodes[3] = tmp_nodes[5];
-            //ci.nodes[4] = tmp_nodes[4];
-            ci.nodes[5] = tmp_nodes[2];
-        } break;
-        case 10 : { /* Second order quadrangle */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[4];
-            ci.nodes[2] = tmp_nodes[1];
-            ci.nodes[3] = tmp_nodes[7];
-            ci.nodes[4] = tmp_nodes[8];
-            //ci.nodes[5] = tmp_nodes[5];
-            ci.nodes[6] = tmp_nodes[3];
-            ci.nodes[7] = tmp_nodes[6];
-            ci.nodes[8] = tmp_nodes[2];
-        } break;
-        case 11: { /* Second order tetrahedron */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[4];
-            ci.nodes[2] = tmp_nodes[1];
-            ci.nodes[3] = tmp_nodes[6];
-            ci.nodes[4] = tmp_nodes[5];
-            ci.nodes[5] = tmp_nodes[2];
-            ci.nodes[6] = tmp_nodes[7];
-            ci.nodes[7] = tmp_nodes[9];
-            //ci.nodes[8] = tmp_nodes[8];
-            ci.nodes[9] = tmp_nodes[3];
-        } break;
-        case 12: { /* Second order hexahedron */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[8];
-            ci.nodes[2] = tmp_nodes[1];
-            ci.nodes[3] = tmp_nodes[9];
-            ci.nodes[4] = tmp_nodes[20];
-            ci.nodes[5] = tmp_nodes[11];
-            ci.nodes[6] = tmp_nodes[3];
-            ci.nodes[7] = tmp_nodes[13];
-            ci.nodes[8] = tmp_nodes[2];
-            ci.nodes[9] = tmp_nodes[10];
-            ci.nodes[10] = tmp_nodes[21];
-            ci.nodes[11] = tmp_nodes[12];
-            ci.nodes[12] = tmp_nodes[22];
-            ci.nodes[13] = tmp_nodes[26];
-            ci.nodes[14] = tmp_nodes[23];
-            //ci.nodes[15] = tmp_nodes[15];
-            ci.nodes[16] = tmp_nodes[24];
-            ci.nodes[17] = tmp_nodes[14];
-            ci.nodes[18] = tmp_nodes[4];
-            ci.nodes[19] = tmp_nodes[16];
-            ci.nodes[20] = tmp_nodes[5];
-            ci.nodes[21] = tmp_nodes[17];
-            ci.nodes[22] = tmp_nodes[25];
-            ci.nodes[23] = tmp_nodes[18];
-            ci.nodes[24] = tmp_nodes[7];
-            ci.nodes[25] = tmp_nodes[19];
-            ci.nodes[26] = tmp_nodes[6];
-        } break;
-        case 16 : { /* Incomplete second order quadrangle */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[4];
-            ci.nodes[2] = tmp_nodes[1];
-            ci.nodes[3] = tmp_nodes[7];
-            ci.nodes[4] = tmp_nodes[5];
-            ci.nodes[5] = tmp_nodes[3];
-            ci.nodes[6] = tmp_nodes[6];
-            ci.nodes[7] = tmp_nodes[2];
-        } break;
-        case 17: { /* Incomplete second order hexahedron */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[8];
-            ci.nodes[2] = tmp_nodes[1];
-            ci.nodes[3] = tmp_nodes[9];
-            ci.nodes[4] = tmp_nodes[11];
-            ci.nodes[5] = tmp_nodes[3];
-            ci.nodes[6] = tmp_nodes[13];
-            ci.nodes[7] = tmp_nodes[2];
-            ci.nodes[8] = tmp_nodes[10];
-            ci.nodes[9] = tmp_nodes[12];
-            ci.nodes[10] = tmp_nodes[15];
-            ci.nodes[11] = tmp_nodes[14];
-            ci.nodes[12] = tmp_nodes[4];
-            ci.nodes[13] = tmp_nodes[16];
-            ci.nodes[14] = tmp_nodes[5];
-            ci.nodes[15] = tmp_nodes[17];
-            ci.nodes[16] = tmp_nodes[18];
-            ci.nodes[17] = tmp_nodes[7];
-            ci.nodes[18] = tmp_nodes[19];
-            ci.nodes[19] = tmp_nodes[6];
-        } break;
-        case 26 : { /* Third order line */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[2];
-            ci.nodes[2] = tmp_nodes[3];
-            ci.nodes[3] = tmp_nodes[1];
-        } break;
-        case 21 : { /* Third order triangle */
-            //ci.nodes[0] = tmp_nodes[0];
-            ci.nodes[1] = tmp_nodes[3];
-            ci.nodes[2] = tmp_nodes[4];
-            ci.nodes[3] = tmp_nodes[1];
-            ci.nodes[4] = tmp_nodes[8];
-            ci.nodes[5] = tmp_nodes[9];
-            ci.nodes[6] = tmp_nodes[5];
-            //ci.nodes[7] = tmp_nodes[7];
-            ci.nodes[8] = tmp_nodes[6];
-            ci.nodes[9] = tmp_nodes[2];
-        } break;
-        case 23: { /* Fourth order triangle */
-            //ci.nodes[0]  = tmp_nodes[0];
-            ci.nodes[1]  = tmp_nodes[3];
-            ci.nodes[2]  = tmp_nodes[4];
-            ci.nodes[3]  = tmp_nodes[5];
-            ci.nodes[4]  = tmp_nodes[1];
-            ci.nodes[5]  = tmp_nodes[11];
-            ci.nodes[6]  = tmp_nodes[12];
-            ci.nodes[7]  = tmp_nodes[13];
-            ci.nodes[8]  = tmp_nodes[6];
-            ci.nodes[9]  = tmp_nodes[10];
-            ci.nodes[10] = tmp_nodes[14];
-            ci.nodes[11] = tmp_nodes[7];
-            ci.nodes[12] = tmp_nodes[9];
-            ci.nodes[13] = tmp_nodes[8];
-            ci.nodes[14] = tmp_nodes[2];
-        } break;
-        case 27: { /* Fourth order line */
-            //ci.nodes[0]  = tmp_nodes[0];
-            ci.nodes[1]  = tmp_nodes[2];
-            ci.nodes[2]  = tmp_nodes[3];
-            ci.nodes[3]  = tmp_nodes[4];
-            ci.nodes[4]  = tmp_nodes[1];
-        } break;
-        }
+      unsigned id, type, region;
+      unsigned dummy, cv_nb_nodes;
+
+      if (version == 2) { /* Format version 2 */
+        unsigned nbtags, mesh_part;
+        f >> id >> type >> nbtags;
+        if (nbtags == 0 || nbtags > 3)
+          GMM_ASSERT1(false, "Number of tags " << nbtags
+                      << " is not managed.");
+
+        f >> region;
+        if (nbtags > 1) f >> dummy;
+        if (nbtags > 2) f >> mesh_part;
+      }
+      else
+        f >> id >> type >> region >> dummy >> cv_nb_nodes;
+
+      id--; /* gmsh numbering starts at 1 */
+
+      cvlst.push_back(gmsh_cv_info());
+      gmsh_cv_info &ci = cvlst.back();
+      ci.id = id; ci.type = type; ci.region = region;
+
+
+      if (version == 2) { /* For version 2 */
+        ci.set_nb_nodes();
+        cv_nb_nodes = unsigned(ci.nodes.size());
+      }
+      else
+        ci.nodes.resize(cv_nb_nodes);
+
+      // cout << "cv_nb_nodes = " << cv_nb_nodes << endl;
+
+      for (size_type i=0; i < cv_nb_nodes; ++i) {
+        size_type j;
+        f >> j;
+        std::map<size_type, size_type>::iterator
+          it = msh_node_2_getfem_node.find(j);
+        GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
+                    "Invalid node ID " << j << " in gmsh element "
+                    << (ci.id + 1));
+        ci.nodes[i] = it->second;
+      }
+      if(ci.type != 15) ci.set_pgt();
+      // Reordering nodes for certain elements (should be completed ?)
+      // http://www.geuz.org/gmsh/doc/texinfo/gmsh.html#Node-ordering
+      std::vector<size_type> tmp_nodes(ci.nodes);
+      switch(ci.type) {
+      case 3 : {
+        ci.nodes[2] = tmp_nodes[3];
+        ci.nodes[3] = tmp_nodes[2];
+      } break;
+      case 5 : { /* First order hexaedron */
+        //ci.nodes[0] = tmp_nodes[0];
+        //ci.nodes[1] = tmp_nodes[1];
+        ci.nodes[2] = tmp_nodes[3];
+        ci.nodes[3] = tmp_nodes[2];
+        //ci.nodes[4] = tmp_nodes[4];
+        //ci.nodes[5] = tmp_nodes[5];
+        ci.nodes[6] = tmp_nodes[7];
+        ci.nodes[7] = tmp_nodes[6];
+      } break;
+      case 7 : { /* first order pyramid */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[2];
+        ci.nodes[2] = tmp_nodes[1];
+        // ci.nodes[3] = tmp_nodes[3];
+        // ci.nodes[4] = tmp_nodes[4];
+      } break;
+      case 8 : { /* Second order line */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[2];
+        ci.nodes[2] = tmp_nodes[1];
+      } break;
+      case 9 : { /* Second order triangle */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[3];
+        ci.nodes[2] = tmp_nodes[1];
+        ci.nodes[3] = tmp_nodes[5];
+        //ci.nodes[4] = tmp_nodes[4];
+        ci.nodes[5] = tmp_nodes[2];
+      } break;
+      case 10 : { /* Second order quadrangle */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[4];
+        ci.nodes[2] = tmp_nodes[1];
+        ci.nodes[3] = tmp_nodes[7];
+        ci.nodes[4] = tmp_nodes[8];
+        //ci.nodes[5] = tmp_nodes[5];
+        ci.nodes[6] = tmp_nodes[3];
+        ci.nodes[7] = tmp_nodes[6];
+        ci.nodes[8] = tmp_nodes[2];
+      } break;
+      case 11: { /* Second order tetrahedron */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[4];
+        ci.nodes[2] = tmp_nodes[1];
+        ci.nodes[3] = tmp_nodes[6];
+        ci.nodes[4] = tmp_nodes[5];
+        ci.nodes[5] = tmp_nodes[2];
+        ci.nodes[6] = tmp_nodes[7];
+        ci.nodes[7] = tmp_nodes[9];
+        //ci.nodes[8] = tmp_nodes[8];
+        ci.nodes[9] = tmp_nodes[3];
+      } break;
+      case 12: { /* Second order hexahedron */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[8];
+        ci.nodes[2] = tmp_nodes[1];
+        ci.nodes[3] = tmp_nodes[9];
+        ci.nodes[4] = tmp_nodes[20];
+        ci.nodes[5] = tmp_nodes[11];
+        ci.nodes[6] = tmp_nodes[3];
+        ci.nodes[7] = tmp_nodes[13];
+        ci.nodes[8] = tmp_nodes[2];
+        ci.nodes[9] = tmp_nodes[10];
+        ci.nodes[10] = tmp_nodes[21];
+        ci.nodes[11] = tmp_nodes[12];
+        ci.nodes[12] = tmp_nodes[22];
+        ci.nodes[13] = tmp_nodes[26];
+        ci.nodes[14] = tmp_nodes[23];
+        //ci.nodes[15] = tmp_nodes[15];
+        ci.nodes[16] = tmp_nodes[24];
+        ci.nodes[17] = tmp_nodes[14];
+        ci.nodes[18] = tmp_nodes[4];
+        ci.nodes[19] = tmp_nodes[16];
+        ci.nodes[20] = tmp_nodes[5];
+        ci.nodes[21] = tmp_nodes[17];
+        ci.nodes[22] = tmp_nodes[25];
+        ci.nodes[23] = tmp_nodes[18];
+        ci.nodes[24] = tmp_nodes[7];
+        ci.nodes[25] = tmp_nodes[19];
+        ci.nodes[26] = tmp_nodes[6];
+      } break;
+      case 16 : { /* Incomplete second order quadrangle */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[4];
+        ci.nodes[2] = tmp_nodes[1];
+        ci.nodes[3] = tmp_nodes[7];
+        ci.nodes[4] = tmp_nodes[5];
+        ci.nodes[5] = tmp_nodes[3];
+        ci.nodes[6] = tmp_nodes[6];
+        ci.nodes[7] = tmp_nodes[2];
+      } break;
+      case 17: { /* Incomplete second order hexahedron */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[8];
+        ci.nodes[2] = tmp_nodes[1];
+        ci.nodes[3] = tmp_nodes[9];
+        ci.nodes[4] = tmp_nodes[11];
+        ci.nodes[5] = tmp_nodes[3];
+        ci.nodes[6] = tmp_nodes[13];
+        ci.nodes[7] = tmp_nodes[2];
+        ci.nodes[8] = tmp_nodes[10];
+        ci.nodes[9] = tmp_nodes[12];
+        ci.nodes[10] = tmp_nodes[15];
+        ci.nodes[11] = tmp_nodes[14];
+        ci.nodes[12] = tmp_nodes[4];
+        ci.nodes[13] = tmp_nodes[16];
+        ci.nodes[14] = tmp_nodes[5];
+        ci.nodes[15] = tmp_nodes[17];
+        ci.nodes[16] = tmp_nodes[18];
+        ci.nodes[17] = tmp_nodes[7];
+        ci.nodes[18] = tmp_nodes[19];
+        ci.nodes[19] = tmp_nodes[6];
+      } break;
+      case 26 : { /* Third order line */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[2];
+        ci.nodes[2] = tmp_nodes[3];
+        ci.nodes[3] = tmp_nodes[1];
+      } break;
+      case 21 : { /* Third order triangle */
+        //ci.nodes[0] = tmp_nodes[0];
+        ci.nodes[1] = tmp_nodes[3];
+        ci.nodes[2] = tmp_nodes[4];
+        ci.nodes[3] = tmp_nodes[1];
+        ci.nodes[4] = tmp_nodes[8];
+        ci.nodes[5] = tmp_nodes[9];
+        ci.nodes[6] = tmp_nodes[5];
+        //ci.nodes[7] = tmp_nodes[7];
+        ci.nodes[8] = tmp_nodes[6];
+        ci.nodes[9] = tmp_nodes[2];
+      } break;
+      case 23: { /* Fourth order triangle */
+      //ci.nodes[0]  = tmp_nodes[0];
+        ci.nodes[1]  = tmp_nodes[3];
+        ci.nodes[2]  = tmp_nodes[4];
+        ci.nodes[3]  = tmp_nodes[5];
+        ci.nodes[4]  = tmp_nodes[1];
+        ci.nodes[5]  = tmp_nodes[11];
+        ci.nodes[6]  = tmp_nodes[12];
+        ci.nodes[7]  = tmp_nodes[13];
+        ci.nodes[8]  = tmp_nodes[6];
+        ci.nodes[9]  = tmp_nodes[10];
+        ci.nodes[10] = tmp_nodes[14];
+        ci.nodes[11] = tmp_nodes[7];
+        ci.nodes[12] = tmp_nodes[9];
+        ci.nodes[13] = tmp_nodes[8];
+        ci.nodes[14] = tmp_nodes[2];
+      } break;
+      case 27: { /* Fourth order line */
+      //ci.nodes[0]  = tmp_nodes[0];
+        ci.nodes[1]  = tmp_nodes[2];
+        ci.nodes[2]  = tmp_nodes[3];
+        ci.nodes[3]  = tmp_nodes[4];
+        ci.nodes[4]  = tmp_nodes[1];
+      } break;
+      }
     }
     nb_cv = cvlst.size();
     if (cvlst.size()) {
-        std::sort(cvlst.begin(), cvlst.end());
-        if (cvlst.front().type == 15){
-            GMM_WARNING2("Only nodes defined in the mesh! No elements are 
added.");
-            return;
+      std::sort(cvlst.begin(), cvlst.end());
+      if (cvlst.front().type == 15){
+        GMM_WARNING2("Only nodes defined in the mesh! No elements are added.");
+        return;
+      }
+
+      unsigned N = cvlst.front().pgt->dim();
+      for (size_type cv=0; cv < nb_cv; ++cv) {
+        bool cvok = false;
+        gmsh_cv_info &ci = cvlst[cv];
+        bool is_node = (ci.type == 15);
+        unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
+        //cout << "importing cv dim=" << int(ci.pgt->dim()) << " N=" << N
+        //     << " region: " << ci.region << "\n";
+
+        //main convex import
+        if (ci_dim == N) {
+          size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
+          cvok = true;
+          m.region(ci.region).add(ic);
+
+        //convexes with lower dimensions
         }
-
-        unsigned N = cvlst.front().pgt->dim();
-        for (size_type cv=0; cv < nb_cv; ++cv) {
-            bool cvok = false;
-            gmsh_cv_info &ci = cvlst[cv];
-            bool is_node = (ci.type == 15);
-            unsigned ci_dim = (is_node) ? 0 : ci.pgt->dim();
-            //cout << "importing cv dim=" << int(ci.pgt->dim()) << " N=" << N
-            //     << " region: " << ci.region << "\n";
-
-            //main convex import
-            if (ci_dim == N) {
-                size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
-                cvok = true;
-                m.region(ci.region).add(ic);
-
-                //convexes with lower dimensions
-            }
-            else {
-                //convex that lies within the regions of lower_dim_convex_rg
-                //is imported explicitly as a convex.
-                if (lower_dim_convex_rg != NULL &&
-                        lower_dim_convex_rg->find(ci.region) != 
lower_dim_convex_rg->end() &&
-                        !is_node){
-                    size_type ic = m.add_convex(ci.pgt, ci.nodes.begin()); 
cvok = true;
-                    m.region(ci.region).add(ic);
+        else {
+          //convex that lies within the regions of lower_dim_convex_rg
+          //is imported explicitly as a convex.
+          if (lower_dim_convex_rg != NULL &&
+              lower_dim_convex_rg->find(ci.region) != 
lower_dim_convex_rg->end() &&
+              !is_node){
+              size_type ic = m.add_convex(ci.pgt, ci.nodes.begin()); cvok = 
true;
+              m.region(ci.region).add(ic);
+          }
+          //find if the convex is part of a face of higher dimension convex
+          else{
+            bgeot::mesh_structure::ind_cv_ct ct = 
m.convex_to_point(ci.nodes[0]);
+            for (bgeot::mesh_structure::ind_cv_ct::const_iterator
+                   it = ct.begin(); it != ct.end(); ++it) {
+              for (short_type face=0;
+                   face < m.structure_of_convex(*it)->nb_faces(); ++face) {
+                if (m.is_convex_face_having_points(*it,face,
+                                                   short_type(ci.nodes.size()),
+                                                   ci.nodes.begin())) {
+                  m.region(ci.region).add(*it,face);
+                  cvok = true;
                 }
-                //find if the convex is part of a face of higher dimension 
convex
-                else{
-                    bgeot::mesh_structure::ind_cv_ct ct = 
m.convex_to_point(ci.nodes[0]);
-                    for (bgeot::mesh_structure::ind_cv_ct::const_iterator
-                         it = ct.begin(); it != ct.end(); ++it) {
-                        for (short_type face=0;
-                             face < m.structure_of_convex(*it)->nb_faces(); 
++face) {
-                            if (m.is_convex_face_having_points(*it,face,
-                                                               
short_type(ci.nodes.size()),
-                                                               
ci.nodes.begin())) {
-                                m.region(ci.region).add(*it,face);
-                                cvok = true;
-                            }
-                        }
-                    }
-                    if (is_node && (nodal_map != NULL)) 
(*nodal_map)[ci.region].insert(ci.id);
-                    //if the convex is not part of the face of others
-                    if (!cvok)
-                    {
-                        if (is_node)
-                        {
-                            if (nodal_map == NULL){
-                                GMM_WARNING2("gmsh import ignored a node id: "
-                                             << ci.id << " region :" << 
ci.region <<
-                                             " point is not added explicitly 
as an element.");
-                            }
-                        }
-                        else if (add_all_element_type){
-                            size_type ic = m.add_convex(ci.pgt, 
ci.nodes.begin());
-                            m.region(ci.region).add(ic);
-                            cvok = true;
-                        }
-                        else{
-                            GMM_WARNING2("gmsh import ignored an element of 
type "
-                                         << 
bgeot::name_of_geometric_trans(ci.pgt) <<
-                                         " as it does not belong to the face 
of another element");
-                        }
-                    }
+              }
+            }
+            if (is_node && (nodal_map != NULL)) 
(*nodal_map)[ci.region].insert(ci.id);
+            //if the convex is not part of the face of others
+            if (!cvok)
+            {
+              if (is_node)
+              {
+                if (nodal_map == NULL){
+                  GMM_WARNING2("gmsh import ignored a node id: "
+                               << ci.id << " region :" << ci.region <<
+                               " point is not added explicitly as an 
element.");
                 }
+              }
+              else if (add_all_element_type){
+                size_type ic = m.add_convex(ci.pgt, ci.nodes.begin());
+                m.region(ci.region).add(ic);
+                cvok = true;
+              }
+              else{
+                GMM_WARNING2("gmsh import ignored an element of type "
+                  << bgeot::name_of_geometric_trans(ci.pgt) <<
+                  " as it does not belong to the face of another element");
+              }
             }
+          }
         }
+      }
     }
     if (remove_last_dimension) maybe_remove_last_dimension(m);
-}
+  }
 
-/* mesh file from GiD [http://gid.cimne.upc.es/]
+  /* mesh file from GiD [http://gid.cimne.upc.es/]
 
   supports linear and quadratic elements (quadrilaterals, use 9(or 27)-noded 
elements)
   */
-static void import_gid_mesh_file(std::istream& f, mesh& m) {
+  static void import_gid_mesh_file(std::istream& f, mesh& m) {
     gmm::stream_standard_locale sl(f);
     /* read the node list */
     size_type dim;
@@ -985,154 +962,154 @@ static void import_gid_mesh_file(std::istream& f, mesh& 
m) {
     std::vector<size_type> cv_nodes, getfem_cv_nodes;
     bool nodes_done = false;
     do {
-        if (!f.eof()) f >> std::ws;
-        if (f.eof() || !bgeot::read_until(f, "MESH")) break;
-        std::string selemtype;
-        f >> bgeot::skip("DIMENSION") >> dim
-                                      >> bgeot::skip("ELEMTYPE") >> std::ws
-                                      >> selemtype
-                                      >> bgeot::skip("NNODE") >> nnode;
-        if (bgeot::casecmp(selemtype, "linear")==0) { eltype = LIN;  }
-        else if (bgeot::casecmp(selemtype, "triangle")==0) { eltype = TRI; }
-        else if (bgeot::casecmp(selemtype, "quadrilateral")==0) { eltype = 
QUAD; }
-        else if (bgeot::casecmp(selemtype, "tetrahedra")==0) { eltype = TETR; }
-        else if (bgeot::casecmp(selemtype, "prisma")==0) { eltype = PRISM; }
-        else if (bgeot::casecmp(selemtype, "hexahedra")==0) { eltype = HEX; }
-        else GMM_ASSERT1(false, "unknown element type '"<< selemtype << "'");
-        GMM_ASSERT1(!f.eof(), "File ended before coordinates");
-        f >> bgeot::skip("COORDINATES");
-        if (!nodes_done) {
-            dal::dynamic_array<base_node> gid_nodes;
-            dal::bit_vector gid_nodes_used;
-            do {
-                //cerr << "reading coordinates " << std::streamoff(f.tellg()) 
<< "\n";
-                std::string ls;
-                f >> std::ws;
-                std::getline(f,ls);
-                if (bgeot::casecmp(ls, "END COORDINATES", 15)==0) break;
-                std::stringstream s; s << ls;
-                size_type id;
-                s >> id;
-
-                gid_nodes[id].resize(dim); gid_nodes_used.add(id);
-                for (size_type i=0; i < dim; ++i) s >> gid_nodes[id][i];
-                //cerr << "ppoint " << id << ", " << n << endl;
-            } while (true);
-
-            GMM_ASSERT1(gid_nodes_used.card() != 0, "no nodes in the mesh!");
-
-            /* suppression of unused dimensions */
-            std::vector<bool> direction_useless(3,true);
-            base_node first_pt = gid_nodes[gid_nodes_used.first()];
-            for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
-                for (size_type j=0; j < first_pt.size(); ++j) {
-                    if (direction_useless[j] && 
(gmm::abs(gid_nodes[ip][j]-first_pt[j]) > 1e-13))
-                        direction_useless[j] = false;
-                }
-            }
-            size_type dim2=0;
-            for (size_type j=0; j < dim; ++j) if (!direction_useless[j]) 
dim2++;
-            for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
-                base_node n(dim2);
-                for (size_type j=0, cnt=0; j < dim; ++j) if 
(!direction_useless[j]) n[cnt++]=gid_nodes[ip][j];
-                msh_node_2_getfem_node[ip] = m.add_point(n);
-            }
-        }
+      if (!f.eof()) f >> std::ws;
+      if (f.eof() || !bgeot::read_until(f, "MESH")) break;
+      std::string selemtype;
+      f >> bgeot::skip("DIMENSION") >> dim
+        >> bgeot::skip("ELEMTYPE") >> std::ws
+        >> selemtype
+        >> bgeot::skip("NNODE") >> nnode;
+      if (bgeot::casecmp(selemtype, "linear")==0) { eltype = LIN;  }
+      else if (bgeot::casecmp(selemtype, "triangle")==0) { eltype = TRI; }
+      else if (bgeot::casecmp(selemtype, "quadrilateral")==0) { eltype = QUAD; 
}
+      else if (bgeot::casecmp(selemtype, "tetrahedra")==0) { eltype = TETR; }
+      else if (bgeot::casecmp(selemtype, "prisma")==0) { eltype = PRISM; }
+      else if (bgeot::casecmp(selemtype, "hexahedra")==0) { eltype = HEX; }
+      else GMM_ASSERT1(false, "unknown element type '"<< selemtype << "'");
+      GMM_ASSERT1(!f.eof(), "File ended before coordinates");
+      f >> bgeot::skip("COORDINATES");
+      if (!nodes_done) {
+        dal::dynamic_array<base_node> gid_nodes;
+        dal::bit_vector gid_nodes_used;
+        do {
+          //cerr << "reading coordinates " << std::streamoff(f.tellg()) << 
"\n";
+          std::string ls;
+          f >> std::ws;
+          std::getline(f,ls);
+          if (bgeot::casecmp(ls, "END COORDINATES", 15)==0) break;
+          std::stringstream s; s << ls;
+          size_type id;
+          s >> id;
+
+          gid_nodes[id].resize(dim); gid_nodes_used.add(id);
+          for (size_type i=0; i < dim; ++i) s >> gid_nodes[id][i];
+          //cerr << "ppoint " << id << ", " << n << endl;
+        } while (true);
 
-        bgeot::read_until(f, "ELEMENTS");
-        bgeot::pgeometric_trans pgt = NULL;
-        std::vector<size_type> order(nnode); // ordre de GiD cf 
http://gid.cimne.upc.es/support/gid_11.subst#SEC160
-        for (size_type i=0; i < nnode; ++i) order[i]=i;
-        //cerr << "reading elements " << std::streamoff(f.tellg()) << "\n";
-        switch (eltype) {
-        case LIN: {
-            if (nnode == 2) pgt = bgeot::simplex_geotrans(1,1);
-            else if (nnode == 3) {
-                pgt = bgeot::simplex_geotrans(1,2); // A VERIFIER TOUT CA
-                std::swap(order[1],order[2]);
-            }
-        } break;
-        case TRI: {
-            if (nnode == 3) pgt = bgeot::simplex_geotrans(2,1);
-            else if (nnode == 6) { // valid�
-                static size_type lorder[6] = {0,3,1,5,4,2};
-                pgt = bgeot::simplex_geotrans(2,2);
-                std::copy(lorder,lorder+nnode,order.begin());
-            }
-        } break;
-        case QUAD: {
-            if (nnode == 4) pgt = bgeot::parallelepiped_geotrans(2,1);
-            else if (nnode == 9) {
-                static size_type lorder[9] = {0,4,1, 7,8,5, 3,6,2};
-                pgt = bgeot::parallelepiped_geotrans(2,2);
-                std::copy(lorder,lorder+nnode,order.begin());
-            }
-        } break;
-        case TETR: {
-            if (nnode == 4) pgt = bgeot::simplex_geotrans(3,1);
-            else if (nnode == 10) { // valid�
-                static size_type lorder[10] = {0,4,1, 7,8, 3, 6, 5, 9, 2};
-                pgt = bgeot::simplex_geotrans(3,2);
-                std::copy(lorder,lorder+nnode,order.begin());
-            }
-        } break;
-        case PRISM: {
-            if (nnode == 6) pgt = bgeot::prism_geotrans(3,1);
-        } break;
-        case HEX: {
-            if (nnode == 8) pgt = bgeot::parallelepiped_geotrans(3,1);
-            else if (nnode == 27) {
-                static size_type lorder[27] = {0,8,1, 12,21,13, 4,16,5,
-                                               11,20,9, 22,26,24, 19,25,17,
-                                               3,10,2, 15,23,14, 7,18,6};
-                pgt = bgeot::parallelepiped_geotrans(3,2);
-                std::copy(lorder,lorder+nnode,order.begin());
-            }
-        } break;
-        default: GMM_ASSERT1(false, ""); break;
+        GMM_ASSERT1(gid_nodes_used.card() != 0, "no nodes in the mesh!");
+
+        /* suppression of unused dimensions */
+        std::vector<bool> direction_useless(3,true);
+        base_node first_pt = gid_nodes[gid_nodes_used.first()];
+        for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
+          for (size_type j=0; j < first_pt.size(); ++j) {
+            if (direction_useless[j] && 
(gmm::abs(gid_nodes[ip][j]-first_pt[j]) > 1e-13))
+              direction_useless[j] = false;
+          }
         }
-        GMM_ASSERT1(pgt != NULL, "unknown element type " << selemtype
-                    << " with " << nnode << "nodes");
-        do {
-            std::string ls;
-            f >> std::ws;
-            std::getline(f,ls);
-            if (bgeot::casecmp(ls, "END ELEMENTS", 12)==0) break;
-            std::stringstream s; s << ls;
-            size_type cv_id;
-            s >> cv_id;
-            cv_nodes.resize(nnode);
-            for (size_type i=0; i < nnode; ++i) {
-                size_type j;
-                s >> j;
-                std::map<size_type, size_type>::iterator
-                        it = msh_node_2_getfem_node.find(j);
-                GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
-                            "Invalid node ID " << j << " in GiD element " << 
cv_id);
-                cv_nodes[i] = it->second;
-            }
-            getfem_cv_nodes.resize(nnode);
-            for (size_type i=0; i < nnode; ++i) {
-                getfem_cv_nodes[i] = cv_nodes[order[i]];
-            }
-            //cerr << "elt " << cv_id << ", " << getfem_cv_nodes << endl;
+        size_type dim2=0;
+        for (size_type j=0; j < dim; ++j) if (!direction_useless[j]) dim2++;
+        for (dal::bv_visitor ip(gid_nodes_used); !ip.finished(); ++ip) {
+          base_node n(dim2);
+          for (size_type j=0, cnt=0; j < dim; ++j) if (!direction_useless[j]) 
n[cnt++]=gid_nodes[ip][j];
+          msh_node_2_getfem_node[ip] = m.add_point(n);
+        }
+      }
+
+      bgeot::read_until(f, "ELEMENTS");
+      bgeot::pgeometric_trans pgt = NULL;
+      std::vector<size_type> order(nnode); // ordre de GiD cf 
http://gid.cimne.upc.es/support/gid_11.subst#SEC160
+      for (size_type i=0; i < nnode; ++i) order[i]=i;
+      //cerr << "reading elements " << std::streamoff(f.tellg()) << "\n";
+      switch (eltype) {
+      case LIN: {
+        if (nnode == 2) pgt = bgeot::simplex_geotrans(1,1);
+        else if (nnode == 3) {
+          pgt = bgeot::simplex_geotrans(1,2); // A VERIFIER TOUT CA
+          std::swap(order[1],order[2]);
+        }
+      } break;
+      case TRI: {
+        if (nnode == 3) pgt = bgeot::simplex_geotrans(2,1);
+        else if (nnode == 6) { // validé
+          static size_type lorder[6] = {0,3,1,5,4,2};
+          pgt = bgeot::simplex_geotrans(2,2);
+          std::copy(lorder,lorder+nnode,order.begin());
+        }
+      } break;
+      case QUAD: {
+        if (nnode == 4) pgt = bgeot::parallelepiped_geotrans(2,1);
+        else if (nnode == 9) {
+          static size_type lorder[9] = {0,4,1, 7,8,5, 3,6,2};
+          pgt = bgeot::parallelepiped_geotrans(2,2);
+          std::copy(lorder,lorder+nnode,order.begin());
+        }
+      } break;
+      case TETR: {
+        if (nnode == 4) pgt = bgeot::simplex_geotrans(3,1);
+        else if (nnode == 10) { // validé
+          static size_type lorder[10] = {0,4,1, 7,8, 3, 6, 5, 9, 2};
+          pgt = bgeot::simplex_geotrans(3,2);
+          std::copy(lorder,lorder+nnode,order.begin());
+        }
+      } break;
+      case PRISM: {
+        if (nnode == 6) pgt = bgeot::prism_geotrans(3,1);
+      } break;
+      case HEX: {
+        if (nnode == 8) pgt = bgeot::parallelepiped_geotrans(3,1);
+        else if (nnode == 27) {
+          static size_type lorder[27] = {0,8,1, 12,21,13, 4,16,5,
+                                         11,20,9, 22,26,24, 19,25,17,
+                                         3,10,2, 15,23,14, 7,18,6};
+          pgt = bgeot::parallelepiped_geotrans(3,2);
+          std::copy(lorder,lorder+nnode,order.begin());
+        }
+      } break;
+      default: GMM_ASSERT1(false, ""); break;
+      }
+      GMM_ASSERT1(pgt != NULL, "unknown element type " << selemtype
+                  << " with " << nnode << "nodes");
+      do {
+        std::string ls;
+        f >> std::ws;
+        std::getline(f,ls);
+        if (bgeot::casecmp(ls, "END ELEMENTS", 12)==0) break;
+        std::stringstream s; s << ls;
+        size_type cv_id;
+        s >> cv_id;
+        cv_nodes.resize(nnode);
+        for (size_type i=0; i < nnode; ++i) {
+          size_type j;
+          s >> j;
+          std::map<size_type, size_type>::iterator
+            it = msh_node_2_getfem_node.find(j);
+          GMM_ASSERT1(it != msh_node_2_getfem_node.end(),
+                      "Invalid node ID " << j << " in GiD element " << cv_id);
+          cv_nodes[i] = it->second;
+        }
+        getfem_cv_nodes.resize(nnode);
+        for (size_type i=0; i < nnode; ++i) {
+          getfem_cv_nodes[i] = cv_nodes[order[i]];
+        }
+        //cerr << "elt " << cv_id << ", " << getfem_cv_nodes << endl;
 
-            // envisager la "simplification" quand on a une transfo non
-            // lineaire mais que la destination est lineaire
-            m.add_convex(pgt, getfem_cv_nodes.begin());
-        } while (true);
+        // envisager la "simplification" quand on a une transfo non
+        // lineaire mais que la destination est lineaire
+        m.add_convex(pgt, getfem_cv_nodes.begin());
+      } while (true);
     } while (!f.eof());
-}
+  }
 
-/* mesh file from ANSYS
+  /* mesh file from ANSYS
 
   Supports solid structural elements stored with cdwrite in blocked format.
   Use the following command in ANSYS for exporting the mesh:
 
   cdwrite,db,filename,cdb
   */
-static void import_cdb_mesh_file(std::istream& f, mesh& m,
-                                 size_type imat_filt=size_type(-1)) {
+  static void import_cdb_mesh_file(std::istream& f, mesh& m,
+                                   size_type imat_filt=size_type(-1)) {
 
     std::map<size_type, size_type> cdb_node_2_getfem_node;
     std::vector<size_type> getfem_cv_nodes;
@@ -1143,428 +1120,429 @@ static void import_cdb_mesh_file(std::istream& f, 
mesh& m,
     size_type pos, pos2;
     std::string line;
     while (true) {
-        std::getline(f,line);
-        pos = line.find_first_not_of(" ");
-        if (bgeot::casecmp(line.substr(pos,2),"ET") == 0) {
-            size_type itype;
-            std::string type_name;
-            pos = line.find_first_of(",")+1;
-            pos2 = line.find_first_of(",", pos);
-            itype = std::stol(line.substr(pos, pos2-pos));
-            pos = line.find_first_not_of(" ,\n\r\t", pos2);
-            pos2 = line.find_first_of(" ,\n\r\t", pos);
-            type_name = line.substr(pos, pos2-pos);
-            bool only_digits
-                    = (type_name.find_first_not_of("0123456789") == 
std::string::npos);
-            const std::locale loc;
-            for (auto&& c : type_name) c = std::toupper(c, loc);
-
-            if (elt_types.size() < itype+1)
-                elt_types.resize(itype+1);
-
-            elt_types[itype] = "";
-            if (only_digits) {
-                size_type type_num = std::stol(type_name);
-                if (type_num == 42 || type_num == 82 ||
-                        type_num == 182 || type_num == 183)
-                    elt_types[itype] = "PLANE";
-                else if (type_num == 45 || type_num == 73 || type_num == 87 ||
-                         type_num == 90 || type_num == 92 || type_num == 95 ||
-                         type_num == 162 || type_num == 185 || type_num == 186 
||
-                         type_num == 187 || type_num == 191)
-                    elt_types[itype] = "SOLID";
-                else if (type_num == 89)
-                    elt_types[itype] = "VISCO";
-            }
-            elt_types[itype].append(type_name);
+      std::getline(f,line);
+      pos = line.find_first_not_of(" ");
+      if (bgeot::casecmp(line.substr(pos,2),"ET") == 0) {
+        size_type itype;
+        std::string type_name;
+        pos = line.find_first_of(",")+1;
+        pos2 = line.find_first_of(",", pos);
+        itype = std::stol(line.substr(pos, pos2-pos));
+        pos = line.find_first_not_of(" ,\n\r\t", pos2);
+        pos2 = line.find_first_of(" ,\n\r\t", pos);
+        type_name = line.substr(pos, pos2-pos);
+        bool only_digits
+          = (type_name.find_first_not_of("0123456789") == std::string::npos);
+        const std::locale loc;
+        for (auto&& c : type_name) c = std::toupper(c, loc);
+
+        if (elt_types.size() < itype+1)
+          elt_types.resize(itype+1);
+
+        elt_types[itype] = "";
+        if (only_digits) {
+          size_type type_num = std::stol(type_name);
+          if (type_num == 42 || type_num == 82 ||
+              type_num == 182 || type_num == 183)
+            elt_types[itype] = "PLANE";
+          else if (type_num == 45 || type_num == 73 || type_num == 87 ||
+                   type_num == 90 || type_num == 92 || type_num == 95 ||
+                   type_num == 162 || type_num == 185 || type_num == 186 ||
+                   type_num == 187 || type_num == 191)
+            elt_types[itype] = "SOLID";
+          else if (type_num == 89)
+            elt_types[itype] = "VISCO";
         }
-        else if (bgeot::casecmp(line.substr(pos,5),"KEYOP") == 0) {
-            size_type itype, knum, keyval;
-            pos = line.find_first_of(",")+1;
-            pos2 = line.find_first_of(",", pos);
-            itype = std::stol(line.substr(pos, pos2-pos));
-            pos = pos2+1;
-            pos2 = line.find_first_of(",", pos);
-            knum = std::stol(line.substr(pos+1, pos2-pos));
-            keyval = std::stol(line.substr(pos2+1));
-            if (knum == 1 && itype < elt_types.size() &&
-                    elt_types[itype].size() == 7 &&
-                    bgeot::casecmp(elt_types[itype].substr(0,7),"MESH200") == 
0) {
-                std::stringstream ss("MESH200");
-                ss << "_" << keyval;
-                elt_types[itype] = ss.str();
-            }
+        elt_types[itype].append(type_name);
+      }
+      else if (bgeot::casecmp(line.substr(pos,5),"KEYOP") == 0) {
+        size_type itype, knum, keyval;
+        pos = line.find_first_of(",")+1;
+        pos2 = line.find_first_of(",", pos);
+        itype = std::stol(line.substr(pos, pos2-pos));
+        pos = pos2+1;
+        pos2 = line.find_first_of(",", pos);
+        knum = std::stol(line.substr(pos+1, pos2-pos));
+        keyval = std::stol(line.substr(pos2+1));
+        if (knum == 1 && itype < elt_types.size() &&
+            elt_types[itype].size() == 7 &&
+            bgeot::casecmp(elt_types[itype].substr(0,7),"MESH200") == 0) {
+          std::stringstream ss("MESH200");
+          ss << "_" << keyval;
+          elt_types[itype] = ss.str();
         }
-        else if (bgeot::casecmp(line.substr(pos,6),"NBLOCK") == 0)
-            break;
-        else if (f.eof())
-            return;
+      }
+      else if (bgeot::casecmp(line.substr(pos,6),"NBLOCK") == 0)
+        break;
+      else if (f.eof())
+        return;
     }
     elt_cnt.resize(elt_types.size());
 
     //(3i8,6e20.13)
     size_type fields1, fieldwidth1, fields2, fieldwidth2; // 3,8,6,20
     { // "%8lu%*8u%*8u%20lf%20lf%20lf"
-        std::string fortran_fmt; // "(%lu%*[i]%lu,%lu%*[e,E]%lu.%*u)"
-        std::getline(f,fortran_fmt);
-        pos = fortran_fmt.find_first_of("(")+1;
-        pos2 = fortran_fmt.find_first_of("iI", pos);
-        fields1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
-        pos = pos2+1;
-        pos2 = fortran_fmt.find_first_of(",", pos);
-        fieldwidth1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
-        pos = pos2+1;
-        pos2 = fortran_fmt.find_first_of("eE", pos);
-        fields2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
-        pos = pos2+1;
-        pos2 = fortran_fmt.find_first_of(".", pos);
-        fieldwidth2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
-        GMM_ASSERT1(fields1 >= 1 && fields2 >= 3 ,
-                    "Ansys mesh import routine requires NBLOCK entries with at 
least "
-                    "1 integer field and 3 float number fields");
+      std::string fortran_fmt; // "(%lu%*[i]%lu,%lu%*[e,E]%lu.%*u)"
+      std::getline(f,fortran_fmt);
+      pos = fortran_fmt.find_first_of("(")+1;
+      pos2 = fortran_fmt.find_first_of("iI", pos);
+      fields1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
+      pos = pos2+1;
+      pos2 = fortran_fmt.find_first_of(",", pos);
+      fieldwidth1 = std::stol(fortran_fmt.substr(pos, pos2-pos));
+      pos = pos2+1;
+      pos2 = fortran_fmt.find_first_of("eE", pos);
+      fields2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
+      pos = pos2+1;
+      pos2 = fortran_fmt.find_first_of(".", pos);
+      fieldwidth2 = std::stol(fortran_fmt.substr(pos, pos2-pos));
+      GMM_ASSERT1(fields1 >= 1 && fields2 >= 3 ,
+                  "Ansys mesh import routine requires NBLOCK entries with at 
least "
+                  "1 integer field and 3 float number fields");
     }
 
     base_node pt(3);
     for (size_type i=0; i < size_type(-1); ++i) {
-        size_type nodeid;
-        std::getline(f,line);
-        if (line.compare(0,1,"N") == 0)
-            break;
-        //       1       0       0-3.0000000000000E+00 2.0000000000000E+00 
1.0000000000000E+00
-        nodeid = std::stol(line.substr(0, fieldwidth1));
-        pos = fields1*fieldwidth1;
-        for (size_type j=0; j < 3; ++j, pos += fieldwidth2)
-            pt[j] = std::stod(line.substr(pos, fieldwidth2));
-
-        cdb_node_2_getfem_node[nodeid] = m.add_point(pt, 0., false);
+      size_type nodeid;
+      std::getline(f,line);
+      if (line.compare(0,1,"N") == 0)
+        break;
+      //       1       0       0-3.0000000000000E+00 2.0000000000000E+00 
1.0000000000000E+00
+      nodeid = std::stol(line.substr(0, fieldwidth1));
+      pos = fields1*fieldwidth1;
+      for (size_type j=0; j < 3; ++j, pos += fieldwidth2)
+        pt[j] = std::stod(line.substr(pos, fieldwidth2));
+
+      cdb_node_2_getfem_node[nodeid] = m.add_point(pt, 0., false);
     }
 
     while (bgeot::casecmp(line.substr(0,6),"EBLOCK") != 0) {
-        if (f.eof())
-            return;
-        std::getline(f,line);
+      if (f.eof())
+        return;
+      std::getline(f,line);
     }
 
 
     //(19i8)
     size_type fieldsno, fieldwidth; // 19,8
     { // "%8lu%8lu%8lu%8lu%8lu%8lu%8lu%8lu"
-        std::string fortran_fmt;
-        std::getline(f,fortran_fmt);
-
-        pos = fortran_fmt.find_first_of("(")+1;
-        pos2 = fortran_fmt.find_first_of("iI", pos);
-        fieldsno = std::stol(fortran_fmt.substr(pos, pos2-pos));
-        pos = pos2+1;
-        pos2 = fortran_fmt.find_first_of(")\n", pos);
-        fieldwidth = std::stol(fortran_fmt.substr(pos, pos2-pos));
-        GMM_ASSERT1(fieldsno == 19, "Ansys mesh import routine requires EBLOCK 
"
-                                    "entries with 19 fields");
+      std::string fortran_fmt;
+      std::getline(f,fortran_fmt);
+
+      pos = fortran_fmt.find_first_of("(")+1;
+      pos2 = fortran_fmt.find_first_of("iI", pos);
+      fieldsno = std::stol(fortran_fmt.substr(pos, pos2-pos));
+      pos = pos2+1;
+      pos2 = fortran_fmt.find_first_of(")\n", pos);
+      fieldwidth = std::stol(fortran_fmt.substr(pos, pos2-pos));
+      GMM_ASSERT1(fieldsno == 19, "Ansys mesh import routine requires EBLOCK "
+                                  "entries with 19 fields");
     }
 
     size_type II,JJ,KK,LL,MM,NN,OO,PP,QQ,RR,SS,TT,UU,VV,WW,XX,YY,ZZ,AA,BB;
     for (size_type i=0; i < size_type(-1); ++i) {
-        GMM_ASSERT1(!f.eof(), "File ended before all elements could be read");
-        size_type imat, itype, nodesno(0);
+      GMM_ASSERT1(!f.eof(), "File ended before all elements could be read");
+      size_type imat, itype, nodesno(0);
+      std::getline(f,line);
+      {
+        long int ii = std::stol(line.substr(0,fieldwidth));
+        if (ii < 0)
+          break;
+        else
+          imat = size_type(ii);
+      }
+      itype = std::stol(line.substr(fieldwidth,fieldwidth));
+      nodesno = std::stol(line.substr(8*fieldwidth,fieldwidth));
+      line = line.substr(11*fieldwidth);
+
+      if (imat_filt != size_type(-1) && imat != imat_filt) { // skip current 
element
+        if (nodesno > 8)
+          std::getline(f,line);
+        continue;
+      }
+
+      if (nodesno >= 1) II = std::stol(line.substr(0,fieldwidth));
+      if (nodesno >= 2) JJ = std::stol(line.substr(1*fieldwidth,fieldwidth));
+      if (nodesno >= 3) KK = std::stol(line.substr(2*fieldwidth,fieldwidth));
+      if (nodesno >= 4) LL = std::stol(line.substr(3*fieldwidth,fieldwidth));
+      if (nodesno >= 5) MM = std::stol(line.substr(4*fieldwidth,fieldwidth));
+      if (nodesno >= 6) NN = std::stol(line.substr(5*fieldwidth,fieldwidth));
+      if (nodesno >= 7) OO = std::stol(line.substr(6*fieldwidth,fieldwidth));
+      if (nodesno >= 8) PP = std::stol(line.substr(7*fieldwidth,fieldwidth));
+      if (nodesno >= 9) {
         std::getline(f,line);
-        {
-            long int ii = std::stol(line.substr(0,fieldwidth));
-            if (ii < 0)
-                break;
-            else
-                imat = size_type(ii);
-        }
-        itype = std::stol(line.substr(fieldwidth,fieldwidth));
-        nodesno = std::stol(line.substr(8*fieldwidth,fieldwidth));
-        line = line.substr(11*fieldwidth);
-
-        if (imat_filt != size_type(-1) && imat != imat_filt) { // skip current 
element
-            if (nodesno > 8)
-                std::getline(f,line);
-            continue;
-        }
-
-        if (nodesno >= 1) II = std::stol(line.substr(0,fieldwidth));
-        if (nodesno >= 2) JJ = std::stol(line.substr(1*fieldwidth,fieldwidth));
-        if (nodesno >= 3) KK = std::stol(line.substr(2*fieldwidth,fieldwidth));
-        if (nodesno >= 4) LL = std::stol(line.substr(3*fieldwidth,fieldwidth));
-        if (nodesno >= 5) MM = std::stol(line.substr(4*fieldwidth,fieldwidth));
-        if (nodesno >= 6) NN = std::stol(line.substr(5*fieldwidth,fieldwidth));
-        if (nodesno >= 7) OO = std::stol(line.substr(6*fieldwidth,fieldwidth));
-        if (nodesno >= 8) PP = std::stol(line.substr(7*fieldwidth,fieldwidth));
-        if (nodesno >= 9) {
-            std::getline(f,line);
-            if (nodesno >= 9) QQ = std::stol(line.substr(0,fieldwidth));
-            if (nodesno >= 10) RR = 
std::stol(line.substr(1*fieldwidth,fieldwidth));
-            if (nodesno >= 11) SS = 
std::stol(line.substr(2*fieldwidth,fieldwidth));
-            if (nodesno >= 12) TT = 
std::stol(line.substr(3*fieldwidth,fieldwidth));
-            if (nodesno >= 13) UU = 
std::stol(line.substr(4*fieldwidth,fieldwidth));
-            if (nodesno >= 14) VV = 
std::stol(line.substr(5*fieldwidth,fieldwidth));
-            if (nodesno >= 15) WW = 
std::stol(line.substr(6*fieldwidth,fieldwidth));
-            if (nodesno >= 16) XX = 
std::stol(line.substr(7*fieldwidth,fieldwidth));
-            if (nodesno >= 17) YY = 
std::stol(line.substr(8*fieldwidth,fieldwidth));
-            if (nodesno >= 18) ZZ = 
std::stol(line.substr(9*fieldwidth,fieldwidth));
-            if (nodesno >= 19) AA = 
std::stol(line.substr(10*fieldwidth,fieldwidth));
-            if (nodesno >= 20) BB = 
std::stol(line.substr(11*fieldwidth,fieldwidth));
+        if (nodesno >= 9) QQ = std::stol(line.substr(0,fieldwidth));
+        if (nodesno >= 10) RR = 
std::stol(line.substr(1*fieldwidth,fieldwidth));
+        if (nodesno >= 11) SS = 
std::stol(line.substr(2*fieldwidth,fieldwidth));
+        if (nodesno >= 12) TT = 
std::stol(line.substr(3*fieldwidth,fieldwidth));
+        if (nodesno >= 13) UU = 
std::stol(line.substr(4*fieldwidth,fieldwidth));
+        if (nodesno >= 14) VV = 
std::stol(line.substr(5*fieldwidth,fieldwidth));
+        if (nodesno >= 15) WW = 
std::stol(line.substr(6*fieldwidth,fieldwidth));
+        if (nodesno >= 16) XX = 
std::stol(line.substr(7*fieldwidth,fieldwidth));
+        if (nodesno >= 17) YY = 
std::stol(line.substr(8*fieldwidth,fieldwidth));
+        if (nodesno >= 18) ZZ = 
std::stol(line.substr(9*fieldwidth,fieldwidth));
+        if (nodesno >= 19) AA = 
std::stol(line.substr(10*fieldwidth,fieldwidth));
+        if (nodesno >= 20) BB = 
std::stol(line.substr(11*fieldwidth,fieldwidth));
+      }
+
+      if (imat+1 > regions.size())
+        regions.resize(imat+1);
+
+      if (nodesno == 3) {
+        // TODO MESH200_2, MESH200_3, MESH200_4
+      }
+      else if (nodesno == 4) {
+
+        // assume MESH200_6 (4-node quadrilateral)
+        std::string eltname("MESH200_6");
+        if (elt_types.size() > itype && elt_types[itype].size() > 0)
+          eltname = elt_types[itype];
+
+        if (eltname.compare("MESH200_6") == 0 ||
+            eltname.compare("PLANE42") == 0 ||
+            eltname.compare("PLANE182") == 0) {
+          getfem_cv_nodes.resize(4);
+          getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+          getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
+          getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
+          getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
+          regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(2,1),
+                                         getfem_cv_nodes.begin()));
+          if (itype < elt_cnt.size())
+            elt_cnt[itype] += 1;
         }
-
-        if (imat+1 > regions.size())
-            regions.resize(imat+1);
-
-        if (nodesno == 3) {
-            // TODO MESH200_2, MESH200_3, MESH200_4
-        }
-        else if (nodesno == 4) {
-
-            // assume MESH200_6 (4-node quadrilateral)
-            std::string eltname("MESH200_6");
-            if (elt_types.size() > itype && elt_types[itype].size() > 0)
-                eltname = elt_types[itype];
-
-            if (eltname.compare("MESH200_6") == 0 ||
-                    eltname.compare("PLANE42") == 0 ||
-                    eltname.compare("PLANE182") == 0) {
-                getfem_cv_nodes.resize(4);
-                getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
-                getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
-                getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
-                
regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(2,1),
-                                               getfem_cv_nodes.begin()));
-                if (itype < elt_cnt.size())
-                    elt_cnt[itype] += 1;
-            }
-            else if (eltname.compare("MESH200_8") == 0 ||
-                     eltname.compare("SOLID72") == 0) {
-                getfem_cv_nodes.resize(4);
-                getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
-                getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
-                getfem_cv_nodes[3] = cdb_node_2_getfem_node[LL];
-                regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
-                                               getfem_cv_nodes.begin()));
-                if (itype < elt_cnt.size())
-                    elt_cnt[itype] += 1;
-            }
+        else if (eltname.compare("MESH200_8") == 0 ||
+                 eltname.compare("SOLID72") == 0) {
+          getfem_cv_nodes.resize(4);
+          getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+          getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
+          getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
+          getfem_cv_nodes[3] = cdb_node_2_getfem_node[LL];
+          regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
+                                         getfem_cv_nodes.begin()));
+          if (itype < elt_cnt.size())
+            elt_cnt[itype] += 1;
         }
-        else if (nodesno == 6) {
-            // TODO MESH200_5
+      }
+      else if (nodesno == 6) {
+        // TODO MESH200_5
+      }
+      else if (nodesno == 8) {
+
+        // assume MESH200_10
+        std::string eltname("MESH200_10");
+        if (elt_types.size() > itype && elt_types[itype].size() > 0)
+          eltname = elt_types[itype];
+
+        if (eltname.compare("MESH200_7") == 0 ||
+            eltname.compare("PLANE82") == 0 ||
+            eltname.compare("PLANE183") == 0) {
+          getfem_cv_nodes.resize(8);
+          getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+          getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
+          getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
+          getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
+          getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
+          getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
+          getfem_cv_nodes[6] = cdb_node_2_getfem_node[OO];
+          getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
+          regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(2),
+                                         getfem_cv_nodes.begin()));
+          if (itype < elt_cnt.size())
+            elt_cnt[itype] += 1;
         }
-        else if (nodesno == 8) {
-
-            // assume MESH200_10
-            std::string eltname("MESH200_10");
-            if (elt_types.size() > itype && elt_types[itype].size() > 0)
-                eltname = elt_types[itype];
-
-            if (eltname.compare("MESH200_7") == 0 ||
-                    eltname.compare("PLANE82") == 0 ||
-                    eltname.compare("PLANE183") == 0) {
-                getfem_cv_nodes.resize(8);
-                getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
-                getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
-                getfem_cv_nodes[3] = cdb_node_2_getfem_node[PP];
-                getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
-                getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
-                getfem_cv_nodes[6] = cdb_node_2_getfem_node[OO];
-                getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
-                
regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(2),
-                                               getfem_cv_nodes.begin()));
-                if (itype < elt_cnt.size())
-                    elt_cnt[itype] += 1;
+        else if (eltname.compare("MESH200_10") == 0 ||
+                 eltname.compare("SOLID45") == 0 ||
+                 eltname.compare("SOLID185") == 0) {
+          if (KK == LL && OO == PP) {
+            if (MM == NN && NN == OO) { // 4-node tetrahedral
+              getfem_cv_nodes.resize(4);
+              getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+              getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
+              getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
+              getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
+              regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
+                                             getfem_cv_nodes.begin()));
             }
-            else if (eltname.compare("MESH200_10") == 0 ||
-                     eltname.compare("SOLID45") == 0 ||
-                     eltname.compare("SOLID185") == 0) {
-                if (KK == LL && OO == PP) {
-                    if (MM == NN && NN == OO) { // 4-node tetrahedral
-                        getfem_cv_nodes.resize(4);
-                        getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                        getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
-                        getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
-                        getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
-                        
regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,1),
-                                                       
getfem_cv_nodes.begin()));
-                    }
-                    else { // 6-node prism
-                        getfem_cv_nodes.resize(6);
-                        getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                        getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
-                        getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
-                        getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
-                        getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
-                        getfem_cv_nodes[5] = cdb_node_2_getfem_node[OO];
-                        
regions[imat].add(m.add_convex(bgeot::prism_geotrans(3,1),
-                                                       
getfem_cv_nodes.begin()));
-                    }
-                }
-                else { // 8-node hexahedral
-                    getfem_cv_nodes.resize(8);
-                    getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                    getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
-                    getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
-                    getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
-                    getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
-                    getfem_cv_nodes[5] = cdb_node_2_getfem_node[NN];
-                    getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
-                    getfem_cv_nodes[7] = cdb_node_2_getfem_node[OO];
-                    
regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(3,1),
-                                                   getfem_cv_nodes.begin()));
-                }
-                if (itype < elt_cnt.size())
-                    elt_cnt[itype] += 1;
+            else { // 6-node prism
+              getfem_cv_nodes.resize(6);
+              getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+              getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
+              getfem_cv_nodes[2] = cdb_node_2_getfem_node[KK];
+              getfem_cv_nodes[3] = cdb_node_2_getfem_node[MM];
+              getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
+              getfem_cv_nodes[5] = cdb_node_2_getfem_node[OO];
+              regions[imat].add(m.add_convex(bgeot::prism_geotrans(3,1),
+                                             getfem_cv_nodes.begin()));
             }
+          }
+          else { // 8-node hexahedral
+            getfem_cv_nodes.resize(8);
+            getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+            getfem_cv_nodes[1] = cdb_node_2_getfem_node[JJ];
+            getfem_cv_nodes[2] = cdb_node_2_getfem_node[LL];
+            getfem_cv_nodes[3] = cdb_node_2_getfem_node[KK];
+            getfem_cv_nodes[4] = cdb_node_2_getfem_node[MM];
+            getfem_cv_nodes[5] = cdb_node_2_getfem_node[NN];
+            getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
+            getfem_cv_nodes[7] = cdb_node_2_getfem_node[OO];
+            regions[imat].add(m.add_convex(bgeot::parallelepiped_geotrans(3,1),
+                                           getfem_cv_nodes.begin()));
+          }
+          if (itype < elt_cnt.size())
+            elt_cnt[itype] += 1;
         }
-        else if (nodesno == 10) {
-
-            // assume MESH200_9 (10-node tetrahedral)
-            std::string eltname("MESH200_9");
-            if (elt_types.size() > itype && elt_types[itype].size() > 0)
-                eltname = elt_types[itype];
-
-            if (eltname.compare("MESH200_9") == 0 ||
-                    eltname.compare("SOLID87") == 0 ||
-                    eltname.compare("SOLID92") == 0 ||
-                    eltname.compare("SOLID162") == 0 ||
-                    eltname.compare("SOLID187") == 0) {
-                getfem_cv_nodes.resize(10);
-                getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
-                getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
-                getfem_cv_nodes[3] = cdb_node_2_getfem_node[OO];
-                getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
-                getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
-                getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
-                getfem_cv_nodes[7] = cdb_node_2_getfem_node[QQ];
-                getfem_cv_nodes[8] = cdb_node_2_getfem_node[RR];
-                getfem_cv_nodes[9] = cdb_node_2_getfem_node[LL];
-                regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
-                                               getfem_cv_nodes.begin()));
-                if (itype < elt_cnt.size())
-                    elt_cnt[itype] += 1;
-            }
+      }
+      else if (nodesno == 10) {
+
+        // assume MESH200_9 (10-node tetrahedral)
+        std::string eltname("MESH200_9");
+        if (elt_types.size() > itype && elt_types[itype].size() > 0)
+          eltname = elt_types[itype];
+
+        if (eltname.compare("MESH200_9") == 0 ||
+            eltname.compare("SOLID87") == 0 ||
+            eltname.compare("SOLID92") == 0 ||
+            eltname.compare("SOLID162") == 0 ||
+            eltname.compare("SOLID187") == 0) {
+          getfem_cv_nodes.resize(10);
+          getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+          getfem_cv_nodes[1] = cdb_node_2_getfem_node[MM];
+          getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
+          getfem_cv_nodes[3] = cdb_node_2_getfem_node[OO];
+          getfem_cv_nodes[4] = cdb_node_2_getfem_node[NN];
+          getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
+          getfem_cv_nodes[6] = cdb_node_2_getfem_node[PP];
+          getfem_cv_nodes[7] = cdb_node_2_getfem_node[QQ];
+          getfem_cv_nodes[8] = cdb_node_2_getfem_node[RR];
+          getfem_cv_nodes[9] = cdb_node_2_getfem_node[LL];
+          regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
+                                         getfem_cv_nodes.begin()));
+          if (itype < elt_cnt.size())
+            elt_cnt[itype] += 1;
         }
-        else if (nodesno == 20) { //  # assume SOLID186/SOLID95
-
-            // assume MESH200_11 (20-node hexahedral)
-            std::string eltname("MESH200_11");
-            if (elt_types.size() > itype && elt_types[itype].size() > 0)
-                eltname = elt_types[itype];
-
-            if (eltname.compare("MESH200_11") == 0 ||
-                    eltname.compare("VISCO89") == 0 ||
-                    eltname.compare("SOLID90") == 0 ||
-                    eltname.compare("SOLID95") == 0 ||
-                    eltname.compare("SOLID186") == 0 ||
-                    eltname.compare("SOLID191") == 0) {
-                if (KK == LL && MM == NN && NN == OO && OO == PP) { // assume 
10-node tetrahedral
-                    getfem_cv_nodes.resize(10);
-                    getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                    getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
-                    getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
-                    getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
-                    getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
-                    getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
-                    getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
-                    getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
-                    getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
-                    getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
-                    
regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
-                                                   getfem_cv_nodes.begin()));
-                    if (itype < elt_cnt.size())
-                        elt_cnt[itype] += 1;
-                } else if (MM == NN && NN == OO && OO == PP) { // assume 
13-node pyramid
-                    getfem_cv_nodes.resize(13);
-                    getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                    getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
-                    getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
-                    getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
-                    getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
-                    getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
-                    getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
-                    getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
-                    getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
-                    getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
-                    getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
-                    getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
-                    getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
-                    
regions[imat].add(m.add_convex(bgeot::pyramid2_incomplete_geotrans(),
-                                                   getfem_cv_nodes.begin()));
-                    if (itype < elt_cnt.size())
-                        elt_cnt[itype] += 1;
-
-                } else if (KK == LL && OO == PP) { // assume 15-node prism
-                    getfem_cv_nodes.resize(15);
-                    getfem_cv_nodes[0]  = cdb_node_2_getfem_node[II];
-                    getfem_cv_nodes[1]  = cdb_node_2_getfem_node[QQ];
-                    getfem_cv_nodes[2]  = cdb_node_2_getfem_node[JJ];
-                    getfem_cv_nodes[3]  = cdb_node_2_getfem_node[TT];
-                    getfem_cv_nodes[4]  = cdb_node_2_getfem_node[RR];
-                    getfem_cv_nodes[5]  = cdb_node_2_getfem_node[LL];
-                    getfem_cv_nodes[6]  = cdb_node_2_getfem_node[YY];
-                    getfem_cv_nodes[7]  = cdb_node_2_getfem_node[ZZ];
-                    getfem_cv_nodes[8]  = cdb_node_2_getfem_node[AA];
-                    getfem_cv_nodes[9]  = cdb_node_2_getfem_node[MM];
-                    getfem_cv_nodes[10] = cdb_node_2_getfem_node[UU];
-                    getfem_cv_nodes[11] = cdb_node_2_getfem_node[NN];
-                    getfem_cv_nodes[12] = cdb_node_2_getfem_node[XX];
-                    getfem_cv_nodes[13] = cdb_node_2_getfem_node[VV];
-                    getfem_cv_nodes[14] = cdb_node_2_getfem_node[OO];
-                    
regions[imat].add(m.add_convex(bgeot::prism2_incomplete_geotrans(),
-                                                   getfem_cv_nodes.begin()));
-                    if (itype < elt_cnt.size())
-                        elt_cnt[itype] += 1;
-                } else {
-                    getfem_cv_nodes.resize(20);
-                    getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
-                    getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
-                    getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
-                    getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
-                    getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
-                    getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
-                    getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
-                    getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
-                    getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
-                    getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
-                    getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
-                    getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
-                    getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
-                    getfem_cv_nodes[13] = cdb_node_2_getfem_node[UU];
-                    getfem_cv_nodes[14] = cdb_node_2_getfem_node[NN];
-                    getfem_cv_nodes[15] = cdb_node_2_getfem_node[XX];
-                    getfem_cv_nodes[16] = cdb_node_2_getfem_node[VV];
-                    getfem_cv_nodes[17] = cdb_node_2_getfem_node[PP];
-                    getfem_cv_nodes[18] = cdb_node_2_getfem_node[WW];
-                    getfem_cv_nodes[19] = cdb_node_2_getfem_node[OO];
-                    
regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(3),
-                                                   getfem_cv_nodes.begin()));
-                    if (itype < elt_cnt.size())
-                        elt_cnt[itype] += 1;
-                }
-            }
+      }
+      else if (nodesno == 20) { //  # assume SOLID186/SOLID95
+
+        // assume MESH200_11 (20-node hexahedral)
+        std::string eltname("MESH200_11");
+        if (elt_types.size() > itype && elt_types[itype].size() > 0)
+          eltname = elt_types[itype];
+
+        if (eltname.compare("MESH200_11") == 0 ||
+            eltname.compare("VISCO89") == 0 ||
+            eltname.compare("SOLID90") == 0 ||
+            eltname.compare("SOLID95") == 0 ||
+            eltname.compare("SOLID186") == 0 ||
+            eltname.compare("SOLID191") == 0) {
+          if (KK == LL && MM == NN && NN == OO && OO == PP) { // assume 
10-node tetrahedral
+            getfem_cv_nodes.resize(10);
+            getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+            getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
+            getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
+            getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
+            getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
+            getfem_cv_nodes[5] = cdb_node_2_getfem_node[KK];
+            getfem_cv_nodes[6] = cdb_node_2_getfem_node[YY];
+            getfem_cv_nodes[7] = cdb_node_2_getfem_node[ZZ];
+            getfem_cv_nodes[8] = cdb_node_2_getfem_node[AA];
+            getfem_cv_nodes[9] = cdb_node_2_getfem_node[MM];
+            regions[imat].add(m.add_convex(bgeot::simplex_geotrans(3,2),
+                                           getfem_cv_nodes.begin()));
+            if (itype < elt_cnt.size())
+              elt_cnt[itype] += 1;
+          } else if (MM == NN && NN == OO && OO == PP) { // assume 13-node 
pyramid
+            getfem_cv_nodes.resize(13);
+            getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+            getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
+            getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
+            getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
+            getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
+            getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
+            getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
+            getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
+            getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
+            getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
+            getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
+            getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
+            getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
+            
regions[imat].add(m.add_convex(bgeot::pyramid_Q2_incomplete_geotrans(),
+                                           getfem_cv_nodes.begin()));
+            if (itype < elt_cnt.size())
+              elt_cnt[itype] += 1;
+
+          } else if (KK == LL && OO == PP) { // assume 15-node prism
+            getfem_cv_nodes.resize(15);
+            getfem_cv_nodes[0]  = cdb_node_2_getfem_node[II];
+            getfem_cv_nodes[1]  = cdb_node_2_getfem_node[QQ];
+            getfem_cv_nodes[2]  = cdb_node_2_getfem_node[JJ];
+            getfem_cv_nodes[3]  = cdb_node_2_getfem_node[TT];
+            getfem_cv_nodes[4]  = cdb_node_2_getfem_node[RR];
+            getfem_cv_nodes[5]  = cdb_node_2_getfem_node[LL];
+            getfem_cv_nodes[6]  = cdb_node_2_getfem_node[YY];
+            getfem_cv_nodes[7]  = cdb_node_2_getfem_node[ZZ];
+            getfem_cv_nodes[8]  = cdb_node_2_getfem_node[AA];
+            getfem_cv_nodes[9]  = cdb_node_2_getfem_node[MM];
+            getfem_cv_nodes[10] = cdb_node_2_getfem_node[UU];
+            getfem_cv_nodes[11] = cdb_node_2_getfem_node[NN];
+            getfem_cv_nodes[12] = cdb_node_2_getfem_node[XX];
+            getfem_cv_nodes[13] = cdb_node_2_getfem_node[VV];
+            getfem_cv_nodes[14] = cdb_node_2_getfem_node[OO];
+            regions[imat].add(m.add_convex
+                              (bgeot::prism_incomplete_P2_geotrans(),
+                               getfem_cv_nodes.begin()));
+            if (itype < elt_cnt.size())
+              elt_cnt[itype] += 1;
+          } else {
+            getfem_cv_nodes.resize(20);
+            getfem_cv_nodes[0] = cdb_node_2_getfem_node[II];
+            getfem_cv_nodes[1] = cdb_node_2_getfem_node[QQ];
+            getfem_cv_nodes[2] = cdb_node_2_getfem_node[JJ];
+            getfem_cv_nodes[3] = cdb_node_2_getfem_node[TT];
+            getfem_cv_nodes[4] = cdb_node_2_getfem_node[RR];
+            getfem_cv_nodes[5] = cdb_node_2_getfem_node[LL];
+            getfem_cv_nodes[6] = cdb_node_2_getfem_node[SS];
+            getfem_cv_nodes[7] = cdb_node_2_getfem_node[KK];
+            getfem_cv_nodes[8] = cdb_node_2_getfem_node[YY];
+            getfem_cv_nodes[9] = cdb_node_2_getfem_node[ZZ];
+            getfem_cv_nodes[10] = cdb_node_2_getfem_node[BB];
+            getfem_cv_nodes[11] = cdb_node_2_getfem_node[AA];
+            getfem_cv_nodes[12] = cdb_node_2_getfem_node[MM];
+            getfem_cv_nodes[13] = cdb_node_2_getfem_node[UU];
+            getfem_cv_nodes[14] = cdb_node_2_getfem_node[NN];
+            getfem_cv_nodes[15] = cdb_node_2_getfem_node[XX];
+            getfem_cv_nodes[16] = cdb_node_2_getfem_node[VV];
+            getfem_cv_nodes[17] = cdb_node_2_getfem_node[PP];
+            getfem_cv_nodes[18] = cdb_node_2_getfem_node[WW];
+            getfem_cv_nodes[19] = cdb_node_2_getfem_node[OO];
+            regions[imat].add(m.add_convex(bgeot::Q2_incomplete_geotrans(3),
+                                           getfem_cv_nodes.begin()));
+            if (itype < elt_cnt.size())
+              elt_cnt[itype] += 1;
+          }
         }
+      }
     }
 
     int nonempty_regions=0;
     for (size_type i=0; i < regions.size(); ++i)
-        if (regions[i].card() > 0)
-            ++nonempty_regions;
+      if (regions[i].card() > 0)
+        ++nonempty_regions;
 
     if (nonempty_regions > 1)
-        for (size_type i=0; i < regions.size(); ++i)
-            if (regions[i].card() > 0)
-                m.region(i).add(regions[i]);
+      for (size_type i=0; i < regions.size(); ++i)
+        if (regions[i].card() > 0)
+          m.region(i).add(regions[i]);
 
     for (size_type i=1; i < elt_types.size(); ++i)
-        if (elt_cnt[i] > 0)
-            cout << "Imported " << elt_cnt[i] << " " << elt_types[i] << " 
elements." << endl;
+      if (elt_cnt[i] > 0)
+        cout << "Imported " << elt_cnt[i] << " " << elt_types[i] << " 
elements." << endl;
     cout << "Imported " << m.convex_index().card() << " elements in total." << 
endl;
 
-}
+  }
 
 
-static double round_to_nth_significant_number(double x, int ndec) {
+  static double round_to_nth_significant_number(double x, int ndec) {
     double p = 1.;
     double s = (x < 0 ? -1 : 1);
     double pdec = pow(10.,double(ndec));
@@ -1575,16 +1553,16 @@ static double round_to_nth_significant_number(double x, 
int ndec) {
     //cerr << "x=" << x << ", p=" << p << ", pdec=" << pdec << "\n";
     x = s * (floor(x * pdec + 0.5) / pdec) * p;
     return x;
-}
+  }
 
 
-/* mesh file from noboite [http://www.distene.com/fr/corp/newsroom16.html] */
-static void import_noboite_mesh_file(std::istream& f, mesh& m) {
+  /* mesh file from noboite [http://www.distene.com/fr/corp/newsroom16.html] */
+  static void import_noboite_mesh_file(std::istream& f, mesh& m) {
 
     using namespace std;
     gmm::stream_standard_locale sl(f);
 
-    ofstream fichier_GiD("noboite_to_GiD.gid",    ios::out | ios::trunc );  
//d�claration du flux et ouverture du fichier
+    ofstream fichier_GiD("noboite_to_GiD.gid",    ios::out | ios::trunc );  
//déclaration du flux et ouverture du fichier
 
     fichier_GiD << "MESH    dimension 3 ElemType Tetrahedra  Nnode 4"<<endl;
 
@@ -1603,7 +1581,7 @@ static void import_noboite_mesh_file(std::istream& f, 
mesh& m) {
     //quatrieme ligne)
     string contenu;
     for (i=1; i<=ligne_debut_NP; i++){
-        getline(f, contenu);
+      getline(f, contenu);
     }
 
 
@@ -1613,12 +1591,12 @@ static void import_noboite_mesh_file(std::istream& f, 
mesh& m) {
     fichier_GiD << "Coordinates" <<endl;
 
     for (i=1; i<=NP; i++){
-        float coor_x,coor_y,coor_z;
+      float coor_x,coor_y,coor_z;
 
-        fichier_GiD << i<<" ";
+      fichier_GiD << i<<" ";
 
-        f>>coor_x >>coor_y >>coor_z;
-        fichier_GiD<<coor_x<<" " <<coor_y <<" "<<coor_z <<endl;
+      f>>coor_x >>coor_y >>coor_z;
+      fichier_GiD<<coor_x<<" " <<coor_y <<" "<<coor_z <<endl;
 
     }
 
@@ -1631,37 +1609,37 @@ static void import_noboite_mesh_file(std::istream& f, 
mesh& m) {
     //revenir au debut du fichier . noboite, puis passer les trois premiere 
lignes
     f.seekg(0, ios::beg);
     for (i=1; i<=3; i++){
-        getline(f, contenu);
+      getline(f, contenu);
     }
 
 
     fichier_GiD << "Elements" <<endl;
 
     for (i=1; i<=NE; i++){
-        float elem_1,elem_2,elem_3,elem_4;
+      float elem_1,elem_2,elem_3,elem_4;
 
-        fichier_GiD << i<<" ";
-        f>>elem_1>>elem_2>>elem_3>>elem_4;
-        fichier_GiD<<elem_1<<" " <<elem_2 <<" "<<elem_3<<" "<<elem_4<<" 
1"<<endl;
+      fichier_GiD << i<<" ";
+      f>>elem_1>>elem_2>>elem_3>>elem_4;
+      fichier_GiD<<elem_1<<" " <<elem_2 <<" "<<elem_3<<" "<<elem_4<<" 1"<<endl;
 
     }
     fichier_GiD << "end elements" <<endl<<endl;
 
-    if(fichier_GiD)  // si l'ouverture a r�ussi
-    {
+    if(fichier_GiD)  // si l'ouverture a réussi
+      {
         // instructions
         fichier_GiD.close();  // on referme le fichier
-    }
+      }
     else  // sinon
-        cerr << "Erreur � l'ouverture !" << endl;
+      cerr << "Erreur à l'ouverture !" << endl;
 
-    if(f)  // si l'ouverture a r�ussi
-    {
+    if(f)  // si l'ouverture a réussi
+      {
         // instructions
         //f.close();  // on referme le fichier
-    }
+      }
     else  // sinon
-        cerr << "Erreur � l'ouverture !" << endl;
+      cerr << "Erreur à l'ouverture !" << endl;
 
     // appeler sunroutine import_gid_mesh_file
     //import_mesh(const std::string& "noboite_to_GiD.gid", mesh& msh)
@@ -1669,13 +1647,13 @@ static void import_noboite_mesh_file(std::istream& f, 
mesh& m) {
     import_gid_mesh_file(fichier1_GiD, m);
 
     //      return 0;
-}
+  }
 
-/* mesh file from emc2 
[http://pauillac.inria.fr/cdrom/prog/unix/emc2/eng.htm], am_fmt format
+  /* mesh file from emc2 
[http://pauillac.inria.fr/cdrom/prog/unix/emc2/eng.htm], am_fmt format
 
   (only triangular 2D meshes)
   */
-static void import_am_fmt_mesh_file(std::istream& f, mesh& m) {
+  static void import_am_fmt_mesh_file(std::istream& f, mesh& m) {
     gmm::stream_standard_locale sl(f);
     /* read the node list */
     std::vector<size_type> tri;
@@ -1685,22 +1663,22 @@ static void import_am_fmt_mesh_file(std::istream& f, 
mesh& m) {
     tri.resize(nbt*3);
     for (size_type i=0; i < nbt*3; ++i) f >> tri[i];
     for (size_type j=0; j < nbs; ++j) {
-        f >> P[0] >> P[1];
-        cerr.precision(16);
-        P[0]=round_to_nth_significant_number(P[0],6); // force 9.999999E-1 to 
be converted to 1.0
-        P[1]=round_to_nth_significant_number(P[1],6);
-        size_type jj = m.add_point(P);
-        GMM_ASSERT1(jj == j, "ouch");
+      f >> P[0] >> P[1];
+      cerr.precision(16);
+      P[0]=round_to_nth_significant_number(P[0],6); // force 9.999999E-1 to be 
converted to 1.0
+      P[1]=round_to_nth_significant_number(P[1],6);
+      size_type jj = m.add_point(P);
+      GMM_ASSERT1(jj == j, "ouch");
     }
     for (size_type i=0; i < nbt*3; i+=3)
-        m.add_triangle(tri[i]-1,tri[i+1]-1,tri[i+2]-1);
-}
+      m.add_triangle(tri[i]-1,tri[i+1]-1,tri[i+2]-1);
+  }
 
-/* mesh file from emc2 
[http://pauillac.inria.fr/cdrom/prog/unix/emc2/eng.htm], am_fmt format
+  /* mesh file from emc2 
[http://pauillac.inria.fr/cdrom/prog/unix/emc2/eng.htm], am_fmt format
 
   triangular/quadrangular 2D meshes
   */
-static void import_emc2_mesh_file(std::istream& f, mesh& m) {
+  static void import_emc2_mesh_file(std::istream& f, mesh& m) {
     gmm::stream_standard_locale sl(f);
     /* read the node list */
     std::vector<size_type> tri;
@@ -1709,183 +1687,181 @@ static void import_emc2_mesh_file(std::istream& f, 
mesh& m) {
     bgeot::read_until(f,"Vertices");
     f >> nbs;
     for (size_type j=0; j < nbs; ++j) {
-        f >> P[0] >> P[1] >> dummy;
-        size_type jj = m.add_point(P);
-        GMM_ASSERT1(jj == j, "ouch");
+      f >> P[0] >> P[1] >> dummy;
+      size_type jj = m.add_point(P);
+      GMM_ASSERT1(jj == j, "ouch");
     }
     while (!f.eof()) {
-        size_type ip[4];
-        std::string ls;
-        std::getline(f,ls);
-        if (ls.find("Triangles")+1) {
-            f >> nbt;
-            for (size_type i=0; i < nbt; ++i) {
-                f >> ip[0] >> ip[1] >> ip[2] >> dummy; ip[0]--; ip[1]--; 
ip[2]--;
-                m.add_triangle(ip[0],ip[1],ip[2]);
-            }
-        } else if (ls.find("Quadrangles")+1) {
-            f >> nbq;
-            for (size_type i=0; i < nbq; ++i) {
-                f >> ip[0] >> ip[1] >> ip[2] >> ip[3] >> dummy; ip[0]--; 
ip[1]--; ip[2]--; ip[3]--;
-                m.add_parallelepiped(2, &ip[0]);
-            }
-        } else if (ls.find("End")+1) break;
+      size_type ip[4];
+      std::string ls;
+      std::getline(f,ls);
+      if (ls.find("Triangles")+1) {
+        f >> nbt;
+        for (size_type i=0; i < nbt; ++i) {
+          f >> ip[0] >> ip[1] >> ip[2] >> dummy; ip[0]--; ip[1]--; ip[2]--;
+          m.add_triangle(ip[0],ip[1],ip[2]);
+        }
+      } else if (ls.find("Quadrangles")+1) {
+        f >> nbq;
+        for (size_type i=0; i < nbq; ++i) {
+          f >> ip[0] >> ip[1] >> ip[2] >> ip[3] >> dummy; ip[0]--; ip[1]--; 
ip[2]--; ip[3]--;
+          m.add_parallelepiped(2, &ip[0]);
+        }
+      } else if (ls.find("End")+1) break;
     }
-}
+  }
 
-void import_mesh(const std::string& filename, const std::string& format,
-                 mesh& m) {
+  void import_mesh(const std::string& filename, const std::string& format,
+                   mesh& m) {
     m.clear();
     try {
 
-        if (bgeot::casecmp(format,"structured")==0)
+      if (bgeot::casecmp(format,"structured")==0)
         { regular_mesh(m, filename); return; }
-        else if (bgeot::casecmp(format,"structured_ball")==0)
+      else if (bgeot::casecmp(format,"structured_ball")==0)
         { regular_ball_mesh(m, filename); return; }
 
-        std::ifstream f(filename.c_str());
-        GMM_ASSERT1(f.good(), "can't open file " << filename);
-        /* throw exceptions when an error occurs */
-        f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
-        import_mesh(f, format,m);
-        f.close();
+      std::ifstream f(filename.c_str());
+      GMM_ASSERT1(f.good(), "can't open file " << filename);
+      /* throw exceptions when an error occurs */
+      f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
+      import_mesh(f, format,m);
+      f.close();
     }
     catch (std::logic_error& exc) {
-        m.clear();
-        throw exc;
+      m.clear();
+      throw exc;
     }
     catch (std::ios_base::failure& exc) {
-        m.clear();
-        GMM_ASSERT1(false, "error while importing " << format
-                    << " mesh file \"" << filename << "\" : " << exc.what());
+      m.clear();
+      GMM_ASSERT1(false, "error while importing " << format
+                  << " mesh file \"" << filename << "\" : " << exc.what());
     }
     catch (std::runtime_error& exc) {
-        m.clear();
-        throw exc;
+      m.clear();
+      throw exc;
     }
-}
-
-void import_mesh_gmsh(std::istream& f, mesh &m,
-                      std::map<std::string, size_type> &region_map,
-                      bool remove_last_dimension,
-                      std::map<size_type, std::set<size_type>> *nodal_map,
-                      bool remove_duplicated_nodes)
-{
+  }
+
+  void import_mesh_gmsh(std::istream& f, mesh &m,
+                        std::map<std::string, size_type> &region_map,
+                        bool remove_last_dimension,
+                        std::map<size_type, std::set<size_type>> *nodal_map,
+                        bool remove_duplicated_nodes)
+  {
     import_gmsh_mesh_file(f, m, 0, &region_map, nullptr, false, 
remove_last_dimension, nodal_map,
                           remove_duplicated_nodes);
-}
-
-void import_mesh_gmsh(std::istream& f, mesh& m,
-                      bool add_all_element_type,
-                      std::set<size_type> *lower_dim_convex_rg,
-                      std::map<std::string, size_type> *region_map,
-                      bool remove_last_dimension,
-                      std::map<size_type, std::set<size_type>> *nodal_map,
-                      bool remove_duplicated_nodes)
-{
+  }
+
+  void import_mesh_gmsh(std::istream& f, mesh& m,
+                        bool add_all_element_type,
+                        std::set<size_type> *lower_dim_convex_rg,
+                        std::map<std::string, size_type> *region_map,
+                        bool remove_last_dimension,
+                        std::map<size_type, std::set<size_type>> *nodal_map,
+                        bool remove_duplicated_nodes)
+  {
     import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, 
add_all_element_type,
                           remove_last_dimension, nodal_map, 
remove_duplicated_nodes);
-}
-
-void import_mesh_gmsh(const std::string& filename, mesh& m,
-                      bool add_all_element_type,
-                      std::set<size_type> *lower_dim_convex_rg,
-                      std::map<std::string, size_type> *region_map,
-                      bool remove_last_dimension,
-                      std::map<size_type, std::set<size_type>> *nodal_map,
-                      bool remove_duplicated_nodes)
-{
+  }
+
+  void import_mesh_gmsh(const std::string& filename, mesh& m,
+                        bool add_all_element_type,
+                        std::set<size_type> *lower_dim_convex_rg,
+                        std::map<std::string, size_type> *region_map,
+                        bool remove_last_dimension,
+                        std::map<size_type, std::set<size_type>> *nodal_map,
+                        bool remove_duplicated_nodes)
+  {
     m.clear();
     try {
-        std::ifstream f(filename.c_str());
-        GMM_ASSERT1(f.good(), "can't open file " << filename);
-        /* throw exceptions when an error occurs */
-        f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
-        import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, 
add_all_element_type,
-                              remove_last_dimension, nodal_map, 
remove_duplicated_nodes);
-        f.close();
+      std::ifstream f(filename.c_str());
+      GMM_ASSERT1(f.good(), "can't open file " << filename);
+      /* throw exceptions when an error occurs */
+      f.exceptions(std::ifstream::badbit | std::ifstream::failbit);
+      import_gmsh_mesh_file(f, m, 0, region_map, lower_dim_convex_rg, 
add_all_element_type,
+                            remove_last_dimension, nodal_map, 
remove_duplicated_nodes);
+      f.close();
     }
     catch (std::logic_error& exc) {
-        m.clear();
-        throw exc;
+      m.clear();
+      throw exc;
     }
     catch (std::ios_base::failure& exc) {
-        m.clear();
-        GMM_ASSERT1(false, "error while importing " << "gmsh"
-                    << " mesh file \"" << filename << "\" : " << exc.what());
+      m.clear();
+      GMM_ASSERT1(false, "error while importing " << "gmsh"
+                  << " mesh file \"" << filename << "\" : " << exc.what());
     }
     catch (std::runtime_error& exc) {
-        m.clear();
-        throw exc;
+      m.clear();
+      throw exc;
     }
-}
+  }
 
-void import_mesh_gmsh(const std::string& filename,
-                      mesh& m, std::map<std::string, size_type> &region_map,
-                      bool remove_last_dimension,
-                      std::map<size_type, std::set<size_type>> *nodal_map,
-                      bool remove_duplicated_nodes) {
+  void import_mesh_gmsh(const std::string& filename,
+    mesh& m, std::map<std::string, size_type> &region_map,
+    bool remove_last_dimension,
+    std::map<size_type, std::set<size_type>> *nodal_map,
+    bool remove_duplicated_nodes) {
     import_mesh_gmsh(filename, m, false, NULL, &region_map, 
remove_last_dimension, nodal_map,
                      remove_duplicated_nodes);
-}
+  }
 
-void import_mesh(std::istream& f, const std::string& format,
-                 mesh& m) {
+  void import_mesh(std::istream& f, const std::string& format,
+                   mesh& m) {
     if (bgeot::casecmp(format,"gmsh")==0)
-        import_gmsh_mesh_file(f,m);
+      import_gmsh_mesh_file(f,m);
     else if (bgeot::casecmp(format,"gmshv2")==0)/* deprecate */
-        import_gmsh_mesh_file(f,m,2);
-    else if (bgeot::casecmp(format,"vtk")==0)
-        import_vtk_mesh_file(f,m); // Phuoc
+      import_gmsh_mesh_file(f,m,2);
     else if (bgeot::casecmp(format,"gid")==0)
-        import_gid_mesh_file(f,m);
+      import_gid_mesh_file(f,m);
     else if (bgeot::casecmp(format,"noboite")==0)
-        import_noboite_mesh_file(f,m);
+      import_noboite_mesh_file(f,m);
     else if (bgeot::casecmp(format,"am_fmt")==0)
-        import_am_fmt_mesh_file(f,m);
+      import_am_fmt_mesh_file(f,m);
     else if (bgeot::casecmp(format,"emc2_mesh")==0)
-        import_emc2_mesh_file(f,m);
+      import_emc2_mesh_file(f,m);
     else if (bgeot::casecmp(format,"cdb")==0)
-        import_cdb_mesh_file(f,m);
+      import_cdb_mesh_file(f,m);
     else if (bgeot::casecmp(format.substr(0,4),"cdb:")==0) {
-        size_type imat(-1);
-        bool success(true);
-        try {
-            size_t sz;
-            imat = std::stol(format.substr(4), &sz);
-            success = (sz == format.substr(4).size() && imat != size_type(-1));
-        } catch (const std::invalid_argument&) {
-            success = false;
-        } catch (const std::out_of_range&) {
-            success = false;
-        }
-        if (success)
-            import_cdb_mesh_file(f,m,imat);
-        else GMM_ASSERT1(false, "cannot import "
-                         << format << " mesh type : wrong cdb mesh type 
input");
+      size_type imat(-1);
+      bool success(true);
+      try {
+        size_t sz;
+        imat = std::stol(format.substr(4), &sz);
+        success = (sz == format.substr(4).size() && imat != size_type(-1));
+      } catch (const std::invalid_argument&) {
+        success = false;
+      } catch (const std::out_of_range&) {
+        success = false;
+      }
+      if (success)
+        import_cdb_mesh_file(f,m,imat);
+      else GMM_ASSERT1(false, "cannot import "
+                       << format << " mesh type : wrong cdb mesh type input");
     }
     else GMM_ASSERT1(false, "cannot import "
                      << format << " mesh type : unknown mesh type");
-}
+  }
 
-void import_mesh(const std::string& filename, mesh& msh) {
+  void import_mesh(const std::string& filename, mesh& msh) {
     size_type pos = filename.find_last_of(":");
     if (pos != std::string::npos)
-        getfem::import_mesh(filename.substr(pos+1), filename.substr(0,pos), 
msh);
+      getfem::import_mesh(filename.substr(pos+1), filename.substr(0,pos), msh);
     else
-        msh.read_from_file(filename);
-}
+      msh.read_from_file(filename);
+  }
 
-void maybe_remove_last_dimension(mesh &m) {
+  void maybe_remove_last_dimension(mesh &m) {
     bool is_flat = true;
     unsigned N = m.dim(); if (N < 1) return;
     for (dal::bv_visitor i(m.points().index()); !i.finished(); ++i)
-        if (m.points()[i][N-1] != 0) is_flat = 0;
+      if (m.points()[i][N-1] != 0) is_flat = 0;
     if (is_flat) {
-        base_matrix M(N-1,N);
-        for (unsigned i=0; i < N-1; ++i) M(i,i) = 1;
-        m.transformation(M);
+      base_matrix M(N-1,N);
+      for (unsigned i=0; i < N-1; ++i) M(i,i) = 1;
+      m.transformation(M);
     }
-}
+  }
 
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]