From ca9b150ae6af4629dc0a32d11877eb5a81027b47 Mon Sep 17 00:00:00 2001
From: Gaetan Bricteux <gaetan.bricteux@uclouvain.be>
Date: Mon, 10 Oct 2011 10:19:58 +0000
Subject: [PATCH] fix numbering

---
 Geo/GEdge.cpp       | 11 ++++++++++-
 Geo/GEdge.h         |  1 +
 Geo/GEntity.h       |  1 +
 Geo/GFace.cpp       |  9 +++++++++
 Geo/GFace.h         |  1 +
 Geo/GModel.cpp      | 10 ++++++++++
 Geo/GModel.h        |  1 +
 Geo/GRegion.cpp     |  9 +++++++++
 Geo/GRegion.h       |  1 +
 Geo/MElement.cpp    |  6 +++---
 Geo/MElement.h      |  2 +-
 Geo/MElementCut.cpp | 10 +++++-----
 12 files changed, 52 insertions(+), 10 deletions(-)

diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp
index a495a70277..d04e042aa1 100644
--- a/Geo/GEdge.cpp
+++ b/Geo/GEdge.cpp
@@ -53,10 +53,19 @@ void GEdge::reverse()
 }
 
 unsigned int GEdge::getNumMeshElements()
-{ 
+{
   return lines.size();
 }
 
+unsigned int GEdge::getNumMeshParentElements()
+{
+  unsigned int n = 0;
+  for(unsigned int i = 0; i < lines.size(); i++)
+    if(lines[i]->ownsParent())
+      n++;
+  return n;
+}
+
 void GEdge::getNumMeshElements(unsigned *const c) const
 {
   c[0] += lines.size();
diff --git a/Geo/GEdge.h b/Geo/GEdge.h
index fd3f9a845e..7f98689c58 100644
--- a/Geo/GEdge.h
+++ b/Geo/GEdge.h
@@ -141,6 +141,7 @@ class GEdge : public GEntity {
 
   // get total/by-type number of elements in the mesh
   unsigned int getNumMeshElements();
+  unsigned int getNumMeshParentElements();
   void getNumMeshElements(unsigned *const c) const;
 
   // get the start of the array of a type of element
diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index 084d7b7b2f..ff0f3ee981 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -287,6 +287,7 @@ class GEntity {
 
   // get the number of mesh elements (total and by type) in the entity
   virtual unsigned int getNumMeshElements() { return 0; }
+  virtual unsigned int getNumMeshParentElements() { return 0; }
   virtual void getNumMeshElements(unsigned *const c) const { };
 
   // get the start of the array of a type of element
diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp
index 97645751ea..7321425206 100644
--- a/Geo/GFace.cpp
+++ b/Geo/GFace.cpp
@@ -93,6 +93,15 @@ unsigned int GFace::getNumMeshElements()
   return triangles.size() + quadrangles.size() + polygons.size();
 }
 
+unsigned int GFace::getNumMeshParentElements()
+{
+  unsigned int n = 0;
+  for(unsigned int i = 0; i < polygons.size(); i++)
+    if(polygons[i]->ownsParent())
+      n++;
+  return n;
+}
+
 void GFace::getNumMeshElements(unsigned *const c) const
 {
   c[0] += triangles.size();
diff --git a/Geo/GFace.h b/Geo/GFace.h
index bea0547df0..509eb6573c 100644
--- a/Geo/GFace.h
+++ b/Geo/GFace.h
@@ -234,6 +234,7 @@ class GFace : public GEntity
 
   // get total/by-type number of elements in the mesh
   unsigned int getNumMeshElements();
+  unsigned int getNumMeshParentElements();
   void getNumMeshElements(unsigned *const c) const;
 
   // get the start of the array of a type of element
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index f19e13970c..5d05bc505b 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -566,6 +566,16 @@ int GModel::getNumMeshElements()
   return n;
 }
 
+int GModel::getNumMeshParentElements()
+{
+  std::vector<GEntity*> entities;
+  getEntities(entities);
+  unsigned int n = 0;
+  for(unsigned int i = 0; i < entities.size(); i++)
+    n += entities[i]->getNumMeshParentElements();
+  return n;
+}
+
 int GModel::getNumMeshElements(unsigned c[5])
 {
   c[0] = 0; c[1] = 0; c[2] = 0; c[3] = 0; c[4] = 0;
diff --git a/Geo/GModel.h b/Geo/GModel.h
index 3a79369550..44a2b2ffac 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -288,6 +288,7 @@ class GModel
 
   // return the total number of elements in the mesh
   int getNumMeshElements();
+  int getNumMeshParentElements();
 
   // get the number of each type of element in the mesh at the largest
   // dimension and return the dimension
diff --git a/Geo/GRegion.cpp b/Geo/GRegion.cpp
index 57c7d0ba50..62849ad249 100644
--- a/Geo/GRegion.cpp
+++ b/Geo/GRegion.cpp
@@ -56,6 +56,15 @@ unsigned int GRegion::getNumMeshElements()
     polyhedra.size();
 }
 
+unsigned int GRegion::getNumMeshParentElements()
+{
+  unsigned int n = 0;
+  for(unsigned int i = 0; i < polyhedra.size(); i++)
+    if(polyhedra[i]->ownsParent())
+      n++;
+  return n;
+}
+
 void GRegion::getNumMeshElements(unsigned *const c) const
 {
   c[0] += tetrahedra.size();
diff --git a/Geo/GRegion.h b/Geo/GRegion.h
index f869c133a9..77acd62130 100644
--- a/Geo/GRegion.h
+++ b/Geo/GRegion.h
@@ -78,6 +78,7 @@ class GRegion : public GEntity {
 
   // get total/by-type number of elements in the mesh
   unsigned int getNumMeshElements();
+  unsigned int getNumMeshParentElements();
   void getNumMeshElements(unsigned *const c) const;
 
   // get the start of the array of a type of element
diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 9e29a31d9e..0d1da05eb7 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -1080,7 +1080,7 @@ int *MElement::getVerticesIdForMSH()
   return verts;
 }
 
-MElement *MElement::copy(int &num, std::map<int, MVertex*> &vertexMap,
+MElement *MElement::copy(std::map<int, MVertex*> &vertexMap,
                          std::map<MElement*, MElement*> &newParents,
                          std::map<MElement*, MElement*> &newDomains)
 {
@@ -1123,7 +1123,7 @@ MElement *MElement::copy(int &num, std::map<int, MVertex*> &vertexMap,
     std::map<MElement*, MElement*>::iterator it = newParents.find(eParent);
     MElement *newParent;
     if(it == newParents.end()) {
-      newParent = eParent->copy(++num, vertexMap, newParents, newDomains);
+      newParent = eParent->copy(vertexMap, newParents, newDomains);
       newParents[eParent] = newParent;
     }
     else
@@ -1140,7 +1140,7 @@ MElement *MElement::copy(int &num, std::map<int, MVertex*> &vertexMap,
     std::map<MElement*, MElement*>::iterator it = newDomains.find(dom);
     MElement *newDom;
     if(it == newDomains.end()) {
-      newDom = dom->copy(++num, vertexMap, newParents, newDomains);
+      newDom = dom->copy(vertexMap, newParents, newDomains);
       newDomains[dom] = newDom;
     }
     else
diff --git a/Geo/MElement.h b/Geo/MElement.h
index 943b5ca5eb..2a901bb434 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -339,7 +339,7 @@ class MElement
   virtual int *getVerticesIdForMSH();
 
   // copy element and parent if any, vertexMap contains the new vertices
-  virtual MElement *copy(int &num, std::map<int, MVertex*> &vertexMap,
+  virtual MElement *copy(std::map<int, MVertex*> &vertexMap,
                          std::map<MElement*, MElement*> &newParents,
                          std::map<MElement*, MElement*> &newDomains);
 };
diff --git a/Geo/MElementCut.cpp b/Geo/MElementCut.cpp
index 39f17442e7..f54b09c65b 100644
--- a/Geo/MElementCut.cpp
+++ b/Geo/MElementCut.cpp
@@ -516,7 +516,7 @@ static void elementSplitMesh(MElement *e, fullMatrix<double> &verticesLs,
   int eType = e->getTypeForMSH();
   std::vector<int> gePhysicals = ge->physicals;
 
-  MElement *copy = e->copy(numEle, vertexMap, newParents, newDomains);
+  MElement *copy = e->copy(vertexMap, newParents, newDomains);
 
   double lsMean = 0.;
   for(int k = 0; k < e->getNumVertices(); k++)
@@ -642,7 +642,7 @@ static void elementCutMesh(MElement *e, std::vector<const gLevelset *> &RPN,
   unsigned int nbTr = triangles.size();
   unsigned int nbTe = tetras.size();
 
-  MElement *copy = e->copy(numEle, vertexMap, newParents, newDomains);
+  MElement *copy = e->copy(vertexMap, newParents, newDomains);
   MElement *parent = eParent ? copy->getParent() : copy;
 
   double **nodeLs = new double*[e->getNumPrimaryVertices()];
@@ -1131,7 +1131,7 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
   int nbLs = (cutElem) ? ((primS > 1) ? primS + 1 : 1) : 1;
   fullMatrix<double> verticesLs(nbLs, numVert + 1);
 
- //Emi test compute all at once for POINTS (type = 11)
+ //compute all at once for ls POINTS (type = 11)
   std::vector<MVertex *> vert;
   for(unsigned int i = 0; i < gmEntities.size(); i++) {
     for(unsigned int j = 0; j < gmEntities[i]->getNumMeshVertices(); j++) {
@@ -1139,7 +1139,7 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
     }
   }
   for(int k = 0; k < primS; k++){
-    if (primitives[k]->type() == 11){ //points
+    if (primitives[k]->type() == 11){
       ((gLevelsetPoints*)primitives[k])->computeLS(vert);
     }
   }
@@ -1167,7 +1167,7 @@ GModel *buildCutMesh(GModel *gm, gLevelset *ls,
     newPhysTags[d][0] = gm->getMaxPhysicalNumber(d); //max value at [dim][0]
   }
 
-  int numEle = gm->getNumMeshElements(); //element number increment
+  int numEle = gm->getNumMeshElements() + gm->getNumMeshParentElements(); //element number increment
   std::map<MElement*, MElement*> newParents; //map<oldParent, newParent>
   std::map<MElement*, MElement*> newDomains; //map<oldDomain, newDomain>
 
-- 
GitLab