00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00038 #ifndef __vtkMPICommunicator_h
00039 #define __vtkMPICommunicator_h
00040
00041 #include "vtkCommunicator.h"
00042
00043 class vtkMPIController;
00044 class vtkMPIGroup;
00045
00046 class vtkMPICommunicatorOpaqueRequest;
00047 class vtkMPICommunicatorOpaqueComm;
00048
00049 class VTK_PARALLEL_EXPORT vtkMPICommunicator : public vtkCommunicator
00050 {
00051 public:
00052 vtkTypeRevisionMacro( vtkMPICommunicator,vtkCommunicator);
00053
00055 static vtkMPICommunicator* New();
00056
00059 static vtkMPICommunicator* GetWorldCommunicator();
00060
00061 virtual void PrintSelf(ostream& os, vtkIndent indent);
00062
00067 int Initialize(vtkMPICommunicator* mpiComm, vtkMPIGroup* group);
00068
00070
00072 virtual int Send(int* data, int length, int remoteProcessId, int tag);
00073 virtual int Send(unsigned long* data, int length, int remoteProcessId,
00074 int tag);
00075 virtual int Send(char* data, int length, int remoteProcessId, int tag);
00076 virtual int Send(unsigned char* data, int length, int remoteProcessId,
00077 int tag);
00078 virtual int Send(float* data, int length, int remoteProcessId,
00079 int tag);
00080 virtual int Send(double* data, int length, int remoteProcessId,
00081 int tag);
00082 #ifdef VTK_USE_64BIT_IDS
00083 virtual int Send(vtkIdType* data, int length, int remoteProcessId,
00084 int tag);
00086 #endif
00087 virtual int Send(vtkDataObject* data, int remoteProcessId, int tag)
00088 { return this->vtkCommunicator::Send(data, remoteProcessId, tag); }
00089 virtual int Send(vtkDataArray* data, int remoteProcessId, int tag)
00090 { return this->vtkCommunicator::Send(data, remoteProcessId, tag); }
00091
00092
00093
00094 class VTK_PARALLEL_EXPORT Request
00095 {
00096 public:
00097 Request();
00098 ~Request();
00099 int Test();
00100 void Cancel();
00101 void Wait();
00102 vtkMPICommunicatorOpaqueRequest* Req;
00103 };
00104
00105
00106
00108
00112 int NoBlockSend(int* data, int length, int remoteProcessId, int tag,
00113 Request& req);
00114 int NoBlockSend(unsigned long* data, int length, int remoteProcessId,
00115 int tag, Request& req);
00116 int NoBlockSend(char* data, int length, int remoteProcessId,
00117 int tag, Request& req);
00118 int NoBlockSend(float* data, int length, int remoteProcessId,
00119 int tag, Request& req);
00121
00123
00125 virtual int Receive(int* data, int length, int remoteProcessId,
00126 int tag);
00127 virtual int Receive(unsigned long* data, int length,
00128 int remoteProcessId, int tag);
00129 virtual int Receive(char* data, int length, int remoteProcessId,
00130 int tag);
00131 virtual int Receive(unsigned char* data, int length, int remoteProcessId,
00132 int tag);
00133 virtual int Receive(float* data, int length, int remoteProcessId,
00134 int tag);
00135 virtual int Receive(double* data, int length, int remoteProcessId,
00136 int tag);
00137 #ifdef VTK_USE_64BIT_IDS
00138 virtual int Receive(vtkIdType* data, int length, int remoteProcessId,
00139 int tag);
00141 #endif
00142 virtual int Receive(vtkDataObject* data, int remoteProcessId, int tag)
00143 { return this->vtkCommunicator::Receive(data, remoteProcessId, tag); }
00144 virtual int Receive(vtkDataArray* data, int remoteProcessId, int tag)
00145 { return this->vtkCommunicator::Receive(data, remoteProcessId, tag); }
00146
00148
00151 int NoBlockReceive(int* data, int length, int remoteProcessId,
00152 int tag, Request& req);
00153 int NoBlockReceive(unsigned long* data, int length,
00154 int remoteProcessId, int tag, Request& req);
00155 int NoBlockReceive(char* data, int length, int remoteProcessId,
00156 int tag, Request& req);
00157 int NoBlockReceive(float* data, int length, int remoteProcessId,
00158 int tag, Request& req);
00160
00161
00163
00164 int Broadcast(int* data , int length, int root);
00165 int Broadcast(unsigned long* data, int length, int root);
00166 int Broadcast(char* data , int length, int root);
00167 int Broadcast(float* data , int length, int root);
00168 int Broadcast(double* data , int length, int root);
00170
00171
00173
00175 int Gather(int* data , int* to , int length, int root);
00176 int Gather(unsigned long* data, unsigned long* to, int length, int root);
00177 int Gather(char* data , char* to , int length, int root);
00178 int Gather(float* data , float* to , int length, int root);
00179 int Gather(double* data , double* to , int length, int root);
00181
00183
00190 int GatherV(int* data, int* to,
00191 int sendlength, int* recvlengths, int* offsets, int root);
00192 int GatherV(unsigned long* data, unsigned long* to,
00193 int sendlength, int* recvlengths, int* offsets, int root);
00194 int GatherV(char* data, char* to,
00195 int sendlength, int* recvlengths, int* offsets, int root);
00196 int GatherV(float* data, float* to,
00197 int sendlength, int* recvlengths, int* offsets, int root);
00198 int GatherV(double* data, double* to,
00199 int sendlength, int* recvlengths, int* offsets, int root);
00201
00202
00204
00208 int AllGather(int* data , int* to , int length);
00209 int AllGather(unsigned long* data, unsigned long* to, int length);
00210 int AllGather(char* data , char* to , int length);
00211 int AllGather(float* data , float* to , int length);
00212 int AllGather(double* data , double* to , int length);
00214
00216
00220 int AllGatherV(int* data, int* to,
00221 int sendlength, int* recvlengths, int* recvOffsets);
00222 int AllGatherV(unsigned long* data, unsigned long* to,
00223 int sendlength, int* recvlengths, int* recvOffsets);
00224 int AllGatherV(char* data, char* to,
00225 int sendlength, int* recvlengths, int* recvOffsets);
00226 int AllGatherV(float* data, float* to,
00227 int sendlength, int* recvlengths, int* recvOffsets);
00228 int AllGatherV(double* data, double* to,
00229 int sendlength, int* recvlengths, int* recvOffsets);
00231
00233
00234 int ReduceMax(int* data, int* to, int size, int root);
00235 int ReduceMax(long* data, long* to, int size, int root);
00236 int ReduceMax(float* data, float* to, int size, int root);
00237 int ReduceMax(double* data, double* to, int size, int root);
00239
00240 int ReduceMin(int* data, int* to, int size, int root);
00241 int ReduceMin(long* data, long* to, int size, int root);
00242 int ReduceMin(float* data, float* to, int size, int root);
00243 int ReduceMin(double* data, double* to, int size, int root);
00244
00245 int ReduceSum(int* data, int* to, int size, int root);
00246 int ReduceSum(long* data, long* to, int size, int root);
00247 int ReduceSum(float* data, float* to, int size, int root);
00248 int ReduceSum(double* data, double* to, int size, int root);
00249
00250 int ReduceAnd(bool* data, bool* to, int size, int root);
00251 int ReduceOr(bool* data, bool* to, int size, int root);
00252
00253
00254
00255
00256 friend class vtkMPIController;
00257
00258 vtkMPICommunicatorOpaqueComm* GetMPIComm()
00259 {
00260 return this->Comm;
00261 }
00262
00263
00264
00265 static char* Allocate(size_t size);
00266 static void Free(char* ptr);
00267
00268
00269 protected:
00270 vtkMPICommunicator();
00271 ~vtkMPICommunicator();
00272
00273 virtual void SetGroup(vtkMPIGroup*);
00274
00276
00283 vtkSetMacro(KeepHandle, int);
00284 vtkBooleanMacro(KeepHandle, int);
00286
00287
00288 static vtkMPICommunicator* WorldCommunicator;
00289
00290 void InitializeCopy(vtkMPICommunicator* source);
00291
00296 void CopyFrom(vtkMPICommunicator* source);
00297
00304 void Duplicate(vtkMPICommunicator* source);
00305
00306 vtkMPICommunicatorOpaqueComm* Comm;
00307 vtkMPIGroup* Group;
00308
00309 int Initialized;
00310 int KeepHandle;
00311
00312 static int CheckForMPIError(int err);
00313
00314 private:
00315 vtkMPICommunicator(const vtkMPICommunicator&);
00316 void operator=(const vtkMPICommunicator&);
00317 };
00318
00319
00320 #endif // __vtkMPICommunicator_h
00321
00322
00323
00324