From ea25631459562c89cebfda00b5a7125f7211d670 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Wed, 8 Feb 2012 15:03:14 +0000
Subject: [PATCH] hack for exact extrusions of 3-sided extruded faces

---
 Common/GmshMessage.cpp | 10 +---------
 Geo/gmshEdge.cpp       | 40 +++++++++++++++++++++++-----------------
 2 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/Common/GmshMessage.cpp b/Common/GmshMessage.cpp
index 47b3e2349f..961f528b1d 100644
--- a/Common/GmshMessage.cpp
+++ b/Common/GmshMessage.cpp
@@ -659,15 +659,7 @@ void Msg::ExchangeOnelabParameter(const std::string &key,
   else if(fopt.count("Max")){
     ps[0].setMax(fopt["Max"][0]); ps[0].setMin(-onelab::parameter::maxNumber());
   }
-  //if(fopt.count("Step")) ps[0].setStep(fopt["Step"][0]);
-  if(fopt.count("Step")) {
-    int Step=fopt["Step"][0];
-    if (Step<=0) {
-      Step=1;
-      Error("Non positive Step for parameter '%s', set to 1", ps[0].getName().c_str());
-    }
-    ps[0].setStep(Step);
-  }
+  if(fopt.count("Step")) ps[0].setStep(fopt["Step"][0]);
   if(fopt.count("Choices")) ps[0].setChoices(fopt["Choices"]);
   if(fopt.count("Visible")) ps[0].setVisible(fopt["Visible"][0] ? true : false);
   if(copt.count("Help")) ps[0].setHelp(copt["Help"][0]);
diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp
index 956763aae2..73c4343864 100644
--- a/Geo/gmshEdge.cpp
+++ b/Geo/gmshEdge.cpp
@@ -30,13 +30,13 @@ void gmshEdge::resetMeshAttributes()
 }
 
 Range<double> gmshEdge::parBounds(int i) const
-{ 
+{
  return Range<double>(c->ubeg, c->uend);
 }
 
 GPoint gmshEdge::point(double par) const
 {
-  
+
   Vertex a = InterpolateCurve(c, par, 0);
   return GPoint(a.Pos.X, a.Pos.Y, a.Pos.Z, this, par);
 }
@@ -49,7 +49,7 @@ SVector3 gmshEdge::firstDer(double par) const
 
 SVector3 gmshEdge::secondDer(double par) const
 {
- 
+
   Vertex a = InterpolateCurve(c, par, 2);
   return SVector3(a.Pos.X, a.Pos.Y, a.Pos.Z);
 }
@@ -58,16 +58,16 @@ GEntity::GeomType gmshEdge::geomType() const
 {
   switch (c->Typ){
   case MSH_SEGM_LINE : return Line;
-  case MSH_SEGM_CIRC :  
+  case MSH_SEGM_CIRC :
   case MSH_SEGM_CIRC_INV : return Circle;
   case MSH_SEGM_ELLI:
   case MSH_SEGM_ELLI_INV: return Ellipse;
   case MSH_SEGM_BSPLN:
-  case MSH_SEGM_BEZIER: 
+  case MSH_SEGM_BEZIER:
   case MSH_SEGM_NURBS:
-  case MSH_SEGM_SPLN: return Nurb; 
-  case MSH_SEGM_BND_LAYER: return BoundaryLayerCurve; 
-  case MSH_SEGM_DISCRETE: return DiscreteCurve; 
+  case MSH_SEGM_SPLN: return Nurb;
+  case MSH_SEGM_BND_LAYER: return BoundaryLayerCurve;
+  case MSH_SEGM_DISCRETE: return DiscreteCurve;
   default : return Unknown;
   }
 }
@@ -84,7 +84,7 @@ std::string gmshEdge::getAdditionalInfoString()
       sstream << v->Num;
     }
     sstream << "}";
-    return sstream.str();    
+    return sstream.str();
   }
   else
     return GEdge::getAdditionalInfoString();
@@ -126,7 +126,7 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar,int dir) const
         Vertex *v[3];
         List_Read(c->Control_Points, 0, &v[1]);
         List_Read(c->Control_Points, 1, &v[2]);
-        SPoint2 p = v[1]->pntOnGeometry + 
+        SPoint2 p = v[1]->pntOnGeometry +
           (v[2]->pntOnGeometry - v[1]->pntOnGeometry) * epar;
         return p;
       }
@@ -146,9 +146,9 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar,int dir) const
         Vertex *v[4];
         for(int j = 0; j < 4; j ++ ){
           int k = iCurve - (periodic ? 1 : 2) + j;
-          if(k < 0) 
+          if(k < 0)
             k = periodic ? k + NbControlPoints - 1 : 0;
-          if(k >= NbControlPoints) 
+          if(k >= NbControlPoints)
             k = periodic ? k - NbControlPoints + 1: NbControlPoints - 1;
           List_Read(c->Control_Points, k, &v[j]);
         }
@@ -200,7 +200,7 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar,int dir) const
       return SPoint2();
     }
   }
-  
+
 
   if(s->Typ ==  MSH_SURF_REGL){
     Curve *C[4];
@@ -251,7 +251,13 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar,int dir) const
     for(int i = 0; i < 3; i++)
       List_Read(s->Generatrices, i, &C[i]);
 
-    double U, V;    
+    // FIXME: workaround for exact extrutions
+    bool hack = false;
+    if(CTX::instance()->geom.exactExtrusion && s->Extrude &&
+       s->Extrude->geo.Mode == EXTRUDED_ENTITY && s->Typ != MSH_SURF_PLAN)
+      hack = true;
+
+    double U, V;
     if (C[0]->Num == c->Num) {
       U = (epar - C[0]->ubeg) / (C[0]->uend - C[0]->ubeg) ;
       V = 0;
@@ -270,11 +276,11 @@ SPoint2 gmshEdge::reparamOnFace(const GFace *face, double epar,int dir) const
     }
     else if (C[2]->Num == c->Num) {
       U = 1-(epar - C[2]->ubeg) / (C[2]->uend - C[2]->ubeg) ;
-      V = U;
+      V = hack ? 1 : U;
     }
     else if (C[2]->Num == -c->Num) {
       U = 1-(C[2]->uend - epar - C[2]->ubeg) / (C[2]->uend - C[2]->ubeg) ;
-      V = U;
+      V = hack ? 1 : U;
     }
     else{
       Msg::Info("Reparameterizing edge %d on face %d", c->Num, s->Num);
@@ -352,7 +358,7 @@ void gmshEdge::writeGEO(FILE *fp)
   fprintf(fp, "};\n");
 
   if(meshAttributes.Method == MESH_TRANSFINITE){
-    fprintf(fp, "Transfinite Line {%d} = %d", 
+    fprintf(fp, "Transfinite Line {%d} = %d",
             tag() * (meshAttributes.typeTransfinite > 0 ? 1 : -1),
             meshAttributes.nbPointsTransfinite);
     if(meshAttributes.typeTransfinite){
-- 
GitLab