diff --git a/Common/Views.cpp b/Common/Views.cpp
index ab3c14ae09773c042774edff721e2265baedf6a1..0396689bb8fa7d13ac647c10ee42dac405c37648 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-// $Id: Views.cpp,v 1.187 2006-03-15 08:29:06 remacle Exp $
+// $Id: Views.cpp,v 1.188 2006-04-18 09:57:32 remacle Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -111,6 +111,7 @@ Post_View *BeginView(int allocate)
   if(allocate) {
     v->DataSize = sizeof(double);
     v->Grains = new  std::map < int , List_T * > ;
+    v->DisplayListsOfGrains= new  std::map < int , int > ;
 
 #define LCD List_Create(1, 1000, sizeof(double))
     v->Time = LCD;
@@ -132,6 +133,7 @@ Post_View *BeginView(int allocate)
   else {
     v->Time = NULL;
     v->Grains = 0;
+    v->DisplayListsOfGrains = 0;
     v->SP = v->VP = v->TP = NULL;
     v->SL = v->VL = v->TL = v->SL2 = v->VL2 = v->TL2 = NULL;
     v->ST = v->VT = v->TT = v->ST2 = v->VT2 = v->TT2 = NULL;
@@ -598,6 +600,7 @@ void FreeView(Post_View * v)
     List_Delete(v->T2D); List_Delete(v->T2C);
     List_Delete(v->T3D); List_Delete(v->T3C);
     delete v->Grains;
+    delete v->DisplayListsOfGrains;
     // Note: all the second order elements have already been freed in xxxx
     if(v->normals) delete v->normals;
     if(v->TriVertexArray) delete v->TriVertexArray;
diff --git a/Common/Views.h b/Common/Views.h
index 98e4a75b2aa838e81f073bb6393bc4e844df1158..c22da3ef99204a09bd4e25ef2b9afeee52caebd7 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -70,6 +70,7 @@ class Post_View{
   int NbT2, NbT3;
   List_T *T2D, *T2C, *T3D, *T3C; // 2D and 3D text strings
   std::map < int , List_T * >  *Grains; // For LMGC90, grains shapes
+  std::map < int , int >       *DisplayListsOfGrains; // For LMGC90, grains shapes
 
 
   // vertex arrays to draw triangles and lines efficiently
diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp
index 030ee99ad8233a6153a2a1c6f72de612ef208f2c..fe7bf6d1d0626c8059b9a830b2511bbf37282c71 100644
--- a/Graphics/PostElement.cpp
+++ b/Graphics/PostElement.cpp
@@ -1,4 +1,4 @@
-// $Id: PostElement.cpp,v 1.72 2006-04-18 07:49:20 remacle Exp $
+// $Id: PostElement.cpp,v 1.73 2006-04-18 09:57:42 remacle Exp $
 //
 // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
 //
@@ -36,10 +36,6 @@
 
 using namespace std;
 
-int state = -1;		// to distinguish the different LMGC cases to output
-double zmin[1],zmax[1];
-int k = 0;
-int kk =0;
 extern Context_T CTX;
 
 void Draw_ElementBoundary(int type, Post_View * View, 
@@ -1254,12 +1250,15 @@ void Draw_VectorPyramid(ARGS)
 
 // Tensor Elements
 
+static int state = -1;
+
 void Draw_TensorElement(int type, Post_View * View, int preproNormals,
                         double ValMin, double ValMax,
-                        double *X, double *Y, double *Z, double *V)
+                        double *iX, double *iY, double *iZ, double *V)
 {
   int nbnod = 0;
 
+
   switch (type) {
   case POST_POINT: nbnod = 1; break;
   case POST_LINE: nbnod = 2; break;
@@ -1275,427 +1274,320 @@ void Draw_TensorElement(int type, Post_View * View, int preproNormals,
   /// their Von Mises invariant (J2 invariant); this will simply call
   /// the scalar function...
 
+  int ts = View->TimeStep;
+
   if(View->TensorType == DRAW_POST_VONMISES){
-  	int ts = View->TimeStep;
  	View->TimeStep = 0;
 
   	double V_VonMises[8];
   	for(int i = 0; i < nbnod; i++){
   	  	V_VonMises[i] = ComputeVonMises(V + 9*(i + nbnod * ts));
   	}
-  	Draw_ScalarElement(type, View, preproNormals, ValMin, ValMax, X, Y, Z, V_VonMises);
-
-  	View->TimeStep = ts;
-	
+  	Draw_ScalarElement(type, View, preproNormals, ValMin, ValMax, iX, iY, iZ, V_VonMises);
    }
+  
+  else if(View->TensorType == DRAW_POST_LMGC90 || 
+	  View->TensorType == DRAW_POST_LMGC90_TYPE || 
+	  View->TensorType == DRAW_POST_LMGC90_COORD || 
+	  View->TensorType == DRAW_POST_LMGC90_PRES || 
+	  View->TensorType == DRAW_POST_LMGC90_SN || 
+	  View->TensorType == DRAW_POST_LMGC90_DEPX || 
+	  View->TensorType == DRAW_POST_LMGC90_DEPY|| 
+	  View->TensorType == DRAW_POST_LMGC90_DEPZ || 
+	  View->TensorType == DRAW_POST_LMGC90_DEPAV || 
+	  View->TensorType == DRAW_POST_LMGC90_DEPNORM){
+    
+    //cout << View->TensorType << endl;
+
+    static double zmin[3],zmax[3];
+    int it;
+    double DEP[3];	// déplacement relatif cdf % a config de référence
+    double CDG[3];	// coordonnées du centre de gravité au tps t0
+    double VIT[3];  // vitesse en x,y,z du cdg % au repère absolu
+    double ROT[3]; 	// angles de rotation du cdg % au repère absolu
+    double VAR[3];	// valeur des 3 variables supplémentaires
+    double X[3],Y[3],Z[3];
+    double a11,a12,a13,a21,a22,a23,a31,a32,a33;
+    double ztmp[3];
+    
+    View->TimeStep = 0;
+    
+    List_T * list = (*(View->Grains))[(int)V[6]];
+    // Liste contenant toutes les info sur les lignes TP : (x,x,x) et {x,x,x,x,x,x,x,x,x, ...}
+    // info rangé à la suite
+    List_T * listt = View->TP;
+    
+    CDG[0] = iX[0];
+    CDG[1] = iY[0];
+    CDG[2] = iZ[0];
+
+    // Lecture des coordonnées du cdg dans le repère absolu
+    //    List_Read(listt,0+it,&CDG[0]);
+    //    List_Read(listt,1+it,&CDG[1]);
+    //    List_Read(listt,2+it,&CDG[2]);
+    
+    // Lecture des déplacements par rapport au cdg initital
 
-     if(View->TensorType == DRAW_POST_LMGC90 || View->TensorType == DRAW_POST_LMGC90_TYPE || View->TensorType == DRAW_POST_LMGC90_COORD || View->TensorType == DRAW_POST_LMGC90_PRES || View->TensorType == DRAW_POST_LMGC90_SN || View->TensorType == DRAW_POST_LMGC90_DEPX || View->TensorType == DRAW_POST_LMGC90_DEPY|| View->TensorType == DRAW_POST_LMGC90_DEPZ || View->TensorType == DRAW_POST_LMGC90_DEPAV || View->TensorType == DRAW_POST_LMGC90_DEPNORM){
-//cout << View->TensorType << endl;
-	int ts = View->TimeStep;
-	int it;
-	double DEP[3];	// déplacement relatif cdf % a config de référence
-	double CDG[3];	// coordonnées du centre de gravité au tps t0
-	double VIT[3];  // vitesse en x,y,z du cdg % au repère absolu
-	double ROT[3]; 	// angles de rotation du cdg % au repère absolu
-	double VAR[3];	// valeur des 3 variables supplémentaires
-	double a11,a12,a13,a21,a22,a23,a31,a32,a33;
-	double ztmp[3];
-
-	View->TimeStep = 0;
-
-	List_T * list = (*(View->Grains))[(int)V[6]];
-	// Liste contenant toutes les info sur les lignes TP : (x,x,x) et {x,x,x,x,x,x,x,x,x, ...}
-	// info rangé à la suite
-	List_T * listt = View->TP;
-
-	k = k+1;
-	it = (k-1)*List_Nbr(listt)/View->NbTP;
-		
-	// Lecture des coordonnées du cdg dans le repère absolu
-	List_Read(listt,0+it,&CDG[0]);
-	List_Read(listt,1+it,&CDG[1]);
-	List_Read(listt,2+it,&CDG[2]);
-
-	// Lecture des déplacements par rapport au cdg initital
-	List_Read(listt,3+ts*9+it,&DEP[0]);
-	List_Read(listt,4+ts*9+it,&DEP[1]);
-	List_Read(listt,5+ts*9+it,&DEP[2]);
-
-	// Lecture des rotations du centre de gravité
-	List_Read(listt,6+ts*9+it,&ROT[0]);
-	List_Read(listt,7+ts*9+it,&ROT[1]);
-	List_Read(listt,8+ts*9+it,&ROT[2]);
-
-	/*if(vz==0 || vy == 0){
-		ROT[0] = 0;
-	else{
-		ROT[0] = atan(vz/vy);}
-	if(vx==0 || vz == 0){
-		ROT[1] = 0;}
-	else{
-		ROT[1] = atan(vx/vz);}
-	if(vy==0 || vx == 0){
-		ROT[2] = 0;}
-	else{
-		ROT[2] = atan(vy/vx);}	*/
-
-	// Lecture des valeurs des variables supplémentaires
-	List_Read(listt,9+ts*9+it,&VAR[0]);
-	List_Read(listt,10+ts*9+it,&VAR[1]);
-	List_Read(listt,11+ts*9+it,&VAR[2]);
-//	cout << "var8 " << VAR[1] << endl;
-//	cout << "var9 " << VAR[2] << endl;
-	// calcule les valeurs min et max d'une info 1 seule fois
-	if(state != View->TensorType){
-	switch (View->TensorType) {
-  		case DRAW_POST_LMGC90: 
-			// couleur uniforme
-			zmin[0]=1;
-			zmax[0]=1;
-			state = DRAW_POST_LMGC90;
-		break;
-  		case DRAW_POST_LMGC90_TYPE: 
-			// couleur en fonction du type de grain
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,9,&zmin[0]);
-			List_Read(listt,9,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				List_Read(listt,i*it+9,&ztmp[0]);
-				if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-				if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-			}
-			state = DRAW_POST_LMGC90_TYPE;
-		break;
-  		case DRAW_POST_LMGC90_COORD: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,9,&zmin[0]);
-			List_Read(listt,9,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9-1; j++){
-					List_Read(listt,i*it+18+j*9,&ztmp[0]); // on part pas du premier
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_COORD;
-		break;
-  		case DRAW_POST_LMGC90_PRES: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,10,&zmin[0]);
-			List_Read(listt,10,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+10+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_PRES;
-		break;
-  		case DRAW_POST_LMGC90_SN: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,11,&zmin[0]);
-			List_Read(listt,11,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+11+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_SN;
-		break;
-  		case DRAW_POST_LMGC90_DEPX: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,3,&zmin[0]);
-			List_Read(listt,3,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+3+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPX;
-		break;
-  		case DRAW_POST_LMGC90_DEPY: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,4,&zmin[0]);
-			List_Read(listt,4,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+4+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPY;
-		break;
-  		case DRAW_POST_LMGC90_DEPZ:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,5,&zmin[0]);
-			List_Read(listt,5,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+5+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPZ;
-		break;
-  		case DRAW_POST_LMGC90_DEPAV:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,3,&ztmp[0]);
-			List_Read(listt,4,&ztmp[1]);
-			List_Read(listt,5,&ztmp[2]);
-			zmin[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3;
-			List_Read(listt,3,&ztmp[0]);
-			List_Read(listt,4,&ztmp[1]);
-			List_Read(listt,5,&ztmp[2]);
-			zmax[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3;
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+3+j*9,&ztmp[0]);
-					List_Read(listt,i*it+4+j*9,&ztmp[1]);
-					List_Read(listt,i*it+5+j*9,&ztmp[2]);
-					ztmp[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3;
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPAV ;
-		break;
-  		case DRAW_POST_LMGC90_DEPNORM:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,3,&ztmp[0]);
-			List_Read(listt,4,&ztmp[1]);
-			List_Read(listt,5,&ztmp[2]);
-			zmin[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]);
-			List_Read(listt,3,&ztmp[0]);
-			List_Read(listt,4,&ztmp[1]);
-			List_Read(listt,5,&ztmp[2]);
-			zmax[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+3+j*9,&ztmp[0]);
-					List_Read(listt,i*it+4+j*9,&ztmp[1]);
-					List_Read(listt,i*it+5+j*9,&ztmp[2]);
-					ztmp[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPNORM ;
-		break;
-	
-/*
-  		case DRAW_POST_LMGC90_DEPX: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,3,&zmin[0]);
-			List_Read(listt,3,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+3+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPX;
-		break;
-  		case DRAW_POST_LMGC90_DEPY: 
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,4,&zmin[0]);
-			List_Read(listt,4,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+4+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPY;
-		break;
-  		case DRAW_POST_LMGC90_DEPZ:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,5,&zmin[0]);
-			List_Read(listt,5,&zmax[0]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+5+j*9,&ztmp[0]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEP;
-		break;
-  		case DRAW_POST_LMGC90_DEPAV:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,3,&ztmp[0]);
-			List_Read(listt,4,&ztmp[1]);
-			List_Read(listt,5,&ztmp[2]);
-			zmin[0]=(ztemp[0]+ztemp[1]+ztemp[2])/3;
-			List_Read(listt,3,&zmax[0]);
-			List_Read(listt,4,&zmax[1]);
-			List_Read(listt,5,&zmax[2]);
-			zmax[0]=(ztemp[0]+ztemp[1]+ztemp[2])/3;
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+3+j*9,&ztmp[0]);
-					List_Read(listt,i*it+4+j*9,&ztmp[0]);
-					List_Read(listt,i*it+5+j*9,&ztmp[0]);
-					ztmp[0]=(ztemp[0]+ztemp[1]+ztemp[2])/3;
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPAV ;
-		break;
-  		case DRAW_POST_LMGC90_DEPNORM:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,3,&ztmp[0]);
-			List_Read(listt,4,&ztmp[1]);
-			List_Read(listt,5,&ztmp[2]);
-			zmin[0]=sqrt(ztemp[0]*ztemp[0]+ztemp[1]*ztemp[1]+ztemp[2]*ztemp[2]);
-			List_Read(listt,3,&zmax[0]);
-			List_Read(listt,4,&zmax[1]);
-			List_Read(listt,5,&zmax[2]);
-			zmax[0]=sqrt(ztemp[0]*ztemp[0]+ztemp[1]*ztemp[1]+ztemp[2]*ztemp[2]);
-			for(int i = 0; i < View->NbTP; i++){
-				for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
-					List_Read(listt,i*it+3+j*9,&ztmp[0]);
-					List_Read(listt,i*it+4+j*9,&ztmp[0]);
-					List_Read(listt,i*it+5+j*9,&ztmp[0]);
-				if(k==View->NbTP){
-		k = 0;	
-	}	ztmp[0]=sqrt(ztemp[0]*ztemp[0]+ztemp[1]*ztemp[1]+ztemp[2]*ztemp[2]);
-					if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
-					if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
-				}
-			}
-			state = DRAW_POST_LMGC90_DEPNORM ;
-		break;*/
-		} //end switch
-	} //end if
-
-	// matrice de changement de base, pour la rotation
-	a11 = cos(ROT[0])*cos(ROT[1]); a12 = -sin(ROT[0])*cos(ROT[1]); 	a13 = -sin(ROT[1]);
-	a21 = sin(ROT[0])*cos(ROT[2])-cos(ROT[0])*sin(ROT[1])*sin(ROT[2]);
-	a22 = cos(ROT[0])*cos(ROT[2])+sin(ROT[0])*sin(ROT[1])*sin(ROT[2]);
-	a23 = -cos(ROT[1])*sin(ROT[2]);
-	a31 = sin(ROT[0])*sin(ROT[2])+cos(ROT[0])*sin(ROT[1])*cos(ROT[2]);
-	a32 = cos(ROT[0])*sin(ROT[2])-sin(ROT[0])*sin(ROT[1])*cos(ROT[2]);
-	a33 = cos(ROT[1])*cos(ROT[2]);	
-
-	for(int i = 0; i < List_Nbr(list) ; i = i+9){
-		double tmp[9];
-		List_Read(list,i,&tmp[0]);	//X
-		List_Read(list,i+1,&tmp[1]);	//Y
-		List_Read(list,i+2,&tmp[2]);	//Z
-		List_Read(list,i+3,&tmp[3]);
-		List_Read(list,i+4,&tmp[4]);
-		List_Read(list,i+5,&tmp[5]);
-		List_Read(list,i+6,&tmp[6]);
-		List_Read(list,i+7,&tmp[7]);
-		List_Read(list,i+8,&tmp[8]);
-
-		X[0] = ((tmp[0])*a11+(tmp[1])*a12+(tmp[2])*a13)+CDG[0]+DEP[0];
-		Y[0] = ((tmp[0])*a21+(tmp[1])*a22+(tmp[2])*a23)+CDG[1]+DEP[1]; 
-		Z[0] = ((tmp[0])*a31+(tmp[1])*a32+(tmp[2])*a33)+CDG[2]+DEP[2];
-
-		X[1] = ((tmp[3])*a11+(tmp[4])*a12+(tmp[5])*a13)+CDG[0]+DEP[0];
-		Y[1] = ((tmp[3])*a21+(tmp[4])*a22+(tmp[5])*a23)+CDG[1]+DEP[1];
-		Z[1] = ((tmp[3])*a31+(tmp[4])*a32+(tmp[5])*a33)+CDG[2]+DEP[2];
-
-		X[2] = ((tmp[6])*a11+(tmp[7])*a12+(tmp[8])*a13)+CDG[0]+DEP[0];
-		Y[2] = ((tmp[6])*a21+(tmp[7])*a22+(tmp[8])*a23)+CDG[1]+DEP[1];
-		Z[2] = ((tmp[6])*a31+(tmp[7])*a32+(tmp[8])*a33)+CDG[2]+DEP[2];
-
-		double n[3];
-     		double n1[3];
-		double n2[3];
-		double n3[3];
-		double racine;
-      		normal3points(X[0], Y[0], Z[0], X[1], Y[1], Z[1], X[2], Y[2], Z[2], n);
-		//vertex 1
-/*		n1[0] = X[0]+X[1]-2*(CDG[0]+DEP[0]);
-		n1[1] = Y[0]+Y[1]-2*(CDG[1]+DEP[1]);
-		n1[2] = Z[0]+Z[1]-2*(CDG[2]+DEP[2]);
-		racine = sqrt(n1[0]*n1[0]+n1[1]*n1[1]+n1[2]*n1[2]);
-		n1[0] = n1[0]/racine;	n1[1] = n1[1]/racine; 	n1[2] = n1[2]/racine;
-		//vertex 2
-		n2[0] = X[2]+X[1]-2*(CDG[0]+DEP[0]);
-		n2[1] = Y[2]+Y[1]-2*(CDG[1]+DEP[1]);
-		n2[2] = Z[2]+Z[1]-2*(CDG[2]+DEP[2]);
-		racine = sqrt(n2[0]*n2[0]+n2[1]*n2[1]+n2[2]*n2[2]);
-		n2[0] = n2[0]/racine;	n2[1] = n2[1]/racine; 	n2[2] = n1[2]/racine;
-		//vertex 3
-		n3[0] = X[0]+X[2]-2*(CDG[0]+DEP[0]);
-		n3[1] = Y[0]+Y[2]-2*(CDG[1]+DEP[1]);
-		n3[2] = Z[0]+Z[2]-2*(CDG[2]+DEP[2]);
-		racine = sqrt(n3[0]*n3[0]+n3[1]*n3[1]+n3[2]*n3[2]);
-		n3[0] = n3[0]/racine;	n3[1] = n3[1]/racine; 	n3[2] = n3[2]/racine;*/
-	switch (View->TensorType) {
-  		case DRAW_POST_LMGC90: 
-			PaletteContinuous(View,zmin[0],zmax[0],1);
-		break;
-  		case DRAW_POST_LMGC90_TYPE:
-			it = List_Nbr(listt)/View->NbTP;
-			List_Read(listt,(k-1)*it+9,&ztmp[0]);
-			PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); 
-		break;
-		case DRAW_POST_LMGC90_COORD:
-			if(ts!=0){
-				PaletteContinuous(View,zmin[0],zmax[0],VAR[0]);} 
-			else{
-				it = List_Nbr(listt)/View->NbTP;
-				List_Read(listt,(k-1)*it+18,&ztmp[0]);
-				PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); 
-			}
-		break;
-		case DRAW_POST_LMGC90_PRES:
-			PaletteContinuous(View,zmin[0],zmax[0],VAR[1]); 
-		break;
-		case DRAW_POST_LMGC90_SN:
-			PaletteContinuous(View,zmin[0],zmax[0],VAR[2]); 
-		break;
-		case DRAW_POST_LMGC90_DEPX:
-			PaletteContinuous(View,zmin[0],zmax[0],DEP[0]); 
-		break;
-		case DRAW_POST_LMGC90_DEPY:
-			PaletteContinuous(View,zmin[0],zmax[0],DEP[1]); 
-		break;
-  		case DRAW_POST_LMGC90_DEPZ: 
-			PaletteContinuous(View,zmin[0],zmax[0],DEP[2]);
-		break;
-  		case DRAW_POST_LMGC90_DEPAV:
-			PaletteContinuous(View,zmin[0],zmax[0],(DEP[0]+DEP[1]+DEP[2])/3);
-		break;
-		case DRAW_POST_LMGC90_DEPNORM:
-			PaletteContinuous(View,zmin[0],zmax[0],sqrt(DEP[0]*DEP[0]+DEP[1]*DEP[1]+DEP[2]*DEP[2]));
-		break;
+    double *VV = V + 9* nbnod * ts ;
 
-	}
-		glEnable(GL_LIGHTING);
-		glBegin(GL_TRIANGLES);
-			glNormal3dv(n);			
-			glVertex3d(X[0], Y[0], Z[0]);
-//			glNormal3dv(n2);
-			glVertex3d(X[1], Y[1], Z[1]);
-//			glNormal3dv(n3);			
-			glVertex3d(X[2], Y[2], Z[2]);
-		glEnd();
-		glDisable(GL_LIGHTING);
-	}
+    DEP[0] = VV[0];
+    DEP[1] = VV[1];
+    DEP[2] = VV[2];
+
+    //    List_Read(listt,3+ts*9+it,&DEP[0]);
+    //    List_Read(listt,4+ts*9+it,&DEP[1]);
+    //    List_Read(listt,5+ts*9+it,&DEP[2]);
+    
+    // Lecture des rotations du centre de gravité
 
-	View->TimeStep = ts;
-	if(k==View->NbTP){
-		k = 0;	
+    ROT[0] = VV[3];
+    ROT[1] = VV[4];
+    ROT[2] = VV[5];
+
+    ///    List_Read(listt,6+ts*9+it,&ROT[0]);
+    //    List_Read(listt,7+ts*9+it,&ROT[1]);
+    //    List_Read(listt,8+ts*9+it,&ROT[2]);
+    
+    VAR[0] = VV[6];
+    VAR[1] = VV[7];
+    VAR[2] = VV[8];
+
+    // Lecture des valeurs des variables supplémentaires
+    //    List_Read(listt,9+ts*9+it,&VAR[0]);
+    //    List_Read(listt,10+ts*9+it,&VAR[1]);
+    //    List_Read(listt,11+ts*9+it,&VAR[2]);
+
+    // calcule les valeurs min et max d'une info 1 seule fois
+    if(state != View->TensorType)
+      {
+	printf("coucouc\n");
+	state = View->TensorType;
+	switch (View->TensorType) {
+	case DRAW_POST_LMGC90: 
+	  // couleur uniforme
+	  zmin[0]=1;
+	  zmax[0]=1;
+	  break;
+	case DRAW_POST_LMGC90_TYPE: 
+	  // couleur en fonction du type de grain
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,9,&zmin[0]);
+	  List_Read(listt,9,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    List_Read(listt,i*it+9,&ztmp[0]);
+	    if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	    if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	  }
+	break;
+	case DRAW_POST_LMGC90_COORD: 
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,9,&zmin[0]);
+	  List_Read(listt,9,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9-1; j++){
+	      List_Read(listt,i*it+18+j*9,&ztmp[0]); // on part pas du premier
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	break;
+	case DRAW_POST_LMGC90_PRES: 
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,10,&zmin[0]);
+	  List_Read(listt,10,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+10+j*9,&ztmp[0]);
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	  break;
+	case DRAW_POST_LMGC90_SN: 
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,11,&zmin[0]);
+	  List_Read(listt,11,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+11+j*9,&ztmp[0]);
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	break;
+	case DRAW_POST_LMGC90_DEPX: 
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,3,&zmin[0]);
+	  List_Read(listt,3,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+3+j*9,&ztmp[0]);
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	  break;
+	case DRAW_POST_LMGC90_DEPY: 
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,4,&zmin[0]);
+	  List_Read(listt,4,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+4+j*9,&ztmp[0]);
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	break;
+	case DRAW_POST_LMGC90_DEPZ:
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,5,&zmin[0]);
+	  List_Read(listt,5,&zmax[0]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+5+j*9,&ztmp[0]);
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	break;
+	case DRAW_POST_LMGC90_DEPAV:
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,3,&ztmp[0]);
+	  List_Read(listt,4,&ztmp[1]);
+	  List_Read(listt,5,&ztmp[2]);
+	  zmin[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3;
+	  List_Read(listt,3,&ztmp[0]);
+	  List_Read(listt,4,&ztmp[1]);
+	  List_Read(listt,5,&ztmp[2]);
+	  zmax[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3;
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+3+j*9,&ztmp[0]);
+	      List_Read(listt,i*it+4+j*9,&ztmp[1]);
+	      List_Read(listt,i*it+5+j*9,&ztmp[2]);
+	      ztmp[0]=(ztmp[0]+ztmp[1]+ztmp[2])/3;
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	break;
+	case DRAW_POST_LMGC90_DEPNORM:
+	  it = List_Nbr(listt)/View->NbTP;
+	  List_Read(listt,3,&ztmp[0]);
+	  List_Read(listt,4,&ztmp[1]);
+	  List_Read(listt,5,&ztmp[2]);
+	  zmin[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]);
+	  List_Read(listt,3,&ztmp[0]);
+	  List_Read(listt,4,&ztmp[1]);
+	  List_Read(listt,5,&ztmp[2]);
+	  zmax[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]);
+	  for(int i = 0; i < View->NbTP; i++){
+	    for(int j = 0; j< ((List_Nbr(listt)/View->NbTP)-3)/9; j++){
+	      List_Read(listt,i*it+3+j*9,&ztmp[0]);
+	      List_Read(listt,i*it+4+j*9,&ztmp[1]);
+	      List_Read(listt,i*it+5+j*9,&ztmp[2]);
+	      ztmp[0]=sqrt(ztmp[0]*ztmp[0]+ztmp[1]*ztmp[1]+ztmp[2]*ztmp[2]);
+	      if(ztmp[0]<zmin[0]){zmin[0] = ztmp[0];}
+	      if(ztmp[0]>zmax[0]){zmax[0] = ztmp[0];}
+	    }
+	  }
+	  break;
 	}
- 
-   }	
+      }
+    // matrice de changement de base, pour la rotation
+//     a11 = cos(ROT[0])*cos(ROT[1]); a12 = -sin(ROT[0])*cos(ROT[1]); 	a13 = -sin(ROT[1]);
+//     a21 = sin(ROT[0])*cos(ROT[2])-cos(ROT[0])*sin(ROT[1])*sin(ROT[2]);
+//     a22 = cos(ROT[0])*cos(ROT[2])+sin(ROT[0])*sin(ROT[1])*sin(ROT[2]);
+//     a23 = -cos(ROT[1])*sin(ROT[2]);
+//     a31 = sin(ROT[0])*sin(ROT[2])+cos(ROT[0])*sin(ROT[1])*cos(ROT[2]);
+//     a32 = cos(ROT[0])*sin(ROT[2])-sin(ROT[0])*sin(ROT[1])*cos(ROT[2]);
+//     a33 = cos(ROT[1])*cos(ROT[2]);	
+    
 
-	
+    switch (View->TensorType) {
+    case DRAW_POST_LMGC90: 
+      PaletteContinuous(View,zmin[0],zmax[0],1);
+      break;
+    case DRAW_POST_LMGC90_TYPE:
+      //	it = List_Nbr(listt)/View->NbTP;
+      //	List_Read(listt,V[6],&ztmp[0]);
+      //	PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); 
+      break;
+    case DRAW_POST_LMGC90_COORD:
+      // 	if(ts!=0){
+      // 	  PaletteContinuous(View,zmin[0],zmax[0],VAR[0]);} 
+      // 	else{
+      // 	  it = List_Nbr(listt)/View->NbTP;
+      // 	  List_Read(listt,V[6],&ztmp[0]);
+      // 	  PaletteContinuous(View,zmin[0],zmax[0],ztmp[0]); 
+      //	}
+      break;
+    case DRAW_POST_LMGC90_PRES:
+      PaletteContinuous(View,zmin[0],zmax[0],VAR[1]); 
+      break;
+    case DRAW_POST_LMGC90_SN:
+      PaletteContinuous(View,zmin[0],zmax[0],VAR[2]); 
+      break;
+    case DRAW_POST_LMGC90_DEPX:
+      PaletteContinuous(View,zmin[0],zmax[0],DEP[0]); 
+      break;
+    case DRAW_POST_LMGC90_DEPY:
+      PaletteContinuous(View,zmin[0],zmax[0],DEP[1]); 
+      break;
+    case DRAW_POST_LMGC90_DEPZ: 
+      PaletteContinuous(View,zmin[0],zmax[0],DEP[2]);
+      break;
+    case DRAW_POST_LMGC90_DEPAV:
+      PaletteContinuous(View,zmin[0],zmax[0],(DEP[0]+DEP[1]+DEP[2])/3);
+      break;
+    case DRAW_POST_LMGC90_DEPNORM:
+      PaletteContinuous(View,zmin[0],zmax[0],sqrt(DEP[0]*DEP[0]+DEP[1]*DEP[1]+DEP[2]*DEP[2]));
+      break;      
+    }
+
+    std::map<int,int> :: iterator iter = View->DisplayListsOfGrains->find ( (int)V[6] );
+    
+    glEnable(GL_LIGHTING);
+    if (iter == View->DisplayListsOfGrains->end() )
+    {
+      int listnum = glGenLists(1);
+      printf("new DL grain generated %d listnum %d \n",(int)V[6],listnum );
+      glNewList(listnum, GL_COMPILE);
+      (* View->DisplayListsOfGrains )[(int)V[6]] = listnum;
+      for(int i = 0; i < List_Nbr(list) ; i = i+9){
+	List_Read(list,i  ,&X[0]);	//X
+	List_Read(list,i+1,&Y[0]);	//Y
+	List_Read(list,i+2,&Z[0]);	//Z
+	List_Read(list,i+3,&X[1]);
+	List_Read(list,i+4,&Y[1]);
+	List_Read(list,i+5,&Z[1]);
+	List_Read(list,i+6,&X[2]);
+	List_Read(list,i+7,&Y[2]);
+	List_Read(list,i+8,&Z[2]);
+	double n[3];
+	normal3points(X[0], Y[0], Z[0], X[1], Y[1], Z[1], X[2], Y[2], Z[2], n);
+	glBegin(GL_TRIANGLES);
+	glNormal3dv(n);			
+	glVertex3d(X[0], Y[0], Z[0]);
+	glVertex3d(X[1], Y[1], Z[1]);
+	glVertex3d(X[2], Y[2], Z[2]);
+	glEnd();
+      } 
+      glEndList();
+    }
+    glPushMatrix(); 
+    //    glRotated (1,0,0, ROT[0] *180/M_PI);
+    //    glRotated (0,1,0, ROT[1] *180/M_PI);
+    glTranslated(CDG[0] + DEP[0], CDG[1] + DEP[1], CDG[2] + DEP [2]);
+    glRotated ( ROT[0] *180/M_PI, 0,0,1);
+    glRotated ( ROT[1] *180/M_PI, 1,0,0);
+    glRotated ( ROT[2] *180/M_PI, 0,1,0);
+    glCallList((* View->DisplayListsOfGrains )[(int)V[6]]);
+    glPopMatrix();    
+    glDisable(GL_LIGHTING);
+  }	      
+  View->TimeStep = ts;
 }
 
 #define ARGS Post_View *View, int preproNormals, \