From 65c7cd88e7c0a101d4597224ec3d3bdc5250e5b6 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 23 Jan 2014 14:10:54 +0000
Subject: [PATCH] call setVolumePositive after mesh optimization, as the
 optimizer can revert elements

---
 Geo/GModel.cpp     | 9 ++++-----
 Mesh/Generator.cpp | 4 ++--
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index c4a7d50a6e..466a04c8e1 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -541,11 +541,10 @@ int GModel::mesh(int dimension)
 bool GModel::setAllVolumesPositive()
 {
   bool ok = true;
-  for(riter it = regions.begin(); it != regions.end(); ++it) {
-    int nbEl = (*it)->getNumMeshElements();
-    for (int iEl = 0; iEl < nbEl; ++iEl)
-      ok = (ok && (*it)->getMeshElement(iEl)->setVolumePositive());
-  }
+  for(riter it = regions.begin(); it != regions.end(); ++it)
+    for (int i = 0; i < (*it)->getNumMeshElements(); ++i)
+      if(!(*it)->getMeshElement(i)->setVolumePositive())
+        ok = false;
   return ok;
 }
 
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index fba73a065a..d2753f1db5 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -671,8 +671,6 @@ static void Mesh3D(GModel *m)
     }
   }
 
-  m->setAllVolumesPositive();
-
   double t2 = Cpu();
   CTX::instance()->meshTimer[2] = t2 - t1;
   Msg::StatusBar(true, "Done meshing 3D (%g s)", CTX::instance()->meshTimer[2]);
@@ -784,6 +782,8 @@ void GenerateMesh(GModel *m, int ask)
     }
   }
 
+  m->setAllVolumesPositive();
+
   // Subdivide into quads or hexas
   if(m->getMeshStatus() == 2 && CTX::instance()->mesh.algoSubdivide == 1)
     RefineMesh(m, CTX::instance()->mesh.secondOrderLinear, true);
-- 
GitLab