diff --git a/Common/Views.cpp b/Common/Views.cpp
index aada0845508139d14faa51de8c5b46c074e61f45..18d790278a059b2185aba7f7510e31b397acb3f3 100644
--- a/Common/Views.cpp
+++ b/Common/Views.cpp
@@ -1,4 +1,4 @@
-/* $Id: Views.cpp,v 1.6 2000-11-26 21:34:22 geuzaine Exp $ */
+/* $Id: Views.cpp,v 1.7 2000-11-27 10:58:18 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "Views.h"
@@ -10,7 +10,8 @@ Post_View  *ActualView;
 
 extern Context_T   CTX ;
 
-static int         ActualViewNum=0;
+static int  ActualViewNum=0;
+static int  NbPoints, NbLines, NbTriangles, NbTetrahedra;
 
 /* ------------------------------------------------------------------------ */
 /*  V i e w s                                                               */
@@ -27,6 +28,8 @@ int fcmpPostViewDuplicateOf(const void *v1, const void *v2){
 void BeginView(int allocate){
   ActualView = (Post_View*)Malloc(sizeof(Post_View));
 
+  NbPoints = NbLines = NbTriangles = NbTetrahedra = 0;
+
   ActualView->NbSP = ActualView->NbVP = ActualView->NbTP = 0;
   ActualView->NbSL = ActualView->NbVL = ActualView->NbTL = 0;
   ActualView->NbST = ActualView->NbVT = ActualView->NbTT = 0;
@@ -38,33 +41,25 @@ void BeginView(int allocate){
     ActualView->SP = List_Create(100,1000,sizeof(double));
     ActualView->VP = List_Create(100,1000,sizeof(double));
     ActualView->TP = List_Create(100,1000,sizeof(double));
-    ActualView->Points = List_Create(100,1000,sizeof(Post_Simplex));
     
     ActualView->SL = List_Create(100,1000,sizeof(double));
     ActualView->VL = List_Create(100,1000,sizeof(double));
     ActualView->TL = List_Create(100,1000,sizeof(double));
-    ActualView->Lines = List_Create(100,1000,sizeof(Post_Simplex));
     
     ActualView->ST = List_Create(100,1000,sizeof(double));
     ActualView->VT = List_Create(100,1000,sizeof(double));
     ActualView->TT = List_Create(100,1000,sizeof(double));
-    ActualView->Triangles = List_Create(100,1000,sizeof(Post_Simplex));
     
     ActualView->SS = List_Create(100,1000,sizeof(double));
     ActualView->VS = List_Create(100,1000,sizeof(double));
     ActualView->TS = List_Create(100,1000,sizeof(double));
-    ActualView->Tetrahedra = List_Create(100,1000,sizeof(Post_Simplex));
   }
   else{
     ActualView->Time = NULL;
     ActualView->SP = NULL; ActualView->VP = NULL; ActualView->TP = NULL;
-    ActualView->Points = NULL;
     ActualView->SL = NULL; ActualView->VL = NULL; ActualView->TL = NULL;
-    ActualView->Lines = NULL;
     ActualView->ST = NULL; ActualView->VT = NULL; ActualView->TT = NULL;
-    ActualView->Triangles = NULL;
     ActualView->SS = NULL; ActualView->VS = NULL; ActualView->TS = NULL;
-    ActualView->Tetrahedra = NULL;
   }
 
   ActualView->Changed = 1;
@@ -108,20 +103,20 @@ void EndView(int AddInUI, int Number, char *FileName, char *Name,
   if(ActualView->NbSP){
     nb = List_Nbr(ActualView->SP) / ActualView->NbSP ;
     for(i = 0 ; i < List_Nbr(ActualView->SP) ; i+=nb)
-      AddView_ScalarSimplex(0, (double*)List_Pointer(ActualView->SP,i),
-                            nb-3, (double*)List_Pointer(ActualView->SP,i+3));
+      Stat_ScalarSimplex(0, (double*)List_Pointer(ActualView->SP,i),
+			 nb-3, (double*)List_Pointer(ActualView->SP,i+3));
   }
   if(ActualView->NbVP){
     nb = List_Nbr(ActualView->VP) / ActualView->NbVP ;
     for(i = 0 ; i < List_Nbr(ActualView->VP) ; i+=nb)
-      AddView_VectorSimplex(0, (double*)List_Pointer(ActualView->VP,i),
-                            nb-3, (double*)List_Pointer(ActualView->VP,i+3));
+      Stat_VectorSimplex(0, (double*)List_Pointer(ActualView->VP,i),
+			 nb-3, (double*)List_Pointer(ActualView->VP,i+3));
   }
   if(ActualView->NbTP){
     nb = List_Nbr(ActualView->TP) / ActualView->NbTP ;
     for(i = 0 ; i < List_Nbr(ActualView->TP) ; i+=nb)
-      AddView_TensorSimplex(0, (double*)List_Pointer(ActualView->TP,i),
-                            nb-3, (double*)List_Pointer(ActualView->TP,i+3));
+      Stat_TensorSimplex(0, (double*)List_Pointer(ActualView->TP,i),
+			 nb-3, (double*)List_Pointer(ActualView->TP,i+3));
   }
 
   // Lines
@@ -129,20 +124,20 @@ void EndView(int AddInUI, int Number, char *FileName, char *Name,
   if(ActualView->NbSL){
     nb = List_Nbr(ActualView->SL) / ActualView->NbSL ;
     for(i = 0 ; i < List_Nbr(ActualView->SL) ; i+=nb)
-      AddView_ScalarSimplex(1, (double*)List_Pointer(ActualView->SL,i),
-                            nb-6, (double*)List_Pointer(ActualView->SL,i+6));
+      Stat_ScalarSimplex(1, (double*)List_Pointer(ActualView->SL,i),
+			 nb-6, (double*)List_Pointer(ActualView->SL,i+6));
   }
   if(ActualView->NbVL){
     nb = List_Nbr(ActualView->VL) / ActualView->NbVL ;
     for(i = 0 ; i < List_Nbr(ActualView->VL) ; i+=nb)
-      AddView_VectorSimplex(1, (double*)List_Pointer(ActualView->VL,i),
-                            nb-6, (double*)List_Pointer(ActualView->VL,i+6));
+      Stat_VectorSimplex(1, (double*)List_Pointer(ActualView->VL,i),
+			 nb-6, (double*)List_Pointer(ActualView->VL,i+6));
   }
   if(ActualView->NbTL){
     nb = List_Nbr(ActualView->TL) / ActualView->NbTL ;
     for(i = 0 ; i < List_Nbr(ActualView->TL) ; i+=nb)
-      AddView_TensorSimplex(1, (double*)List_Pointer(ActualView->TL,i),
-                            nb-6, (double*)List_Pointer(ActualView->TL,i+6));
+      Stat_TensorSimplex(1, (double*)List_Pointer(ActualView->TL,i),
+			 nb-6, (double*)List_Pointer(ActualView->TL,i+6));
   }
 
   // Triangles
@@ -150,20 +145,20 @@ void EndView(int AddInUI, int Number, char *FileName, char *Name,
   if(ActualView->NbST){
     nb = List_Nbr(ActualView->ST) / ActualView->NbST ;
     for(i = 0 ; i < List_Nbr(ActualView->ST) ; i+=nb)
-      AddView_ScalarSimplex(2, (double*)List_Pointer(ActualView->ST,i),
-                            nb-9, (double*)List_Pointer(ActualView->ST,i+9));
+      Stat_ScalarSimplex(2, (double*)List_Pointer(ActualView->ST,i),
+			 nb-9, (double*)List_Pointer(ActualView->ST,i+9));
   }
   if(ActualView->NbVT){
     nb = List_Nbr(ActualView->VT) / ActualView->NbVT ;
     for(i = 0 ; i < List_Nbr(ActualView->VT) ; i+=nb)
-      AddView_VectorSimplex(2, (double*)List_Pointer(ActualView->VT,i),
-                            nb-9, (double*)List_Pointer(ActualView->VT,i+9));
+      Stat_VectorSimplex(2, (double*)List_Pointer(ActualView->VT,i),
+			 nb-9, (double*)List_Pointer(ActualView->VT,i+9));
   }
   if(ActualView->NbTT){
     nb = List_Nbr(ActualView->TT) / ActualView->NbTT ;
     for(i = 0 ; i < List_Nbr(ActualView->TT) ; i+=nb)
-      AddView_TensorSimplex(2, (double*)List_Pointer(ActualView->TT,i),
-                            nb-9, (double*)List_Pointer(ActualView->TT,i+9));
+      Stat_TensorSimplex(2, (double*)List_Pointer(ActualView->TT,i),
+			 nb-9, (double*)List_Pointer(ActualView->TT,i+9));
   }
 
   // Tetrahedra
@@ -171,20 +166,20 @@ void EndView(int AddInUI, int Number, char *FileName, char *Name,
   if(ActualView->NbSS){
     nb = List_Nbr(ActualView->SS) / ActualView->NbSS ;
     for(i = 0 ; i < List_Nbr(ActualView->SS) ; i+=nb)
-      AddView_ScalarSimplex(3, (double*)List_Pointer(ActualView->SS,i),
-                            nb-12, (double*)List_Pointer(ActualView->SS,i+12));
+      Stat_ScalarSimplex(3, (double*)List_Pointer(ActualView->SS,i),
+			 nb-12, (double*)List_Pointer(ActualView->SS,i+12));
   }
   if(ActualView->NbVS){
     nb = List_Nbr(ActualView->VS) / ActualView->NbVS ;
     for(i = 0 ; i < List_Nbr(ActualView->VS) ; i+=nb)
-      AddView_VectorSimplex(3, (double*)List_Pointer(ActualView->VS,i),
-                            nb-12, (double*)List_Pointer(ActualView->VS,i+12));
+      Stat_VectorSimplex(3, (double*)List_Pointer(ActualView->VS,i),
+			 nb-12, (double*)List_Pointer(ActualView->VS,i+12));
   }
   if(ActualView->NbTS){
     nb = List_Nbr(ActualView->TS) / ActualView->NbTS ;
     for(i = 0 ; i < List_Nbr(ActualView->TS) ; i+=nb)
-      AddView_TensorSimplex(3, (double*)List_Pointer(ActualView->TS,i),
-                            nb-12, (double*)List_Pointer(ActualView->TS,i+12));
+      Stat_TensorSimplex(3, (double*)List_Pointer(ActualView->TS,i),
+			 nb-12, (double*)List_Pointer(ActualView->TS,i+12));
   }
 
   // Dummy time values if using old parsed format...
@@ -254,20 +249,11 @@ void FreeView(Post_View *v){
 
   if(free && !v->Links){
     Msg(DEBUG, " ->Freeing View");
-
     List_Delete(v->Time);
-
     List_Delete(v->SP); List_Delete(v->VP); List_Delete(v->TP);
-    List_Delete(v->Points);
-
     List_Delete(v->SL); List_Delete(v->VL); List_Delete(v->TL);
-    List_Delete(v->Lines);
-
     List_Delete(v->ST); List_Delete(v->VT); List_Delete(v->TT);
-    List_Delete(v->Triangles);
-
     List_Delete(v->SS); List_Delete(v->VS); List_Delete(v->TS);
-    List_Delete(v->Tetrahedra);   
   }
 
 }
@@ -301,68 +287,52 @@ void CopyViewOptions(Post_View *src, Post_View *dest){
 }
 
 /* ------------------------------------------------------------------------ */
-/*  S c a l a r S i m p l e x                                               */
+/*  S t a t _ X X X  S i m p l e x                                          */
 /* ------------------------------------------------------------------------ */
 
-void AddView_ScalarSimplex(int dim, double *coord, int N, double *v){
-  Post_Simplex S;
+void Stat_ScalarSimplex(int dim, double *coord, int N, double *V){
   int i,nbnod;
-  
-  S.Type = DRAW_POST_SCALAR;
-  S.Dimension = dim;
+  double *X, *Y, *Z;
   
   switch(dim){
-  case 0 : nbnod = 1 ; break; // point
-  case 1 : nbnod = 2 ; break; // line
-  case 2 : nbnod = 3 ; break; // triangle
-  case 3 : nbnod = 4 ; break; // tetrahedron
+  case 0 : nbnod = 1 ; NbPoints++; break;
+  case 1 : nbnod = 2 ; NbLines++; break;
+  case 2 : nbnod = 3 ; NbTriangles++; break;
+  case 3 : nbnod = 4 ; NbTetrahedra++; break;
   }
 
-  S.X = &coord[0] ; S.Y = &coord[nbnod] ; S.Z = &coord[2*nbnod] ; S.V = v ;
+  X = &coord[0] ; Y = &coord[nbnod] ; Z = &coord[2*nbnod] ;
 
-  if(!List_Nbr(ActualView->Points) &&    !List_Nbr(ActualView->Lines) && 
-     !List_Nbr(ActualView->Triangles) && !List_Nbr(ActualView->Tetrahedra)){
-    ActualView->Min = S.V[0];
-    ActualView->Max = S.V[0];
+  if(NbPoints == 1 && NbLines == 1 && NbTriangles == 1 && NbTetrahedra == 1){
+    ActualView->Min = V[0];
+    ActualView->Max = V[0];
     ActualView->NbTimeStep = N/nbnod;
   }
   else if(N/nbnod < ActualView->NbTimeStep)
     ActualView->NbTimeStep = N/nbnod ;
 
   for(i=0 ; i<N ; i++){
-    if(S.V[i] < ActualView->Min) ActualView->Min = S.V[i] ;
-    if(S.V[i] > ActualView->Max) ActualView->Max = S.V[i] ;
+    if(V[i] < ActualView->Min) ActualView->Min = V[i] ;
+    if(V[i] > ActualView->Max) ActualView->Max = V[i] ;
   }
-  
-  switch(dim){
-  case 0 : List_Add(ActualView->Points,&S); break;
-  case 1 : List_Add(ActualView->Lines,&S); break;
-  case 2 : List_Add(ActualView->Triangles,&S); break;
-  case 3 : List_Add(ActualView->Tetrahedra,&S); break;
-  }
-  
 }
 
-void AddView_VectorSimplex(int dim, double *coord, int N, double *v){
-  Post_Simplex S;
+void Stat_VectorSimplex(int dim, double *coord, int N, double *V){
   double l0;
   int nbnod, i;
-    
-  S.Type = DRAW_POST_VECTOR;
-  S.Dimension = dim;
+  double *X, *Y, *Z;
 
   switch(dim){
-  case 0 : nbnod = 1 ; break; // point
-  case 1 : nbnod = 2 ; break; // line
-  case 2 : nbnod = 3 ; break; // triangle
-  case 3 : nbnod = 4 ; break; // tetrahedron
+  case 0 : nbnod = 1 ; NbPoints++; break;
+  case 1 : nbnod = 2 ; NbLines++; break; 
+  case 2 : nbnod = 3 ; NbTriangles++; break;
+  case 3 : nbnod = 4 ; NbTetrahedra++; break;
   }
 
-  S.X = &coord[0] ; S.Y = &coord[nbnod] ; S.Z = &coord[2*nbnod] ; S.V = v ;
+  X = &coord[0] ; Y = &coord[nbnod] ; Z = &coord[2*nbnod] ;
 
-  if(!List_Nbr(ActualView->Points) &&    !List_Nbr(ActualView->Lines) && 
-     !List_Nbr(ActualView->Triangles) && !List_Nbr(ActualView->Tetrahedra)){
-    l0 = sqrt(DSQR(S.V[0])+DSQR(S.V[1])+DSQR(S.V[2]));
+  if(NbPoints == 1 && NbLines == 1 && NbTriangles == 1 && NbTetrahedra == 1){
+    l0 = sqrt(DSQR(V[0])+DSQR(V[1])+DSQR(V[2]));
     ActualView->Min = l0;
     ActualView->Max = l0;
     ActualView->NbTimeStep = N/(3*nbnod) ;
@@ -371,22 +341,15 @@ void AddView_VectorSimplex(int dim, double *coord, int N, double *v){
     ActualView->NbTimeStep = N/(3*nbnod) ;
 
   for(i=0 ; i<N ; i+=3){
-    l0 = sqrt(DSQR(S.V[i])+DSQR(S.V[i+1])+DSQR(S.V[i+2]));
+    l0 = sqrt(DSQR(V[i])+DSQR(V[i+1])+DSQR(V[i+2]));
     if(l0 < ActualView->Min) ActualView->Min = l0 ;
     if(l0 > ActualView->Max) ActualView->Max = l0 ;
   }
 
   ActualView->ScalarOnly = 0;
-
-  switch(dim){
-  case 0 : List_Add(ActualView->Points,&S); break;
-  case 1 : List_Add(ActualView->Lines,&S); break;
-  case 2 : List_Add(ActualView->Triangles,&S); break;
-  case 3 : List_Add(ActualView->Tetrahedra,&S); break;
-  }
 }
 
-void AddView_TensorSimplex(int dim, double *coord, int N, double *v){
+void Stat_TensorSimplex(int dim, double *coord, int N, double *v){
   Msg(ERROR, "Tensor Field Views not Implemented Yet");
 }
 
@@ -446,10 +409,6 @@ void Read_View(FILE *file, char *filename){
 
       ActualView->Time = List_CreateFromFile(nbtimestep, sizeof(double), file, format);
 
-      if((nb = ActualView->NbSP + ActualView->NbVP + ActualView->NbTP))
-        ActualView->Points = List_Create(nb,1,sizeof(Post_Simplex));
-      else
-        ActualView->Points = NULL ;
       nb = ActualView->NbSP ? 
         ActualView->NbSP * nbtimestep     + ActualView->NbSP * 3 : 0 ;
       ActualView->SP = List_CreateFromFile(nb, sizeof(double), file, format);
@@ -460,10 +419,6 @@ void Read_View(FILE *file, char *filename){
         ActualView->NbTP * nbtimestep * 9 + ActualView->NbTP * 3 : 0 ;
       ActualView->TP = List_CreateFromFile(nb, sizeof(double), file, format);
 
-      if((nb = ActualView->NbSL + ActualView->NbVL + ActualView->NbTL))
-        ActualView->Lines = List_Create(nb,1,sizeof(Post_Simplex));
-      else
-        ActualView->Lines = NULL ;
       nb = ActualView->NbSL ? 
         ActualView->NbSL * nbtimestep * 2     + ActualView->NbSL * 6 : 0 ;
       ActualView->SL = List_CreateFromFile(nb, sizeof(double), file, format);
@@ -474,10 +429,6 @@ void Read_View(FILE *file, char *filename){
         ActualView->NbTL * nbtimestep * 2 * 9 + ActualView->NbTL * 6 : 0 ;
       ActualView->TL = List_CreateFromFile(nb, sizeof(double), file, format);
 
-      if((nb = ActualView->NbST + ActualView->NbVT + ActualView->NbTT))
-        ActualView->Triangles = List_Create(nb,1,sizeof(Post_Simplex));
-      else
-        ActualView->Triangles = NULL ;
       nb = ActualView->NbST ? 
         ActualView->NbST * nbtimestep * 3     + ActualView->NbST * 9 : 0 ;
       ActualView->ST = List_CreateFromFile(nb, sizeof(double), file, format);
@@ -488,10 +439,6 @@ void Read_View(FILE *file, char *filename){
         ActualView->NbTT * nbtimestep * 3 * 9 + ActualView->NbTT * 9 : 0 ;
       ActualView->TT = List_CreateFromFile(nb, sizeof(double), file, format);
 
-      if((nb = ActualView->NbSS + ActualView->NbVS + ActualView->NbTS))
-        ActualView->Tetrahedra = List_Create(nb,1,sizeof(Post_Simplex));
-      else
-        ActualView->Tetrahedra = NULL ;
       nb = ActualView->NbSS ?
         ActualView->NbSS * nbtimestep * 4     + ActualView->NbSS * 12 : 0 ;
       ActualView->SS = List_CreateFromFile(nb, sizeof(double), file, format);
diff --git a/Common/Views.h b/Common/Views.h
index fc249536b919793ff0bf73de22cc1a8076dec97a..6b817e482c8e615fd0b6eb111d2265b3e4e2a29e 100644
--- a/Common/Views.h
+++ b/Common/Views.h
@@ -1,14 +1,8 @@
-/* $Id: Views.h,v 1.6 2000-11-26 15:43:45 geuzaine Exp $ */
+/* $Id: Views.h,v 1.7 2000-11-27 10:58:18 geuzaine Exp $ */
 #ifndef _VIEWS_H_
 #define _VIEWS_H_
 
 #include "Const.h"
-
-typedef struct{
-  int    Dimension, Type;
-  double *X, *Y, *Z, *V;
-}Post_Simplex;
-
 #include "ColorTable.h"
 
 typedef struct{
@@ -18,14 +12,14 @@ typedef struct{
 
   /* the data */
   List_T *Time;
-  int NbSP, NbVP, NbTP;
-  List_T *SP, *VP, *TP, *Points; // points
-  int NbSL, NbVL, NbTL;
-  List_T *SL, *VL, *TL, *Lines; // lines
-  int NbST, NbVT, NbTT;
-  List_T *ST, *VT, *TT, *Triangles; // triangles
-  int NbSS, NbVS, NbTS;
-  List_T *SS, *VS, *TS, *Tetrahedra; // tetrahedra
+  int NbPoints, NbSP, NbVP, NbTP;
+  List_T *SP, *VP, *TP; // points
+  int NbLines, NbSL, NbVL, NbTL;
+  List_T *SL, *VL, *TL; // lines
+  int NbTriangles, NbST, NbVT, NbTT;
+  List_T *ST, *VT, *TT; // triangles
+  int NbTetrahedra, NbSS, NbVS, NbTS;
+  List_T *SS, *VS, *TS; // tetrahedra
   int NbTimeStep, ScalarOnly;
   double Min, Max;
 
@@ -45,11 +39,6 @@ typedef struct{
   int (*GIFV) (double min, double max, int nb, double value);
 }Post_View;
 
-/* Type (The keys are important!) */
-#define DRAW_POST_SCALAR  1
-#define DRAW_POST_VECTOR  3
-#define DRAW_POST_TENSOR  9
-
 /* IntervalsType */
 #define DRAW_POST_ISO          1
 #define DRAW_POST_CONTINUOUS   2
@@ -89,9 +78,9 @@ void FreeView(Post_View *v);
 void Read_View(FILE *file, char *filename);
 void CopyViewOptions(Post_View *src, Post_View *dest);
 
-void AddView_ScalarSimplex(int dim, double *coord, int N, double *v);
-void AddView_VectorSimplex(int dim, double *coord, int N, double *v);
-void AddView_TensorSimplex(int dim, double *coord, int N, double *v);
+void Stat_ScalarSimplex(int dim, double *coord, int N, double *v);
+void Stat_VectorSimplex(int dim, double *coord, int N, double *v);
+void Stat_TensorSimplex(int dim, double *coord, int N, double *v);
 
 int BGMWithView (Post_View *ErrView);
 int CreateBGM(Post_View *ErrView, int OptiMethod, double Degree,
diff --git a/Graphics/Draw.h b/Graphics/Draw.h
index d5577e494456a97e7e96d35e1d80f4bf8091ab38..535ebe40b33a8ba4bfcfd72fba20c63fe7c58ddd 100644
--- a/Graphics/Draw.h
+++ b/Graphics/Draw.h
@@ -1,4 +1,4 @@
-/* $Id: Draw.h,v 1.6 2000-11-26 15:43:46 geuzaine Exp $ */
+/* $Id: Draw.h,v 1.7 2000-11-27 10:58:54 geuzaine Exp $ */
 #ifndef _DRAW_H_
 #define _DRAW_H_
 
@@ -73,13 +73,41 @@ void Draw_Simplex_Volume (void *a, void *b);
 void Draw_Hexahedron_Volume (void *a, void *b);
 void Draw_Prism_Volume (void *a, void *b);
 
-void Draw_Post_Tetrahedron (Post_View * View, Post_Simplex * s,
-                            double ValMin, double ValMax, double Raise[3][5]);
-void Draw_Post_Triangle (Post_View * View, Post_Simplex * t,
-                         double ValMin, double ValMax, double Raise[3][5]);
-void Draw_Post_Line (Post_View * View, Post_Simplex * l,
-                     double ValMin, double ValMax, double Raise[3][5]);
-void Draw_Post_Point (Post_View * View, Post_Simplex * p,
-                      double ValMin, double ValMax, double Raise[3][5]);
+void Draw_ScalarPoint(Post_View *View, 
+		      double ValMin, double ValMax, double Raise[3][5],
+		      double *X, double *Y, double *Z, double *V);
+void Draw_VectorPoint(Post_View *View, 
+		      double ValMin, double ValMax, double Raise[3][5],
+		      double *X, double *Y, double *Z, double *V);
+void Draw_TensorPoint(Post_View *View, 
+		      double ValMin, double ValMax, double Raise[3][5],
+		      double *X, double *Y, double *Z, double *V);
+void Draw_ScalarLine(Post_View *View, 
+		     double ValMin, double ValMax, double Raise[3][5],
+		     double *X, double *Y, double *Z, double *V);
+void Draw_VectorLine(Post_View *View, 
+		     double ValMin, double ValMax, double Raise[3][5],
+		     double *X, double *Y, double *Z, double *V);
+void Draw_TensorLine(Post_View *View, 
+		     double ValMin, double ValMax, double Raise[3][5],
+		     double *X, double *Y, double *Z, double *V);
+void Draw_ScalarTriangle(Post_View *View, 
+			 double ValMin, double ValMax, double Raise[3][5],
+			 double *X, double *Y, double *Z, double *V);
+void Draw_VectorTriangle(Post_View *View, 
+			 double ValMin, double ValMax, double Raise[3][5],
+			 double *X, double *Y, double *Z, double *V);
+void Draw_TensorTriangle(Post_View *View, 
+			 double ValMin, double ValMax, double Raise[3][5],
+			 double *X, double *Y, double *Z, double *V);
+void Draw_ScalarTetrahedron(Post_View *View, 
+			    double ValMin, double ValMax, double Raise[3][5],
+			    double *X, double *Y, double *Z, double *V);
+void Draw_VectorTetrahedron(Post_View *View, 
+			    double ValMin, double ValMax, double Raise[3][5],
+			    double *X, double *Y, double *Z, double *V);
+void Draw_TensorTetrahedron(Post_View *View, 
+			    double ValMin, double ValMax, double Raise[3][5],
+			    double *X, double *Y, double *Z, double *V);
 
 #endif
diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp
index f24283ebd6fb1ed4837d54cc237c3cde66dddef6..8a34d96d9a914f41bc232b134e61f342ca0dffb3 100644
--- a/Graphics/Post.cpp
+++ b/Graphics/Post.cpp
@@ -1,4 +1,4 @@
-/* $Id: Post.cpp,v 1.5 2000-11-26 15:43:46 geuzaine Exp $ */
+/* $Id: Post.cpp,v 1.6 2000-11-27 10:58:54 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -79,15 +79,15 @@ void RaiseFill(int i, double Val, double ValMin, double Raise[3][5]){
    ------------------------------------------------------------------------ */
 
 void Draw_Post (void) {
-  int            i,j,k,n;
+  int            iView,i,j,k,nb;
   double         ValMin,ValMax,AbsMax;
   Post_View     *v;
 
   if(!Post_ViewList) return;
   
-  for(i=0 ; i<List_Nbr(Post_ViewList) ; i++){
+  for(iView=0 ; iView<List_Nbr(Post_ViewList) ; iView++){
 
-    v = (Post_View*)List_Pointer(Post_ViewList,i);
+    v = (Post_View*)List_Pointer(Post_ViewList,iView);
 
     if(v->Visible){ 
 
@@ -100,7 +100,7 @@ void Draw_Post (void) {
 
         if(CTX.display_lists){
           if(glIsList(v->Num)) glDeleteLists(v->Num,1);
-          //Msg(INFO, "New Display List");
+          // Msg(INFO, "New Display List");
           glNewList(v->Num, GL_COMPILE_AND_EXECUTE);
         }
 
@@ -111,7 +111,7 @@ void Draw_Post (void) {
           InitNoShading();
         }
         
-        /* force this */
+        // force this
         if(v->IntervalsType == DRAW_POST_CONTINUOUS)
           glShadeModel(GL_SMOOTH); 
         
@@ -138,29 +138,128 @@ void Draw_Post (void) {
           RaiseFactor[j] = v->Raise[j] / AbsMax ;
           for(k=0;k<5;k++) Raise[j][k] = 0. ;
         }
-        
-        if((n = List_Nbr(v->Tetrahedra)))
-          for(j=0 ; j<n ; j++)
-            Draw_Post_Tetrahedron(v, (Post_Simplex*)List_Pointer(v->Tetrahedra,j), 
-                                  ValMin, ValMax, Raise);
-        
-        //if(there is alpha)List_Sort(v->Triangles, fcmpTriangle);
 
-        if((n = List_Nbr(v->Triangles)))
-          for(j=0 ; j<n ; j++)
-            Draw_Post_Triangle(v, (Post_Simplex*)List_Pointer(v->Triangles,j), 
-                               ValMin, ValMax, Raise);
+	// Points
+
+	if(v->NbSP){
+	  nb = List_Nbr(v->SP) / v->NbSP ;
+	  for(i = 0 ; i < List_Nbr(v->SP) ; i+=nb)
+	    Draw_ScalarPoint(v, ValMin, ValMax, Raise,
+			     (double*)List_Pointer_Fast(v->SP,i),
+			     (double*)List_Pointer_Fast(v->SP,i+1),
+			     (double*)List_Pointer_Fast(v->SP,i+2),
+			     (double*)List_Pointer_Fast(v->SP,i+3));
+	}
+	if(v->NbVP){
+	  nb = List_Nbr(v->VP) / v->NbVP ;
+	  for(i = 0 ; i < List_Nbr(v->VP) ; i+=nb)
+	    Draw_VectorPoint(v, ValMin, ValMax, Raise,
+			     (double*)List_Pointer_Fast(v->VP,i),
+			     (double*)List_Pointer_Fast(v->VP,i+1),
+			     (double*)List_Pointer_Fast(v->VP,i+2),
+			     (double*)List_Pointer_Fast(v->VP,i+3));
+	}
+	if(v->NbTP){
+	  nb = List_Nbr(v->TP) / v->NbTP ;
+	  for(i = 0 ; i < List_Nbr(v->TP) ; i+=nb)
+	    Draw_TensorPoint(v, ValMin, ValMax, Raise,
+			     (double*)List_Pointer_Fast(v->TP,i),
+			     (double*)List_Pointer_Fast(v->TP,i+1),
+			     (double*)List_Pointer_Fast(v->TP,i+2),
+			     (double*)List_Pointer_Fast(v->TP,i+3));
+	}
+
+	// Lines
+	
+	if(v->NbSL){
+	  nb = List_Nbr(v->SL) / v->NbSL ;
+	  for(i = 0 ; i < List_Nbr(v->SL) ; i+=nb)
+	    Draw_ScalarLine(v, ValMin, ValMax, Raise,
+			    (double*)List_Pointer_Fast(v->SL,i),
+			    (double*)List_Pointer_Fast(v->SL,i+2),
+			    (double*)List_Pointer_Fast(v->SL,i+4),
+			    (double*)List_Pointer_Fast(v->SL,i+6));
+	}
+	if(v->NbVL){
+	  nb = List_Nbr(v->VL) / v->NbVL ;
+	  for(i = 0 ; i < List_Nbr(v->VL) ; i+=nb)
+	    Draw_VectorLine(v, ValMin, ValMax, Raise,
+			    (double*)List_Pointer_Fast(v->VL,i),
+			    (double*)List_Pointer_Fast(v->VL,i+2),
+			    (double*)List_Pointer_Fast(v->VL,i+4),
+			    (double*)List_Pointer_Fast(v->VL,i+6));
+	}
+	if(v->NbTL){
+	  nb = List_Nbr(v->TL) / v->NbTL ;
+	  for(i = 0 ; i < List_Nbr(v->TL) ; i+=nb)
+	    Draw_VectorLine(v, ValMin, ValMax, Raise,
+			    (double*)List_Pointer_Fast(v->TL,i),
+			    (double*)List_Pointer_Fast(v->TL,i+2),
+			    (double*)List_Pointer_Fast(v->TL,i+4),
+			    (double*)List_Pointer_Fast(v->TL,i+6));
+	}
+	
+	// Triangles
+	
+	if(v->NbST){
+	  nb = List_Nbr(v->ST) / v->NbST ;
+	  for(i = 0 ; i < List_Nbr(v->ST) ; i+=nb)
+	    Draw_ScalarTriangle(v, ValMin, ValMax, Raise,
+				(double*)List_Pointer_Fast(v->ST,i),
+				(double*)List_Pointer_Fast(v->ST,i+3),
+				(double*)List_Pointer_Fast(v->ST,i+6),
+				(double*)List_Pointer_Fast(v->ST,i+9));
+	}
+	if(v->NbVT){
+	  nb = List_Nbr(v->VT) / v->NbVT ;
+	  for(i = 0 ; i < List_Nbr(v->VT) ; i+=nb)
+	    Draw_VectorTriangle(v, ValMin, ValMax, Raise,
+				(double*)List_Pointer_Fast(v->VT,i),
+				(double*)List_Pointer_Fast(v->VT,i+3),
+				(double*)List_Pointer_Fast(v->VT,i+6),
+				(double*)List_Pointer_Fast(v->VT,i+9));
+	}
+	if(v->NbTT){
+	  nb = List_Nbr(v->TT) / v->NbTT ;
+	  for(i = 0 ; i < List_Nbr(v->TT) ; i+=nb)
+	    Draw_TensorTriangle(v, ValMin, ValMax, Raise,
+				(double*)List_Pointer_Fast(v->TT,i),
+				(double*)List_Pointer_Fast(v->TT,i+3),
+				(double*)List_Pointer_Fast(v->TT,i+6),
+				(double*)List_Pointer_Fast(v->TT,i+9));
+	}
+	
+	// Tetrahedra
+	
+	if(v->NbSS){
+	  nb = List_Nbr(v->SS) / v->NbSS ;
+	  for(i = 0 ; i < List_Nbr(v->SS) ; i+=nb)
+	    Draw_ScalarTetrahedron(v, ValMin, ValMax, Raise,
+				   (double*)List_Pointer_Fast(v->SS,i),
+				   (double*)List_Pointer_Fast(v->SS,i+4),
+				   (double*)List_Pointer_Fast(v->SS,i+8),
+				   (double*)List_Pointer_Fast(v->SS,i+12));
+	}
+	if(v->NbVS){
+	  nb = List_Nbr(v->VS) / v->NbVS ;
+	  for(i = 0 ; i < List_Nbr(v->VS) ; i+=nb)
+	    Draw_VectorTetrahedron(v, ValMin, ValMax, Raise,
+				   (double*)List_Pointer_Fast(v->VS,i),
+				   (double*)List_Pointer_Fast(v->VS,i+4),
+				   (double*)List_Pointer_Fast(v->VS,i+8),
+				   (double*)List_Pointer_Fast(v->VS,i+12));
+	}
+	if(v->NbTS){
+	  nb = List_Nbr(v->TS) / v->NbTS ;
+	  for(i = 0 ; i < List_Nbr(v->TS) ; i+=nb)
+	    Draw_TensorTetrahedron(v, ValMin, ValMax, Raise,
+				   (double*)List_Pointer_Fast(v->TS,i),
+				   (double*)List_Pointer_Fast(v->TS,i+4),
+				   (double*)List_Pointer_Fast(v->TS,i+8),
+				   (double*)List_Pointer_Fast(v->TS,i+12));
+	}
+
 
-        if((n = List_Nbr(v->Lines)))
-          for(j=0 ; j<n ; j++)
-            Draw_Post_Line(v, (Post_Simplex*)List_Pointer(v->Lines,j), 
-                           ValMin, ValMax, Raise);
-        
-        if((n = List_Nbr(v->Points)))
-          for(j=0 ; j<n ; j++)
-            Draw_Post_Point(v, (Post_Simplex*)List_Pointer(v->Points,j), 
-                            ValMin, ValMax, Raise);
-        
         if(CTX.display_lists){
           glEndList();
           v->Changed=0;
diff --git a/Graphics/PostSimplex.cpp b/Graphics/PostSimplex.cpp
index 577c4d8246c52d870822f94b4e0dd6d64dd605aa..917ee2a074c8d266bb33eb45a7db50983ec6b56e 100644
--- a/Graphics/PostSimplex.cpp
+++ b/Graphics/PostSimplex.cpp
@@ -1,4 +1,4 @@
-/* $Id: PostSimplex.cpp,v 1.4 2000-11-26 15:43:46 geuzaine Exp $ */
+/* $Id: PostSimplex.cpp,v 1.5 2000-11-27 10:58:54 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -14,53 +14,53 @@ extern Context_T   CTX;
 /*  P o i n t s                                                             */
 /* ------------------------------------------------------------------------ */
 
-void Draw_Post_Point(Post_View *View, Post_Simplex *PP, 
-                     double ValMin, double ValMax, double Raise[3][5]){      
+void Draw_ScalarPoint(Post_View *View, 
+		      double ValMin, double ValMax, double Raise[3][5],
+		      double *X, double *Y, double *Z, double *V){
+  double   d;
+
+  d = V[View->TimeStep];  
+  if(d>=ValMin && d<=ValMax){      
+    Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+    glBegin(GL_POINTS);
+    glVertex3d(X[0], Y[0], Z[0]);
+    glEnd();
+  }
+}
+
+void Draw_VectorPoint(Post_View *View, 
+		      double ValMin, double ValMax, double Raise[3][5],
+		      double *X, double *Y, double *Z, double *V){
   int      i;
   double   d,dx,dy,dz,fact;
           
-  switch(PP->Type){         
-
-  case DRAW_POST_SCALAR:                    
-    d = PP->V[View->TimeStep];  
-    if(d>=ValMin && d<=ValMax){      
-      Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
-      glBegin(GL_POINTS);
-      glVertex3d(PP->X[0], PP->Y[0], PP->Z[0]);
-      glEnd();
-    }
-    break;
-    
-  case DRAW_POST_VECTOR:            
-
-    if(View->ArrowType == DRAW_POST_DISPLACEMENT){
-      fact = View->ArrowScale/100. ;
-      glColor4ubv((GLubyte*)&CTX.color.fg);
-      glBegin(GL_POINTS);
-      glVertex3d(fact*PP->V[3*View->TimeStep],
-                 fact*PP->V[3*View->TimeStep+1],
-                 fact*PP->V[3*View->TimeStep+2]);
+  if(View->ArrowType == DRAW_POST_DISPLACEMENT){
+    fact = View->ArrowScale/100. ;
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glBegin(GL_POINTS);
+    glVertex3d(fact*V[3*View->TimeStep],
+	       fact*V[3*View->TimeStep+1],
+	       fact*V[3*View->TimeStep+2]);
+    glEnd();
+    if(View->TimeStep){
+      glBegin(GL_LINE_STRIP);
+      for(i=0 ; i<View->TimeStep+1 ; i++)
+	glVertex3d(fact*V[3*(View->TimeStep-i)],
+		   fact*V[3*(View->TimeStep-i)+1],
+		   fact*V[3*(View->TimeStep-i)+2]);
       glEnd();
-      if(View->TimeStep){
-        glBegin(GL_LINE_STRIP);
-        for(i=0 ; i<View->TimeStep+1 ; i++)
-          glVertex3d(fact*PP->V[3*(View->TimeStep-i)],
-                     fact*PP->V[3*(View->TimeStep-i)+1],
-                     fact*PP->V[3*(View->TimeStep-i)+2]);
-        glEnd();
-      }
-      break;
     }
-
-    dx = PP->V[3*View->TimeStep];  
-    dy = PP->V[3*View->TimeStep+1];
-    dz = PP->V[3*View->TimeStep+2];
+  }
+  else{
+    dx = V[3*View->TimeStep];  
+    dy = V[3*View->TimeStep+1];
+    dz = V[3*View->TimeStep+2];
     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));
-
+      
       fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;
       
       if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
@@ -70,141 +70,147 @@ void Draw_Post_Point(Post_View *View, Post_Simplex *PP,
       }
 
       RaiseFill(0, d, ValMin, Raise);
-
+      
       Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO, 
-                  PP->X[0], PP->Y[0], PP->Z[0],
+                  X[0], Y[0], Z[0],
                   fact*d, fact*dx, fact*dy, fact*dz,
                   View->Offset, Raise);
     }
-    break;
-    
-  case DRAW_POST_TENSOR :
-    break;
-    
   }
 }
 
+void Draw_TensorPoint(Post_View *View, 
+		      double ValMin, double ValMax, double Raise[3][5],
+		      double *X, double *Y, double *Z, double *V){
+}
+
 /* ------------------------------------------------------------------------ */
 /*  L i n e s                                                               */
 /* ------------------------------------------------------------------------ */
 
-void Draw_Post_Line(Post_View *View, Post_Simplex *PL, 
-                    double ValMin, double ValMax, double Raise[3][5]){
+void Draw_ScalarLine(Post_View *View, 
+		     double ValMin, double ValMax, double Raise[3][5],
+		     double *X, double *Y, double *Z, double *V){
 
   int     i,k,nb=0;
-  double  d,dx,dy,dz,fact;
+  double  d;
   double  Xp[5],Yp[5],Zp[5],value[5],thev;
   char    Num[100] ;
 
-  switch(PL->Type){         
-  case DRAW_POST_SCALAR:            
-
-    if(View->IntervalsType==DRAW_POST_NUMERIC){
-      d = (PL->V[2*View->TimeStep]+PL->V[2*View->TimeStep+1]) / 2.;
-      if(d >= ValMin && d <= ValMax){
-        sprintf(Num, "%g", d);
-        glColor4ubv((GLubyte*)&CTX.color.fg);
-        glRasterPos3d((PL->X[0] + PL->X[1])/2.,
-                      (PL->Y[0] + PL->Y[1])/2.,
-                      (PL->Z[0] + PL->Z[1])/2.);
-        Draw_String(Num);
-      }
-      break ;
+  if(View->IntervalsType==DRAW_POST_NUMERIC){
+    d = (V[2*View->TimeStep]+V[2*View->TimeStep+1]) / 2.;
+    if(d >= ValMin && d <= ValMax){
+      sprintf(Num, "%g", d);
+      glColor4ubv((GLubyte*)&CTX.color.fg);
+      glRasterPos3d((X[0] + X[1])/2.,
+		    (Y[0] + Y[1])/2.,
+		    (Z[0] + Z[1])/2.);
+      Draw_String(Num);
     }
+  }
+  else{
 
     glDisable(GL_LINE_STIPPLE);
-    for(k=0 ; k<2 ; k++) RaiseFill(k, PL->V[2*View->TimeStep+k], ValMin, Raise);
-
+    for(k=0 ; k<2 ; k++) RaiseFill(k, V[2*View->TimeStep+k], ValMin, Raise);
+    
     if(View->IntervalsType==DRAW_POST_CONTINUOUS){
       glBegin(GL_LINES);
-      Palette2(View,ValMin,ValMax,PL->V[2*View->TimeStep]);
-      glVertex3d(PL->X[0]+View->Offset[0]+Raise[0][0],
-                 PL->Y[0]+View->Offset[1]+Raise[1][0],
-                 PL->Z[0]+View->Offset[2]+Raise[2][0]);
-      Palette2(View,ValMin,ValMax,PL->V[2*View->TimeStep+1]);
-      glVertex3d(PL->X[1]+View->Offset[0]+Raise[0][1],
-                 PL->Y[1]+View->Offset[1]+Raise[1][1],
-                 PL->Z[1]+View->Offset[2]+Raise[2][1]);
+      Palette2(View,ValMin,ValMax,V[2*View->TimeStep]);
+      glVertex3d(X[0]+View->Offset[0]+Raise[0][0],
+		 Y[0]+View->Offset[1]+Raise[1][0],
+		 Z[0]+View->Offset[2]+Raise[2][0]);
+      Palette2(View,ValMin,ValMax,V[2*View->TimeStep+1]);
+      glVertex3d(X[1]+View->Offset[0]+Raise[0][1],
+		 Y[1]+View->Offset[1]+Raise[1][1],
+		 Z[1]+View->Offset[2]+Raise[2][1]);
       glEnd();
     }
     else{
       for(k=0 ; k<View->NbIso ; k++){
-        Palette(View,View->NbIso,k);
-        if(View->IntervalsType==DRAW_POST_DISCRETE){
-          CutLine1D(PL->X,PL->Y,PL->Z,&PL->V[2*View->TimeStep],
-                    View->GVFI(ValMin,ValMax,View->NbIso+1,k),
-                    View->GVFI(ValMin,ValMax,View->NbIso+1,k+1),
-                    ValMin,ValMax,Xp,Yp,Zp,&nb,value);    
-          if(nb == 2){
-            for(i=0;i<2;i++) RaiseFill(i,value[i],ValMin,Raise);    
-            Draw_Line(Xp,Yp,Zp,View->Offset,Raise);  
-          }
-        }
-        else{
-          thev = View->GVFI(ValMin,ValMax,View->NbIso,k);
-          CutLine0D(PL->X,PL->Y,PL->Z,&PL->V[2*View->TimeStep],
-                    thev, ValMin,ValMax,Xp,Yp,Zp,&nb);    
-          if(nb){
-            RaiseFill(0,thev,ValMin,Raise);
-            Draw_Point(Xp,Yp,Zp,View->Offset,Raise);    
-          }
-        }
+	Palette(View,View->NbIso,k);
+	if(View->IntervalsType==DRAW_POST_DISCRETE){
+	  CutLine1D(X,Y,Z,&V[2*View->TimeStep],
+		    View->GVFI(ValMin,ValMax,View->NbIso+1,k),
+		    View->GVFI(ValMin,ValMax,View->NbIso+1,k+1),
+		    ValMin,ValMax,Xp,Yp,Zp,&nb,value);    
+	  if(nb == 2){
+	    for(i=0;i<2;i++) RaiseFill(i,value[i],ValMin,Raise);    
+	    Draw_Line(Xp,Yp,Zp,View->Offset,Raise);  
+	  }
+	}
+	else{
+	  thev = View->GVFI(ValMin,ValMax,View->NbIso,k);
+	  CutLine0D(X,Y,Z,&V[2*View->TimeStep],
+		    thev, ValMin,ValMax,Xp,Yp,Zp,&nb);    
+	  if(nb){
+	    RaiseFill(0,thev,ValMin,Raise);
+	    Draw_Point(Xp,Yp,Zp,View->Offset,Raise);    
+	  }
+	}
       }
-
     }
-    break;
-    
-  case DRAW_POST_VECTOR:            
-    if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
-      dx = 0.5 * (PL->V[6*View->TimeStep]  +PL->V[6*View->TimeStep+3]);
-      dy = 0.5 * (PL->V[6*View->TimeStep+1]+PL->V[6*View->TimeStep+4]);
-      dz = 0.5 * (PL->V[6*View->TimeStep+2]+PL->V[6*View->TimeStep+5]);
-      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));            
-        fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;            
-        if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
-          dx /= d ; dy /= d ; dz /= d ;
-          d = log10(d/ValMin) ; 
-          dx *= d ; dy *= d ; dz *= d ;
-        }
-        RaiseFill(0, d, ValMin, Raise);         
-        Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-                    0.5 * (PL->X[0] + PL->X[1]),
-                    0.5 * (PL->Y[0] + PL->Y[1]),
-                    0.5 * (PL->Z[0] + PL->Z[1]),
-                    fact*d, fact*dx, fact*dy, fact*dz,
-                    View->Offset, Raise);
+
+  }
+
+}
+
+void Draw_VectorLine(Post_View *View, 
+		     double ValMin, double ValMax, double Raise[3][5],
+		     double *X, double *Y, double *Z, double *V){
+
+  int     k;
+  double  d,dx,dy,dz,fact;
+
+  if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
+    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]);
+    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));            
+      fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;            
+      if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	dx /= d ; dy /= d ; dz /= d ;
+	d = log10(d/ValMin) ; 
+	dx *= d ; dy *= d ; dz *= d ;
       }
+      RaiseFill(0, d, ValMin, Raise);         
+      Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		  0.5 * (X[0] + X[1]),
+		  0.5 * (Y[0] + Y[1]),
+		  0.5 * (Z[0] + Z[1]),
+		  fact*d, fact*dx, fact*dy, fact*dz,
+		  View->Offset, Raise);
     }
-    else{
-      for(k=0 ; k<2 ; k++){
-        dx = PL->V[6*View->TimeStep  +3*k] ;
-        dy = PL->V[6*View->TimeStep+1+3*k] ;
-        dz = PL->V[6*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));
-          fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;          
-          if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
-            dx /= d ; dy /= d ; dz /= d ;
-            d = log10(d/ValMin) ; 
-            dx *= d ; dy *= d ; dz *= d ;
-          }
-          RaiseFill(0, d, ValMin, Raise);               
-          Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-                      PL->X[k], PL->Y[k], PL->Z[k],
-                      fact*d, fact*dx, fact*dy, fact*dz,
-                      View->Offset, Raise);
-        }               
-      }       
-    }
-    break;
-    
-  case DRAW_POST_TENSOR :
-    break;
-    
   }
+  else{
+    for(k=0 ; k<2 ; k++){
+      dx = V[6*View->TimeStep  +3*k] ;
+      dy = V[6*View->TimeStep+1+3*k] ;
+      dz = V[6*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));
+	fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;          
+	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	  dx /= d ; dy /= d ; dz /= d ;
+	  d = log10(d/ValMin) ; 
+	  dx *= d ; dy *= d ; dz *= d ;
+	}
+	RaiseFill(0, d, 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,
+		    View->Offset, Raise);
+      }               
+    }       
+  }
+
+}
+
+void Draw_TensorLine(Post_View *View, 
+		     double ValMin, double ValMax, double Raise[3][5],
+		     double *X, double *Y, double *Z, double *V){
 }
 
 
@@ -212,46 +218,42 @@ void Draw_Post_Line(Post_View *View, Post_Simplex *PL,
 /*  T r i a n g l e s                                                       */
 /* ------------------------------------------------------------------------ */
 
-void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT, 
-                        double ValMin, double ValMax, double Raise[3][5]){
+void Draw_ScalarTriangle(Post_View *View, 
+			 double ValMin, double ValMax, double Raise[3][5],
+			 double *X, double *Y, double *Z, double *V){
 
-  int     i, k, m, nb=0;
-  double  d,dx,dy,dz,fact;
+  int     i, k, nb=0;
+  double  d;
   double  x1x0, y1y0, z1z0, x2x0, y2y0, z2z0, nn[3];
-  double  xx[3],yy[3],zz[3];
   double  Xp[5],Yp[5],Zp[5],value[5],thev;
   char    Num[100] ;
 
   if(View->ShowElement)
     glEnable(GL_POLYGON_OFFSET_FILL);
 
-  switch(PT->Type){         
-    
-  case DRAW_POST_SCALAR:
-
-    if(View->IntervalsType==DRAW_POST_NUMERIC){
-      d = (PT->V[3*View->TimeStep]+PT->V[3*View->TimeStep+1]+PT->V[3*View->TimeStep+2]) / 3.;
-      if(d >= ValMin && d <= ValMax){
-        sprintf(Num, "%g", d);
-        glColor4ubv((GLubyte*)&CTX.color.fg);
-        glRasterPos3d((PT->X[0] + PT->X[1] + PT->X[2])/3.,
-                      (PT->Y[0] + PT->Y[1] + PT->Y[2])/3.,
-                      (PT->Z[0] + PT->Z[1] + PT->Z[2])/3.);
-        Draw_String(Num);
-      }
-      break ;
+  if(View->IntervalsType==DRAW_POST_NUMERIC){
+    d = (V[3*View->TimeStep]+V[3*View->TimeStep+1]+V[3*View->TimeStep+2]) / 3.;
+    if(d >= ValMin && d <= ValMax){
+      sprintf(Num, "%g", d);
+      glColor4ubv((GLubyte*)&CTX.color.fg);
+      glRasterPos3d((X[0] + X[1] + X[2])/3.,
+		    (Y[0] + Y[1] + Y[2])/3.,
+		    (Z[0] + Z[1] + Z[2])/3.);
+      Draw_String(Num);
     }
+  }
+  else{
 
     if(View->IntervalsType!=DRAW_POST_ISO)
-      for(i=0;i<3;i++)RaiseFill(i, PT->V[3*View->TimeStep+i], ValMin, Raise);
+      for(i=0;i<3;i++)RaiseFill(i, V[3*View->TimeStep+i], ValMin, Raise);
     
     if(View->Light){
-      x1x0 = (PT->X[1]+Raise[0][1]) - (PT->X[0]+Raise[0][0]); 
-      y1y0 = (PT->Y[1]+Raise[1][1]) - (PT->Y[0]+Raise[1][0]);
-      z1z0 = (PT->Z[1]+Raise[2][1]) - (PT->Z[0]+Raise[2][0]); 
-      x2x0 = (PT->X[2]+Raise[0][2]) - (PT->X[0]+Raise[0][0]);
-      y2y0 = (PT->Y[2]+Raise[1][2]) - (PT->Y[0]+Raise[1][0]); 
-      z2z0 = (PT->Z[2]+Raise[2][2]) - (PT->Z[0]+Raise[2][0]);
+      x1x0 = (X[1]+Raise[0][1]) - (X[0]+Raise[0][0]); 
+      y1y0 = (Y[1]+Raise[1][1]) - (Y[0]+Raise[1][0]);
+      z1z0 = (Z[1]+Raise[2][1]) - (Z[0]+Raise[2][0]); 
+      x2x0 = (X[2]+Raise[0][2]) - (X[0]+Raise[0][0]);
+      y2y0 = (Y[2]+Raise[1][2]) - (Y[0]+Raise[1][0]); 
+      z2z0 = (Z[2]+Raise[2][2]) - (Z[0]+Raise[2][0]);
       nn[0]  = y1y0 * z2z0 - z1z0 * y2y0 ;
       nn[1]  = z1z0 * x2x0 - x1x0 * z2z0 ;
       nn[2]  = x1x0 * y2y0 - y1y0 * x2x0 ;
@@ -267,26 +269,26 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
     }
 
     if(View->IntervalsType==DRAW_POST_CONTINUOUS){
-      if(PT->V[3*View->TimeStep]  >=ValMin && PT->V[3*View->TimeStep]  <=ValMax &&
-         PT->V[3*View->TimeStep+1]>=ValMin && PT->V[3*View->TimeStep+1]<=ValMax &&
-         PT->V[3*View->TimeStep+2]>=ValMin && PT->V[3*View->TimeStep+2]<=ValMax){
+      if(V[3*View->TimeStep]  >=ValMin && V[3*View->TimeStep]  <=ValMax &&
+         V[3*View->TimeStep+1]>=ValMin && V[3*View->TimeStep+1]<=ValMax &&
+         V[3*View->TimeStep+2]>=ValMin && V[3*View->TimeStep+2]<=ValMax){
         glBegin(GL_TRIANGLES);
-        Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep]);
-        glVertex3d(PT->X[0]+View->Offset[0]+Raise[0][0],
-                   PT->Y[0]+View->Offset[1]+Raise[1][0],
-                   PT->Z[0]+View->Offset[2]+Raise[2][0]);
-        Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep+1]);
-        glVertex3d(PT->X[1]+View->Offset[0]+Raise[0][1],
-                   PT->Y[1]+View->Offset[1]+Raise[1][1],
-                   PT->Z[1]+View->Offset[2]+Raise[2][1]);
-        Palette2(View,ValMin,ValMax,PT->V[3*View->TimeStep+2]);
-        glVertex3d(PT->X[2]+View->Offset[0]+Raise[0][2],
-                   PT->Y[2]+View->Offset[1]+Raise[1][2],
-                   PT->Z[2]+View->Offset[2]+Raise[2][2]);
+        Palette2(View,ValMin,ValMax,V[3*View->TimeStep]);
+        glVertex3d(X[0]+View->Offset[0]+Raise[0][0],
+                   Y[0]+View->Offset[1]+Raise[1][0],
+                   Z[0]+View->Offset[2]+Raise[2][0]);
+        Palette2(View,ValMin,ValMax,V[3*View->TimeStep+1]);
+        glVertex3d(X[1]+View->Offset[0]+Raise[0][1],
+                   Y[1]+View->Offset[1]+Raise[1][1],
+                   Z[1]+View->Offset[2]+Raise[2][1]);
+        Palette2(View,ValMin,ValMax,V[3*View->TimeStep+2]);
+        glVertex3d(X[2]+View->Offset[0]+Raise[0][2],
+                   Y[2]+View->Offset[1]+Raise[1][2],
+                   Z[2]+View->Offset[2]+Raise[2][2]);
         glEnd();
       }
       else{
-        CutTriangle2D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep],
+        CutTriangle2D(X,Y,Z,&V[3*View->TimeStep],
                       ValMin,ValMax,ValMin,ValMax,
                       Xp,Yp,Zp,&nb,value);
         if(nb >= 3){      
@@ -306,7 +308,7 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
       for(k=0 ; k<View->NbIso ; k++){
         if(View->IntervalsType==DRAW_POST_DISCRETE){
           Palette(View,View->NbIso,k);
-          CutTriangle2D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep],
+          CutTriangle2D(X,Y,Z,&V[3*View->TimeStep],
                         View->GVFI(ValMin,ValMax,View->NbIso+1,k),
                         View->GVFI(ValMin,ValMax,View->NbIso+1,k+1),
                         ValMin,ValMax,
@@ -320,7 +322,7 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
           Palette(View,View->NbIso,k);
 
           thev = View->GVFI(ValMin,ValMax,View->NbIso,k);
-          CutTriangle1D(PT->X,PT->Y,PT->Z,&PT->V[3*View->TimeStep],
+          CutTriangle1D(X,Y,Z,&V[3*View->TimeStep],
                         thev, ValMin,ValMax,Xp,Yp,Zp,&nb);        
           if(nb == 2){
             for(i=0;i<2;i++) RaiseFill(i,thev,ValMin,Raise);
@@ -329,33 +331,56 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
         }
       }
     }
-    break;
-    
-  case DRAW_POST_VECTOR:
+
+  }
     
-    if(View->ArrowType == DRAW_POST_DISPLACEMENT){
-      fact = View->ArrowScale/100. ;
-      for(m=0;m<3;m++){
-        xx[m] = PT->X[m] + fact * PT->V[9*View->TimeStep + 3 * m ];
-        yy[m] = PT->Y[m] + fact * PT->V[9*View->TimeStep + 3 * m + 1];
-        zz[m] = PT->Z[m] + fact * PT->V[9*View->TimeStep + 3 * m + 2];
-      }
-      glEnable(GL_POLYGON_OFFSET_FILL);
-      glColor4ubv((GLubyte*)&CTX.color.bg);
-      if(View->IntervalsType!=DRAW_POST_ISO)
-        Draw_Polygon (3, xx, yy, zz, View->Offset, Raise);
-      glColor4ubv((GLubyte*)&CTX.color.fg);
-      glBegin(GL_LINE_LOOP);
-      for(m=0 ; m<3 ; m++) glVertex3d(xx[m], yy[m], zz[m]);
-      glEnd();
-      glDisable(GL_POLYGON_OFFSET_FILL);      
-      break;
+  if(View->ShowElement){
+    glDisable(GL_POLYGON_OFFSET_FILL) ;
+    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();
+  }
+
+}
+
+void Draw_VectorTriangle(Post_View *View, 
+			 double ValMin, double ValMax, double Raise[3][5],
+			 double *X, double *Y, double *Z, double *V){
+
+  int     i, k, m;
+  double  d,dx,dy,dz,fact;
+  double  xx[3],yy[3],zz[3];
+
+  if(View->ShowElement)
+    glEnable(GL_POLYGON_OFFSET_FILL);
+
+  if(View->ArrowType == DRAW_POST_DISPLACEMENT){
+    fact = View->ArrowScale/100. ;
+    for(m=0;m<3;m++){
+      xx[m] = X[m] + fact * V[9*View->TimeStep + 3 * m ];
+      yy[m] = Y[m] + fact * V[9*View->TimeStep + 3 * m + 1];
+      zz[m] = Z[m] + fact * V[9*View->TimeStep + 3 * m + 2];
     }
+    glEnable(GL_POLYGON_OFFSET_FILL);
+    glColor4ubv((GLubyte*)&CTX.color.bg);
+    if(View->IntervalsType!=DRAW_POST_ISO)
+      Draw_Polygon (3, xx, yy, zz, View->Offset, Raise);
+    glColor4ubv((GLubyte*)&CTX.color.fg);
+    glBegin(GL_LINE_LOOP);
+    for(m=0 ; m<3 ; m++) glVertex3d(xx[m], yy[m], zz[m]);
+    glEnd();
+    glDisable(GL_POLYGON_OFFSET_FILL);      
+  }
+  else{
     
     if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
-      dx = (PT->V[9*View->TimeStep]  +PT->V[9*View->TimeStep+3]+PT->V[9*View->TimeStep+6])/3.;
-      dy = (PT->V[9*View->TimeStep+1]+PT->V[9*View->TimeStep+4]+PT->V[9*View->TimeStep+7])/3.;
-      dz = (PT->V[9*View->TimeStep+2]+PT->V[9*View->TimeStep+5]+PT->V[9*View->TimeStep+8])/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.;
       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));            
@@ -367,18 +392,18 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
         }
         RaiseFill(0, d, ValMin, Raise);         
         Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-                    (PT->X[0] + PT->X[1] + PT->X[2])/3.,
-                    (PT->Y[0] + PT->Y[1] + PT->Y[2])/3.,
-                    (PT->Z[0] + PT->Z[1] + PT->Z[2])/3.,
+                    (X[0] + X[1] + X[2])/3.,
+                    (Y[0] + Y[1] + Y[2])/3.,
+                    (Z[0] + Z[1] + Z[2])/3.,
                     fact*d, fact*dx, fact*dy, fact*dz,
                     View->Offset, Raise);
       }
     }
     else{
       for(k=0 ; k<3 ; k++){
-        dx = PT->V[9*View->TimeStep  +3*k] ;
-        dy = PT->V[9*View->TimeStep+1+3*k] ;
-        dz = PT->V[9*View->TimeStep+2+3*k] ;              
+        dx = V[9*View->TimeStep  +3*k] ;
+        dy = V[9*View->TimeStep+1+3*k] ;
+        dz = V[9*View->TimeStep+2+3*k] ;              
         d = sqrt(dx*dx+dy*dy+dz*dz);
         
         if(d!=0.0 && d>=ValMin && d<=ValMax){           
@@ -391,18 +416,14 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
           }
           RaiseFill(0, d, ValMin, Raise);                                 
           Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-                      PT->X[k], PT->Y[k], PT->Z[k],
+                      X[k], Y[k], Z[k],
                       fact*d, fact*dx, fact*dy, fact*dz,
                       View->Offset, Raise);
           
         }               
       }       
     }
-    break;
-    
-  case DRAW_POST_TENSOR :
-    break;
-    
+
   }
 
   if(View->ShowElement){
@@ -410,98 +431,105 @@ void Draw_Post_Triangle(Post_View *View, Post_Simplex *PT,
     glColor4ubv((GLubyte*)&CTX.color.fg);
     glBegin(GL_LINE_LOOP);
     for(i=0 ; i<3 ; i++) 
-      glVertex3d(PT->X[i]+View->Offset[0]+Raise[0][i],
-                 PT->Y[i]+View->Offset[1]+Raise[1][i],
-                 PT->Z[i]+View->Offset[2]+Raise[2][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();
   }
 
 }
 
-
+void Draw_TensorTriangle(Post_View *View, 
+			 double ValMin, double ValMax, double Raise[3][5],
+			 double *X, double *Y, double *Z, double *V){
+}
 
 
 /* ------------------------------------------------------------------------ */
 /*  T e t r a h e d r a                                                     */
 /* ------------------------------------------------------------------------ */
 
-void Draw_Post_Tetrahedron(Post_View *View, Post_Simplex *PS, 
-                           double ValMin, double ValMax, double Raise[3][5]){
+void Draw_ScalarTetrahedron(Post_View *View, 
+			    double ValMin, double ValMax, double Raise[3][5],
+			    double *X, double *Y, double *Z, double *V){
+
+  int     k;
+
+  for(k=0 ; k<View->NbIso ; k++){
+    Palette(View,View->NbIso,k);
+    IsoSimplex(X, Y, Z, &V[4*View->TimeStep],
+	       View->GVFI(ValMin,ValMax,View->NbIso,k), 
+	       ValMin, ValMax, View->Offset, Raise, View->Light);
+  }
+
+}
+
+
+void Draw_VectorTetrahedron(Post_View *View, 
+			    double ValMin, double ValMax, double Raise[3][5],
+			    double *X, double *Y, double *Z, double *V){
 
   int     k;
   double  d,dx,dy,dz,fact;
 
-  switch(PS->Type){
-  case DRAW_POST_SCALAR:            
-    for(k=0 ; k<View->NbIso ; k++){
-      Palette(View,View->NbIso,k);
-      IsoSimplex(PS->X, PS->Y, PS->Z, &PS->V[4*View->TimeStep],
-                 View->GVFI(ValMin,ValMax,View->NbIso,k), 
-                 ValMin, ValMax, View->Offset, Raise, View->Light);
-    }
-    break;
+  /* 
+     la plus grande fleche (d=ValMax) est de taille CTX.lc/50
+     (View->ArrowScale == 100 par defaut)
+  */
     
-    /* 
-       la plus grande fleche (d=ValMax) est de taille CTX.lc/50
-       (View->ArrowScale == 100 par defaut)
-       */
+  if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
+    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] );
+    d = sqrt(dx*dx+dy*dy+dz*dz);
     
-  case DRAW_POST_VECTOR:            
-    if(View->ArrowLocation == DRAW_POST_LOCATE_COG){
-      dx = 0.25 * (PS->V[12*View->TimeStep]  +PS->V[12*View->TimeStep+3]+
-                   PS->V[12*View->TimeStep+6]+PS->V[12*View->TimeStep+9] );
-      dy = 0.25 * (PS->V[12*View->TimeStep+1]+PS->V[12*View->TimeStep+4]+
-                   PS->V[12*View->TimeStep+7]+PS->V[12*View->TimeStep+10] );
-      dz = 0.25 * (PS->V[12*View->TimeStep+2]+PS->V[12*View->TimeStep+5]+
-                   PS->V[12*View->TimeStep+8]+PS->V[12*View->TimeStep+11] );
-      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));
-        fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;            
-        if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
-          dx /= d ; dy /= d ; dz /= d ;
-          d = log10(d/ValMin) ; 
-          dx *= d ; dy *= d ; dz *= d ;
-        }
-        RaiseFill(0, d, ValMin, Raise);         
-        Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-                    0.25 * (PS->X[0] + PS->X[1] + PS->X[2] + PS->X[3]),
-                    0.25 * (PS->Y[0] + PS->Y[1] + PS->Y[2] + PS->Y[3]),
-                    0.25 * (PS->Z[0] + PS->Z[1] + PS->Z[2] + PS->Z[3]),
-                    fact*d, fact*dx, fact*dy, fact*dz,
-                    View->Offset, Raise);
+    if(d!=0.0 && d>=ValMin && d<=ValMax){             
+      Palette(View,View->NbIso,View->GIFV(ValMin,ValMax,View->NbIso,d));
+      fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;            
+      if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	dx /= d ; dy /= d ; dz /= d ;
+	d = log10(d/ValMin) ; 
+	dx *= d ; dy *= d ; dz *= d ;
       }
+      RaiseFill(0, d, ValMin, Raise);         
+      Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
+		  0.25 * (X[0] + X[1] + X[2] + X[3]),
+		  0.25 * (Y[0] + Y[1] + Y[2] + Y[3]),
+		  0.25 * (Z[0] + Z[1] + Z[2] + Z[3]),
+		  fact*d, fact*dx, fact*dy, fact*dz,
+		  View->Offset, Raise);
     }
-    else{
-      for(k=0 ; k<4 ; k++){
-        dx = PS->V[12*View->TimeStep  +3*k] ;
-        dy = PS->V[12*View->TimeStep+1+3*k] ;
-        dz = PS->V[12*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));
-          fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;          
-          if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
-            dx /= d ; dy /= d ; dz /= d ;
-            d = log10(d/ValMin) ; 
-            dx *= d ; dy *= d ; dz *= d ;
-          }
-          RaiseFill(0, d, ValMin, Raise);               
-          Draw_Vector(View->ArrowType, View->IntervalsType!=DRAW_POST_ISO,
-                      PS->X[k], PS->Y[k], PS->Z[k],
-                      fact*d, fact*dx, fact*dy, fact*dz,
-                      View->Offset, Raise);
-        }               
-      }       
-    }
-    break;
-    
-  case DRAW_POST_TENSOR :
-    break;
-    
+  }
+  else{
+    for(k=0 ; k<4 ; k++){
+      dx = V[12*View->TimeStep  +3*k] ;
+      dy = V[12*View->TimeStep+1+3*k] ;
+      dz = V[12*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));
+	fact = 2.e-4 * CTX.lc * View->ArrowScale/View->Max ;          
+	if(View->ScaleType == DRAW_POST_LOGARITHMIC && ValMin>0){
+	  dx /= d ; dy /= d ; dz /= d ;
+	  d = log10(d/ValMin) ; 
+	  dx *= d ; dy *= d ; dz *= d ;
+	}
+	RaiseFill(0, d, 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,
+		    View->Offset, Raise);
+      }               
+    }       
   }
 
 }
 
+void Draw_TensorTetrahedron(Post_View *View, 
+			    double ValMin, double ValMax, double Raise[3][5],
+			    double *X, double *Y, double *Z, double *V){
+}
diff --git a/Mesh/3D_BGMesh.cpp b/Mesh/3D_BGMesh.cpp
index 25611a513d2396a9e0590dde10d9def821d4e296..8b723e6cc39ab8f3b8860d4884b3d53265bb169f 100644
--- a/Mesh/3D_BGMesh.cpp
+++ b/Mesh/3D_BGMesh.cpp
@@ -1,4 +1,4 @@
-/* $Id: 3D_BGMesh.cpp,v 1.9 2000-11-26 15:43:46 geuzaine Exp $ */
+/* $Id: 3D_BGMesh.cpp,v 1.10 2000-11-27 10:58:56 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "Mesh.h"
@@ -123,10 +123,9 @@ static void AIG (void *a, void *b){
 }
 
 int BGMWithView (Post_View * ErrView){
-
   static Vertex *VertexUp, *v, V, *ver[4];
-  int i, j, k;
-  Post_Simplex s, t;
+  int i, j, k, nb;
+  double *X, *Y, *Z, *Val;
   Simplex *si;
 
   VertexUp = Create_Vertex (-1, 0., 0., 1., 1., -1.0);
@@ -138,50 +137,64 @@ int BGMWithView (Post_View * ErrView){
   m.Simplexes = Tree_Create (sizeof (Simplex *), compareSimplex);
   Create_BgMesh (ONFILE, .2, THEM);
 
+
   k = 1;
-  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
-    List_Read (ErrView->Triangles, i, &t);
-    for (j = 0; j < 3; j++){
-      v = &V;
-      v->Pos.X = t.X[j];
-      v->Pos.Y = t.Y[j];
-      v->Pos.Z = t.Z[j];
-      if (0 /*Tree_Query(Pts,&v) */ ){
-        /* Corriger la Lc pour lissage */
-        //ver[j] = v;
-      }
-      else{
-        v = Create_Vertex (k++, t.X[j], t.Y[j], t.Z[j], t.V[j], -1.0);
-        ver[j] = v;
-        Tree_Add (m.Vertices, &v);
-        Tree_Add (Pts, &v);
+  if(ErrView->NbST){
+    nb = List_Nbr(ErrView->ST) / ErrView->NbST ;
+    for(i = 0 ; i < List_Nbr(ErrView->ST) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->ST,i);
+      Y = (double*)List_Pointer_Fast(ErrView->ST,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->ST,i+6);
+      Val = (double*)List_Pointer_Fast(ErrView->ST,i+9);
+
+      for (j = 0; j < 3; j++){
+	v = &V;
+	v->Pos.X = X[j];
+	v->Pos.Y = Y[j];
+	v->Pos.Z = Z[j];
+	if (Tree_Query (Pts, &v)){
+	  ver[j] = v;
+	}
+	else{
+	  v = Create_Vertex (k++, X[j], Y[j], Z[j], Val[j], -1.0);
+	  ver[j] = v;
+	  Tree_Add (m.Vertices, &v);
+	  Tree_Add (Pts, &v);
+	}
       }
+      si = Create_Simplex (ver[0], ver[1], ver[2], VertexUp);
+      Tree_Add (m.Simplexes, &si);
     }
-    si = Create_Simplex (ver[0], ver[1], ver[2], VertexUp);
-    Tree_Add (m.Simplexes, &si);
   }
-  
-  for (i = 0; i < List_Nbr (ErrView->Tetrahedra); i++){
-    List_Read (ErrView->Tetrahedra, i, &s);
-    for (j = 0; j < 4; j++){
-      v = &V;
-      v->Pos.X = s.X[j];
-      v->Pos.Y = s.Y[j];
-      v->Pos.Z = s.Z[j];
-      if (Tree_Query (Pts, &v)){
-        ver[j] = v;
-      }
-      else{
-        v = Create_Vertex (k++, s.X[k], s.Y[j], s.Z[j], s.V[0], -1.0);
-        ver[j] = v;
-        Tree_Add (m.Vertices, &v);
-        Tree_Add (Pts, &v);
+
+  if(ErrView->NbSS){
+    nb = List_Nbr(ErrView->SS) / ErrView->NbSS ;
+    for(i = 0 ; i < List_Nbr(ErrView->SS) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->SS,i);
+      Y = (double*)List_Pointer_Fast(ErrView->SS,i+4);
+      Z = (double*)List_Pointer_Fast(ErrView->SS,i+8);
+      Val = (double*)List_Pointer_Fast(ErrView->SS,i+12);
+
+      for (j = 0; j < 4; j++){
+	v = &V;
+	v->Pos.X = X[j];
+	v->Pos.Y = Y[j];
+	v->Pos.Z = Z[j];
+	if (Tree_Query (Pts, &v)){
+	  ver[j] = v;
+	}
+	else{
+	  v = Create_Vertex (k++, X[j], Y[j], Z[j], Val[j], -1.0);
+	  ver[j] = v;
+	  Tree_Add (m.Vertices, &v);
+	  Tree_Add (Pts, &v);
+	}
       }
+      si = Create_Simplex (ver[0], ver[1], ver[2], ver[3]);
+      Tree_Add (m.Simplexes, &si);
     }
-    si = Create_Simplex (ver[0], ver[1], ver[2], ver[3]);
-    Tree_Add (m.Simplexes, &si);
   }
-  
+
   m.Grid.init = 0;
   m.Grid.Nx = 10;
   m.Grid.Ny = 10;
@@ -208,31 +221,42 @@ int BGMWithView (Post_View * ErrView){
 
 
 double ErrorInView (Post_View * ErrView, int *n){
-
-  Post_Simplex s, t;
-  double e, tot=0.0;
-  int i, j=0;
+  double e, tot=0.0, *X, *Y, *Z, *Val;
+  int i, j=0, nb;
 
   if(ErrView == NULL){
     Msg(WARNING, "Empty Error View");
     return 0.;
   }
 
-  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
-    List_Read (ErrView->Triangles, i, &t);
-    e = (t.V[0] + t.V[1] + t.V[2]) / 3. ;
-    tot += e * e;
-    j++;
+  if(ErrView->NbST){
+    nb = List_Nbr(ErrView->ST) / ErrView->NbST ;
+    for(i = 0 ; i < List_Nbr(ErrView->ST) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->ST,i);
+      Y = (double*)List_Pointer_Fast(ErrView->ST,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->ST,i+6);
+      Val = (double*)List_Pointer_Fast(ErrView->ST,i+9);
+      e = (Val[0] + Val[1] + Val[2]) / 3. ;
+      tot += e * e;
+      j++;
+    }
   }
 
-  for (i = 0; i < List_Nbr (ErrView->Tetrahedra); i++){
-    List_Read (ErrView->Tetrahedra, i, &s);
-    e = (t.V[0] + t.V[1] + t.V[2] + t.V[3]) * 0.25;
-    tot += e * e;
-    j++;
+  if(ErrView->NbSS){
+    nb = List_Nbr(ErrView->SS) / ErrView->NbSS ;
+    for(i = 0 ; i < List_Nbr(ErrView->SS) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->SS,i);
+      Y = (double*)List_Pointer_Fast(ErrView->SS,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->SS,i+8);
+      Val = (double*)List_Pointer_Fast(ErrView->SS,i+12);
+      e = (Val[0] + Val[1] + Val[2] + Val[3]) * 0.25 ;
+      tot += e * e;
+      j++;
+    }
   }
 
   *n = j;
+
   return 100 * sqrt (tot);
 }
 
@@ -243,20 +267,17 @@ double ErrorInView (Post_View * ErrView, int *n){
 
 int CreateBGM (Post_View * ErrView, int OptiMethod, double Degree,
                double OptiValue, double *ObjFunct, char *OutFile){
-
-  Post_Simplex s, t;
-  double *h, *p, *e, xc, yc, zc, c[3];
-  int N, i, j, dim;
+  double *h, *p, *e, xc, yc, zc, c[3], *X, *Y, *Z, *Val;
+  int N, i, j, dim, nb;
   Simplex smp;
   FILE *f;
 
-  if (List_Nbr (ErrView->Tetrahedra))
+  if (ErrView->NbSS)
     dim = 3;
   else
     dim = 2;
 
-  N = List_Nbr (ErrView->Tetrahedra) +
-    List_Nbr (ErrView->Triangles) + 2;
+  N = ErrView->NbSS + ErrView->NbST + 2;
 
   h = (double *) malloc (N * sizeof (double));
   e = (double *) malloc (N * sizeof (double));
@@ -264,40 +285,50 @@ int CreateBGM (Post_View * ErrView, int OptiMethod, double Degree,
 
   j = 0;
 
-  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
-    List_Read (ErrView->Triangles, i, &t);
-
-    /*
-      Attention, cette ligne est seulement valable en
-      2d x-y. Si plus, calculer le centre du cercle en
-      3d ou utiliser une autre mesure de taille.
-    */
-    CircumCircle (t.X[0], t.Y[0],
-                  t.X[1], t.Y[1],
-                  t.X[2], t.Y[2],
-                  &xc, &yc);
-    h[j + 1] = sqrt ((xc - t.X[0]) * (xc - t.X[0]) +
-                     (yc - t.Y[0]) * (yc - t.Y[0]));
-    p[j + 1] = Degree;
-    e[j + 1] = (t.V[0] + t.V[1] + t.V[2]) / 3. ;
-    j++;
+  if(ErrView->NbST){
+    nb = List_Nbr(ErrView->ST) / ErrView->NbST ;
+    for(i = 0 ; i < List_Nbr(ErrView->ST) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->ST,i);
+      Y = (double*)List_Pointer_Fast(ErrView->ST,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->ST,i+6);
+      Val = (double*)List_Pointer_Fast(ErrView->ST,i+9);
+      /*
+	Attention, cette ligne est seulement valable en
+	2d x-y. Si plus, calculer le centre du cercle en
+	3d ou utiliser une autre mesure de taille.
+      */
+      CircumCircle (X[0], Y[0],
+		    X[1], Y[1],
+		    X[2], Y[2],
+		    &xc, &yc);
+      h[j + 1] = sqrt ((xc - X[0]) * (xc - X[0]) +
+		       (yc - Y[0]) * (yc - Y[0]));
+      p[j + 1] = Degree;
+      e[j + 1] = (Val[0] + Val[1] + Val[2]) / 3. ;
+      j++;
+    }
   }
 
-  for (i = 0; i < List_Nbr (ErrView->Tetrahedra); i++){
-    List_Read (ErrView->Tetrahedra, i, &s);
-    
-    smp.center_tet (t.X, t.Y, t.Z, c);
+  if(ErrView->NbSS){
+    nb = List_Nbr(ErrView->SS) / ErrView->NbSS ;
+    for(i = 0 ; i < List_Nbr(ErrView->SS) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->SS,i);
+      Y = (double*)List_Pointer_Fast(ErrView->SS,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->SS,i+8);
+      Val = (double*)List_Pointer_Fast(ErrView->SS,i+12);
     
-    xc = c[0];
-    yc = c[1];
-    zc = c[2];
+      smp.center_tet (X, Y, Z, c);
+      xc = c[0];
+      yc = c[1];
+      zc = c[2];
     
-    h[j + 1] = sqrt ((xc - t.X[0]) * (xc - t.X[0]) +
-                     (yc - t.X[0]) * (yc - t.X[0]) +
-                     (zc - t.Y[0]) * (zc - t.Y[0]));
-    p[j + 1] = Degree;
-    e[j + 1] = (t.V[0] + t.V[1] + t.V[2] + t.V[3]) * 0.25;
-    j++;
+      h[j + 1] = sqrt ((xc - X[0]) * (xc - X[0]) +
+		       (yc - X[0]) * (yc - X[0]) +
+		       (zc - Y[0]) * (zc - Y[0]));
+      p[j + 1] = Degree;
+      e[j + 1] = (Val[0] + Val[1] + Val[2] + Val[3]) * 0.25;
+      j++;
+    }
   }
 
   *ObjFunct = AdaptMesh (j, OptiMethod, dim, e, h, p, OptiValue);
@@ -305,25 +336,40 @@ int CreateBGM (Post_View * ErrView, int OptiMethod, double Degree,
   f = fopen (OutFile, "w");
 
   fprintf (f, "View \"Auto_BGMesh\" Offset{0,0,0} {\n");
+
   j = 0;
-  for (i = 0; i < List_Nbr (ErrView->Triangles); i++){
-    List_Read (ErrView->Triangles, i, &t);
-    fprintf (f, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n",
-             t.X[0], t.Y[0], t.Z[0],
-             t.X[1], t.Y[1], t.Z[1],
-             t.X[2], t.Y[2], t.Z[2],
-             h[j], h[j], h[j]);
-    j++;
+
+  if(ErrView->NbST){
+    nb = List_Nbr(ErrView->ST) / ErrView->NbST ;
+    for(i = 0 ; i < List_Nbr(ErrView->ST) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->ST,i);
+      Y = (double*)List_Pointer_Fast(ErrView->ST,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->ST,i+6);
+      Val = (double*)List_Pointer_Fast(ErrView->ST,i+9);
+      fprintf (f, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n",
+	       X[0], Y[0], Z[0],
+	       X[1], Y[1], Z[1],
+	       X[2], Y[2], Z[2],
+	       h[j], h[j], h[j]);
+      j++;
+    }
   }
-  for (i = 0; i < List_Nbr (ErrView->Tetrahedra); i++){
-    List_Read (ErrView->Tetrahedra, i, &s);
-    fprintf (f, "SS(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g,%g};\n",
-             s.X[0], s.Y[0], s.Z[0],
-             s.X[1], s.Y[1], s.Z[1],
-             s.X[2], s.Y[2], s.Z[2],
-             s.X[3], s.Y[3], s.Z[3],
-             h[j], h[j], h[j], h[j]);
-    j++;
+
+  if(ErrView->NbSS){
+    nb = List_Nbr(ErrView->SS) / ErrView->NbSS ;
+    for(i = 0 ; i < List_Nbr(ErrView->SS) ; i+=nb){
+      X = (double*)List_Pointer_Fast(ErrView->SS,i);
+      Y = (double*)List_Pointer_Fast(ErrView->SS,i+3);
+      Z = (double*)List_Pointer_Fast(ErrView->SS,i+8);
+      Val = (double*)List_Pointer_Fast(ErrView->SS,i+12);
+      fprintf (f, "SS(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g,%g};\n",
+	       X[0], Y[0], Z[0],
+	       X[1], Y[1], Z[1],
+	       X[2], Y[2], Z[2],
+	       X[3], Y[3], Z[3],
+	       h[j], h[j], h[j], h[j]);
+      j++;
+    }
   }
   fprintf (f, "};\n");
   fclose (f);
@@ -331,5 +377,6 @@ int CreateBGM (Post_View * ErrView, int OptiMethod, double Degree,
   Msg(INFOS, "Background Mesh Wriiten in '%s'", OutFile); 
 
   return 1;
+
 }
 
diff --git a/Unix/CbGeneral.cpp b/Unix/CbGeneral.cpp
index 9bfd030a18f7e899de0b3614973adb7406865e5a..4968e1228f7ff8a57d624fb7b525a18c933b5ab5 100644
--- a/Unix/CbGeneral.cpp
+++ b/Unix/CbGeneral.cpp
@@ -1,4 +1,4 @@
-/* $Id: CbGeneral.cpp,v 1.4 2000-11-26 15:43:47 geuzaine Exp $ */
+/* $Id: CbGeneral.cpp,v 1.5 2000-11-27 10:58:59 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -107,10 +107,10 @@ void CurrentInfoCb (Widget w, XtPointer client_data, XtPointer call_data){
     for(i=0 ; i<List_Nbr(Post_ViewList) ; i++){
       v = (Post_View*)List_Pointer(Post_ViewList, i);
       if(v->Visible){
-	s[16] += List_Nbr(v->Points);
-	s[17] += List_Nbr(v->Lines);
-	s[18] += List_Nbr(v->Triangles);
-	s[19] += List_Nbr(v->Tetrahedra);
+	s[16] += v->NbSP + v->NbVP + v->NbTP;
+	s[17] += v->NbSL + v->NbVL + v->NbTL;
+	s[18] += v->NbST + v->NbVT + v->NbTT;
+	s[19] += v->NbSS + v->NbVS + v->NbTS;
       }
     }
     sprintf(label, "%g", s[16]); XtVaSetValues(VLAB(19));
diff --git a/Unix/CbPost.cpp b/Unix/CbPost.cpp
index c88ae5caebcabaa19fd902bb8564ff4c0e2db88e..6145dcc73f80160b18d74f9445400122528df758 100644
--- a/Unix/CbPost.cpp
+++ b/Unix/CbPost.cpp
@@ -1,4 +1,4 @@
-/* $Id: CbPost.cpp,v 1.6 2000-11-26 15:43:48 geuzaine Exp $ */
+/* $Id: CbPost.cpp,v 1.7 2000-11-27 10:58:59 geuzaine Exp $ */
 
 #include "Gmsh.h"
 #include "GmshUI.h"
@@ -129,10 +129,6 @@ void DuplicateViewCb (Widget w, XtPointer client_data, XtPointer call_data){
   }
 
   v2->Time        = v1->Time;
-  v2->Points      = v1->Points;
-  v2->Lines       = v1->Lines;
-  v2->Triangles   = v1->Triangles;
-  v2->Tetrahedra  = v1->Tetrahedra;
   v2->ScalarOnly  = v1->ScalarOnly;
   v2->Min         = v1->Min;       
   v2->Max         = v1->Max;