Salome HOME
Fix of 0021175: EDF 1692 VISU: Scalar bar range is not good.
[modules/visu.git] / src / CONVERTOR / VISU_MeshValue.cxx
index 4b7a27850707429468f61c9506cbb62c8f8d458d..97c34f7c439fd30acdbb8effaf41a1044b01bdeb 100644 (file)
@@ -1,35 +1,37 @@
-//  VISU OBJECT : interactive object for VISU entities implementation
+//  Copyright (C) 2007-2010  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+//  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+//  This library is free software; you can redistribute it and/or
+//  modify it under the terms of the GNU Lesser General Public
+//  License as published by the Free Software Foundation; either
+//  version 2.1 of the License.
+//
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
 //
-//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  This library is free software; you can redistribute it and/or 
-//  modify it under the terms of the GNU Lesser General Public 
-//  License as published by the Free Software Foundation; either 
-//  version 2.1 of the License. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  License along with this library; if not, write to the Free Software 
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-// 
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+
+//  VISU OBJECT : interactive object for VISU entities implementation
 //  File:
 //  Author:
 //  Module : VISU
-
+//
 #include "VISU_MeshValue.hxx"
+#include "VISU_ElnoMeshValue.hxx"
 #include "VISU_Structures_impl.hxx"
 #include "VISU_ConvertorUtils.hxx"
 
 #include "VISU_PointCoords.hxx"
-#include "VISU_TypeList.hxx"
+#include "VISU_VTKTypeList.hxx"
 
 #include <vtkUnstructuredGrid.h>
 #include <vtkPolyData.h>
@@ -44,9 +46,9 @@
 #include <vtkIntArray.h>
 #include <vtkUnsignedIntArray.h>
 #include <vtkLongArray.h>
-#include <vtkUnsignedLongArray.h> 
-#include <vtkFloatArray.h> 
-#include <vtkDoubleArray.h> 
+#include <vtkUnsignedLongArray.h>
+#include <vtkFloatArray.h>
+#include <vtkDoubleArray.h>
 
 #include <string>
 #include <algorithm>
@@ -62,10 +64,10 @@ namespace VISU
   //---------------------------------------------------------------
   std::string
   GenerateFieldName(const PFieldImpl& theField,
-                   const PValForTimeImpl& theValForTime)
+                    const PValForTimeImpl& theValForTime)
   {
     const VISU::TTime& aTime = theValForTime->myTime;
-    std::string aFieldName = theField->myMeshName + ", " + theField->myName + ": " + 
+    std::string aFieldName = theField->myMeshName + ", " + theField->myName + ": " +
       VISU_Convertor::GenerateName(aTime);
     return aFieldName;
   }
@@ -75,8 +77,8 @@ namespace VISU
   void
   TMeshValueBase
   ::Init(vtkIdType theNbElem,
-        vtkIdType theNbGauss,
-        vtkIdType theNbComp)
+         vtkIdType theNbGauss,
+         vtkIdType theNbComp)
   {
     myNbElem = theNbElem;
     myNbGauss = theNbGauss;
@@ -84,28 +86,28 @@ namespace VISU
     myStep = theNbComp*theNbGauss;
   }
 
-  vtkIdType 
+  vtkIdType
   TMeshValueBase
   ::GetNbElem() const
   {
     return myNbElem;
   }
 
-  vtkIdType 
+  vtkIdType
   TMeshValueBase
   ::GetNbComp() const
   {
     return myNbComp;
   }
 
-  vtkIdType 
+  vtkIdType
   TMeshValueBase
   ::GetNbGauss() const
   {
     return myNbGauss;
   }
 
-  size_t 
+  size_t
   TMeshValueBase
   ::size() const
   {
@@ -113,91 +115,21 @@ namespace VISU
   }
 
 
-  namespace TL
-  {
-    //----------------------------------------------------------------------------
-    typedef TList<char,
-                 TList<unsigned char,
-                       TList<short,
-                             TList<unsigned short,
-                                   TList<int,
-                                         TList<unsigned int,
-                                               TList<long,
-                                                     TList<unsigned long, 
-                                                           TList<float, 
-                                                                 TList<double, 
-                                                                       TNullType> > > > > > > > > >
-    TVTKBasicTypeList;
-    
-
-    //----------------------------------------------------------------------------
-    typedef TList<vtkCharArray,
-                 TList<vtkUnsignedCharArray,
-                       TList<vtkShortArray,
-                             TList<vtkUnsignedShortArray,
-                                   TList<vtkIntArray,
-                                         TList<vtkUnsignedIntArray,
-                                               TList<vtkLongArray,
-                                                     TList<vtkUnsignedLongArray, 
-                                                           TList<vtkFloatArray, 
-                                                                 TList<vtkDoubleArray, 
-                                                                             TNullType> > > > > > > > > >
-    TVTKArrayTypeList;
-    
-
-    typedef TList<TInt2Type<VTK_CHAR>,
-                 TList<TInt2Type<VTK_UNSIGNED_CHAR>,
-                       TList<TInt2Type<VTK_SHORT>,
-                             TList<TInt2Type<VTK_UNSIGNED_SHORT>,
-                                   TList<TInt2Type<VTK_INT>,
-                                         TList<TInt2Type<VTK_UNSIGNED_INT>,
-                                               TList<TInt2Type<VTK_LONG>,
-                                                     TList<TInt2Type<VTK_UNSIGNED_LONG>,
-                                                           TList<TInt2Type<VTK_FLOAT>, 
-                                                                 TList<TInt2Type<VTK_DOUBLE>, 
-                                                                       TNullType> > > > > > > > > >
-    TVTKBasicEnumList;
-    
-
-    //----------------------------------------------------------------------------
-    template <unsigned int type_enum>
-    struct TEnum2VTKBasicType
-    {
-      typedef typename TTypeAt<TVTKBasicTypeList, TIndexOf<TVTKBasicEnumList, TInt2Type<type_enum> >::value >::TResult TResult;
-    };
-    
-    //----------------------------------------------------------------------------
-    template <unsigned int type_enum>
-    struct TEnum2VTKArrayType
-    {
-      typedef typename TTypeAt<TVTKArrayTypeList, TIndexOf<TVTKBasicEnumList, TInt2Type<type_enum> >::value >::TResult TResult;
-    };
-    
-    //----------------------------------------------------------------------------
-    template <class T>
-    struct TVTKBasicType2Enum
-    {
-      typedef typename TTypeAt<TVTKBasicEnumList, TIndexOf<TVTKBasicTypeList, T>::value >::TResult TResult;
-    };
-    
-  }
-
-
   //----------------------------------------------------------------------------
   template<int EDataType>
-  void 
+  void
   InitTimeStampOnProfile(const PUnstructuredGrid& theSource,
-                        const PFieldImpl& theField, 
-                        const PValForTimeImpl& theValForTime,
-                        const VISU::TEntity& theEntity);
+                         const PFieldImpl& theField,
+                         const PValForTimeImpl& theValForTime,
+                         const VISU::TEntity& theEntity);
 
 
   //----------------------------------------------------------------------------
-  void 
+  void
   GetTimeStampOnProfile(const PUnstructuredGrid& theSource,
-                       const PFieldImpl& theField, 
-                       const PValForTimeImpl& theValForTime,
-                       const VISU::TEntity& theEntity)
+                        const PFieldImpl& theField,
+                        const PValForTimeImpl& theValForTime,
+                        const VISU::TEntity& theEntity)
   {
     vtkIdType aDataType = theField->GetDataType();
     switch(aDataType){
@@ -215,7 +147,7 @@ namespace VISU
       break;
     default:
       EXCEPTION(std::runtime_error,
-               "GetTimeStampOnProfile - handling unsupported data type - "<<aDataType);
+                "GetTimeStampOnProfile - handling unsupported data type - "<<aDataType);
     }
   }
 
@@ -231,23 +163,23 @@ namespace VISU
     TDataArrayHolder(TVTKDataArray* theDataArray):
       myDataArray(theDataArray)
     {}
-    
+
     void
     WritePointer(TVTKDataArray* theDataArray,
-                vtkIdType theTupleId,
-                TVTKBasicType* thePointer)
+                 vtkIdType theTupleId,
+                 TVTKBasicType* thePointer)
     {
       vtkIdType aNumberOfComponents = theDataArray->GetNumberOfComponents();
       vtkIdType aPosition = theTupleId * aNumberOfComponents;
       TVTKBasicType *aPtr = theDataArray->WritePointer(aPosition, aNumberOfComponents);
       for(vtkIdType anId = 0; anId < aNumberOfComponents; anId++)
-       *aPtr++ = *thePointer++;
+        *aPtr++ = *thePointer++;
     }
 
     virtual
     void
-    SetTuple(vtkIdType theTupleId, 
-            TVTKBasicType* thePointer)
+    SetTuple(vtkIdType theTupleId,
+             TVTKBasicType* thePointer)
     {
       this->WritePointer(myDataArray, theTupleId, thePointer);
     }
@@ -264,15 +196,15 @@ namespace VISU
     TVTKDataArray* myDataArray2;
 
     TDataArrayHolder2(TVTKDataArray* theDataArray,
-                     TVTKDataArray* theDataArray2):
+                      TVTKDataArray* theDataArray2):
       TSuperClass(theDataArray),
       myDataArray2(theDataArray2)
     {}
-    
+
     virtual
     void
-    SetTuple(vtkIdType theTupleId, 
-            TVTKBasicType* thePointer)
+    SetTuple(vtkIdType theTupleId,
+             TVTKBasicType* thePointer)
     {
       this->WritePointer(this->myDataArray, theTupleId, thePointer);
       this->WritePointer(this->myDataArray2, theTupleId, thePointer);
@@ -296,42 +228,137 @@ namespace VISU
     TTimeStampOnProfileInitArray(const PDataArrayHolder& theDataArrayHolder):
       myDataArrayHolder(theDataArrayHolder)
     {}
-    
+
     void
     Execute(const PFieldImpl& theField,
-           const PValForTimeImpl& theValForTime)
+            const PValForTimeImpl& theValForTime,
+            const TGaussMetric theGaussMetric = VISU::AVERAGE_METRIC)
     {
       vtkIdType aNbComp = theField->myNbComp;
-      vtkIdType aSize = std::max(3, aNbComp);
-      TVector<TVTKBasicType> aDataValues(aSize);
-      
+      vtkIdType aSize = std::max(vtkIdType(3), aNbComp);
+      TVector<TVTKBasicType> aDataValues (aSize);
+
+      const TGeom2MeshValue& aGeom2MeshValue = theValForTime->GetGeom2MeshValue();
+      TGeom2MeshValue::const_iterator anIter = aGeom2MeshValue.begin();
+      for (int aTupleId = 0; anIter != aGeom2MeshValue.end(); anIter++) {
+        EGeometry aEGeom = anIter->first;
+        const TMeshValuePtr aMeshValue = anIter->second;
+
+        vtkIdType aNbElem = aMeshValue->GetNbElem();
+        vtkIdType aNbGauss = aMeshValue->GetNbGauss();
+
+        INITMSG(MYDEBUG,
+                "- aEGeom = "<<aEGeom<<
+                "; aNbElem = "<<aNbElem<<
+                "; aNbGauss = "<<aNbGauss<<
+                std::endl);
+
+        for (vtkIdType iElem = 0; iElem < aNbElem; iElem++, aTupleId++) {
+          typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetCompValueSliceArr(iElem);
+
+          for (vtkIdType iComp = 0; iComp < aNbComp; iComp++) {
+            const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iComp];
+            //jfa//aDataValues[iComp] = TVTKBasicType();
+            for (vtkIdType iGauss = 0; iGauss < aNbGauss; iGauss++) {
+              TVTKBasicType aValue = aValueSlice[iGauss];
+              //jfa//if (iGauss == 0 && theGaussMetric != VISU::AVERAGE_METRIC) {
+              if (iGauss == 0) {
+                aDataValues[iComp] = aValue; // init
+              }
+              else {
+                switch (theGaussMetric) {
+                  case VISU::AVERAGE_METRIC:
+                    aDataValues[iComp] += aValue; break;
+                  case VISU::MINIMUM_METRIC:
+                    aDataValues[iComp] = std::min( aValue, aDataValues[iComp] ); break;
+                  case VISU::MAXIMUM_METRIC:
+                    aDataValues[iComp] = std::max( aValue, aDataValues[iComp] ); break;
+                }
+              }
+            }
+            if (theGaussMetric == VISU::AVERAGE_METRIC)
+              aDataValues[iComp] /= aNbGauss;
+          }
+
+          this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
+        }
+      }
+    }
+  };
+
+  template<int EDataType>
+  struct TTimeStampOnProfileInitModulus
+  {
+    typedef typename TL::TEnum2VTKArrayType<EDataType>::TResult TVTKDataArray;
+    typedef typename TL::TEnum2VTKBasicType<EDataType>::TResult TVTKBasicType;
+    typedef TTMeshValue<TVTKBasicType> TMeshValue;
+    typedef MED::SharedPtr<TMeshValue> TMeshValuePtr;
+
+    typedef TDataArrayHolder<EDataType> TTDataArrayHolder;
+    typedef MED::SharedPtr<TTDataArrayHolder> PDataArrayHolder;
+    PDataArrayHolder myDataArrayHolder;
+
+    TTimeStampOnProfileInitModulus(const PDataArrayHolder& theDataArrayHolder):
+      myDataArrayHolder(theDataArrayHolder)
+    {}
+
+    void
+    Execute(const PFieldImpl& theField, const PValForTimeImpl& theValForTime)
+    {
+      vtkIdType aNbComp = theField->myNbComp;
+      vtkIdType aSize = vtkIdType(3); // Minimum, Maximum and Average modulus
+      TVector<TVTKBasicType> aDataValues (aSize);
+
       const TGeom2MeshValue& aGeom2MeshValue = theValForTime->GetGeom2MeshValue();
       TGeom2MeshValue::const_iterator anIter = aGeom2MeshValue.begin();
-      for(int aTupleId = 0; anIter != aGeom2MeshValue.end(); anIter++){
-       EGeometry aEGeom = anIter->first;
-       const TMeshValuePtr aMeshValue = anIter->second;
-       
-       vtkIdType aNbElem = aMeshValue->GetNbElem();
-       vtkIdType aNbGauss = aMeshValue->GetNbGauss();
-       
-       INITMSG(MYDEBUG,
-               "- aEGeom = "<<aEGeom<<
-               "; aNbElem = "<<aNbElem<<
-               "; aNbGauss = "<<aNbGauss<<
-               std::endl);
-       
-       for(vtkIdType iElem = 0; iElem < aNbElem; iElem++, aTupleId++){
-         typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetCompValueSliceArr(iElem);
-         for(vtkIdType iComp = 0; iComp < aNbComp; iComp++){
-           const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iComp];
-           aDataValues[iComp] = TVTKBasicType();
-           for(vtkIdType iGauss = 0; iGauss < aNbGauss; iGauss++){
-             aDataValues[iComp] += aValueSlice[iGauss];
-           }
-           aDataValues[iComp] /= aNbGauss;
-         }
-         this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
-       }
+      for (int aTupleId = 0; anIter != aGeom2MeshValue.end(); anIter++) {
+        EGeometry aEGeom = anIter->first;
+        const TMeshValuePtr aMeshValue = anIter->second;
+
+        vtkIdType aNbElem = aMeshValue->GetNbElem();
+        vtkIdType aNbGauss = aMeshValue->GetNbGauss();
+
+        INITMSG(MYDEBUG,
+                "- aEGeom = "<<aEGeom<<
+                "; aNbElem = "<<aNbElem<<
+                "; aNbGauss = "<<aNbGauss<<
+                std::endl);
+
+        for (vtkIdType iElem = 0; iElem < aNbElem; iElem++, aTupleId++) {
+          typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetCompValueSliceArr(iElem);
+
+          // modules of all gauss points
+          TVector<TVTKBasicType> aModules (aNbGauss);
+
+          for (vtkIdType iComp = 0; iComp < aNbComp; iComp++) {
+            const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iComp];
+            for (vtkIdType iGauss = 0; iGauss < aNbGauss; iGauss++) {
+              TVTKBasicType aValue = aValueSlice[iGauss];
+
+              // modules of all gauss points
+              if (iComp == 0)
+                aModules[iGauss] = aValue * aValue; // init
+              else
+                aModules[iGauss] += aValue * aValue;
+            }
+          }
+
+          TVTKBasicType aModule = (TVTKBasicType)sqrt((double)aModules[0]);
+          aDataValues[0] = aModule; // init Min
+          aDataValues[1] = aModule; // init Max
+          aDataValues[2] = aModule; // init Average
+
+          for (vtkIdType ig = 0; ig < aNbGauss; ig++) {
+            aModule = (TVTKBasicType)sqrt((double)aModules[ig]);
+
+            aDataValues[0] = std::min(TVTKBasicType(aModule), aDataValues[0]); // Min
+            aDataValues[1] = std::max(TVTKBasicType(aModule), aDataValues[1]); // Max
+            aDataValues[2] += aModule;                                         // Average
+          }
+          aDataValues[2] /= aNbGauss; // Average
+
+          this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
+        }
       }
     }
   };
@@ -339,97 +366,196 @@ namespace VISU
 
   //----------------------------------------------------------------------------
   template<int EDataType>
-  void 
+  void
   InitTimeStampOnProfile(const PUnstructuredGrid& theSource,
-                        const PFieldImpl& theField, 
-                        const PValForTimeImpl& theValForTime,
-                        const VISU::TEntity& theEntity)
+                         const PFieldImpl& theField,
+                         const PValForTimeImpl& theValForTime,
+                         const VISU::TEntity& theEntity)
   {
     vtkIdType aNbTuples = theField->myDataSize / theField->myNbComp;
     std::string aFieldName = VISU::GenerateFieldName(theField, theValForTime);
-    
+
     vtkDataSetAttributes* aDataSetAttributes;
-    switch(theEntity){
-    case VISU::NODE_ENTITY : 
+    switch ( theEntity ) {
+    case VISU::NODE_ENTITY :
       aDataSetAttributes = theSource->GetPointData();
       break;
-    default: 
+    default:
       aDataSetAttributes = theSource->GetCellData();
     }
 
     typedef typename TL::TEnum2VTKArrayType<EDataType>::TResult TVTKDataArray;
     TVTKDataArray *aSelectedDataArray = TVTKDataArray::New();
     vtkIdType aNbComp = theField->myNbComp;
-    switch(aNbComp) {
+
+    switch ( aNbComp ) {
     case 1:
-      aSelectedDataArray->SetNumberOfComponents(1);
-      aDataSetAttributes->SetScalars(aSelectedDataArray);
+      aSelectedDataArray->SetNumberOfComponents( 1 );
+      aDataSetAttributes->SetScalars( aSelectedDataArray );
       break;
     default:
-      aSelectedDataArray->SetNumberOfComponents(3);
-      aDataSetAttributes->SetVectors(aSelectedDataArray);
+      aSelectedDataArray->SetNumberOfComponents( 3 );
+      aDataSetAttributes->SetVectors( aSelectedDataArray );
     }
-    aSelectedDataArray->SetNumberOfTuples(aNbTuples);
-    aSelectedDataArray->SetName(aFieldName.c_str());
+    aSelectedDataArray->SetNumberOfTuples( aNbTuples );
+    aSelectedDataArray->SetName( aFieldName.c_str() );
 
     TVTKDataArray *aFullDataArray = TVTKDataArray::New();
-    aFullDataArray->SetNumberOfComponents(aNbComp);
-    aFullDataArray->SetNumberOfTuples(aNbTuples);
-    aFullDataArray->SetName("VISU_FIELD");
-    aDataSetAttributes->AddArray(aFullDataArray);
+    aFullDataArray->SetNumberOfComponents( aNbComp );
+    aFullDataArray->SetNumberOfTuples( aNbTuples );
+    aFullDataArray->SetName( "VISU_FIELD" );
+    aDataSetAttributes->AddArray( aFullDataArray );
 
     INITMSG(MYDEBUG,"InitTimeStampOnProfile "<<
-           "- theEntity = "<<theEntity<<
-           "; aNbTuples = "<<aNbTuples<<
-           "; aNbComp = "<<aNbComp<<
-           std::endl);
+            "- theEntity = "<<theEntity<<
+            "; aNbTuples = "<<aNbTuples<<
+            "; aNbComp = "<<aNbComp<<
+            std::endl);
+
     TTimerLog aTimerLog(MYDEBUG,"InitTimeStampOnProfile");
-    
+
     const TGeom2MeshValue& aGeom2MeshValue = theValForTime->GetGeom2MeshValue();
-    typedef typename TL::TEnum2VTKBasicType<EDataType>::TResult TVTKBasicType;
-    typedef TTMeshValue<TVTKBasicType> TMeshValue;
-    typedef MED::SharedPtr<TMeshValue> TMeshValuePtr;
+    typedef typename TL::TEnum2VTKBasicType< EDataType >::TResult TVTKBasicType;
+    typedef TTMeshValue< TVTKBasicType > TMeshValue;
+    typedef MED::SharedPtr< TMeshValue > TMeshValuePtr;
 
-    typedef TDataArrayHolder<EDataType> TTDataArrayHolder;
-    typedef MED::SharedPtr<TTDataArrayHolder> PDataArrayHolder;
+    typedef TDataArrayHolder< EDataType > TTDataArrayHolder;
+    typedef MED::SharedPtr< TTDataArrayHolder > PDataArrayHolder;
 
     TMeshValuePtr aMeshValue = theValForTime->GetFirstMeshValue();
-    if(aGeom2MeshValue.size() == 1 && aMeshValue->GetNbGauss() == 1){
+    if ( aGeom2MeshValue.size() == 1 && aMeshValue->GetNbGauss() == 1 ) {
       aFullDataArray->SetVoidArray(aMeshValue->GetPointer(),
-                                  aMeshValue->size(),
-                                  true);
+                                   aMeshValue->size(),
+                                   true);
       INITMSG(MYDEBUG,"InitTimeStampOnProfile - aFullDataArray->SetVoidArray()"<<std::endl);
-      if(aNbComp == 1){
-       aSelectedDataArray->SetVoidArray(aMeshValue->GetPointer(),
-                                        aMeshValue->size(),
-                                        true);
-       INITMSG(MYDEBUG,"InitTimeStampOnProfile - aSelectedDataArray->SetVoidArray()"<<std::endl);
+      if ( aNbComp == 1 ) {
+        aSelectedDataArray->SetVoidArray( aMeshValue->GetPointer(),
+                                          aMeshValue->size(),
+                                          true );
+        INITMSG(MYDEBUG,"InitTimeStampOnProfile - aSelectedDataArray->SetVoidArray()"<<std::endl);
       }else{
-       PDataArrayHolder aDataArrayHolder(new TTDataArrayHolder(aSelectedDataArray));
-       TTimeStampOnProfileInitArray<EDataType>(aDataArrayHolder).Execute(theField, theValForTime);
+        PDataArrayHolder aDataArrayHolder(new TTDataArrayHolder(aSelectedDataArray));
+        TTimeStampOnProfileInitArray<EDataType>(aDataArrayHolder).Execute(theField, theValForTime);
       }
-    }else{
+    }
+    else {
       typedef TDataArrayHolder2<EDataType> TTDataArrayHolder2;
       PDataArrayHolder aDataArrayHolder(new TTDataArrayHolder2(aSelectedDataArray, aFullDataArray));
       TTimeStampOnProfileInitArray<EDataType>(aDataArrayHolder).Execute(theField, theValForTime);
+
+      if ( theValForTime->GetMaxNbGauss() > 1 ) { // at least one of geometry contains multiple gauss points
+        TVTKDataArray *aGaussMinDataArray = TVTKDataArray::New();
+        aGaussMinDataArray->SetNumberOfComponents( aNbComp );
+        aGaussMinDataArray->SetNumberOfTuples( aNbTuples );
+        aGaussMinDataArray->SetName( "VISU_FIELD_GAUSS_MIN" );
+        aDataSetAttributes->AddArray( aGaussMinDataArray );
+
+        PDataArrayHolder aGaussMinDataArrayHolder(new TTDataArrayHolder(aGaussMinDataArray));
+        TTimeStampOnProfileInitArray<EDataType>(aGaussMinDataArrayHolder).Execute
+          (theField, theValForTime, VISU::MINIMUM_METRIC);
+        aGaussMinDataArray->Delete();
+
+        TVTKDataArray *aGaussMaxDataArray = TVTKDataArray::New();
+        aGaussMaxDataArray->SetNumberOfComponents( aNbComp );
+        aGaussMaxDataArray->SetNumberOfTuples( aNbTuples );
+        aGaussMaxDataArray->SetName( "VISU_FIELD_GAUSS_MAX" );
+        aDataSetAttributes->AddArray( aGaussMaxDataArray );
+
+        PDataArrayHolder aGaussMaxDataArrayHolder(new TTDataArrayHolder(aGaussMaxDataArray));
+        TTimeStampOnProfileInitArray<EDataType>(aGaussMaxDataArrayHolder).Execute
+          (theField, theValForTime, VISU::MAXIMUM_METRIC);
+        aGaussMaxDataArray->Delete();
+
+        TVTKDataArray *aGaussModulusDataArray = TVTKDataArray::New();
+        aGaussModulusDataArray->SetNumberOfComponents( 3 ); // Min, Max and Average
+        aGaussModulusDataArray->SetNumberOfTuples( aNbTuples );
+        aGaussModulusDataArray->SetName( "VISU_FIELD_GAUSS_MOD" );
+        aDataSetAttributes->AddArray( aGaussModulusDataArray );
+
+        PDataArrayHolder aGaussModulusDataArrayHolder(new TTDataArrayHolder(aGaussModulusDataArray));
+        TTimeStampOnProfileInitModulus<EDataType>(aGaussModulusDataArrayHolder).Execute
+          (theField, theValForTime);
+        aGaussModulusDataArray->Delete();
+      }
     }
 
     aSelectedDataArray->Delete();
     aFullDataArray->Delete();
+
+    // Process the case for ELNO data
+    //-------------------------------
+    if ( theField->myIsELNO ) {
+      // To calculate effective number of components for the VTK compatibel ELNO data representation
+      vtkIdType aEffectNbTuples = 0;
+      TGeom2MeshValue::const_iterator anIter = aGeom2MeshValue.begin();
+      for ( ; anIter != aGeom2MeshValue.end(); anIter++ ) {
+        const PMeshValue& aMeshValue = anIter->second;
+        aEffectNbTuples += aMeshValue->GetNbElem() * aMeshValue->GetNbGauss();
+      }
+
+      vtkIdType anEffectNbComp = ( aEffectNbTuples * aNbComp ) / aNbTuples + 1;
+
+      // To create corresponding VTK representation for the ELNO data
+      TSetElnoNodeData< EDataType > aSetElnoNodeData( anEffectNbComp,
+                                                      aNbComp,
+                                                      aNbTuples,
+                                                      "ELNO_FIELD",
+                                                      "ELNO_COMPONENT_MAPPER" );
+
+      std::vector< TVTKBasicType > aDataValues( aNbComp ); // To reserve a temproary value holder
+
+      // To initilize these VTK representation for the ELNO data from the MED
+      anIter = aGeom2MeshValue.begin();
+      for ( ; anIter != aGeom2MeshValue.end(); anIter++ ) {
+        EGeometry aEGeom = anIter->first;
+        const TMeshValuePtr aMeshValue = anIter->second;
+
+        vtkIdType aNbElem = aMeshValue->GetNbElem();
+        vtkIdType aNbGauss = aMeshValue->GetNbGauss();
+
+        INITMSG(MYDEBUG,
+                "- aEGeom = "<<aEGeom<<
+                "; aNbElem = "<<aNbElem<<
+                "; aNbGauss = "<<aNbGauss<<
+                std::endl);
+        std::vector<int> med2visu(aNbGauss);
+        InitMed2VisuArray(med2visu,aEGeom);
+        for ( vtkIdType iElem = 0; iElem < aNbElem; iElem++ ) {
+          const typename TMeshValue::TValueSliceArr& aValueSliceArr =
+            aMeshValue->GetGaussValueSliceArr( iElem );
+
+          for( vtkIdType iGauss = 0; iGauss < aNbGauss; iGauss++ ) {
+            const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[ med2visu[iGauss] ];
+
+            for( vtkIdType iComp = 0; iComp < aNbComp; iComp++ ) {
+              aDataValues[ iComp ] = aValueSlice[ iComp ];
+            }
+
+            aSetElnoNodeData.AddNextPointData( &aDataValues[ 0 ] );
+          }
+
+          aSetElnoNodeData.InsertNextCellData();
+        }
+      }
+
+      // Assign the ELNO data on the corresponding VTK data set attribute
+      aSetElnoNodeData.AddData( aDataSetAttributes );
+    }
+    //-------------------------------
   }
 
 
   //----------------------------------------------------------------------------
   template<int EDataType>
-  void 
+  void
   InitTimeStampOnGaussMesh(const PPolyData& theSource,
-                          const PFieldImpl& theField, 
-                          const PValForTimeImpl& theValForTime);
+                           const PFieldImpl& theField,
+                           const PValForTimeImpl& theValForTime);
 
-  void 
+  void
   GetTimeStampOnGaussMesh(const PPolyData& theSource,
-                         const PFieldImpl& theField, 
-                         const PValForTimeImpl& theValForTime)
+                          const PFieldImpl& theField,
+                          const PValForTimeImpl& theValForTime)
   {
     vtkIdType aDataType = theField->GetDataType();
     switch(aDataType){
@@ -447,7 +573,7 @@ namespace VISU
       break;
     default:
       EXCEPTION(std::runtime_error,
-               "GetTimeStampOnGaussMesh - handling unsupported data type - "<<aDataType);
+                "GetTimeStampOnGaussMesh - handling unsupported data type - "<<aDataType);
     }
   }
 
@@ -467,13 +593,13 @@ namespace VISU
     TTimeStampOnGaussMeshInitArray(const PDataArrayHolder& theDataArrayHolder):
       myDataArrayHolder(theDataArrayHolder)
     {}
-    
+
     void
     Execute(const PFieldImpl& theField,
-           const PValForTimeImpl& theValForTime)
+            const PValForTimeImpl& theValForTime)
     {
       vtkIdType aNbComp = theField->myNbComp;
-      vtkIdType aSize = std::max(3, aNbComp);
+      vtkIdType aSize = std::max(vtkIdType(3), aNbComp);
       TVector<TVTKBasicType> aDataValues(aSize);
 
       const TGeom2MeshValue& aGeom2MeshValue = theValForTime->GetGeom2MeshValue();
@@ -482,68 +608,68 @@ namespace VISU
       const TGeom2GaussSubMesh& aGeom2GaussSubMesh = aGaussMesh->myGeom2GaussSubMesh;
       TGeom2GaussSubMesh::const_iterator anIter = aGeom2GaussSubMesh.begin();
       for(int aTupleId = 0; anIter != aGeom2GaussSubMesh.end(); anIter++){
-       EGeometry aEGeom = anIter->first;
-       
-       PGaussSubMeshImpl aGaussSubMesh = anIter->second;
-       if(!aGaussSubMesh->myIsDone)
-         continue;
-       
-       TGeom2MeshValue::const_iterator anIter2 = aGeom2MeshValue.find(aEGeom);
-       if(anIter2 == aGeom2MeshValue.end()){
-         EXCEPTION(std::runtime_error,
-                   "TTimeStampOnGaussMeshInitArray >> Can't find values for corresponding Gauss Points SubMesh");
-       }
-       TMeshValuePtr aMeshValue = anIter2->second;
-       vtkIdType aNbGauss = aMeshValue->GetNbGauss();
-       vtkIdType aNbElem = aMeshValue->GetNbElem();
-       
-       if(aNbGauss < 1)
-         continue;
-       
-       const TPointCoords& aCoords = aGaussSubMesh->myPointCoords;
-       
-       INITMSG(MYDEBUG,
-               "- aEGeom = "<<aEGeom<<
-               "; aNbElem = "<<aNbElem<<
-               "; aNbGauss = "<<aNbGauss<<
-               "; aCoords.GetNbPoints() = "<<aCoords.GetNbPoints()<<
-               std::endl);
-
-       if(aCoords.GetNbPoints() == aNbElem*aNbGauss){
-         for(int iElem = 0; iElem < aNbElem; iElem++){
-           typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetGaussValueSliceArr(iElem);
-           for(int iGauss = 0; iGauss < aNbGauss; iGauss++, aTupleId++){
-             const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iGauss];
-             for(int iComp = 0; iComp < aNbComp; iComp++){
-               aDataValues[iComp] = aValueSlice[iComp];
-             }
-             this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
-           }
-         }
-       }else{
-         for(int iElem = 0; iElem < aNbElem; iElem++, aTupleId++){
-           typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetCompValueSliceArr(iElem);
-           for(int iComp = 0; iComp < aNbComp; iComp++){
-             const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iComp];
-             aDataValues[iComp] = TVTKBasicType();
-             for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
-               aDataValues[iComp] += aValueSlice[iGauss];
-             }
-             aDataValues[iComp] /= aNbGauss;
-           }
-           this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
-         }
-       }
+        EGeometry aEGeom = anIter->first;
+
+        PGaussSubMeshImpl aGaussSubMesh = anIter->second;
+        if(!aGaussSubMesh->myIsDone)
+          continue;
+
+        TGeom2MeshValue::const_iterator anIter2 = aGeom2MeshValue.find(aEGeom);
+        if(anIter2 == aGeom2MeshValue.end()){
+          EXCEPTION(std::runtime_error,
+                    "TTimeStampOnGaussMeshInitArray >> Can't find values for corresponding Gauss Points SubMesh");
+        }
+        TMeshValuePtr aMeshValue = anIter2->second;
+        vtkIdType aNbGauss = aMeshValue->GetNbGauss();
+        vtkIdType aNbElem = aMeshValue->GetNbElem();
+
+        if(aNbGauss < 1)
+          continue;
+
+        const TPointCoords& aCoords = aGaussSubMesh->myPointCoords;
+
+        INITMSG(MYDEBUG,
+                "- aEGeom = "<<aEGeom<<
+                "; aNbElem = "<<aNbElem<<
+                "; aNbGauss = "<<aNbGauss<<
+                "; aCoords.GetNbPoints() = "<<aCoords.GetNbPoints()<<
+                std::endl);
+
+        if(aCoords.GetNbPoints() == aNbElem*aNbGauss){
+          for(int iElem = 0; iElem < aNbElem; iElem++){
+            typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetGaussValueSliceArr(iElem);
+            for(int iGauss = 0; iGauss < aNbGauss; iGauss++, aTupleId++){
+              const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iGauss];
+              for(int iComp = 0; iComp < aNbComp; iComp++){
+                aDataValues[iComp] = aValueSlice[iComp];
+              }
+              this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
+            }
+          }
+        }else{
+          for(int iElem = 0; iElem < aNbElem; iElem++, aTupleId++){
+            typename TMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue->GetCompValueSliceArr(iElem);
+            for(int iComp = 0; iComp < aNbComp; iComp++){
+              const typename TMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iComp];
+              aDataValues[iComp] = TVTKBasicType();
+              for(int iGauss = 0; iGauss < aNbGauss; iGauss++){
+                aDataValues[iComp] += aValueSlice[iGauss];
+              }
+              aDataValues[iComp] /= aNbGauss;
+            }
+            this->myDataArrayHolder->SetTuple(aTupleId, &aDataValues[0]);
+          }
+        }
       }
     }
   };
 
 
   template<int EDataType>
-  void 
+  void
   InitTimeStampOnGaussMesh(const PPolyData& theSource,
-                          const PFieldImpl& theField, 
-                          const PValForTimeImpl& theValForTime)
+                           const PFieldImpl& theField,
+                           const PValForTimeImpl& theValForTime)
   {
     vtkIdType aNbTuples = theSource->GetNumberOfPoints();
     std::string aFieldName = VISU::GenerateFieldName(theField, theValForTime);
@@ -572,11 +698,11 @@ namespace VISU
     aDataSetAttributes->AddArray(aFullDataArray);
 
     INITMSG(MYDEBUG,"InitTimeStampOnGaussMesh "<<
-           "- aNbTuples = "<<aNbTuples<<
-           "; aNbComp = "<<aNbComp<<
-           std::endl);
+            "- aNbTuples = "<<aNbTuples<<
+            "; aNbComp = "<<aNbComp<<
+            std::endl);
     TTimerLog aTimerLog(MYDEBUG,"InitTimeStampOnGaussMesh");
-    
+
     const TGeom2MeshValue& aGeom2MeshValue = theValForTime->GetGeom2MeshValue();
     typedef typename TL::TEnum2VTKBasicType<EDataType>::TResult TVTKBasicType;
     typedef TTMeshValue<TVTKBasicType> TMeshValue;
@@ -588,17 +714,17 @@ namespace VISU
     TMeshValuePtr aMeshValue = theValForTime->GetFirstMeshValue();
     if(aGeom2MeshValue.size() == 1){
       aFullDataArray->SetVoidArray(aMeshValue->GetPointer(),
-                                  aMeshValue->size(),
-                                  true);
+                                   aMeshValue->size(),
+                                   true);
       INITMSG(MYDEBUG,"InitTimeStampOnGaussMesh - aFullDataArray->SetVoidArray()"<<std::endl);
       if(aNbComp == 1 || aNbComp == 3){
-       aSelectedDataArray->SetVoidArray(aMeshValue->GetPointer(),
-                                        aMeshValue->size(),
-                                        true);
-       INITMSG(MYDEBUG,"InitTimeStampOnGaussMesh - aSelectedDataArray->SetVoidArray()"<<std::endl);
+        aSelectedDataArray->SetVoidArray(aMeshValue->GetPointer(),
+                                         aMeshValue->size(),
+                                         true);
+        INITMSG(MYDEBUG,"InitTimeStampOnGaussMesh - aSelectedDataArray->SetVoidArray()"<<std::endl);
       }else{
-       PDataArrayHolder aDataArrayHolder(new TTDataArrayHolder(aSelectedDataArray));
-       TTimeStampOnGaussMeshInitArray<EDataType>(aDataArrayHolder).Execute(theField, theValForTime);
+        PDataArrayHolder aDataArrayHolder(new TTDataArrayHolder(aSelectedDataArray));
+        TTimeStampOnGaussMeshInitArray<EDataType>(aDataArrayHolder).Execute(theField, theValForTime);
       }
     }else{
       typedef TDataArrayHolder2<EDataType> TTDataArrayHolder2;
@@ -611,5 +737,97 @@ namespace VISU
   }
 
 
-  //---------------------------------------------------------------
+  //----------------------------------------------------------------------------
+
+  void InitMed2VisuArray(std::vector<int>& anArray, EGeometry aEGeom){
+    switch(aEGeom){
+#if !(defined(VTK_QUADRATIC_EDGE) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+    case eSEG3:
+      anArray[0] = 0;
+      anArray[2] = 1;
+      anArray[1] = 2;
+      break;
+#endif
+
+#if !(defined(VTK_QUADRATIC_TRIANGLE) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+    case eTRIA6:
+      anArray[0] = 0;
+      anArray[2] = 1;
+      anArray[4] = 2;
+
+      anArray[1] = 3;
+      anArray[3] = 4;
+      anArray[5] = 5;
+      break;
+#endif
+
+#if !(defined(VTK_QUADRATIC_QUAD) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+    case eQUAD8:
+      anArray[0] = 0;
+      anArray[2] = 1;
+      anArray[4] = 2;
+      anArray[6] = 3;
+
+      anArray[1] = 4;
+      anArray[3] = 5;
+      anArray[5] = 6;
+      anArray[7] = 7;
+      break;
+#endif
+    case eTETRA4:
+      anArray[0] = 0;
+      anArray[1] = 2;
+      anArray[2] = 1;
+      anArray[3] = 3;
+      break;
+    case ePYRA5:
+      anArray[0] = 0;
+      anArray[1] = 3;
+      anArray[2] = 2;
+      anArray[3] = 1;
+      anArray[4] = 4;
+      break;
+#if (defined(VTK_QUADRATIC_TETRA) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+    case eTETRA10:
+      anArray[0] = 0;
+      anArray[1] = 2;
+      anArray[2] = 1;
+      anArray[3] = 3;
+
+      anArray[4] = 6;
+      anArray[5] = 5;
+      anArray[6] = 4;
+
+      anArray[7] = 7;
+      anArray[8] = 9;
+      anArray[9] = 8;
+      break;
+#endif
+
+#if (defined(VTK_QUADRATIC_PYRAMID) && defined(VISU_USE_VTK_QUADRATIC)) && defined(VISU_ENABLE_QUADRATIC)
+    case ePYRA13:
+      anArray[0] = 0;
+      anArray[1] = 3;
+      anArray[2] = 2;
+      anArray[3] = 1;
+      anArray[4] = 4;
+
+      anArray[5] = 8;
+      anArray[6] = 7;
+      anArray[7] = 6;
+      anArray[8] = 5;
+
+      anArray[9] = 9;
+      anArray[10] = 12;
+      anArray[11] = 11;
+      anArray[12] = 10;
+      break;
+#endif
+    default:
+      for(int i=0;i<anArray.size();i++){
+        anArray[i] = i;
+      }
+      break;
+    }
+  }
 }