From a2a7a4be21df9e33ad8cde61d41c409af115a05a Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 4 Oct 2013 07:06:57 +0000
Subject: [PATCH] make thomas' experimental flipped element opti available in
 .geo

---
 Common/Context.h        | 2 +-
 Common/DefaultOptions.h | 2 ++
 Common/Options.cpp      | 7 +++++++
 Common/Options.h        | 1 +
 Mesh/Generator.cpp      | 2 +-
 5 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/Common/Context.h b/Common/Context.h
index 601aecd383..2c21f2c4ee 100644
--- a/Common/Context.h
+++ b/Common/Context.h
@@ -42,7 +42,7 @@ struct contextMeshOptions {
   int order, secondOrderLinear, secondOrderIncomplete;
   int secondOrderExperimental, meshOnlyVisible;
   int minCircPoints, minCurvPoints;
-  int hoOptimize, hoNLayers;
+  int hoOptimize, hoNLayers, hoOptPrimSurfMesh;
   double hoThresholdMin, hoThresholdMax, hoPoissonRatio;
   int saveAll, saveTri, saveGroupsOfNodes, binary, bdfFieldFormat, saveParametric;
   int smoothNormals, reverseAllNormals, zoneDefinition, clip;
diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h
index fb60147fbb..35058f056a 100644
--- a/Common/DefaultOptions.h
+++ b/Common/DefaultOptions.h
@@ -980,6 +980,8 @@ StringXNumber MeshOptions_Number[] = {
     "Minimum threshold for high order element optimization"},
   { F|O, "HighOrderThresholdMax", opt_mesh_ho_threshold_max, 2.0,
     "Maximum threshold for high order element optimization"},
+  { F|O, "HighOrderOptPrimSurfMesh", opt_mesh_ho_opt_prim_surf_mesh, 0,
+    "Try to fix flipped surface mesh elements in high-order optimizer"},
 
   { F|O, "LabelSampling" , opt_mesh_label_sampling , 1. ,
     "Label sampling rate (display one label every `LabelSampling' elements)" },
diff --git a/Common/Options.cpp b/Common/Options.cpp
index 796e342d5d..f980418be9 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -5638,6 +5638,13 @@ double opt_mesh_ho_threshold_max(OPT_ARGS_NUM)
   return CTX::instance()->mesh.hoThresholdMax;
 }
 
+double opt_mesh_ho_opt_prim_surf_mesh(OPT_ARGS_NUM)
+{
+  if(action & GMSH_SET)
+    CTX::instance()->mesh.hoOptPrimSurfMesh = (int)val;
+  return CTX::instance()->mesh.hoOptPrimSurfMesh;
+}
+
 double opt_mesh_ho_poisson(OPT_ARGS_NUM)
 {
   if(action & GMSH_SET) {
diff --git a/Common/Options.h b/Common/Options.h
index e2b3dd6cbd..1007a85cad 100644
--- a/Common/Options.h
+++ b/Common/Options.h
@@ -453,6 +453,7 @@ double opt_mesh_ho_nlayers(OPT_ARGS_NUM);
 double opt_mesh_ho_threshold_min(OPT_ARGS_NUM);
 double opt_mesh_ho_threshold_max(OPT_ARGS_NUM);
 double opt_mesh_ho_poisson(OPT_ARGS_NUM);
+double opt_mesh_ho_opt_prim_surf_mesh(OPT_ARGS_NUM);
 double opt_mesh_second_order_experimental(OPT_ARGS_NUM);
 double opt_mesh_second_order_linear(OPT_ARGS_NUM);
 double opt_mesh_second_order_incomplete(OPT_ARGS_NUM);
diff --git a/Mesh/Generator.cpp b/Mesh/Generator.cpp
index 5eb70430af..1505d49996 100644
--- a/Mesh/Generator.cpp
+++ b/Mesh/Generator.cpp
@@ -808,7 +808,7 @@ void GenerateMesh(GModel *m, int ask)
       p.BARRIER_MIN = CTX::instance()->mesh.hoThresholdMin;
       p.BARRIER_MAX = CTX::instance()->mesh.hoThresholdMax;
       p.dim = GModel::current()->getDim();
-      //p.optPrimSurfMesh = true;
+      p.optPrimSurfMesh = CTX::instance()->mesh.hoOptPrimSurfMesh;
       HighOrderMeshOptimizer(GModel::current(), p);
     }
 #else
-- 
GitLab