#include <vtkInformation.h>
#include <vtkInformationVector.h>
#include <vtkMultiBlockDataSet.h>
+#include <vtkMultiProcessController.h>
#include <vtkObjectFactory.h>
#include <vtkSmartPointer.h>
#include <vtkStreamingDemandDrivenPipeline.h>
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);
return 1;
}
-
+
//------------------------------------------------------------------------------
int vtkFileSeriesGroupReader::FillOutputPortInformation(
int vtkNotUsed(port), vtkInformation* info)
{
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);
#ifndef MEDREADER_USE_MPI
this->FillMultiBlockDataSetInstance(output,reqTS,&ti);
#else
- if(this->GCGCP)
+ if (this->DitributeWithMPI && this->GCGCP)
{
vtkSmartPointer<vtkPUnstructuredGridGhostCellsGenerator> gcg(vtkSmartPointer<vtkPUnstructuredGridGhostCellsGenerator>::New());
{
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();
//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_