00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00053 #ifndef __vtkMPICommunicator_h
00054 #define __vtkMPICommunicator_h
00055
00056 #include "vtkCommunicator.h"
00057
00058 class vtkMPIController;
00059 class vtkMPIGroup;
00060
00061 class vtkMPICommunicatorOpaqueRequest;
00062 class vtkMPICommunicatorOpaqueComm;
00063
00064 class VTK_PARALLEL_EXPORT vtkMPICommunicator : public vtkCommunicator
00065 {
00066 public:
00067 vtkTypeRevisionMacro( vtkMPICommunicator,vtkCommunicator);
00068
00070 static vtkMPICommunicator* New();
00071
00074 static vtkMPICommunicator* GetWorldCommunicator();
00075
00076 virtual void PrintSelf(ostream& os, vtkIndent indent);
00077
00082 int Initialize(vtkMPICommunicator* mpiComm, vtkMPIGroup* group);
00083
00085
00087 virtual int Send(int* data, int length, int remoteProcessId, int tag);
00088 virtual int Send(unsigned long* data, int length, int remoteProcessId,
00089 int tag);
00090 virtual int Send(char* data, int length, int remoteProcessId, int tag);
00091 virtual int Send(unsigned char* data, int length, int remoteProcessId,
00092 int tag);
00093 virtual int Send(float* data, int length, int remoteProcessId,
00094 int tag);
00095 virtual int Send(double* data, int length, int remoteProcessId,
00096 int tag);
00097 #ifdef VTK_USE_64BIT_IDS
00098 virtual int Send(vtkIdType* data, int length, int remoteProcessId,
00099 int tag);
00101 #endif
00102 virtual int Send(vtkDataObject* data, int remoteProcessId, int tag)
00103 { return this->vtkCommunicator::Send(data, remoteProcessId, tag); }
00104 virtual int Send(vtkDataArray* data, int remoteProcessId, int tag)
00105 { return this->vtkCommunicator::Send(data, remoteProcessId, tag); }
00106
00107
00108
00109 class VTK_PARALLEL_EXPORT Request
00110 {
00111 public:
00112 Request();
00113 ~Request();
00114 int Test();
00115 void Cancel();
00116 void Wait();
00117 vtkMPICommunicatorOpaqueRequest* Req;
00118 };
00119
00120
00121
00123
00127 int NoBlockSend(int* data, int length, int remoteProcessId, int tag,
00128 Request& req);
00129 int NoBlockSend(unsigned long* data, int length, int remoteProcessId,
00130 int tag, Request& req);
00131 int NoBlockSend(char* data, int length, int remoteProcessId,
00132 int tag, Request& req);
00133 int NoBlockSend(float* data, int length, int remoteProcessId,
00134 int tag, Request& req);
00136
00138
00140 virtual int Receive(int* data, int length, int remoteProcessId,
00141 int tag);
00142 virtual int Receive(unsigned long* data, int length,
00143 int remoteProcessId, int tag);
00144 virtual int Receive(char* data, int length, int remoteProcessId,
00145 int tag);
00146 virtual int Receive(unsigned char* data, int length, int remoteProcessId,
00147 int tag);
00148 virtual int Receive(float* data, int length, int remoteProcessId,
00149 int tag);
00150 virtual int Receive(double* data, int length, int remoteProcessId,
00151 int tag);
00152 #ifdef VTK_USE_64BIT_IDS
00153 virtual int Receive(vtkIdType* data, int length, int remoteProcessId,
00154 int tag);
00156 #endif
00157 virtual int Receive(vtkDataObject* data, int remoteProcessId, int tag)
00158 { return this->vtkCommunicator::Receive(data, remoteProcessId, tag); }
00159 virtual int Receive(vtkDataArray* data, int remoteProcessId, int tag)
00160 { return this->vtkCommunicator::Receive(data, remoteProcessId, tag); }
00161
00163
00166 int NoBlockReceive(int* data, int length, int remoteProcessId,
00167 int tag, Request& req);
00168 int NoBlockReceive(unsigned long* data, int length,
00169 int remoteProcessId, int tag, Request& req);
00170 int NoBlockReceive(char* data, int length, int remoteProcessId,
00171 int tag, Request& req);
00172 int NoBlockReceive(float* data, int length, int remoteProcessId,
00173 int tag, Request& req);
00175
00176
00178
00179 int Broadcast(int* data , int length, int root);
00180 int Broadcast(unsigned long* data, int length, int root);
00181 int Broadcast(char* data , int length, int root);
00182 int Broadcast(float* data , int length, int root);
00183 int Broadcast(double* data , int length, int root);
00185
00186
00188
00190 int Gather(int* data , int* to , int length, int root);
00191 int Gather(unsigned long* data, unsigned long* to, int length, int root);
00192 int Gather(char* data , char* to , int length, int root);
00193 int Gather(float* data , float* to , int length, int root);
00194 int Gather(double* data , double* to , int length, int root);
00196
00198
00205 int GatherV(int* data, int* to,
00206 int sendlength, int* recvlengths, int* offsets, int root);
00207 int GatherV(unsigned long* data, unsigned long* to,
00208 int sendlength, int* recvlengths, int* offsets, int root);
00209 int GatherV(char* data, char* to,
00210 int sendlength, int* recvlengths, int* offsets, int root);
00211 int GatherV(float* data, float* to,
00212 int sendlength, int* recvlengths, int* offsets, int root);
00213 int GatherV(double* data, double* to,
00214 int sendlength, int* recvlengths, int* offsets, int root);
00216
00218
00219 int ReduceMax(int* data, int* to, int size, int root);
00220 int ReduceMax(long* data, long* to, int size, int root);
00221 int ReduceMax(float* data, float* to, int size, int root);
00222 int ReduceMax(double* data, double* to, int size, int root);
00224
00225 int ReduceMin(int* data, int* to, int size, int root);
00226 int ReduceMin(long* data, long* to, int size, int root);
00227 int ReduceMin(float* data, float* to, int size, int root);
00228 int ReduceMin(double* data, double* to, int size, int root);
00229
00230 int ReduceSum(int* data, int* to, int size, int root);
00231 int ReduceSum(long* data, long* to, int size, int root);
00232 int ReduceSum(float* data, float* to, int size, int root);
00233 int ReduceSum(double* data, double* to, int size, int root);
00234
00235 int ReduceAnd(bool* data, bool* to, int size, int root);
00236 int ReduceOr(bool* data, bool* to, int size, int root);
00237
00238
00239
00240
00241 friend class vtkMPIController;
00242
00243 vtkMPICommunicatorOpaqueComm* GetMPIComm()
00244 {
00245 return this->Comm;
00246 }
00247
00248
00249
00250 static char* Allocate(size_t size);
00251 static void Free(char* ptr);
00252
00253
00254 protected:
00255 vtkMPICommunicator();
00256 ~vtkMPICommunicator();
00257
00258 virtual void SetGroup(vtkMPIGroup*);
00259
00261
00268 vtkSetMacro(KeepHandle, int);
00269 vtkBooleanMacro(KeepHandle, int);
00271
00272
00273 static vtkMPICommunicator* WorldCommunicator;
00274
00275 void InitializeCopy(vtkMPICommunicator* source);
00276
00281 void CopyFrom(vtkMPICommunicator* source);
00282
00289 void Duplicate(vtkMPICommunicator* source);
00290
00291 vtkMPICommunicatorOpaqueComm* Comm;
00292 vtkMPIGroup* Group;
00293
00294 int Initialized;
00295 int KeepHandle;
00296
00297 static int CheckForMPIError(int err);
00298
00299 private:
00300 vtkMPICommunicator(const vtkMPICommunicator&);
00301 void operator=(const vtkMPICommunicator&);
00302 };
00303
00304
00305 #endif // __vtkMPICommunicator_h
00306
00307
00308
00309