From 27f55402abe741b4a277d23508423efaf97e9b94 Mon Sep 17 00:00:00 2001
From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be>
Date: Thu, 9 Jun 2011 09:18:25 +0000
Subject: [PATCH] L'aniso MMG est en place

---
 Mesh/meshGRegionMMG3D.cpp            | 55 +++++++++++++++++++++++++---
 contrib/mmg3d/build/sources/scalem.c | 16 ++++----
 2 files changed, 58 insertions(+), 13 deletions(-)

diff --git a/Mesh/meshGRegionMMG3D.cpp b/Mesh/meshGRegionMMG3D.cpp
index 4b8ae84bcd..ad681ce012 100644
--- a/Mesh/meshGRegionMMG3D.cpp
+++ b/Mesh/meshGRegionMMG3D.cpp
@@ -8,6 +8,7 @@
 #include "MTriangle.h"
 #include "MVertex.h"
 #include "BackgroundMesh.h"
+#include "Context.h"
 
 extern "C" {
 #include <libmmg3d.h>
@@ -70,10 +71,34 @@ void gmsh2MMG (GRegion *gr, MMG_pMesh mmg, MMG_pSol sol, std::map<int,MVertex*>
   mmg->disp  = (MMG_pDispl)calloc(mmg->npmax+1,sizeof(MMG_Displ));
   mmg->adja = (int*)calloc(4*mmg->nemax+5,sizeof(int));
 
-  sol->offset = 1;
+  sol->offset = 6;
   sol->met = (double*)calloc(sol->npmax+1,sol->offset*sizeof(double)); 
+  sol->metold = (double*)calloc(sol->npmax+1,sol->offset*sizeof(double)); 
+
+  std::map<MVertex*,std::pair<double,int> > LCS;
+  if (CTX::instance()->mesh.lcExtendFromBoundary){
+    for (std::list<GFace*>::iterator it = f.begin(); it != f.end() ; ++it){
+      for (int i=0;i<(*it)->triangles.size();i++){
+	MTriangle *t = (*it)->triangles[i];
+	double L = t->maxEdge();
+	for (int k=0;k<3;k++){
+	  MVertex *v = t->getVertex(k);
+	  std::map<MVertex*,std::pair<double,int> >::iterator itv = LCS.find(v);
+	  if (itv != LCS.end()){
+	    itv->second.first += L;
+	    itv->second.second ++;
+	  }
+	  else {
+	    LCS[v] = std::make_pair(L,1);
+	  }
+	}
+      }
+    }
+  }
+
   
   int k=1;
+  int count = 1;//sol->offset;
   std::map<int,int> gmsh2mmg_num;
   for (std::set<MVertex*>::iterator it = allVertices.begin() ; it != allVertices.end() ; ++it){
     MMG_pPoint ppt = &mmg->point[k]; 
@@ -96,11 +121,31 @@ void gmsh2MMG (GRegion *gr, MMG_pMesh mmg, MMG_pSol sol, std::map<int,MVertex*>
       v->getParameter(1,V);
     }
     double lc = BGM_MeshSize(v->onWhat(), U,V,v->x(), v->y(), v->z());  
-    int isol = (k-1) * sol->offset + 1; 
-    for (int i=0; i<sol->offset; i++)  {
-      sol->met[isol + i] = lc;
-      //      printf("sol[%d] = %12.5E\n",isol + i,lc);
+    //SMetric3 m = BGM_MeshMetric(v->onWhat(), U,V,v->x(), v->y(), v->z());  
+
+    if (CTX::instance()->mesh.lcExtendFromBoundary){
+      std::map<MVertex*,std::pair<double,int> >::iterator itv = LCS.find(v);
+      if (itv != LCS.end()){
+	double LL = itv->second.first/itv->second.second;
+	//	SMetric3 l4(1./(LL*LL));
+	//	SMetric3 MM = intersection (l4, m);	
+	//	m = MM;
+	lc = std::min(LL,lc);
+      }
     }
+
+    sol->met[count++] = 1/(lc*lc);
+    sol->met[count++] = 0;
+    sol->met[count++] = 0;
+    sol->met[count++] = 1/(lc*lc);
+    sol->met[count++] = 0;
+    sol->met[count++] = 1/(lc*lc);
+    //    printf("%g %g %g %g %g %g\n",m(0,0),m(0,1),m(0,2),m(1,1),m(1,2),m(2,2));
+    
+    //    for (int i=0; i<sol->offset; i++)  {
+    //      sol->met[isol + i] = lc;
+      //      printf("sol[%d] = %12.5E\n",isol + i,lc);
+    //    }
     k++;
   }
   
diff --git a/contrib/mmg3d/build/sources/scalem.c b/contrib/mmg3d/build/sources/scalem.c
index 91fc613612..5865dd0415 100644
--- a/contrib/mmg3d/build/sources/scalem.c
+++ b/contrib/mmg3d/build/sources/scalem.c
@@ -161,14 +161,14 @@ int MMG_scaleMesh(pMesh mesh,pSol sol) {
       }
       mold    = &sol->metold[iadr]; 
       kk = 0;
-	  for (ii=0; ii<3; ii++) {
-         for (jj=ii; jj<3; jj++) {
-            mold[kk] = lambda[0]*v[0][ii]*v[0][jj] + 
- 	                   lambda[1]*v[1][ii]*v[1][jj] +
-                       lambda[2]*v[2][ii]*v[2][jj]; 
-            kk = kk+1;
-         }                     
-       }
+      for (ii=0; ii<3; ii++) {
+	for (jj=ii; jj<3; jj++) {
+	  mold[kk] = lambda[0]*v[0][ii]*v[0][jj] + 
+	    lambda[1]*v[1][ii]*v[1][jj] +
+	    lambda[2]*v[2][ii]*v[2][jj]; 
+	  kk = kk+1;
+	}                     
+      }
     }
     break;
   default:
-- 
GitLab