From d2340a01d8c2decca49319296237beb3d7162249 Mon Sep 17 00:00:00 2001
From: Emilie Marchandise <emilie.marchandise@uclouvain.be>
Date: Thu, 22 Dec 2011 10:23:24 +0000
Subject: [PATCH] mmg3D memory

---
 Geo/GModel.cpp                               | 17 ++++++++---
 Mesh/meshGRegionMMG3D.cpp                    | 18 +++++------
 Mesh/meshMetric.cpp                          |  2 +-
 Numeric/cartesian.h                          | 32 +++++++++++++-------
 benchmarks/boolean/{sphere.lua => sphere.py} |  0
 5 files changed, 42 insertions(+), 27 deletions(-)
 rename benchmarks/boolean/{sphere.lua => sphere.py} (100%)

diff --git a/Geo/GModel.cpp b/Geo/GModel.cpp
index b4faa37a21..884147b1dd 100644
--- a/Geo/GModel.cpp
+++ b/Geo/GModel.cpp
@@ -545,7 +545,7 @@ int GModel::adaptMesh(int technique, simpleFunction<double> *f, std::vector<doub
 
       fields->reset();
       if (++ITER >= niter)  break;
-      if (ITER > 5 && fabs((double)(nbElems - nbElemsOld)) < 0.005 * nbElemsOld) break;
+      if (ITER > 5 && fabs((double)(nbElems - nbElemsOld)) < 0.01 * nbElemsOld) break;
 	
       int id = fields->newId();
       (*fields)[id] = new meshMetric(this, technique, f, parameters);;
@@ -565,7 +565,9 @@ int GModel::adaptMesh(int technique, simpleFunction<double> *f, std::vector<doub
   else{
 
     if (getNumMeshElements() == 0) mesh(getDim());
-    meshMetric *mm; 
+    //meshMetric *mm; 
+    FieldManager *fields = getFields();
+    fields->reset();
 
     while(1) {
       Msg::Info("-- adaptMesh ITER =%d ", ITER);
@@ -591,8 +593,12 @@ int GModel::adaptMesh(int technique, simpleFunction<double> *f, std::vector<doub
       nbElems = elements.size();
       if (nbElems == 0)return -1;
 
-      mm = new meshMetric(this, technique, f, parameters);
-      mm->setAsBackgroundMesh (this);
+ 
+      int id = fields->newId();
+      (*fields)[id] = new meshMetric(this, technique, f, parameters);;
+      fields->background_field = id;
+      //mm = new meshMetric(this, technique, f, parameters);
+      //mm->setAsBackgroundMesh (this);
 
       if (getDim() == 2){
 	for (fiter fit = firstFace(); fit != lastFace(); ++fit){
@@ -611,7 +617,8 @@ int GModel::adaptMesh(int technique, simpleFunction<double> *f, std::vector<doub
 	  _octree = 0;
 	}
       }
-      delete mm;
+      fields->reset();
+      //delete mm;
       if (++ITER >= niter) break;
       if (fabs((double)(nbElems - nbElemsOld)) < 0.01 * nbElemsOld) break;
 
diff --git a/Mesh/meshGRegionMMG3D.cpp b/Mesh/meshGRegionMMG3D.cpp
index 6683aadc25..440a385f83 100644
--- a/Mesh/meshGRegionMMG3D.cpp
+++ b/Mesh/meshGRegionMMG3D.cpp
@@ -74,14 +74,14 @@ static void gmsh2MMG(GRegion *gr, MMG_pMesh mmg, MMG_pSol sol,
     mmg->nt += (*it)->triangles.size();
   }
   
-  mmg->npmax = sol->npmax = 100000;
-  mmg->ntmax = 70000;
-  mmg->nemax = 700000;
+  mmg->npmax = sol->npmax = 1000000;
+  mmg->ntmax = 700000;
+  mmg->nemax = 7000000;
 
   mmg->point = (MMG_pPoint)calloc(mmg->npmax+1,sizeof(MMG_Point));
   mmg->tetra = (MMG_pTetra)calloc(mmg->nemax+1,sizeof(MMG_Tetra));
   mmg->tria  = (MMG_pTria) calloc(mmg->ntmax+1,sizeof(MMG_Tria));
-  mmg->disp  = (MMG_pDispl)calloc(mmg->npmax+1,sizeof(MMG_Displ));
+  //mmg->disp  = (MMG_pDispl)calloc(mmg->npmax+1,sizeof(MMG_Displ));
   mmg->adja = (int*)calloc(4*mmg->nemax+5,sizeof(int));
 
   sol->offset = 6;
@@ -181,7 +181,7 @@ static void gmsh2MMG(GRegion *gr, MMG_pMesh mmg, MMG_pSol sol,
       k++;
     }
   } 
-  mmg->disp = 0;
+  //mmg->disp = 0;
   
 }
 
@@ -242,17 +242,15 @@ static void updateSizes(GRegion *gr, MMG_pMesh mmg, MMG_pSol sol)
 static void freeMMG(MMG_pMesh mmgMesh, MMG_pSol mmgSol)
 {
   free(mmgMesh->point);
-  //  free(mmgMesh->disp->alpha);
-  //  free(mmgMesh->disp->mv);
-  free(mmgMesh->disp);
+  //free(mmgMesh->disp);
   free(mmgMesh->adja);
   free(mmgMesh->tria);
   free(mmgMesh->tetra);
   free(mmgMesh);
-  if ( mmgSol->npfixe ){  
+  //if ( mmgSol->npfixe ){  
     free(mmgSol->met);
     free(mmgSol->metold);
-  }
+  //}
   free(mmgSol);
 }
 
diff --git a/Mesh/meshMetric.cpp b/Mesh/meshMetric.cpp
index eb044c02a7..f56c08b54a 100644
--- a/Mesh/meshMetric.cpp
+++ b/Mesh/meshMetric.cpp
@@ -331,7 +331,7 @@ void meshMetric::computeMetric(){
   //smoothMetric (sol);
   //curvatureContributionToMetric();
 
-  putOnNewView();
+  //putOnNewView();
 
 }
 
diff --git a/Numeric/cartesian.h b/Numeric/cartesian.h
index 164982c830..535451bda8 100644
--- a/Numeric/cartesian.h
+++ b/Numeric/cartesian.h
@@ -226,21 +226,31 @@ class cartesianBox {
     SPoint3 p7 = getNodeCoordinates(it7->first);
     SPoint3 p8 = getNodeCoordinates(it8->first);
 
-    MVertex v1(p1.x(), p1.y(), p1.z());
-    MVertex v2(p2.x(), p2.y(), p2.z());
-    MVertex v3(p3.x(), p3.y(), p3.z());
-    MVertex v4(p4.x(), p4.y(), p4.z());
-    MVertex v5(p5.x(), p5.y(), p5.z());
-    MVertex v6(p6.x(), p6.y(), p6.z());
-    MVertex v7(p7.x(), p7.y(), p7.z());
-    MVertex v8(p8.x(), p8.y(), p8.z());
+    MVertex *v1 = new MVertex(p1.x(), p1.y(), p1.z());
+    MVertex *v2 = new MVertex(p2.x(), p2.y(), p2.z());
+    MVertex *v3 = new MVertex(p3.x(), p3.y(), p3.z());
+    MVertex *v4 = new MVertex(p4.x(), p4.y(), p4.z());
+    MVertex *v5 = new MVertex(p5.x(), p5.y(), p5.z());
+    MVertex *v6 = new MVertex(p6.x(), p6.y(), p6.z());
+    MVertex *v7 = new MVertex(p7.x(), p7.y(), p7.z());
+    MVertex *v8 = new MVertex(p8.x(), p8.y(), p8.z());
 
-    MHexahedron newElem(&v1, &v2, &v3, &v4, &v5, &v6, &v7, &v8);
+    MHexahedron *newElem = new MHexahedron(v1, v2, v3, v4, v5, v6, v7, v8);
     double uvw[3];
     double xyz[3] = {x,y,z};
-    newElem.xyz2uvw(xyz, uvw);
+    newElem->xyz2uvw(xyz, uvw);
     //printf("uvw =%g %g %g \n", uvw[0],uvw[1],uvw[2]);
-    double val = newElem.interpolate(vals, uvw[0], uvw[1], uvw[2]);
+    double val = newElem->interpolate(vals, uvw[0], uvw[1], uvw[2]);
+    
+    delete newElem;
+    delete v1;
+    delete v2;
+    delete v3;
+    delete v4;
+    delete v5;
+    delete v6;
+    delete v7;
+    delete v8;
 
     return val;
   }
diff --git a/benchmarks/boolean/sphere.lua b/benchmarks/boolean/sphere.py
similarity index 100%
rename from benchmarks/boolean/sphere.lua
rename to benchmarks/boolean/sphere.py
-- 
GitLab