33 #ifndef VTKPSTRUCTUREDGRIDCONNECTIVITY_H_
34 #define VTKPSTRUCTUREDGRIDCONNECTIVITY_H_
37 #include "vtkFiltersParallelGeometryModule.h"
39 #include "vtkMPICommunicator.h"
45 class vtkMultiProcessController;
46 class vtkMPIController;
47 class vtkMultiProcessStream;
56 void PrintSelf(ostream& os, vtkIndent indent );
60 vtkSetMacro( Controller,vtkMultiProcessController* );
61 vtkGetMacro( Controller,vtkMultiProcessController* );
70 vtkUnsignedCharArray* nodesGhostArray,
71 vtkUnsignedCharArray* cellGhostArray,
72 vtkPointData* pointData,
73 vtkCellData* cellData,
74 vtkPoints* gridNodes );
81 {
return static_cast<int>(this->GridIds.size()); };
88 int GetGridRank(
const int gridID );
91 bool IsGridRemote(
const int gridID );
94 bool IsGridLocal(
const int gridID );
146 bool GridExtentsAreEqual(
int rhs[6],
int lhs[6] );
150 bool HasPointData(
const int gridIdx);
154 bool HasCellData(
const int gridIdx);
157 bool HasPoints(
const int gridIdx);
160 void InitializeMessageCounters();
164 void ClearRemoteData();
167 void ClearRawBuffers();
171 void RegisterRemoteGrid(
const int gridID,
int extents[6],
int process );
176 void TransferRemoteNeighborData(
186 void PackGhostData();
190 void UnpackGhostData();
195 void DeserializeBufferSizesForProcess(
196 int *buffersizes, vtkIdType N,
const int processId );
201 void SerializeBufferSizes(
int *&sizesbuf, vtkIdType &N);
205 void ExchangeBufferSizes();
210 void ExchangeGhostDataInit();
223 void CommunicateGhostData();
228 void ExchangeGhostDataPost();
231 void ExchangeGhostData();
236 void SerializeGhostPoints(
237 const int gridIdx,
int ext[6], vtkMultiProcessStream& bytestream );
242 void SerializeDataArray(
243 vtkDataArray *dataArray, vtkMultiProcessStream& bytestream );
249 void SerializeFieldData(
250 int sourceExtent[6],
int targetExtent[6], vtkFieldData *fieldData,
251 vtkMultiProcessStream& bytestream );
257 void SerializeGhostPointData(
258 const int gridIdx,
int ext[6], vtkMultiProcessStream& bytestream );
264 void SerializeGhostCellData(
265 const int gridIdx,
int ext[6], vtkMultiProcessStream& bytestream );
271 void DeserializeGhostPoints(
272 const int gridIdx,
const int nei,
273 int ext[6], vtkMultiProcessStream& bytestream );
278 void DeserializeDataArray(
279 vtkDataArray *&dataArray,
const int dataType,
280 const int numberOfTuples,
const int numberOfComponents,
281 vtkMultiProcessStream& bytestream );
287 void DeserializeFieldData(
288 int ext[6], vtkFieldData *fieldData,
289 vtkMultiProcessStream &bytestream );
295 void DeserializeGhostPointData(
296 const int gridIdx,
const int nei,
297 int ext[6], vtkMultiProcessStream& bytestream );
303 void DeserializeGhostCellData(
304 const int gridIdx,
const int nei,
305 int ext[6], vtkMultiProcessStream& bytestream );
313 void SerializeGhostData(
314 const int sndGridID,
const int rcvGrid,
int sndext[6],
315 unsigned char*& buffer,
unsigned int &size);
322 void DeserializeGhostData(
323 const int gridID,
const int neiListID,
324 const int neiGridIdx,
int rcvext[6],
325 unsigned char *buffer,
unsigned int size );
330 void ExchangeGridExtents();
335 void SerializeGridExtents(
int *&sndbuffer, vtkIdType &N );
340 void DeserializeGridExtentForProcess(
341 int *rcvbuffer, vtkIdType &N,
const int processId );
355 int rhs[6],
int lhs[6] )
357 for(
int i=0; i < 6; ++i )
359 if( rhs[i] != lhs[i] )
371 assert(
"pre: grid index is out-of-bounds!" &&
372 (gridIdx >= 0) && (gridIdx < static_cast<int>(this->
NumberOfGrids)));
386 assert(
"pre: grid index is out-of-bounds!" &&
387 (gridIdx >= 0) && (gridIdx < static_cast<int>(this->
NumberOfGrids)));
390 (this->
GridCellData[gridIdx]->GetNumberOfArrays( ) > 0) )
401 assert(
"pre: grid index is out-of-bounds!" &&
402 (gridIdx >= 0) && (gridIdx < static_cast<int>(this->
NumberOfGrids)));
424 for(
unsigned int i=0; i < this->
SendBuffers.size(); ++i )
426 for(
unsigned int j=0; j < this->
SendBuffers[i].size(); ++j )
438 for(
unsigned int i=0; i < this->
RcvBuffers.size(); ++i )
440 for(
unsigned int j=0; j < this->
RcvBuffers[i].size(); ++j )
456 for(
unsigned int i=0; i < this->
RemotePoints.size(); ++i )
458 for(
unsigned int j=0; j < this->
RemotePoints[i].size(); ++j )
507 assert(
"pre: Instance has not been intialized!" && this->
Initialized );
508 assert(
"pre: gridID is out-of-bounds" &&
509 (gridID >= 0) && (gridID < static_cast<int>(this->
NumberOfGrids) ) );
510 assert(
"pre: GridRanks is not properly allocated" &&
518 assert(
"pre: Instance has not been intialized!" && this->
Initialized );
519 assert(
"pre: gridID out-of-bounds!" &&
520 (gridID >= 0 && gridID < static_cast<int>(this->
NumberOfGrids)));
std::vector< std::vector< unsigned int > > RcvBufferSizes
int GetNumberOfLocalGrids()
std::vector< vtkPoints * > GridPoints
bool HasCellData(const int gridIdx)
bool HasPointData(const int gridIdx)
std::vector< int > GridIds
bool HasPoints(const int gridIdx)
virtual void RegisterGrid(const int gridID, int extents[6], vtkUnsignedCharArray *nodesGhostArray, vtkUnsignedCharArray *cellGhostArray, vtkPointData *pointData, vtkCellData *cellData, vtkPoints *gridNodes)
std::vector< std::vector< vtkPoints * > > RemotePoints
vtkMPICommunicator::Request * MPIRequests
bool GridExtentsAreEqual(int rhs[6], int lhs[6])
virtual void ComputeNeighbors()
std::vector< std::vector< vtkPointData * > > RemotePointData
vtkMultiProcessController * Controller
std::vector< std::vector< vtkCellData * > > RemoteCellData
int GetGridRank(const int gridID)
static vtkStructuredGridConnectivity * New()
bool IsGridRemote(const int gridID)
unsigned int NumberOfGrids
std::vector< int > GridRanks
virtual void CreateGhostLayers(const int N=1)
virtual void TransferGhostDataFromNeighbors(const int gridID)
void InitializeMessageCounters()
std::vector< std::vector< unsigned char * > > RcvBuffers
void PrintSelf(ostream &os, vtkIndent indent)
std::vector< std::vector< unsigned char * > > SendBuffers
std::vector< std::vector< unsigned int > > SendBufferSizes
bool IsGridLocal(const int gridID)
std::vector< vtkPointData * > GridPointData
virtual void SetNumberOfGrids(const unsigned int N)
std::vector< vtkCellData * > GridCellData