Salome HOME
Adding distribution support
authorMathieu Westphal <mathieu.westphal@kitware.com>
Tue, 4 Oct 2022 08:17:09 +0000 (16:17 +0800)
committerMathieu Westphal <mathieu.westphal@kitware.com>
Tue, 4 Oct 2022 08:43:51 +0000 (16:43 +0800)
src/Plugins/MEDReader/plugin/MEDReaderIO/vtkFileSeriesGroupReader.cxx
src/Plugins/MEDReader/plugin/MEDReaderIO/vtkMEDReader.cxx
src/Plugins/MEDReader/plugin/MEDReaderIO/vtkMEDReader.h

index 46c226d800e8ac31fcf3bc4b46a94b4deb3d0b99..cc7549e3095e52e4d091dbc3c046e2fdb5fdf23e 100644 (file)
@@ -3,6 +3,7 @@
 #include <vtkInformation.h>
 #include <vtkInformationVector.h>
 #include <vtkMultiBlockDataSet.h>
+#include <vtkMultiProcessController.h>
 #include <vtkObjectFactory.h>
 #include <vtkSmartPointer.h>
 #include <vtkStreamingDemandDrivenPipeline.h>
@@ -104,10 +105,22 @@ int vtkFileSeriesGroupReader::RequestData(vtkInformation* vtkNotUsed(request),
   vtkInformation* info = outputVector->GetInformationObject(0);
   double time = info->Get(vtkStreamingDemandDrivenPipeline::UPDATE_TIME_STEP());
 
-  for (unsigned int i = 0; i < this->GetNumberOfFileNames(); i++)
+  vtkMultiProcessController *vmpc(vtkMultiProcessController::GetGlobalController());
+  unsigned int iProc = vmpc ? vmpc->GetLocalProcessId() : 0;
+  unsigned int nProc = vmpc ? vmpc->GetNumberOfProcesses() : 1;
+  unsigned int nFiles = this->GetNumberOfFileNames() / nProc;
+  unsigned int offFile =  iProc * nFiles;
+  unsigned int supFiles = this->GetNumberOfFileNames() % nProc;
+  if (iProc == nProc - 1)
   {
-    this->ReaderSetFileName(this->GetFileName(i));
+    nFiles += supFiles;
+  }
+
+  for (unsigned int i = 0; i < nFiles; i++)
+  {
+    this->ReaderSetFileName(this->GetFileName(i + offFile));
     vtkMEDReader::SafeDownCast(this->Reader)->ReloadInternals();
+    vtkMEDReader::SafeDownCast(this->Reader)->SetDistributeWithMPI(false);
     this->Reader->UpdateInformation();
     this->Reader->UpdateTimeStep(time);
     vtkDataObject* outputReader = this->Reader->GetOutputDataObject(0);
@@ -118,7 +131,7 @@ int vtkFileSeriesGroupReader::RequestData(vtkInformation* vtkNotUsed(request),
 
   return 1;
 }
+
 //------------------------------------------------------------------------------
 int vtkFileSeriesGroupReader::FillOutputPortInformation(
   int vtkNotUsed(port), vtkInformation* info)
index e5cf08adfe993f69cbd9cd68023ad362b69128b9..76bfb42bec8267c5f057db07b4f4963160aa4227 100644 (file)
@@ -232,12 +232,15 @@ int vtkMEDReader::RequestInformation(vtkInformation *request, vtkInformationVect
         {
           int iPart(-1),nbOfParts(-1);
 #ifdef MEDREADER_USE_MPI
-          vtkMultiProcessController *vmpc(vtkMultiProcessController::GetGlobalController());
-          if(vmpc)
+          if (this->DitributeWithMPI)
+          {
+            vtkMultiProcessController *vmpc(vtkMultiProcessController::GetGlobalController());
+            if(vmpc)
             {
               iPart=vmpc->GetLocalProcessId();
               nbOfParts=vmpc->GetNumberOfProcesses();
             }
+          }
 #endif
           this->Internal->Tree.loadMainStructureOfFile(this->FileName.c_str(),iPart,nbOfParts);
 
@@ -341,7 +344,7 @@ int vtkMEDReader::RequestData(vtkInformation *request, vtkInformationVector ** /
 #ifndef MEDREADER_USE_MPI
       this->FillMultiBlockDataSetInstance(output,reqTS,&ti);
 #else
-      if(this->GCGCP)
+      if (this->DitributeWithMPI && this->GCGCP)
        {
          vtkSmartPointer<vtkPUnstructuredGridGhostCellsGenerator> gcg(vtkSmartPointer<vtkPUnstructuredGridGhostCellsGenerator>::New());
          {
index e30ae01ca17efb55475ead7b19833feea4085850..3d76bee1a90b148c03b2cbf8f40409c3e62f162c 100644 (file)
@@ -79,6 +79,12 @@ class VTK_EXPORT vtkMEDReader : public vtkMultiBlockDataSetAlgorithm
   static vtkInformationDataObjectMetaDataKey* META_DATA();
   static vtkInformationGaussDoubleVectorKey* GAUSS_DATA();
 
+  // Description
+  // Control if MPI should be used for distribution when using a distributed server
+  // Only has an effect if MEDREADER_USE_MPI is defined.
+  vtkSetMacro(DistributeWithMPI, bool);
+  vtkGetMacro(DistributeWithMPI, bool);
+
  protected:
   vtkMEDReader();
   virtual ~vtkMEDReader();
@@ -104,6 +110,7 @@ class VTK_EXPORT vtkMEDReader : public vtkMultiBlockDataSetAlgorithm
   //when false -> do nothing. When true cut off or extend to nbOfCompo=3 vector arrays.
   bool GenerateVect = false;
   bool GCGCP = true;
+  bool DistributeWithMPI = true;
 };
 
 #endif //__vtkMEDReader_h_