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