From bd3720c6b109bb4dba2f8ca48b98a09eedc605f0 Mon Sep 17 00:00:00 2001
From: Norihiro Watanabe <norihiro.watanabe@ufz.de>
Date: Wed, 24 Aug 2016 22:39:16 +0200
Subject: [PATCH] fix the unmatched face issue in a generated tetra mesh.
 generate 6 tets from 1 hex

---
 MeshLib/MeshGenerators/MeshGenerator.cpp | 41 +++++++++++++++---------
 1 file changed, 26 insertions(+), 15 deletions(-)

diff --git a/MeshLib/MeshGenerators/MeshGenerator.cpp b/MeshLib/MeshGenerators/MeshGenerator.cpp
index 18d06ee3078..87fddf6c106 100644
--- a/MeshLib/MeshGenerators/MeshGenerator.cpp
+++ b/MeshLib/MeshGenerators/MeshGenerator.cpp
@@ -513,7 +513,7 @@ Mesh* MeshGenerator::generateRegularTetMesh(
 
     //elements
     std::vector<Element*> elements;
-    elements.reserve(n_x_cells * n_y_cells * n_z_cells * 5);
+    elements.reserve(n_x_cells * n_y_cells * n_z_cells * 6);
 
     for (std::size_t i = 0; i < n_z_cells; i++)
     {
@@ -530,31 +530,31 @@ Mesh* MeshGenerator::generateRegularTetMesh(
                     std::array<Node*, 4> element_nodes;
                     // bottom
                     element_nodes[0] = nodes[offset_z1 + offset_y1 + k];
-                    element_nodes[1] = nodes[offset_z1 + offset_y1 + k + 1];
-                    element_nodes[2] = nodes[offset_z1 + offset_y2 + k + 1];
+                    element_nodes[1] = nodes[offset_z1 + offset_y2 + k + 1];
+                    element_nodes[2] = nodes[offset_z1 + offset_y2 + k];
                     // top
-                    element_nodes[3] = nodes[offset_z2 + offset_y1 + k + 1];
+                    element_nodes[3] = nodes[offset_z2 + offset_y1 + k];
                     elements.push_back (new Tet(element_nodes));
                 }
                 // tet 2
                 {
                     std::array<Node*, 4> element_nodes;
                     // bottom
-                    element_nodes[0] = nodes[offset_z1 + offset_y1 + k];
-                    element_nodes[1] = nodes[offset_z1 + offset_y2 + k + 1];
-                    element_nodes[2] = nodes[offset_z1 + offset_y2 + k];
+                    element_nodes[0] = nodes[offset_z1 + offset_y2 + k + 1];
+                    element_nodes[1] = nodes[offset_z1 + offset_y2 + k];
                     // top
-                    element_nodes[3] = nodes[offset_z2 + offset_y2 + k];
+                    element_nodes[2] = nodes[offset_z2 + offset_y1 + k];
+                    element_nodes[3] = nodes[offset_z2 + offset_y2 + k + 1];
                     elements.push_back (new Tet(element_nodes));
                 }
                 // tet 3
                 {
                     std::array<Node*, 4> element_nodes;
                     // bottom
-                    element_nodes[0] = nodes[offset_z1 + offset_y1 + k];
+                    element_nodes[0] = nodes[offset_z1 + offset_y2 + k];
                     // top
                     element_nodes[1] = nodes[offset_z2 + offset_y1 + k];
-                    element_nodes[2] = nodes[offset_z2 + offset_y1 + k + 1];
+                    element_nodes[2] = nodes[offset_z2 + offset_y2 + k + 1];
                     element_nodes[3] = nodes[offset_z2 + offset_y2 + k];
                     elements.push_back (new Tet(element_nodes));
                 }
@@ -562,11 +562,11 @@ Mesh* MeshGenerator::generateRegularTetMesh(
                 {
                     std::array<Node*, 4> element_nodes;
                     // bottom
-                    element_nodes[0] = nodes[offset_z1 + offset_y2 + k + 1];
+                    element_nodes[0] = nodes[offset_z1 + offset_y1 + k];
+                    element_nodes[1] = nodes[offset_z1 + offset_y1 + k + 1];
+                    element_nodes[2] = nodes[offset_z1 + offset_y2 + k + 1];
                     // top
-                    element_nodes[1] = nodes[offset_z2 + offset_y1 + k + 1];
-                    element_nodes[2] = nodes[offset_z2 + offset_y2 + k + 1];
-                    element_nodes[3] = nodes[offset_z2 + offset_y2 + k];
+                    element_nodes[3] = nodes[offset_z2 + offset_y1 + k + 1];
                     elements.push_back (new Tet(element_nodes));
                 }
                 // tet 5
@@ -576,10 +576,21 @@ Mesh* MeshGenerator::generateRegularTetMesh(
                     element_nodes[0] = nodes[offset_z1 + offset_y1 + k];
                     element_nodes[1] = nodes[offset_z1 + offset_y2 + k + 1];
                     // top
-                    element_nodes[2] = nodes[offset_z2 + offset_y2 + k];
+                    element_nodes[2] = nodes[offset_z2 + offset_y1 + k];
                     element_nodes[3] = nodes[offset_z2 + offset_y1 + k + 1];
                     elements.push_back (new Tet(element_nodes));
                 }
+                // tet 6
+                {
+                    std::array<Node*, 4> element_nodes;
+                    // bottom
+                    element_nodes[0] = nodes[offset_z1 + offset_y2 + k + 1];
+                    // top
+                    element_nodes[1] = nodes[offset_z2 + offset_y1 + k];
+                    element_nodes[2] = nodes[offset_z2 + offset_y1 + k + 1];
+                    element_nodes[3] = nodes[offset_z2 + offset_y2 + k + 1];
+                    elements.push_back (new Tet(element_nodes));
+                }
             }
         }
     }
-- 
GitLab