From aa2f6201f34cd50d39e7ec111bc9d816b1ed404a Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 18 Feb 2010 08:32:21 +0000
Subject: [PATCH] missing mesh cache invalidation

---
 Geo/GEdge.cpp                |  2 ++
 Geo/GEntity.cpp              |  5 -----
 Geo/GEntity.h                |  2 +-
 Geo/GFace.cpp                |  6 ++++--
 Geo/GModel.cpp               |  1 +
 Geo/GRegion.cpp              |  2 ++
 Geo/GVertex.cpp              |  3 +++
 Geo/discreteEdge.cpp         |  2 ++
 Mesh/HighOrder.cpp           |  5 ++++-
 Mesh/highOrderSmoother.cpp   |  4 ++--
 Mesh/meshGEdge.cpp           |  3 ---
 Mesh/meshGFace.cpp           |  7 +------
 Mesh/meshGFaceLloyd.cpp      |  4 ++--
 Mesh/meshGRegion.cpp         |  4 +---
 Solver/multiscaleLaplace.cpp | 34 +++++++++++++++++-----------------
 15 files changed, 42 insertions(+), 42 deletions(-)

diff --git a/Geo/GEdge.cpp b/Geo/GEdge.cpp
index 018c0c0ce6..4aa0af1655 100644
--- a/Geo/GEdge.cpp
+++ b/Geo/GEdge.cpp
@@ -37,6 +37,8 @@ void GEdge::deleteMesh()
   mesh_vertices.clear();
   for(unsigned int i = 0; i < lines.size(); i++) delete lines[i];
   lines.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 void GEdge::reverse()
diff --git a/Geo/GEntity.cpp b/Geo/GEntity.cpp
index 17247cb3a6..abd2baef4a 100644
--- a/Geo/GEntity.cpp
+++ b/Geo/GEntity.cpp
@@ -17,11 +17,6 @@ GEntity::GEntity(GModel *m, int t)
   _color = CTX::instance()->packColor(0, 0, 255, 0);
 }
 
-GEntity::~GEntity()
-{
-  deleteVertexArrays();
-}
-
 void GEntity::deleteVertexArrays()
 {
   if(va_lines) delete va_lines; va_lines = 0;
diff --git a/Geo/GEntity.h b/Geo/GEntity.h
index b24b6db0d7..a4d2f2d593 100644
--- a/Geo/GEntity.h
+++ b/Geo/GEntity.h
@@ -158,7 +158,7 @@ class GEntity {
 
   GEntity(GModel *m, int t);
 
-  virtual ~GEntity();
+  virtual ~GEntity(){}
 
   // delete the mesh data
   virtual void deleteMesh(){}
diff --git a/Geo/GFace.cpp b/Geo/GFace.cpp
index 7032c53b1a..e1f4a904ef 100644
--- a/Geo/GFace.cpp
+++ b/Geo/GFace.cpp
@@ -37,10 +37,10 @@ GFace::~GFace()
     ++it;
   }
 
-  deleteMesh();
-
   if(va_geom_triangles)
     delete va_geom_triangles;
+
+  deleteMesh();
 }
 
 void GFace::delFreeEdge(GEdge *e)
@@ -83,6 +83,8 @@ void GFace::deleteMesh()
   quadrangles.clear();
   for(unsigned int i = 0; i < polygons.size(); i++) delete polygons[i];
   polygons.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 unsigned int GFace::getNumMeshElements()
diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index 82707ba698..2b5700d570 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -704,6 +704,7 @@ void GModel::removeInvisibleElements()
     removeInvisible((*it)->lines, all);
     (*it)->deleteVertexArrays();
   }
+  destroyMeshCaches();
 }
 
 int GModel::indexMeshVertices(bool all, int singlePartition)
diff --git a/Geo/GRegion.cpp b/Geo/GRegion.cpp
index ca75fff6a6..a09843cc76 100644
--- a/Geo/GRegion.cpp
+++ b/Geo/GRegion.cpp
@@ -46,6 +46,8 @@ void GRegion::deleteMesh()
   pyramids.clear();
   for(unsigned int i = 0; i < polyhedra.size(); i++) delete polyhedra[i];
   polyhedra.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 unsigned int GRegion::getNumMeshElements()
diff --git a/Geo/GVertex.cpp b/Geo/GVertex.cpp
index 2e465d05e1..206abc9515 100644
--- a/Geo/GVertex.cpp
+++ b/Geo/GVertex.cpp
@@ -5,6 +5,7 @@
 
 #include <sstream>
 #include <algorithm>
+#include "GModel.h"
 #include "GVertex.h"
 #include "GFace.h"
 #include "MPoint.h"
@@ -25,6 +26,8 @@ void GVertex::deleteMesh()
   mesh_vertices.clear();
   for(unsigned int i = 0; i < points.size(); i++) delete points[i];
   points.clear();
+  deleteVertexArrays();
+  model()->destroyMeshCaches();
 }
 
 void GVertex::setPosition(GPoint &p)
diff --git a/Geo/discreteEdge.cpp b/Geo/discreteEdge.cpp
index cc28500503..baa8ee5e7c 100644
--- a/Geo/discreteEdge.cpp
+++ b/Geo/discreteEdge.cpp
@@ -277,6 +277,8 @@ void discreteEdge::parametrize()
   mesh_vertices = newVertices;
 
   deleteVertexArrays();
+  model()->destroyMeshCaches();
+
   lines.clear();
   lines = newLines;
 
diff --git a/Mesh/HighOrder.cpp b/Mesh/HighOrder.cpp
index 4399e427f1..73f512ba6d 100644
--- a/Mesh/HighOrder.cpp
+++ b/Mesh/HighOrder.cpp
@@ -737,7 +737,8 @@ static void setHighOrder(GFace *gf, edgeContainer &edgeVertices,
   std::vector<MQuadrangle*> quadrangles2;
   for(unsigned int i = 0; i < gf->quadrangles.size(); i++){
     MQuadrangle *q = gf->quadrangles[i];
-    MQuadrangle *qNew = setHighOrder(q,gf,edgeVertices,faceVertices,linear,incomplete,nPts,displ2D,displ3D);
+    MQuadrangle *qNew = setHighOrder(q, gf, edgeVertices, faceVertices, linear,
+                                     incomplete, nPts, displ2D, displ3D);
     quadrangles2.push_back(qNew);
     delete q;
   }
@@ -898,6 +899,8 @@ static void removeHighOrderVertices(GEntity *e)
 
 void SetOrder1(GModel *m)
 {
+  m->destroyMeshCaches();
+
   // replace all elements with first order elements
   for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); ++it){
     setFirstOrder(*it, (*it)->lines);
diff --git a/Mesh/highOrderSmoother.cpp b/Mesh/highOrderSmoother.cpp
index 94d016b437..6500b83aab 100644
--- a/Mesh/highOrderSmoother.cpp
+++ b/Mesh/highOrderSmoother.cpp
@@ -1396,7 +1396,7 @@ static int swapHighOrderTriangles(GFace *gf,
     }    
   }
   gf->mesh_vertices = mesh_vertices2;
-  printf("Deleted %d vertices from %d\n",c2,gf->mesh_vertices.size());
+  printf("Deleted %d vertices from %d\n", c2, (int)gf->mesh_vertices.size());
   printf("Added %d vertices\n",c1);
 
   for (unsigned int i = 0; i < gf->triangles.size(); i++){
@@ -1408,7 +1408,7 @@ static int swapHighOrderTriangles(GFace *gf,
     }    
   }
 
-  printf("replacing %d by %d\n",gf->triangles.size(),triangles2.size());
+  printf("replacing %d by %d\n", (int)gf->triangles.size(), (int)triangles2.size());
   gf->triangles = triangles2;
   return nbSwap;
 }
diff --git a/Mesh/meshGEdge.cpp b/Mesh/meshGEdge.cpp
index da4ef33df7..d3b3a345df 100644
--- a/Mesh/meshGEdge.cpp
+++ b/Mesh/meshGEdge.cpp
@@ -235,10 +235,7 @@ static double Integration(GEdge *ge, double t1, double t2,
 void deMeshGEdge::operator() (GEdge *ge) 
 {
   if(ge->geomType() == GEntity::DiscreteCurve) return;
-
   ge->deleteMesh();
-  ge->deleteVertexArrays();
-  ge->model()->destroyMeshCaches();
 }
 
 void meshGEdge::operator() (GEdge *ge) 
diff --git a/Mesh/meshGFace.cpp b/Mesh/meshGFace.cpp
index 822e029a63..45b80b95f8 100644
--- a/Mesh/meshGFace.cpp
+++ b/Mesh/meshGFace.cpp
@@ -1229,17 +1229,12 @@ static bool meshGeneratorPeriodic(GFace *gf, bool debug = true)
 void deMeshGFace::operator() (GFace *gf)
 {
   if(gf->geomType() == GEntity::DiscreteSurface) return;
-
   gf->deleteMesh();
- 
-  gf->deleteVertexArrays();
-  gf->model()->destroyMeshCaches();
-
   gf->meshStatistics.status = GFace::PENDING;
   gf->meshStatistics.nbTriangle = gf->meshStatistics.nbEdge = 0;
 }
 
-int debugSurface = -100;
+int debugSurface = -1;
 
 void meshGFace::operator() (GFace *gf)
 {
diff --git a/Mesh/meshGFaceLloyd.cpp b/Mesh/meshGFaceLloyd.cpp
index 8978c5d878..f7f8da4879 100644
--- a/Mesh/meshGFaceLloyd.cpp
+++ b/Mesh/meshGFaceLloyd.cpp
@@ -30,8 +30,8 @@ void lloydAlgorithm::operator () ( GFace * gf) {
   const double LC2D = sqrt ((du.high()-du.low())*(du.high()-du.low()) +
 			    (dv.high()-dv.low())*(dv.high()-dv.low()));  
 
-  printf("Lloyd on face %d %d elements %d nodes LC %g\n",gf->tag(),
-	 gf->getNumMeshElements(),all.size(),LC2D);
+  printf("Lloyd on face %d %d elements %d nodes LC %g\n", gf->tag(),
+	 gf->getNumMeshElements(), (int)all.size(), LC2D);
 
   int i = 0;
 
diff --git a/Mesh/meshGRegion.cpp b/Mesh/meshGRegion.cpp
index 073ba271cf..2bc09056ce 100644
--- a/Mesh/meshGRegion.cpp
+++ b/Mesh/meshGRegion.cpp
@@ -124,6 +124,7 @@ void TransferTetgenMesh(GRegion *gr, tetgenio &in, tetgenio &out,
 
   // Tetgen modifies both surface & edge mesh, so we need to re-create
   // everything
+  gr->model()->destroyMeshCaches();
   std::list<GFace*> faces = gr->faces();
   std::list<GFace*>::iterator it = faces.begin();
   while(it != faces.end()){
@@ -438,10 +439,7 @@ void TransferVolumeMesh(GRegion *gr, Ng_Mesh *ngmesh,
 void deMeshGRegion::operator() (GRegion *gr)
 {
   if(gr->geomType() == GEntity::DiscreteVolume) return;
-
   gr->deleteMesh();
-  gr->deleteVertexArrays();
-  gr->model()->destroyMeshCaches();
 }
 
 int intersect_line_triangle(double X[3], double Y[3], double Z[3] , 
diff --git a/Solver/multiscaleLaplace.cpp b/Solver/multiscaleLaplace.cpp
index 5852f1d9bf..6430614ccd 100644
--- a/Solver/multiscaleLaplace.cpp
+++ b/Solver/multiscaleLaplace.cpp
@@ -585,16 +585,16 @@ static void connected_left_right (std::vector<MElement *> &left,
 
 }
 //--------------------------------------------------------------
-static void printLevel ( const char* fn,
-			 std::vector<MElement *> &elements,
-			 std::map<MVertex*,SPoint2> *coordinates,
-			 double version){
-
-  if( !CTX::instance()->mesh.saveAll) return;  
+static void printLevel(const char* fn,
+                       std::vector<MElement *> &elements,
+                       std::map<MVertex*,SPoint2> *coordinates,
+                       double version)
+{
+  if(!CTX::instance()->mesh.saveAll) return;  
 
   std::set<MVertex*> vs;
-  for (int i=0;i<elements.size();i++)
-    for (int j=0;j<elements[i]->getNumVertices();j++)
+  for (int i = 0; i < elements.size(); i++)
+    for (int j = 0; j < elements[i]->getNumVertices(); j++)
       vs.insert(elements[i]->getVertex(j));
 
   bool binary = false;
@@ -603,23 +603,23 @@ static void printLevel ( const char* fn,
   fprintf(fp, "%g %d %d\n", version, binary ? 1 : 0, (int)sizeof(double));
   fprintf(fp, "$EndMeshFormat\n");  
 
-  fprintf(fp,"$Nodes\n%d\n",vs.size());
+  fprintf(fp, "$Nodes\n%d\n", (int)vs.size());
   std::set<MVertex*> :: iterator it = vs.begin();
   int index = 1;
   for (; it != vs.end() ; ++it){
     (*it)->setIndex(index++);
     SPoint2 p = (coordinates) ? (*coordinates)[*it] : SPoint2(0,0);
-    if (coordinates) fprintf(fp,"%d %g %g 0\n",(*it)->getIndex(),p.x(),p.y());
-    else fprintf(fp,"%d %g %g %g\n",(*it)->getIndex(),
-		 (*it)->x(),(*it)->y(),(*it)->z());
+    if (coordinates) fprintf(fp, "%d %g %g 0\n", (*it)->getIndex(), p.x(), p.y());
+    else fprintf(fp, "%d %g %g %g\n", (*it)->getIndex(),
+		 (*it)->x(), (*it)->y(), (*it)->z());
   }
-  fprintf(fp,"$EndNodes\n",elements.size());
+  fprintf(fp, "$EndNodes\n");
   
-  fprintf(fp,"$Elements\n%d\n",elements.size());
-  for (int i=0;i<elements.size();i++){
-    elements[i]->writeMSH(fp,version);
+  fprintf(fp, "$Elements\n%d\n", (int)elements.size());
+  for (int i = 0; i < elements.size(); i++){
+    elements[i]->writeMSH(fp, version);
   }
-  fprintf(fp,"$EndElements\n%d\n",elements.size());
+  fprintf(fp, "$EndElements\n");
   
   fclose(fp);
 }
-- 
GitLab