Salome HOME
PV 5.4 : Porting to OpenGL2
[modules/paravis.git] / src / Plugins / MEDReader / IO / vtkMEDReader.cxx
old mode 100644 (file)
new mode 100755 (executable)
index 1c18555..0ff70c1
@@ -20,6 +20,7 @@
 
 #include "vtkMEDReader.h"
 #include "vtkGenerateVectors.h"
+#include "MEDUtilities.hxx"
 
 #include "vtkMultiBlockDataSet.h"
 #include "vtkInformation.h"
@@ -37,6 +38,7 @@
 #include "vtkMultiTimeStepAlgorithm.h"
 #include "vtkUnstructuredGrid.h"
 #include "vtkInformationQuadratureSchemeDefinitionVectorKey.h"
+#include "vtkInformationDoubleVectorKey.h"
 #include "vtkQuadratureSchemeDefinition.h"
 #include "vtkPointData.h"
 #include "vtkCellData.h"
@@ -231,6 +233,22 @@ vtkInformationDataObjectMetaDataKey *vtkMEDReader::META_DATA()
     }
   return ret;
 }
+
+static vtkInformationGaussDoubleVectorKey *vtkMEDReader_GAUSS_DATA=new vtkInformationGaussDoubleVectorKey("GAUSS_DATA","vtkMEDReader");
+
+vtkInformationGaussDoubleVectorKey *vtkMEDReader::GAUSS_DATA()  
+{
+  static const char ZE_KEY[]="vtkMEDReader::GAUSS_DATA";
+  vtkInformationGaussDoubleVectorKey *ret(vtkMEDReader_GAUSS_DATA);
+  MEDCoupling::GlobalDict *gd(MEDCoupling::GlobalDict::GetInstance());
+  if(!gd->hasKey(ZE_KEY))
+    {// here META_DATA is put on global var to be exchanged with other filters without dependancy of MEDReader. Please do not change ZE_KEY !
+      vtkInformationDoubleVectorKey *ret2(ret);
+      std::ostringstream oss; oss << ret2;
+      gd->setKeyValue(ZE_KEY,oss.str());
+    }
+  return ret;
+}
 // end of overload of vtkInformationKeyMacro
 
 vtkMEDReader::vtkMEDReader():Internal(new vtkMEDReaderInternal(this))
@@ -418,14 +436,15 @@ int vtkMEDReader::RequestData(vtkInformation *request, vtkInformationVector **in
       double reqTS(0.);
       if(outInfo->Has(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP()))
         reqTS=outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP());
+      ExportedTinyInfo ti;
 #ifndef MEDREADER_USE_MPI
-      this->FillMultiBlockDataSetInstance(output,reqTS);
+      this->FillMultiBlockDataSetInstance(output,reqTS,&ti);
 #else
       if(this->Internal->GCGCP)
        {
          vtkSmartPointer<vtkPUnstructuredGridGhostCellsGenerator> gcg(vtkSmartPointer<vtkPUnstructuredGridGhostCellsGenerator>::New());
          {
-           vtkDataSet *ret(RetrieveDataSetAtTime(reqTS));
+           vtkDataSet *ret(RetrieveDataSetAtTime(reqTS,&ti));
            gcg->SetInputData(ret);
            ret->Delete();
          }
@@ -435,8 +454,14 @@ int vtkMEDReader::RequestData(vtkInformation *request, vtkInformationVector **in
          output->SetBlock(0,gcg->GetOutput());
        }
       else
-       this->FillMultiBlockDataSetInstance(output,reqTS);
+       this->FillMultiBlockDataSetInstance(output,reqTS,&ti);
 #endif
+      if(!ti.empty())
+        {
+          const std::vector<double>& data(ti.getData());
+          outInfo->Set(vtkMEDReader::GAUSS_DATA(),&data[0],data.size());
+          request->Append(vtkExecutive::KEYS_TO_COPY(),vtkMEDReader::GAUSS_DATA());// Thank you to SciberQuest and DIPOLE_CENTER ! Don't understand why ! In RequestInformation it does not work !
+        }
       output->GetInformation()->Set(vtkDataObject::DATA_TIME_STEP(),reqTS);
       // Is it really needed ? TODO
       this->UpdateSIL(request, outInfo);
@@ -639,21 +664,21 @@ double vtkMEDReader::PublishTimeStepsIfNeeded(vtkInformation *outInfo, bool& isU
   return tsteps.front();
 }
 
-void vtkMEDReader::FillMultiBlockDataSetInstance(vtkMultiBlockDataSet *output, double reqTS)
+void vtkMEDReader::FillMultiBlockDataSetInstance(vtkMultiBlockDataSet *output, double reqTS, ExportedTinyInfo *internalInfo)
 {
   if( !this->Internal )
     return;
-  vtkDataSet *ret(RetrieveDataSetAtTime(reqTS));
+  vtkDataSet *ret(RetrieveDataSetAtTime(reqTS,internalInfo));
   output->SetBlock(0,ret);
   ret->Delete();
 }
 
-vtkDataSet *vtkMEDReader::RetrieveDataSetAtTime(double reqTS)
+vtkDataSet *vtkMEDReader::RetrieveDataSetAtTime(double reqTS, ExportedTinyInfo *internalInfo)
 {
   if( !this->Internal )
     return 0;
   std::string meshName;
-  vtkDataSet *ret(this->Internal->Tree.buildVTKInstance(this->Internal->IsStdOrMode,reqTS,meshName,this->Internal->TK));
+  vtkDataSet *ret(this->Internal->Tree.buildVTKInstance(this->Internal->IsStdOrMode,reqTS,meshName,this->Internal->TK,internalInfo));
   if(this->Internal->GenerateVect)
     {
       vtkGenerateVectors::Operate(ret->GetPointData());