From b7a888c577f7fbfb5cc08e2bec834ef04a60925a Mon Sep 17 00:00:00 2001
From: Jonathan Lambrechts <jonathan.lambrechts@uclouvain.be>
Date: Fri, 24 Jul 2015 12:33:41 +0000
Subject: [PATCH] GEdge : do not consider closed multi-lines as degenerated

---
 Geo/gmshEdge.cpp   | 4 +++-
 Mesh/meshGEdge.cpp | 5 ++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/Geo/gmshEdge.cpp b/Geo/gmshEdge.cpp
index 40aadcadc2..0921b05828 100644
--- a/Geo/gmshEdge.cpp
+++ b/Geo/gmshEdge.cpp
@@ -22,7 +22,9 @@ gmshEdge::gmshEdge(GModel *m, Curve *edge, GVertex *v1, GVertex *v2)
 
 bool gmshEdge::degenerate(int dim) const
 {
-  if (c->beg == c->end && c->Typ ==  MSH_SEGM_LINE){
+  if (c->beg == c->end &&
+      c->Typ ==  MSH_SEGM_LINE &&
+      List_Nbr(c->Control_Points) == 0){
     Msg::Info("Model Edge %d is degenerate", tag());
     return true;
   }
diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp
index 7e11458416..a4ff906275 100644
--- a/Mesh/meshGEdge.cpp
+++ b/Mesh/meshGEdge.cpp
@@ -371,7 +371,10 @@ void meshGEdge::operator() (GEdge *ge)
   // first compute the length of the curve by integrating one
   double length;
   std::vector<IntPoint> Points;
-  if(ge->geomType() == GEntity::Line && ge->getBeginVertex() == ge->getEndVertex())
+  if(ge->geomType() == GEntity::Line &&
+      ge->getBeginVertex() == ge->getEndVertex() &&
+      //do not consider closed lines as degenerated
+      (ge->position(0.5) - ge->getBeginVertex()->xyz()).norm() < CTX::instance()->geom.tolerance)
     length = 0.; // special case t avoid infinite loop in integration
   else
     length = Integration(ge, t_begin, t_end, F_One, Points, 1.e-8 * CTX::instance()->lc);
-- 
GitLab