mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
186 lines
7.0 KiB
C++
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
|
|
|