From 5453afb208dbf7a8046cff70705fdc914a1e03e7 Mon Sep 17 00:00:00 2001
From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be>
Date: Mon, 25 Nov 2013 11:52:00 +0000
Subject: [PATCH] periodic mesher is now "more" deterministic

---
 Mesh/meshGFace.cpp    | 18 +++++++++---------
 Mesh/meshGFaceBDS.cpp | 10 +++++-----
 Mesh/meshGFaceBDS.h   |  3 ++-
 3 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 7adad2c764..a5cb7eb40e 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -543,7 +543,7 @@ static bool recoverEdge(BDS_Mesh *m, GEdge *ge,
   return true;
 }
 
-void BDS2GMSH(BDS_Mesh *m, GFace *gf, std::map<BDS_Point*, MVertex*> &recoverMap)
+void BDS2GMSH(BDS_Mesh *m, GFace *gf, std::map<BDS_Point*, MVertex*, PointLessThan> &recoverMap)
 {
   {
     std::set<BDS_Point*,PointLessThan>::iterator itp = m->points.begin();
@@ -767,7 +767,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
   //onlyInitialMesh=true;
   BDS_GeomEntity CLASS_F(1, 2);
   BDS_GeomEntity CLASS_EXTERIOR(1, 3);
-  std::map<BDS_Point*, MVertex*> recoverMap;
+  std::map<BDS_Point*, MVertex*,PointLessThan> recoverMap;
   std::map<MVertex*, BDS_Point*> recoverMapInv;
   std::list<GEdge*> edges = replacement_edges ? *replacement_edges : gf->edges();
   std::list<int> dir = gf->edgeOrientations();
@@ -1110,7 +1110,7 @@ bool meshGenerator(GFace *gf, int RECUR_ITER,
 		 edgesToRecover.size());
       for(int i = 0; i < doc.numPoints; i++){
 	BDS_Point *pp = (BDS_Point*)doc.points[i].data;
-	std::map<BDS_Point*, MVertex*>::iterator itv = recoverMap.find(pp);
+	std::map<BDS_Point*, MVertex*,PointLessThan>::iterator itv = recoverMap.find(pp);
 	if(itv != recoverMap.end()){
 	  MVertex *here = itv->second;
 	  GEntity *ge = here->onWhat();
@@ -1349,7 +1349,7 @@ static void printMesh1d(int iEdge, int seam, std::vector<SPoint2> &m)
 static bool buildConsecutiveListOfVertices(GFace *gf, GEdgeLoop &gel,
                                            std::vector<BDS_Point*> &result,
                                            SBoundingBox3d &bbox, BDS_Mesh *m,
-                                           std::map<BDS_Point*, MVertex*> &recoverMap,
+                                           std::map<BDS_Point*, MVertex*,PointLessThan> &recoverMap,
                                            int &count, int countTot, double tol,
                                            bool seam_the_first = false)
 {
@@ -1362,7 +1362,7 @@ static bool buildConsecutiveListOfVertices(GFace *gf, GEdgeLoop &gel,
 
   const int MYDEBUG = false;
 
-  std::map<BDS_Point*, MVertex*> recoverMapLocal;
+  std::map<BDS_Point*, MVertex*,PointLessThan> recoverMapLocal;
 
   result.clear();
   count = 0;
@@ -1505,7 +1505,7 @@ static bool buildConsecutiveListOfVertices(GFace *gf, GEdgeLoop &gel,
       // It has not worked : either tolerance is wrong or the first seam edge
       // has to be taken with the other parametric coordinates (because it is
       // only present once in the closure of the domain).
-      for(std::map<BDS_Point*, MVertex*>::iterator it = recoverMapLocal.begin();
+      for(std::map<BDS_Point*, MVertex*,PointLessThan>::iterator it = recoverMapLocal.begin();
           it != recoverMapLocal.end(); ++it){
         m->del_point(it->first);
       }
@@ -1600,7 +1600,7 @@ static bool meshGeneratorElliptic(GFace *gf, bool debug = true)
 
 static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
 {
-  std::map<BDS_Point*, MVertex*> recoverMap;
+  std::map<BDS_Point*, MVertex*, PointLessThan> recoverMap;
 
   Range<double> rangeU = gf->parBounds(0);
   Range<double> rangeV = gf->parBounds(1);
@@ -1661,7 +1661,7 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
   if(nbPointsTotal == 3){
     MVertex *vv[3];
     int i = 0;
-    for(std::map<BDS_Point*, MVertex*>::iterator it = recoverMap.begin();
+    for(std::map<BDS_Point*, MVertex*, PointLessThan>::iterator it = recoverMap.begin();
 	it != recoverMap.end(); it++){
       vv[i++] = it->second;
     }
@@ -1891,7 +1891,7 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
   std::map<MVertex*, SPoint2> parametricCoordinates;
   if(algoDelaunay2D(gf)){
     std::map<MVertex*, BDS_Point*> invertMap;
-    std::map<BDS_Point*, MVertex*>::iterator it = recoverMap.begin();
+    std::map<BDS_Point*, MVertex*, PointLessThan>::iterator it = recoverMap.begin();
     while(it != recoverMap.end()){
       // we have twice vertex MVertex with 2 different coordinates
       MVertex *mv1 = it->second;
diff --git a/Mesh/meshGFaceBDS.cpp b/Mesh/meshGFaceBDS.cpp
index 0b95c36868..33add83320 100644
--- a/Mesh/meshGFaceBDS.cpp
+++ b/Mesh/meshGFaceBDS.cpp
@@ -746,7 +746,7 @@ void allowAppearanceofEdge (BDS_Point *p1, BDS_Point *p2)
 {
 }
 
-void invalidEdgesPeriodic(BDS_Mesh &m, std::map<BDS_Point*, MVertex*> *recoverMap,
+void invalidEdgesPeriodic(BDS_Mesh &m, std::map<BDS_Point*, MVertex*,PointLessThan> *recoverMap,
                           std::set<BDS_Edge*> &toSplit)
 {
   // first look for degenerated vertices
@@ -755,8 +755,8 @@ void invalidEdgesPeriodic(BDS_Mesh &m, std::map<BDS_Point*, MVertex*> *recoverMa
   while (it != m.edges.end()){
     BDS_Edge *e = *it;
     if (!e->deleted && e->numfaces() == 1){
-      std::map<BDS_Point*, MVertex*>::iterator itp1 = recoverMap->find(e->p1);
-      std::map<BDS_Point*, MVertex*>::iterator itp2 = recoverMap->find(e->p2);
+      std::map<BDS_Point*, MVertex*,PointLessThan>::iterator itp1 = recoverMap->find(e->p1);
+      std::map<BDS_Point*, MVertex*,PointLessThan>::iterator itp2 = recoverMap->find(e->p2);
       if (itp1 != recoverMap->end() && itp2 != recoverMap->end() &&
           itp1->second == itp2->second){
         degenerated.insert(itp1->second);
@@ -807,7 +807,7 @@ void invalidEdgesPeriodic(BDS_Mesh &m, std::map<BDS_Point*, MVertex*> *recoverMa
 // if p1 p2 exists and it is internal, split it
 
 int solveInvalidPeriodic(GFace *gf, BDS_Mesh &m,
-                         std::map<BDS_Point*, MVertex*> *recoverMap)
+                         std::map<BDS_Point*, MVertex*,PointLessThan> *recoverMap)
 {
   std::set<BDS_Edge*> toSplit;
   invalidEdgesPeriodic(m, recoverMap, toSplit);
@@ -836,7 +836,7 @@ int solveInvalidPeriodic(GFace *gf, BDS_Mesh &m,
 }
 
 void optimizeMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT,
-                     std::map<BDS_Point*,MVertex*> *recoverMap=0)
+                     std::map<BDS_Point*,MVertex*,PointLessThan> *recoverMap=0)
 {
   int nb_swap;
   delaunayizeBDS(gf, m, nb_swap);
diff --git a/Mesh/meshGFaceBDS.h b/Mesh/meshGFaceBDS.h
index a82c843e13..798bb29406 100644
--- a/Mesh/meshGFaceBDS.h
+++ b/Mesh/meshGFaceBDS.h
@@ -8,6 +8,7 @@
 
 #include <map>
 #include <list>
+#include "BDS.h"
 
 class GFace;
 class GModel;
@@ -22,7 +23,7 @@ void refineMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT,
                    const bool computeNodalSizeField,
                    std::map<MVertex*, BDS_Point*> *recoverMapInv=0);
 void optimizeMeshBDS(GFace *gf, BDS_Mesh &m, const int NIT, 
-                         std::map<BDS_Point*, MVertex*> *recoverMap=0);
+		     std::map<BDS_Point*, MVertex*,PointLessThan> *recoverMap=0);
 void delaunayizeBDS(GFace *gf, BDS_Mesh &m, int &nb_swap);
 void collapseSmallEdges(GModel &gm);
 BDS_Mesh *gmsh2BDS(std::list<GFace*> &l);
-- 
GitLab