diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp index da6a4be22f0a7628ccc9dc96694b32866cf876c5..ef7924165b4dec974bd3e970ae26ad4c45881406 100644 --- a/Graphics/PostElement.cpp +++ b/Graphics/PostElement.cpp @@ -1,4 +1,4 @@ -// $Id: PostElement.cpp,v 1.8 2003-02-14 04:02:30 geuzaine Exp $ +// $Id: PostElement.cpp,v 1.9 2003-02-14 09:32:31 stainier Exp $ // // Copyright (C) 1997 - 2003 C. Geuzaine, J.-F. Remacle // @@ -834,12 +834,58 @@ void Draw_VectorPyramid(ARGS){ void Draw_TensorElement(int type, Post_View *View, double ValMin, double ValMax, double Raise[3][8], double *X, double *Y, double *Z, double *V){ - static int error=0 ; - if(!error){ - error = 1; - Msg(GERROR, "Tensor field visualization is not implemented"); - Msg(GERROR, "We *need* some ideas on how to implement this!"); - Msg(GERROR, "Send your ideas to <gmsh@geuz.org>!"); + int nbnod ; + + switch(type){ + case POINT : nbnod = 1; break; + case LINE : nbnod = 2; break; + case TRIANGLE : nbnod = 3; break; + case QUADRANGLE : nbnod = 4; break; + case TETRAHEDRON : nbnod = 4; break; + case HEXAHEDRON : nbnod = 8; break; + case PRISM : nbnod = 6; break; + case PYRAMID : nbnod = 5; break; + } + + /// we want to compute "von mises" value i.e. max eigenvalue + /// this will simply call the scalar function + if(View->TensorType == DRAW_POST_VONMISES){ + static const double THIRD = 1.e0/3.e0; + double V_VonMises [8]; + for(int i=0;i<nbnod;i++){ + double tr = (V[0+9*i]+V[4+9*i]+V[8+9*i])*THIRD; + double v11 = V[0+9*i]-tr; + double v12 = V[1+9*i]; + double v13 = V[2+9*i]; + double v21 = V[3+9*i]; + double v22 = V[4+9*i]-tr; + double v23 = V[5+9*i]; + double v31 = V[6+9*i]; + double v32 = V[7+9*i]; + double v33 = V[8+9*i]-tr; + V_VonMises[i] = sqrt (1.5 * ( v11*v11 + v12*v12 + v13*v13 + + v21*v21 + v22*v22 + v23*v23 + + v31*v31 + v32*v32 + v33*v33 ) ); + } + switch(type){ + case POINT : Draw_ScalarPoint(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case LINE : Draw_ScalarLine(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case TRIANGLE : Draw_ScalarTriangle(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case QUADRANGLE : Draw_ScalarQuadrangle(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case TETRAHEDRON : Draw_ScalarTetrahedron(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case HEXAHEDRON : Draw_ScalarHexahedron(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case PRISM : Draw_ScalarPrism(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + case PYRAMID : Draw_ScalarPyramid(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); break; + } + } + else { + static int error=0 ; + if(!error){ + error = 1; + Msg(GERROR, "Tensor field visualization is not implemented"); + Msg(GERROR, "We *need* some ideas on how to implement this!"); + Msg(GERROR, "Send your ideas to <gmsh@geuz.org>!"); + } } } @@ -852,6 +898,7 @@ void Draw_TensorPoint(ARGS){ void Draw_TensorLine(ARGS){ Draw_TensorElement(LINE, View, ValMin, ValMax, Raise, X, Y, Z, V); } void Draw_TensorTriangle(ARGS){ + /* /// we want to compute "von mises" value i.e. max eigenvalue /// this will simply call the scalar function if(View->TensorType == DRAW_POST_VONMISES){ @@ -866,7 +913,8 @@ void Draw_TensorTriangle(ARGS){ } Draw_ScalarTriangle(View, 0, ValMin, ValMax, Raise, X,Y,Z,V_VonMises); } -} + */ + Draw_TensorElement(TRIANGLE, View, ValMin, ValMax, Raise, X, Y, Z, V); } void Draw_TensorTetrahedron(ARGS){ Draw_TensorElement(TETRAHEDRON, View, ValMin, ValMax, Raise, X, Y, Z, V); } void Draw_TensorQuadrangle(ARGS){