diff --git a/Graphics/PostSimplex.cpp b/Graphics/PostSimplex.cpp
index caa48c7c6da3810a73fa161ff286afbeecdebeeb..7856fe7e8956f8d2b33247973c3cdc993064f49c 100644
--- a/Graphics/PostSimplex.cpp
+++ b/Graphics/PostSimplex.cpp
@@ -1,4 +1,4 @@
-// $Id: PostSimplex.cpp,v 1.22 2001-08-03 17:46:48 geuzaine Exp $
+// $Id: PostSimplex.cpp,v 1.23 2001-08-03 19:18:15 geuzaine Exp $
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -11,6 +11,46 @@
 
 extern Context_T   CTX;
 
+void Draw_Simplex(int dim, double *X, double *Y, double *Z,
+		  double *Offset, double Raise[3][5]){
+  int k;
+  double xx[4], yy[4], zz[4];
+
+  glColor4ubv((GLubyte*)&CTX.color.fg);
+  switch(dim){
+  case 0 :
+    Draw_Point(X,Y,Z,Offset,Raise);
+    break;
+  case 1 :
+    Draw_Line(X,Y,Z,Offset,Raise);
+    break;
+  case 2 :
+    glBegin(GL_LINE_LOOP);
+    for(k=0 ; k<3 ; k++) 
+      glVertex3d(X[k]+Offset[0]+Raise[0][k],
+		 Y[k]+Offset[1]+Raise[1][k],
+		 Z[k]+Offset[2]+Raise[2][k]);
+    glEnd();
+    break;
+  case 3 :
+    for(k=0 ; k<4 ; k++){
+      xx[k] = X[k]+Offset[0]+Raise[0][k] ;
+      yy[k] = Y[k]+Offset[1]+Raise[1][k] ;
+      zz[k] = Z[k]+Offset[2]+Raise[2][k] ;
+    }
+    glBegin(GL_LINES);
+    glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[1], yy[1], zz[1]);
+    glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[2], yy[2], zz[2]);
+    glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[3], yy[3], zz[3]);
+    glVertex3d(xx[1], yy[1], zz[1]); glVertex3d(xx[2], yy[2], zz[2]);
+    glVertex3d(xx[1], yy[1], zz[1]); glVertex3d(xx[3], yy[3], zz[3]);
+    glVertex3d(xx[2], yy[2], zz[2]); glVertex3d(xx[3], yy[3], zz[3]);
+    glEnd();
+    break;
+  }
+}
+
+
 /* ------------------------------------------------------------------------ */
 /*  Scalar Simplices                                                        */
 /* ------------------------------------------------------------------------ */
@@ -21,16 +61,19 @@ void Draw_ScalarPoint(Post_View *View,
   double   d;
   char Num[100];
 
-  d = V[View->TimeStep];  
-  RaiseFill(0, d, ValMin, Raise);
-
   if(View->Boundary > 0) return;
 
-  if(View->ShowElement){
-    glColor4ubv((GLubyte*)&CTX.color.fg);
-    Draw_Point(X,Y,Z,View->Offset,Raise);
+  d = V[View->TimeStep];
+
+  if(View->SaturateValues){
+    if(d > ValMax) d = ValMax;
+    else if(d < ValMin) d = ValMin;
   }
 
+  RaiseFill(0, d, ValMin, Raise);
+
+  if(View->ShowElement) Draw_Simplex(0,X,Y,Z,View->Offset,Raise);
+
   if(d>=ValMin && d<=ValMax){      
     Palette2(View,ValMin,ValMax,d);
     if(View->IntervalsType == DRAW_POST_NUMERIC){
@@ -79,10 +122,7 @@ void Draw_ScalarLine(Post_View *View,
   for(k=0 ; k<2 ; k++)
     RaiseFill(k, Val[k], ValMin, Raise);
 
-  if(View->ShowElement){
-    glColor4ubv((GLubyte*)&CTX.color.fg);
-    Draw_Line(X,Y,Z,View->Offset,Raise);
-  }
+  if(View->ShowElement) Draw_Simplex(1,X,Y,Z,View->Offset,Raise);
 
   if(View->IntervalsType == DRAW_POST_NUMERIC){
 
@@ -231,15 +271,7 @@ void Draw_ScalarTriangle(Post_View *View, int preproNormals,
 
   if(preproNormals) return;
 
-  if(View->ShowElement){
-    glColor4ubv((GLubyte*)&CTX.color.fg);
-    glBegin(GL_LINE_LOOP);
-    for(i=0 ; i<3 ; i++) 
-      glVertex3d(X[i]+View->Offset[0]+Raise[0][i],
-		 Y[i]+View->Offset[1]+Raise[1][i],
-		 Z[i]+View->Offset[2]+Raise[2][i]);
-    glEnd();
-  }
+  if(View->ShowElement) Draw_Simplex(2,X,Y,Z,View->Offset,Raise);
 
   if(View->IntervalsType == DRAW_POST_NUMERIC){
 
@@ -352,8 +384,6 @@ void Draw_ScalarTetrahedron(Post_View *View, int preproNormals,
     return;
   }
 
-  // Saturation of values 
-
   double *vv = &V[4*View->TimeStep];
   if(View->SaturateValues){
     for(i=0;i<4;i++){
@@ -371,22 +401,7 @@ void Draw_ScalarTetrahedron(Post_View *View, int preproNormals,
   for(k=0 ; k<4 ; k++)
     RaiseFill(k, Val[k], ValMin, Raise);
 
-  if(!preproNormals && View->ShowElement){
-    glColor4ubv((GLubyte*)&CTX.color.fg);
-    for(k=0 ; k<4 ; k++){
-      xx[k] = X[k]+View->Offset[0]+Raise[0][k] ;
-      yy[k] = Y[k]+View->Offset[1]+Raise[1][k] ;
-      zz[k] = Z[k]+View->Offset[2]+Raise[2][k] ;
-    }
-    glBegin(GL_LINES);
-    glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[1], yy[1], zz[1]);
-    glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[2], yy[2], zz[2]);
-    glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[3], yy[3], zz[3]);
-    glVertex3d(xx[1], yy[1], zz[1]); glVertex3d(xx[2], yy[2], zz[2]);
-    glVertex3d(xx[1], yy[1], zz[1]); glVertex3d(xx[3], yy[3], zz[3]);
-    glVertex3d(xx[2], yy[2], zz[2]); glVertex3d(xx[3], yy[3], zz[3]);
-    glEnd();
-  }
+  if(!preproNormals && View->ShowElement) Draw_Simplex(3,X,Y,Z,View->Offset,Raise);
 
   if(!preproNormals && View->IntervalsType == DRAW_POST_NUMERIC){
 
@@ -424,183 +439,105 @@ void Draw_VectorSimplex(int nbnod, Post_View *View,
 			double ValMin, double ValMax, double Raise[3][5],
 			double *X, double *Y, double *Z, double *V){
   int    j, k ;
-  double d, dx, dy, dz, fact, xx[4], yy[4], zz[4], vv[4], xc=0., yc=0., zc=0. ;
+  double fact, xx[4], yy[4], zz[4],  xc=0., yc=0., zc=0., Val[4][3], d[4];
+  double dx=0., dy=0., dz=0., dd;
   char   Num[100];
 
   for(k=0 ; k<nbnod ; k++){
-    dx = V[3*nbnod*View->TimeStep  +3*k] ;
-    dy = V[3*nbnod*View->TimeStep+1+3*k] ;
-    dz = V[3*nbnod*View->TimeStep+2+3*k] ;              
-    d = sqrt(dx*dx+dy*dy+dz*dz);            
-    RaiseFill(k, d, ValMin, Raise);
+    Val[k][0] = V[3*nbnod*View->TimeStep+3*k] ;
+    Val[k][1] = V[3*nbnod*View->TimeStep+3*k+1] ;
+    Val[k][2] = V[3*nbnod*View->TimeStep+3*k+2] ;              
+    d[k] = sqrt(Val[k][0]*Val[k][0]+Val[k][1]*Val[k][1]+Val[k][2]*Val[k][2]);            
+    RaiseFill(k, d[k], ValMin, Raise);
   }
 
   if(View->ArrowType == DRAW_POST_DISPLACEMENT){
 
     fact = View->ArrowScale/50. ;
     for(k=0 ; k<nbnod ; k++){
-      xx[k] = X[k] + fact * V[3*nbnod*View->TimeStep  +3*k] + 
-	Raise[0][k] + View->Offset[0];
-      yy[k] = Y[k] + fact * V[3*nbnod*View->TimeStep+1+3*k] + 
-	Raise[1][k] + View->Offset[1];
-      zz[k] = Z[k] + fact * V[3*nbnod*View->TimeStep+2+3*k] + 
-	Raise[2][k] + View->Offset[2];
+      xx[k] = X[k] + fact * Val[k][0] + Raise[0][k] + View->Offset[0];
+      yy[k] = Y[k] + fact * Val[k][1] + Raise[1][k] + View->Offset[1];
+      zz[k] = Z[k] + fact * Val[k][2] + Raise[2][k] + View->Offset[2];
     }
 
-    if(nbnod==1){ //draw trajectories
-      glColor4ubv((GLubyte*)&CTX.color.fg);
+    switch(nbnod){
+    case 1:
+      Palette2(View,ValMin,ValMax,d[0]);
       glBegin(GL_POINTS);
       glVertex3d(xx[0],yy[0],zz[0]);
       glEnd();
-      if(View->TimeStep){
+      if(View->TimeStep){//draw trajectory
 	glBegin(GL_LINE_STRIP);
-	for(j=0 ; j<View->TimeStep+1 ; j++)
-	  glVertex3d(X[0] + fact*V[3*(View->TimeStep-j)]  + Raise[0][0] + View->Offset[0],
-		     Y[0] + fact*V[3*(View->TimeStep-j)+1]+ Raise[1][0] + View->Offset[1],
-		     Z[0] + fact*V[3*(View->TimeStep-j)+2]+ Raise[2][0] + View->Offset[2]);
+	for(j=0 ; j<View->TimeStep+1 ; j++){
+	  dx = V[3*(View->TimeStep-j)]  ;
+	  dy = V[3*(View->TimeStep-j)+1];
+	  dz = V[3*(View->TimeStep-j)+2];
+	  dd = sqrt(dx*dx+dy*dy+dz*dz);
+	  Palette2(View,ValMin,ValMax,dd);
+	  glVertex3d(X[0] + fact*dx + Raise[0][0] + View->Offset[0],
+		     Y[0] + fact*dy + Raise[1][0] + View->Offset[1],
+		     Z[0] + fact*dz + Raise[2][0] + View->Offset[2]);
+	}
 	glEnd();
       }
+      break;
+    case 2: Draw_ScalarLine(View, ValMin, ValMax, Raise, xx, yy, zz, d); break;
+    case 3: Draw_ScalarTriangle(View, 0, ValMin, ValMax, Raise, xx, yy, zz, d); break;
+    case 4: Draw_ScalarTetrahedron(View, 0, ValMin, ValMax, Raise, xx, yy, zz, d); break;
     }
-    else{
-      for(k=0 ; k<nbnod ; k++){
-	dx = V[3*nbnod*View->TimeStep  +3*k] ;
-	dy = V[3*nbnod*View->TimeStep+1+3*k] ;
-	dz = V[3*nbnod*View->TimeStep+2+3*k] ;
-	vv[k] = sqrt(dx*dx+dy*dy+dz*dz);
-      }
-      switch(nbnod){
-      case 2: Draw_ScalarLine(View, ValMin, ValMax, Raise, xx, yy, zz, vv); break;
-      case 3: Draw_ScalarTriangle(View, 0, ValMin, ValMax, Raise, xx, yy, zz, vv); break;
-      case 4: Draw_ScalarTetrahedron(View, 0, ValMin, ValMax, Raise, xx, yy, zz, vv); break;
-      }
-    }
-  
     return;
   }
 
-  if(View->ShowElement){
-    switch(nbnod){
-    case 1 :
-      glColor4ubv((GLubyte*)&CTX.color.fg);
-      Draw_Point(X,Y,Z,View->Offset,Raise);
-      break;
-    case 2 :
-      glColor4ubv((GLubyte*)&CTX.color.fg);
-      Draw_Line(X,Y,Z,View->Offset,Raise);
-      break;
-    case 3 :
-      glColor4ubv((GLubyte*)&CTX.color.bg);
-      if(View->IntervalsType!=DRAW_POST_ISO)
-	Draw_Polygon (3, X, Y, Z, View->Offset, Raise);
-      glColor4ubv((GLubyte*)&CTX.color.fg);
-      glBegin(GL_LINE_LOOP);
-      for(k=0 ; k<3 ; k++) 
-	glVertex3d(X[k]+View->Offset[0]+Raise[0][k],
-		   Y[k]+View->Offset[1]+Raise[1][k],
-		   Z[k]+View->Offset[2]+Raise[2][k]);
-      glEnd();
-      break;
-    case 4 :
-      glColor4ubv((GLubyte*)&CTX.color.fg);
-      for(k=0 ; k<4 ; k++){
-	xx[k] = X[k]+View->Offset[0]+Raise[0][k] ;
-	yy[k] = Y[k]+View->Offset[1]+Raise[1][k] ;
-	zz[k] = Z[k]+View->Offset[2]+Raise[2][k] ;
-      }
-      glBegin(GL_LINES);
-      glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[1], yy[1], zz[1]);
-      glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[2], yy[2], zz[2]);
-      glVertex3d(xx[0], yy[0], zz[0]); glVertex3d(xx[3], yy[3], zz[3]);
-      glVertex3d(xx[1], yy[1], zz[1]); glVertex3d(xx[2], yy[2], zz[2]);
-      glVertex3d(xx[1], yy[1], zz[1]); glVertex3d(xx[3], yy[3], zz[3]);
-      glVertex3d(xx[2], yy[2], zz[2]); glVertex3d(xx[3], yy[3], zz[3]);
-      glEnd();
-    }
-  }
+  if(View->ShowElement) Draw_Simplex(nbnod-1,X,Y,Z,View->Offset,Raise);
 
   if(View->ArrowLocation == DRAW_POST_LOCATE_COG ||
      View->IntervalsType == DRAW_POST_NUMERIC){
-    switch(nbnod){
-    case 1:
-      dx = V[3*View->TimeStep];
-      dy = V[3*View->TimeStep+1];
-      dz = V[3*View->TimeStep+2];
-      break;
-    case 2:
-      dx = 0.5 * (V[6*View->TimeStep]  +V[6*View->TimeStep+3]);
-      dy = 0.5 * (V[6*View->TimeStep+1]+V[6*View->TimeStep+4]);
-      dz = 0.5 * (V[6*View->TimeStep+2]+V[6*View->TimeStep+5]);
-      break;
-    case 3 :
-      dx = (V[9*View->TimeStep]  +V[9*View->TimeStep+3]+V[9*View->TimeStep+6])/3.;
-      dy = (V[9*View->TimeStep+1]+V[9*View->TimeStep+4]+V[9*View->TimeStep+7])/3.;
-      dz = (V[9*View->TimeStep+2]+V[9*View->TimeStep+5]+V[9*View->TimeStep+8])/3.;
-      break;
-    case 4 :
-      dx = 0.25 * (V[12*View->TimeStep]  +V[12*View->TimeStep+3]+
-		   V[12*View->TimeStep+6]+V[12*View->TimeStep+9] );
-      dy = 0.25 * (V[12*View->TimeStep+1]+V[12*View->TimeStep+4]+
-		   V[12*View->TimeStep+7]+V[12*View->TimeStep+10] );
-      dz = 0.25 * (V[12*View->TimeStep+2]+V[12*View->TimeStep+5]+
-		   V[12*View->TimeStep+8]+V[12*View->TimeStep+11] );
-      break;
+    for(k = 0 ; k<nbnod ; k++){
+      dx += Val[k][0]; xc += X[k] + Raise[0][k];
+      dy += Val[k][1]; yc += Y[k] + Raise[1][k];
+      dz += Val[k][2]; zc += Z[k] + Raise[2][k];
     }
-    d = sqrt(dx*dx+dy*dy+dz*dz);
-    if(d!=0.0 && d>=ValMin && d<=ValMax){             
-      Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));            
+    dx /= (double)nbnod; xc /= (double)nbnod;
+    dy /= (double)nbnod; yc /= (double)nbnod;
+    dz /= (double)nbnod; zc /= (double)nbnod;
+    dd = sqrt(dx*dx+dy*dy+dz*dz);
+    if(dd!=0.0 && dd>=ValMin && dd<=ValMax){             
+      Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,dd));            
       if(View->IntervalsType == DRAW_POST_NUMERIC){
-	for(k = 0 ; k<nbnod ; k++){
-	  xc += X[k] + Raise[0][k] ; 
-	  yc += Y[k] + Raise[1][k]; 
-	  zc += Z[k] + Raise[2][k]; 
-	}
-	glRasterPos3d(xc/(double)nbnod + View->Offset[0],
-		      yc/(double)nbnod + View->Offset[1],
-		      zc/(double)nbnod + View->Offset[2]);
-	sprintf(Num, View->Format, d);
+	glRasterPos3d(xc + View->Offset[0],
+		      yc + View->Offset[1],
+		      zc + View->Offset[2]);
+	sprintf(Num, View->Format, dd);
 	Draw_String(Num);
       }
       else{
-	for(k = 0 ; k<nbnod ; k++){
-	  xc += X[k] ; 
-	  yc += Y[k] ; 
-	  zc += Z[k] ; 
-	}
-	xc /= (double)nbnod;
-	yc /= (double)nbnod;
-	zc /= (double)nbnod;
 	fact = CTX.pixel_equiv_x/CTX.s[0] * View->ArrowScale/ValMax ;
 	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
-	  dx /= d ; dy /= d ; dz /= d ;
-	  d = log10(d/ValMin) ; 
-	  dx *= d ; dy *= d ; dz *= d ;
+	  dx /= dd ; dy /= dd ; dz /= dd ;
+	  dd = log10(dd/ValMin) ; 
+	  dx *= dd ; dy *= dd ; dz *= dd ;
 	}
-	RaiseFill(0, d, ValMin, Raise);         
+	RaiseFill(0, dd, ValMin, Raise);         
 	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-		    xc, yc, zc,
-		    fact*d, fact*dx, fact*dy, fact*dz,
+		    xc, yc, zc, fact*dd, fact*dx, fact*dy, fact*dz,
 		    View->Offset, Raise);
       }
     }
   }
   else{
     for(k=0 ; k<nbnod ; k++){
-      dx = V[3*nbnod*View->TimeStep  +3*k] ;
-      dy = V[3*nbnod*View->TimeStep+1+3*k] ;
-      dz = V[3*nbnod*View->TimeStep+2+3*k] ;              
-      d = sqrt(dx*dx+dy*dy+dz*dz);
-      if(d!=0.0 && d>=ValMin && d<=ValMax){           
-	Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+      if(d[k]!=0.0 && d[k]>=ValMin && d[k]<=ValMax){           
+	Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d[k]));
 	fact = CTX.pixel_equiv_x/CTX.s[0] * View->ArrowScale/ValMax ;
 	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
-	  dx /= d ; dy /= d ; dz /= d ;
-	  d = log10(d/ValMin) ; 
-	  dx *= d ; dy *= d ; dz *= d ;
+	  Val[k][0] /= d[k] ; Val[k][1] /= d[k] ; Val[k][2] /= d[k] ;
+	  d[k] = log10(d[k]/ValMin) ;
+	  Val[k][0] *= d[k] ; Val[k][1] *= d[k] ; Val[k][2] *= d[k] ;
 	}
-	RaiseFill(0, d, ValMin, Raise);         
+	RaiseFill(0, d[k], ValMin, Raise);         
 	Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
 		    X[k], Y[k], Z[k],
-		    fact*d, fact*dx, fact*dy, fact*dz,
+		    fact*d[k], fact*Val[k][0], fact*Val[k][1], fact*Val[k][1],
 		    View->Offset, Raise);
       }               
     }