Files
ThirdParty-6/ParaView-5.0.1/ParaViewCore/ClientServerCore/Rendering/vtkMPIMoveData.h

186 lines
7.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkMPIMoveData.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkMPIMoveData - Moves/redistributes data between processes.
// .SECTION Description
// This class combines all the duplicate and collection requirements
// into one filter. It can move polydata and unstructured grid between
// processes. It can redistributed polydata from M to N processors.
// Update: This filter can now support delivering vtkUniformGridAMR datasets in
// PASS_THROUGH and/or COLLECT modes.
#ifndef vtkMPIMoveData_h
#define vtkMPIMoveData_h
#include "vtkPVClientServerCoreRenderingModule.h" //needed for exports
#include "vtkPassInputTypeAlgorithm.h"
class vtkMultiProcessController;
class vtkSocketController;
class vtkMPIMToNSocketConnection;
class vtkDataSet;
class vtkIndent;
class VTKPVCLIENTSERVERCORERENDERING_EXPORT vtkMPIMoveData : public vtkPassInputTypeAlgorithm
{
public:
static vtkMPIMoveData *New();
vtkTypeMacro(vtkMPIMoveData, vtkPassInputTypeAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Use this method to initialize all communicators/sockets using ParaView
// defaults.
virtual void InitializeForCommunicationForParaView();
// Description:
// Objects for communication.
// The controller is an MPI controller used to communicate
// between processes within one server (render or data).
// The client-data server socket controller is set on the client
// and data server and is used to communicate between the two.
// MPIMToNSocetConnection is set on the data server and render server
// when we are running with a render server. It has multiple
// sockets which are used to send data from the data server to the
// render server.
// ClientDataServerController==0 => One MPI program.
// MPIMToNSocketConnection==0 => Client-DataServer.
// MPIMToNSocketConnection==1 => Client-DataServer-RenderServer.
void SetController(vtkMultiProcessController* controller);
void SetMPIMToNSocketConnection(vtkMPIMToNSocketConnection* sc);
void SetClientDataServerSocketController(vtkMultiProcessController*);
vtkGetObjectMacro(ClientDataServerSocketController, vtkMultiProcessController);
// Description:
// Tell the object on which client/server it resides.
// Whether the sockets are set helps determine which servers are running.
void SetServerToClient(){this->Server=vtkMPIMoveData::CLIENT;}
void SetServerToDataServer(){this->Server=vtkMPIMoveData::DATA_SERVER;}
void SetServerToRenderServer(){this->Server=vtkMPIMoveData::RENDER_SERVER;}
vtkSetClampMacro(Server, int, vtkMPIMoveData::CLIENT, vtkMPIMoveData::RENDER_SERVER);
vtkGetMacro(Server, int);
// Description:
// Specify how the data is to be redistributed.
void SetMoveModeToPassThrough(){this->MoveMode=vtkMPIMoveData::PASS_THROUGH;}
void SetMoveModeToCollect(){this->MoveMode=vtkMPIMoveData::COLLECT;}
void SetMoveModeToClone(){this->MoveMode=vtkMPIMoveData::CLONE;}
vtkSetClampMacro(MoveMode, int, vtkMPIMoveData::PASS_THROUGH,
vtkMPIMoveData::COLLECT_AND_PASS_THROUGH);
// Description:
// Controls the output type. This is required because processes receiving
// data cannot know their output type in RequestDataObject without
// communicating with other processes. Since communicating with other
// processes in RequestDataObject is dangerous (can cause deadlock because
// it may happen out-of-sync), the application has to set the output
// type. The default is VTK_POLY_DATA.
vtkSetMacro(OutputDataType, int);
vtkGetMacro(OutputDataType, int);
// Description:
// When set to true, zlib compression is used. False by default.
// This value has any effect only on the data-sender processes. The receiver
// always checks the received data to see if zlib decompression is required.
static void SetUseZLibCompression(bool b);
static bool GetUseZLibCompression();
// Description:
// vtkMPIMoveData doesn't necessarily generate a valid output data on all the
// involved processes (depending on the MoveMode and Server ivars). This
// returns true if valid data is available on the current processes after
// successful Update() given the current ivars).
bool GetOutputGeneratedOnProcess();
// Description:
// When set, vtkMPIMoveData will skip the gather-to-root-node process
// altogether. This is useful when the data is already cloned on the
// server-nodes or we are interested in the root-node result alone.
vtkSetMacro(SkipDataServerGatherToZero, bool);
vtkGetMacro(SkipDataServerGatherToZero, bool);
//BTX
enum MoveModes {
PASS_THROUGH=0,
COLLECT=1,
CLONE=2,
COLLECT_AND_PASS_THROUGH=3
};
//ETX
//ETX
protected:
vtkMPIMoveData();
~vtkMPIMoveData();
virtual int RequestDataObject(vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
virtual int RequestData(vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
virtual int FillInputPortInformation(int port, vtkInformation *info);
vtkMultiProcessController* Controller;
vtkMultiProcessController* ClientDataServerSocketController;
vtkMPIMToNSocketConnection* MPIMToNSocketConnection;
void DataServerAllToN(vtkDataObject* inData, vtkDataObject* outData, int n);
void DataServerGatherAll(vtkDataObject* input, vtkDataObject* output);
void DataServerGatherToZero(vtkDataObject* input, vtkDataObject* output);
void DataServerSendToRenderServer(vtkDataObject* output);
void RenderServerReceiveFromDataServer(vtkDataObject* output);
void DataServerZeroSendToRenderServerZero(vtkDataObject* data);
void RenderServerZeroReceiveFromDataServerZero(vtkDataObject* data);
void RenderServerZeroBroadcast(vtkDataObject* data);
void DataServerSendToClient(vtkDataObject* output);
void ClientReceiveFromDataServer(vtkDataObject* output);
int NumberOfBuffers;
vtkIdType* BufferLengths;
vtkIdType* BufferOffsets;
char* Buffers;
vtkIdType BufferTotalLength;
void ClearBuffer();
void MarshalDataToBuffer(vtkDataObject* data);
void ReconstructDataFromBuffer(vtkDataObject* data);
int MoveMode;
int Server;
bool SkipDataServerGatherToZero;
//BTX
enum Servers {
CLIENT=0,
DATA_SERVER=1,
RENDER_SERVER=2
};
//ETX
int OutputDataType;
private:
int UpdateNumberOfPieces;
int UpdatePiece;
vtkMPIMoveData(const vtkMPIMoveData&); // Not implemented
void operator=(const vtkMPIMoveData&); // Not implemented
static bool UseZLibCompression;
};
#endif