From 10e22fbfbf748e1ed89d6211fd9bb84381cd8e86 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Tue, 19 Nov 2019 12:00:56 +0100
Subject: [PATCH] new contructors for partition{Vertex,Edge,Face,Region}
 without tag, to avoid pulluting GEO internals with dummy discrete entities,
 which can lead to unexpected side-effects when re-syncing GEO internals with
 GModel. Fixes #692.

---
 Geo/GModelIO_GEO.cpp   | 4 ----
 Geo/discreteEdge.cpp   | 6 ++++++
 Geo/discreteEdge.h     | 1 +
 Geo/discreteFace.cpp   | 6 ++++++
 Geo/discreteFace.h     | 1 +
 Geo/discreteRegion.cpp | 4 ++++
 Geo/discreteRegion.h   | 1 +
 Geo/discreteVertex.cpp | 6 ++++++
 Geo/discreteVertex.h   | 1 +
 Geo/partitionEdge.h    | 4 ++++
 Geo/partitionFace.h    | 5 +++++
 Geo/partitionRegion.h  | 5 +++++
 Geo/partitionVertex.h  | 5 +++++
 Mesh/meshPartition.cpp | 6 +++---
 14 files changed, 48 insertions(+), 7 deletions(-)

diff --git a/Geo/GModelIO_GEO.cpp b/Geo/GModelIO_GEO.cpp
index 99ec64ad16..90f010d16f 100644
--- a/Geo/GModelIO_GEO.cpp
+++ b/Geo/GModelIO_GEO.cpp
@@ -1229,20 +1229,16 @@ void GEO_Internals::synchronize(GModel *model)
       if(c->Num >= 0) {
         GEdge *e = model->getEdgeByTag(c->Num);
 
-        printf("syncing curve %d:", c->Num);
         if(!e && c->beg && c->end) {
-          printf("case 1\n");
           e = new gmshEdge(model, c, model->getVertexByTag(c->beg->Num),
                            model->getVertexByTag(c->end->Num));
           model->add(e);
         }
         else if(!e) {
-          printf("case 2\n");
           e = new gmshEdge(model, c, 0, 0);
           model->add(e);
         }
         else {
-          printf("case 3\n");
           if(e->getNativeType() == GEntity::GmshModel) {
             if(c->beg && c->end)
               ((gmshEdge *)e)
diff --git a/Geo/discreteEdge.cpp b/Geo/discreteEdge.cpp
index 525527cc3b..a1baac6f03 100644
--- a/Geo/discreteEdge.cpp
+++ b/Geo/discreteEdge.cpp
@@ -34,6 +34,12 @@ discreteEdge::discreteEdge(GModel *model, int num) : GEdge(model, num)
   CreateReversedCurve(c);
 }
 
+discreteEdge::discreteEdge(GModel *model) : GEdge(model, 0)
+{
+  // used for temporary discrete edges, that should not lead to the creation of
+  // the corresponding entity in GEO internals
+}
+
 bool discreteEdge::_orderMLines(bool isCompound)
 {
   std::size_t ss = lines.size();
diff --git a/Geo/discreteEdge.h b/Geo/discreteEdge.h
index 89e0992922..2a1ccd7213 100644
--- a/Geo/discreteEdge.h
+++ b/Geo/discreteEdge.h
@@ -18,6 +18,7 @@ private:
 public:
   discreteEdge(GModel *model, int num, GVertex *_v0, GVertex *_v1);
   discreteEdge(GModel *model, int num);
+  discreteEdge(GModel *model);
   virtual ~discreteEdge() {}
   virtual GeomType geomType() const { return DiscreteCurve; }
   virtual GPoint point(double p) const;
diff --git a/Geo/discreteFace.cpp b/Geo/discreteFace.cpp
index 1c040727c3..abc1e7525f 100644
--- a/Geo/discreteFace.cpp
+++ b/Geo/discreteFace.cpp
@@ -87,6 +87,12 @@ discreteFace::discreteFace(GModel *model, int num) : GFace(model, num)
   meshStatistics.status = GFace::DONE;
 }
 
+discreteFace::discreteFace(GModel *model) : GFace(model, 0)
+{
+  // used for temporary discrete faces, that should not lead to the creation of
+  // the corresponding entity in GEO internals
+}
+
 static void sort_edges(std::vector<GEdge *> &e, std::vector<int> &dir)
 {
   if(e.empty() || dir.empty()) return;
diff --git a/Geo/discreteFace.h b/Geo/discreteFace.h
index b4fbd0584a..4eba8c1286 100644
--- a/Geo/discreteFace.h
+++ b/Geo/discreteFace.h
@@ -35,6 +35,7 @@ private:
   void _createGeometryFromSTL();
 public:
   discreteFace(GModel *model, int num);
+  discreteFace(GModel *model);
   virtual ~discreteFace() {}
   using GFace::point;
   GPoint point(double par1, double par2) const;
diff --git a/Geo/discreteRegion.cpp b/Geo/discreteRegion.cpp
index fd475dbcf7..720f035236 100644
--- a/Geo/discreteRegion.cpp
+++ b/Geo/discreteRegion.cpp
@@ -21,6 +21,10 @@ discreteRegion::discreteRegion(GModel *model, int num) : GRegion(model, num)
   Tree_Add(model->getGEOInternals()->Volumes, &v);
 }
 
+discreteRegion::discreteRegion(GModel *model) : GRegion(model, 0)
+{
+}
+
 void discreteRegion::setBoundFaces(const std::set<int> &tagFaces)
 {
   for(std::set<int>::const_iterator it = tagFaces.begin(); it != tagFaces.end();
diff --git a/Geo/discreteRegion.h b/Geo/discreteRegion.h
index 4397a9579d..d07638e91a 100644
--- a/Geo/discreteRegion.h
+++ b/Geo/discreteRegion.h
@@ -13,6 +13,7 @@
 class discreteRegion : public GRegion {
 public:
   discreteRegion(GModel *model, int num);
+  discreteRegion(GModel *model);
   virtual ~discreteRegion() {}
   virtual GeomType geomType() const { return DiscreteVolume; }
   void setBoundFaces(const std::set<int> &tagFaces);
diff --git a/Geo/discreteVertex.cpp b/Geo/discreteVertex.cpp
index f4d142efc0..5891bd86bf 100644
--- a/Geo/discreteVertex.cpp
+++ b/Geo/discreteVertex.cpp
@@ -18,6 +18,12 @@ discreteVertex::discreteVertex(GModel *m, int num, double x, double y, double z)
   Tree_Add(m->getGEOInternals()->Points, &_v);
 }
 
+discreteVertex::discreteVertex(GModel *m) : GVertex(m, 0)
+{
+  // used for temporary discrete vertices, that should not lead to the creation
+  // of the corresponding entity in GEO internals
+}
+
 discreteVertex::~discreteVertex()
 {
 }
diff --git a/Geo/discreteVertex.h b/Geo/discreteVertex.h
index 28de2ab132..facc7ee9ed 100644
--- a/Geo/discreteVertex.h
+++ b/Geo/discreteVertex.h
@@ -18,6 +18,7 @@ private:
 public:
   discreteVertex(GModel *m, int num, double x = 0., double y = 0.,
                  double z = 0.);
+  discreteVertex(GModel *m);
   virtual ~discreteVertex();
   virtual GPoint point() const;
   virtual double x() const;
diff --git a/Geo/partitionEdge.h b/Geo/partitionEdge.h
index ce684bb7da..b2c233c95d 100644
--- a/Geo/partitionEdge.h
+++ b/Geo/partitionEdge.h
@@ -26,6 +26,10 @@ public:
     : discreteEdge(model, num), _partitions(partitions), _parentEntity(NULL)
   {
   }
+  partitionEdge(GModel *model, const std::vector<unsigned int> &partitions)
+    : discreteEdge(model), _partitions(partitions), _parentEntity(NULL)
+  {
+  }
   virtual ~partitionEdge() {}
   virtual GeomType geomType() const { return PartitionCurve; }
   virtual bool haveParametrization() { return false; }
diff --git a/Geo/partitionFace.h b/Geo/partitionFace.h
index 22da8e87d1..a71fcdaee6 100644
--- a/Geo/partitionFace.h
+++ b/Geo/partitionFace.h
@@ -24,6 +24,11 @@ public:
     : discreteFace(model, num), _partitions(), _parentEntity(NULL)
   {
   }
+  partitionFace(GModel *model,
+                const std::vector<unsigned int> &partitions)
+    : discreteFace(model), _partitions(partitions), _parentEntity(NULL)
+  {
+  }
   virtual ~partitionFace() {}
   virtual GeomType geomType() const { return PartitionSurface; }
   virtual bool haveParametrization() { return false; }
diff --git a/Geo/partitionRegion.h b/Geo/partitionRegion.h
index 9b3689afe8..fd5148b775 100644
--- a/Geo/partitionRegion.h
+++ b/Geo/partitionRegion.h
@@ -24,6 +24,11 @@ public:
     : discreteRegion(model, num), _partitions(), _parentEntity(NULL)
   {
   }
+  partitionRegion(GModel *model,
+                  const std::vector<unsigned int> &partitions)
+    : discreteRegion(model), _partitions(partitions), _parentEntity(NULL)
+  {
+  }
   virtual ~partitionRegion() {}
   virtual GeomType geomType() const { return PartitionVolume; }
   virtual void setParentEntity(GEntity *r) { _parentEntity = r; }
diff --git a/Geo/partitionVertex.h b/Geo/partitionVertex.h
index c76d3ee19f..1008c6598f 100644
--- a/Geo/partitionVertex.h
+++ b/Geo/partitionVertex.h
@@ -24,6 +24,11 @@ public:
     : discreteVertex(model, num), _partitions(), _parentEntity(NULL)
   {
   }
+  partitionVertex(GModel *model,
+                  const std::vector<unsigned int> &partitions)
+    : discreteVertex(model), _partitions(partitions), _parentEntity(NULL)
+  {
+  }
   virtual ~partitionVertex() {}
   virtual GeomType geomType() const { return PartitionPoint; }
   virtual void setParentEntity(GEntity *v) { _parentEntity = v; }
diff --git a/Mesh/meshPartition.cpp b/Mesh/meshPartition.cpp
index 630f55d039..02161cf1f6 100644
--- a/Mesh/meshPartition.cpp
+++ b/Mesh/meshPartition.cpp
@@ -1607,7 +1607,7 @@ static partitionFace *assignPartitionBoundary(
   hashmap<MElement *, GEntity *> &elementToEntity, int &numEntity)
 {
   partitionFace *newEntity = 0;
-  partitionFace pf(model, 1, partitions);
+  partitionFace pf(model, partitions);
   std::pair<
     std::multimap<partitionFace *, GEntity *, Less_partitionFace>::iterator,
     std::multimap<partitionFace *, GEntity *, Less_partitionFace>::iterator>
@@ -1675,7 +1675,7 @@ static partitionEdge *assignPartitionBoundary(
   hashmap<MElement *, GEntity *> &elementToEntity, int &numEntity)
 {
   partitionEdge *newEntity = 0;
-  partitionEdge pe(model, 1, 0, 0, partitions);
+  partitionEdge pe(model, partitions);
   std::pair<
     std::multimap<partitionEdge *, GEntity *, Less_partitionEdge>::iterator,
     std::multimap<partitionEdge *, GEntity *, Less_partitionEdge>::iterator>
@@ -1721,7 +1721,7 @@ static partitionVertex *assignPartitionBoundary(
   hashmap<MElement *, GEntity *> &elementToEntity, int &numEntity)
 {
   partitionVertex *newEntity = 0;
-  partitionVertex pv(model, 1, partitions);
+  partitionVertex pv(model, partitions);
   std::pair<
     std::multimap<partitionVertex *, GEntity *, Less_partitionVertex>::iterator,
     std::multimap<partitionVertex *, GEntity *, Less_partitionVertex>::iterator>
-- 
GitLab