From dc741b081fc666c64515d2fe8d7d35264aed59b0 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 4 Dec 2003 00:13:28 +0000
Subject: [PATCH] Fixed degenrate tets generation (oops!)

---
 Mesh/3D_Extrude.cpp | 87 ++++++++++++++++-----------------------------
 1 file changed, 31 insertions(+), 56 deletions(-)

diff --git a/Mesh/3D_Extrude.cpp b/Mesh/3D_Extrude.cpp
index 100c6efc94..662e7e806a 100644
--- a/Mesh/3D_Extrude.cpp
+++ b/Mesh/3D_Extrude.cpp
@@ -1,4 +1,4 @@
-// $Id: 3D_Extrude.cpp,v 1.66 2003-10-29 22:24:24 geuzaine Exp $
+// $Id: 3D_Extrude.cpp,v 1.67 2003-12-04 00:13:28 geuzaine Exp $
 //
 // Copyright (C) 1997-2003 C. Geuzaine, J.-F. Remacle
 //
@@ -370,10 +370,21 @@ void Create_PriPyrTet(int iEnt, Vertex * v[6])
 
 }
 
+void Create_Sim(int iEnt, Vertex * v1, Vertex * v2, Vertex * v3, Vertex * v4)
+{
+  Simplex *news;
+  if(CTX.mesh.allow_degenerated_extrude ||
+     (v1->Num != v2->Num && v1->Num != v3->Num && v1->Num != v4->Num &&
+      v2->Num != v3->Num && v2->Num != v4->Num && v3->Num != v4->Num)) {
+    news = Create_Simplex(v1, v2, v3, v4);
+    news->iEnt = iEnt;
+    Tree_Add(THEV->Simplexes, &news);
+  }
+}
 
 void Extrude_Simplex_Phase3(void *data, void *dum)
 {
-  Simplex **pS, *s, *news;
+  Simplex **pS, *s;
   int i, j, k;
   Vertex *v[8];
   List_T *L0, *L1, *L2, *L3 = NULL;
@@ -437,80 +448,44 @@ void Extrude_Simplex_Phase3(void *data, void *dum)
           if(are_exist(v[3], v[1], Tree_Ares) &&
              are_exist(v[4], v[2], Tree_Ares) &&
              are_exist(v[3], v[2], Tree_Ares)) {
-            news = Create_Simplex(v[0], v[1], v[2], v[3]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[4], v[5], v[2]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[1], v[3], v[4], v[2]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[2], v[3]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[4], v[5], v[2]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[1], v[3], v[4], v[2]);
           }
           if(are_exist(v[3], v[1], Tree_Ares) &&
              are_exist(v[1], v[5], Tree_Ares) &&
              are_exist(v[3], v[2], Tree_Ares)) {
-            news = Create_Simplex(v[0], v[1], v[2], v[3]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[4], v[5], v[1]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[1], v[5], v[2]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[2], v[3]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[4], v[5], v[1]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[1], v[5], v[2]);
           }
           if(are_exist(v[3], v[1], Tree_Ares) &&
              are_exist(v[1], v[5], Tree_Ares) &&
              are_exist(v[5], v[0], Tree_Ares)) {
-            news = Create_Simplex(v[0], v[1], v[2], v[5]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[4], v[5], v[1]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[1], v[3], v[5], v[0]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[2], v[5]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[4], v[5], v[1]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[1], v[3], v[5], v[0]);
           }
           if(are_exist(v[4], v[0], Tree_Ares) &&
              are_exist(v[4], v[2], Tree_Ares) &&
              are_exist(v[3], v[2], Tree_Ares)) {
-            news = Create_Simplex(v[0], v[1], v[2], v[4]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[4], v[5], v[2]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[0], v[3], v[4], v[2]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[2], v[4]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[4], v[5], v[2]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[3], v[4], v[2]);
           }
           if(are_exist(v[4], v[0], Tree_Ares) &&
              are_exist(v[4], v[2], Tree_Ares) &&
              are_exist(v[5], v[0], Tree_Ares)) {
-            news = Create_Simplex(v[0], v[1], v[2], v[4]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[4], v[5], v[0]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[0], v[2], v[4], v[5]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[2], v[4]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[4], v[5], v[0]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[2], v[4], v[5]);
           }
           if(are_exist(v[4], v[0], Tree_Ares) &&
              are_exist(v[1], v[5], Tree_Ares) &&
              are_exist(v[5], v[0], Tree_Ares)) {
-            news = Create_Simplex(v[0], v[1], v[2], v[5]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[3], v[4], v[5], v[0]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
-            news = Create_Simplex(v[0], v[1], v[4], v[5]);
-            news->iEnt = ep->mesh.ZonLayer[i];
-            Tree_Add(THEV->Simplexes, &news);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[2], v[5]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[3], v[4], v[5], v[0]);
+            Create_Sim(ep->mesh.ZonLayer[i], v[0], v[1], v[4], v[5]);
           }
         }
       }
-- 
GitLab