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: Sun, 2 Dec 2018 15:05:36 -0500 (EST)

branch: master
commit 18bcf868d5029b9899cf82776915b296fe7b1d48
Author: Konstantinos Poulios <address@hidden>
Date:   Sun Dec 2 21:05:25 2018 +0100

    Add initial support for gmsh mesh format version 4
---
 src/getfem_import.cc | 460 ++++++++++++++++++++++++++-------------------------
 1 file changed, 239 insertions(+), 221 deletions(-)

diff --git a/src/getfem_import.cc b/src/getfem_import.cc
index 12800a9..7b04ee8 100644
--- a/src/getfem_import.cc
+++ b/src/getfem_import.cc
@@ -258,251 +258,269 @@ namespace getfem {
 
     /* read the region names */
     if (region_map != NULL) {
-      if (version == 2) {
+      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 */
+    if (version >= 2)
+      bgeot::read_until(f, "$Nodes"); /* Format versions 2 and 4 */
+
+    size_type nb_block, nb_node, dummy;
+    if (version >= 4)
+      f >> nb_block >> nb_node;
+    else {
+      nb_block = 1;
+      f >> nb_node;
+    }
 
-    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, remove_duplicated_nodes ? 0. : -1.);
+    for (size_type block=0; block < nb_block; ++block) {
+      if (version >= 4)
+        f >> dummy >> dummy >> dummy >> nb_node;
+      for (size_type node_cnt=0; node_cnt < nb_node; ++node_cnt) {
+        size_type node_id;
+        base_node n{0,0,0};
+        f >> node_id >> n[0] >> n[1] >> n[2];
+        msh_node_2_getfem_node[node_id]
+          = m.add_point(n, remove_duplicated_nodes ? 0. : -1.);
+      }
     }
 
-    if (version == 2)
-      bgeot::read_until(f, "$Endnodes"); /* Format version 2 */
+    if (version >= 2)
+      bgeot::read_until(f, "$Endnodes"); /* Format versions 2 and 4 */
     else
       bgeot::read_until(f, "$ENDNOD");
 
     /* read the convexes */
-    if (version == 2)
-      bgeot::read_until(f, "$Elements"); /* Format version 2 */
+    if (version >= 2)
+      bgeot::read_until(f, "$Elements"); /* Format versions 2 and 4 */
     else
       bgeot::read_until(f, "$ELM");
 
     size_type nb_cv;
-    f >> nb_cv;
+    if (version >= 4) /* Format version 4 */
+      f >> nb_block >> nb_cv;
+    else {
+      nb_block = 1;
+      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;
+    for (size_type block=0; block < nb_block; ++block) {
+      unsigned type, region;
+      if (version >= 4) /* Format version 4 */
+        f >> region >> dummy >> type >> nb_cv;
 
-      id--; /* gmsh numbering starts at 1 */
+      for (size_type cv=0; cv < nb_cv; ++cv) {
 
-      cvlst.push_back(gmsh_cv_info());
-      gmsh_cv_info &ci = cvlst.back();
-      ci.id = id; ci.type = type; ci.region = region;
+        cvlst.push_back(gmsh_cv_info());
+        gmsh_cv_info &ci = cvlst.back();
+        f >> ci.id;
+        ci.id--; /* gmsh numbering starts at 1 */
+
+        unsigned cv_nb_nodes;
+        if (version >= 2) { /* For versions 2 and 4 */
+          if (version == 2) { /* Format version 2 */
+            unsigned nbtags;
+            f >> type >> nbtags;
+            GMM_ASSERT1(nbtags > 0 && nbtags <= 3,
+                        "Number of tags " << nbtags << " is not managed.");
+            f >> region;
+            if (nbtags > 1) f >> dummy;
+            if (nbtags > 2) f >> dummy;
+          }
+          ci.type = type;
+          ci.set_nb_nodes();
+          cv_nb_nodes = unsigned(ci.nodes.size());
+        } else if (version == 1) {
+          f >> type >> region >> dummy >> cv_nb_nodes;
+          ci.type = type;
+          ci.nodes.resize(cv_nb_nodes);
+        }
+        ci.region = region;
 
+        // cout << "cv_nb_nodes = " << cv_nb_nodes << endl;
 
-      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;
+        for (size_type i=0; i < cv_nb_nodes; ++i) {
+          size_type j;
+          f >> j;
+          const auto 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());



reply via email to

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