Go to the documentation of this file.
32 #ifndef vtkStructuredGridConnectivity_h
33 #define vtkStructuredGridConnectivity_h
35 #define VTK_NO_OVERLAP 0
36 #define VTK_NODE_OVERLAP 1
37 #define VTK_EDGE_OVERLAP 2
38 #define VTK_PARTIAL_OVERLAP 3
41 #include "vtkFiltersGeometryModule.h"
72 vtkSetVector6Macro(WholeExtent,
int);
73 vtkGetVector6Macro(WholeExtent,
int);
80 vtkGetMacro(DataDimension,
int);
102 void GetGridExtent(
const int gridID,
int extent[6] );
108 void SetGhostedGridExtent(
const int gridID,
int ext[6] );
113 void GetGhostedGridExtent(
const int gridID,
int ext[6] );
125 {
return(
static_cast<int>(this->Neighbors[ gridID ].
size() )); };
164 bool InBounds(
const int idx,
const int Lo,
const int Hi )
165 {
return( (idx>=Lo) && (idx<=Hi) ); };
171 {
return( (idx > Lo) && (idx < Hi) ); };
177 {
return( this->InBounds(A[0], B[0], B[1]) &&
178 this->InBounds(A[1], B[0], B[1]) ); };
204 assert(
"ERROR: code should not reach here!" &&
false );
214 const int gridID,
const int dataDescription,
221 const int dataDescription,
const int numNodesPerCell,
232 const int i,
const int j,
const int k,
241 const int i,
const int j,
const int k,
242 int ext[6],
int RealExtent[6],
unsigned char &pfield );
249 unsigned char &pfield,
250 unsigned char *nodeGhostFields,
const int numNodes );
255 void GetRealExtent(
const int gridID,
int GridExtent[6],
int RealExtent[6] );
262 int GridExtent[6],
int RealExtent[6],
263 const int i,
const int j,
const int k );
269 bool IsNodeOnBoundaryOfExtent(
270 const int i,
const int j,
const int k,
int ext[6] );
278 const int gridID,
int RealExtent[6],
279 const int i,
const int j,
const int k );
292 const int i,
const int j,
const int k,
300 const int i,
const int j,
const int k,
305 switch( this->DataDescription )
308 if( (GridExtent[0] <= i) && (i <= GridExtent[1]) )
314 if( (GridExtent[2] <= j) && (j <= GridExtent[3] ) )
320 if( (GridExtent[4] <= k) && (k <= GridExtent[5] ) )
326 if( (GridExtent[0] <= i) && (i <= GridExtent[1]) &&
327 (GridExtent[2] <= j) && (j <= GridExtent[3]) )
333 if( (GridExtent[2] <= j) && (j <= GridExtent[3] ) &&
334 (GridExtent[4] <= k) && (k <= GridExtent[5] ) )
340 if( (GridExtent[0] <= i) && (i <= GridExtent[1] ) &&
341 (GridExtent[4] <= k) && (k <= GridExtent[5] ) )
347 if( (GridExtent[0] <= i) && (i <= GridExtent[1]) &&
348 (GridExtent[2] <= j) && (j <= GridExtent[3]) &&
349 (GridExtent[4] <= k) && (k <= GridExtent[5]) )
355 std::cout <<
"Data description is: " << this->DataDescription <<
"\n";
357 assert(
"pre: Undefined data-description!" &&
false );
367 const int i,
const int j,
368 int i2jOrientation[3],
int j2iOrientation[3],
369 int overlapExtent[6] );
379 void DetermineNeighborOrientation(
380 const int idx,
int A[2],
int B[2],
int overlap[2],
int orient[3] );
388 const int i,
const int j,
int ex1[6],
int ex2[6],
423 int A[2],
const int CofA,
424 int B[2],
const int CofB,
453 bool HasBlockConnection(
const int gridID,
const int blockDirection );
469 void RemoveBlockConnection(
const int gridID,
const int blockDirection );
485 void AddBlockConnection(
const int gridID,
const int blockDirection );
491 void ClearBlockConnections(
const int gridID );
500 int GetNumberOfConnectingBlockFaces(
const int gridID );
514 const int i,
const int j,
const int k,
int ext[6],
int orientation[3] );
520 int Get1DOrientation(
521 const int idx,
const int ExtentLo,
const int ExtentHi,
522 const int OnLo,
const int OnHi,
const int NotOnBoundary );
535 void GetGhostedExtent(
536 int *ghostedExtent,
int GridExtent[6],
537 const int minIdx,
const int maxIdx,
const int N);
614 int GetNeighborIndex(
const int gridIdx,
const int NeighborGridIdx );
628 std::vector< std::vector<vtkStructuredNeighbor> >
Neighbors;
642 const int gridIdx,
const int NeighborGridIdx )
644 assert(
"pre: Grid index is out-of-bounds!" &&
647 assert(
"pre: Neighbor grid index is out-of-bounds!" &&
648 (NeighborGridIdx >= 0) &&
649 (NeighborGridIdx <
static_cast<int>(this->
NumberOfGrids) ) );
651 std::pair<int,int> gridPair = std::make_pair(gridIdx,NeighborGridIdx);
652 assert(
"pre: Neighboring grid pair does not exist in hash!" &&
654 this->NeighborPair2NeighborListIndex.end() ) );
661 int *ghostedExtent,
int GridExtent[6],
662 const int minIdx,
const int maxIdx,
const int N )
664 assert(
"pre: Number of ghost layers must be N >= 1" && (N >= 1) );
665 assert(
"pre: ghosted extent pointer is nullptr" && ghostedExtent !=
nullptr);
667 ghostedExtent[minIdx] = GridExtent[minIdx]-N;
668 ghostedExtent[maxIdx] = GridExtent[maxIdx]+N;
671 ghostedExtent[minIdx] =
672 (ghostedExtent[minIdx] < this->
WholeExtent[minIdx] )?
674 ghostedExtent[maxIdx] =
675 (ghostedExtent[maxIdx] > this->
WholeExtent[maxIdx])?
681 const int gridID,
int ext[6] )
683 assert(
"pre: gridID is out-of-bounds" &&
684 (gridID >= 0) && (gridID <
static_cast<int>(this->
NumberOfGrids)));
685 assert(
"pre: ghosted-extents vector has not been allocated" &&
688 for(
int i=0; i < 6; ++i )
696 const int gridID,
int ext[6])
698 assert(
"pre: gridID out-of-bounds!" &&
699 (gridID >= 0 && gridID <
static_cast<int>(this->
NumberOfGrids)));
700 for(
int i=0; i < 6; ++i )
708 const int gridID,
int ext[6])
710 assert(
"pre: gridID out-of-bounds!" &&
711 (gridID >= 0 && gridID <
static_cast<int>(this->
NumberOfGrids)));
715 ext[0] = ext[2] = ext[4] = -1;
716 ext[1] = ext[3] = ext[5] = 0;
717 vtkErrorMacro(
"No ghosted extents found for registered grid extends!!!" );
721 assert(
"GhostedExtents are not aligned with registered grid extents" &&
723 for(
int i=0; i < 6; ++i )
731 const int i,
const int j,
const int k,
int ext[6] )
742 if( i==ext[0] || i==ext[1] )
748 if( j==ext[2] || j==ext[3] )
754 if( k==ext[4] || k==ext[5] )
760 if( (i==ext[0] || i==ext[1]) ||
761 (j==ext[2] || j==ext[3]) )
767 if( (j==ext[2] || j==ext[3]) ||
768 (k==ext[4] || k==ext[5]) )
774 if( (i==ext[0] || i==ext[1]) ||
775 (k==ext[4] || k==ext[5]) )
781 if( (i==ext[0] || i==ext[1]) ||
782 (j==ext[2] || j==ext[3]) ||
783 (k==ext[4] || k==ext[5]) )
791 assert(
"pre: Undefined data-description!" &&
false );
799 const int i,
const int j,
const int k,
807 if( (GridExtent[0] < i) && (i < GridExtent[1]) )
813 if( (GridExtent[2] < j) && (j < GridExtent[3] ) )
819 if( (GridExtent[4] < k) && (k < GridExtent[5] ) )
825 if( (GridExtent[0] < i) && (i < GridExtent[1]) &&
826 (GridExtent[2] < j) && (j < GridExtent[3]) )
832 if( (GridExtent[2] < j) && (j < GridExtent[3] ) &&
833 (GridExtent[4] < k) && (k < GridExtent[5] ) )
839 if( (GridExtent[0] < i) && (i < GridExtent[1] ) &&
840 (GridExtent[4] < k) && (k < GridExtent[5] ) )
846 if( (GridExtent[0] < i) && (i < GridExtent[1]) &&
847 (GridExtent[2] < j) && (j < GridExtent[3]) &&
848 (GridExtent[4] < k) && (k < GridExtent[5]) )
856 assert(
"pre: Undefined data-description!" &&
false );
864 const int idx,
int A[2],
int B[2],
int overlap[2],
int orient[3] )
866 assert(
"pre: idx is out-of-bounds" && (idx >= 0) && (idx < 3) );
869 if( overlap[0] == overlap[1] )
875 else if( A[0] == B[1] )
882 assert(
"ERROR: Code should not reach here!" &&
false );
888 if( (A[0] == B[0]) && (A[1] == B[1]) )
897 else if( A[0] == B[0] )
901 else if( A[1] == B[1] )
908 assert(
"ERROR: Code should not reach here!" &&
false );
919 if( this->
InBounds( A[0], B[0], B[1] ) )
923 else if( this->
InBounds( A[1], B[0], B[1] ) )
930 assert(
"ERROR: Code should not reach here!" &&
false );
936 assert(
"ERROR: Code should not reach here!" &&
false );
942 const int idx,
const int ExtentLo,
const int ExtentHi,
943 const int OnLo,
const int OnHi,
const int NotOnBoundary )
945 if( idx == ExtentLo )
949 else if( idx == ExtentHi )
953 return NotOnBoundary;
958 const int gridID,
const int blockDirection )
961 assert(
"pre: gridID is out-of-bounds" &&
962 (gridID >=0) && (gridID <
static_cast<int>(this->
NumberOfGrids)));
963 assert(
"pre: BlockTopology has not been properly allocated" &&
965 assert(
"pre: blockDirection is out-of-bounds" &&
966 (blockDirection >= 0) && (blockDirection < 6) );
977 const int gridID,
const int blockDirection )
980 assert(
"pre: gridID is out-of-bounds" &&
981 (gridID >=0) && (gridID <
static_cast<int>(this->
NumberOfGrids)));
982 assert(
"pre: BlockTopology has not been properly allocated" &&
984 assert(
"pre: blockDirection is out-of-bounds" &&
985 (blockDirection >= 0) && (blockDirection < 6) );
992 const int gridID,
const int blockDirection )
995 assert(
"pre: gridID is out-of-bounds" &&
996 (gridID >=0) && (gridID <
static_cast<int>(this->
NumberOfGrids)));
997 assert(
"pre: BlockTopology has not been properly allocated" &&
999 assert(
"pre: blockDirection is out-of-bounds" &&
1000 (blockDirection >= 0) && (blockDirection < 6) );
1009 assert(
"pre: gridID is out-of-bounds" &&
1010 (gridID >=0) && (gridID <
static_cast<int>(this->
NumberOfGrids)));
1011 assert(
"pre: BlockTopology has not been properly allocated" &&
1013 for(
int i=0; i < 6; ++i )
1024 assert(
"pre: gridID is out-of-bounds" &&
1025 (gridID >=0) && (gridID <
static_cast<int>(this->
NumberOfGrids)));
1026 assert(
"pre: BlockTopology has not been properly allocated" &&
1030 for(
int i=0; i < 6; ++i )
1037 assert(
"post: count must be in [0,5]" && (count >=0 && count <= 6) );
1043 const unsigned int N )
1047 vtkErrorMacro(
"Number of grids cannot be 0.");
represent and manipulate 3D points
void CopyFieldData(vtkFieldData *source, vtkIdType sourceIdx, vtkFieldData *target, vtkIdType targetIdx)
Loops through all arrays in the source and for each array, it copies the tuples from sourceIdx to the...
int GetNeighborIndex(const int gridIdx, const int NeighborGridIdx)
Given a global grid ID and the neighbor grid ID, this method returns the neighbor index w....
void GetGhostedExtent(int *ghostedExtent, int GridExtent[6], const int minIdx, const int maxIdx, const int N)
Gets the ghosted extent from the given grid extent along the dimension given by minIdx and maxIdx.
represent and manipulate point attribute data
void SetNumberOfGrids(const unsigned int N) override
Set/Get the total number of domains distributed among processors.
void ClearBlockConnections(const int gridID)
Clears all block connections for the block corresponding to the given grid ID.
void FillGhostArrays(const int gridID, vtkUnsignedCharArray *nodesArray, vtkUnsignedCharArray *cellsArray) override
Fills the mesh property arrays, nodes and cells, for the grid corresponding to the given grid ID.
void AcquireDataDescription()
Based on the user-supplied WholeExtent, this method determines the topology of the structured domain,...
void AllocateCellData(vtkCellData *RCD, const int N, vtkCellData *CD)
Adds/creates all the arrays in the reference grid cell data, RCD, to the user-supplied cell data inst...
vtkStructuredNeighbor GetGridNeighbor(const int gridID, const int nei)
Returns the neighbor corresponding to the index nei for the grid with the given (global) grid ID.
void SetBlockTopology(const int gridID)
Sets the block topology connections for the grid corresponding to gridID.
void ComputeNeighbors() override
Computes neighboring information.
std::map< std::pair< int, int >, int > NeighborPair2NeighborListIndex
bool HasBlockConnection(const int gridID, const int blockDirection)
Checks if the block corresponding to the given grid ID has a block adjacent to it in the given block ...
dynamic, self-adjusting array of unsigned char
void SetNeighbors(const int i, const int j, int i2jOrientation[3], int j2iOrientation[3], int overlapExtent[6])
Creates a neighbor from i-to-j and from j-to-i.
vtkStructuredGridConnectivity()
int GetNumberOfNodesPerCell(const int dim)
Returns the number of nodes per cell according to the given dimension.
void SetGhostedGridExtent(const int gridID, int ext[6])
Sets the ghosted grid extent for the grid corresponding to the given grid ID to the given extent.
void AllocatePointData(vtkPointData *RPD, const int N, vtkPointData *PD)
Adds/creates all the arrays in the reference grid point data, RPD, to the user-supplied point data in...
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int IntervalOverlap(int A[2], int B[2], int overlap[2])
Checks if the intervals A,B overlap.
void AddBlockConnection(const int gridID, const int blockDirection)
Adds a block connection along the given direction for the block corresponding to the given gridID.
represent and manipulate fields of data
void DetectNeighbors(const int i, const int j, int ex1[6], int ex2[6], int orientation[3], int ndim)
Detects if the two extents, ex1 and ex2, corresponding to the grids with grid IDs i,...
virtual void SetNumberOfGrids(const unsigned int N)=0
Sets the total number of grids in the domain.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
std::vector< std::vector< vtkStructuredNeighbor > > Neighbors
void AllocateUserRegisterDataStructures()
Allocate/De-allocate the data-structures where the user-supplied grids will be registered.
bool IsNodeOnSharedBoundary(const int gridID, int RealExtent[6], const int i, const int j, const int k)
Checks if the node corresponding to the given global i,j,k coordinates is on the shared boundary,...
void ComputeNeighborSendAndRcvExtent(const int gridID, const int N)
This method computes, the send and rcv extents for each neighbor of each grid.
bool IsNodeOnBoundary(const int i, const int j, const int k)
Checks if the node corresponding to the given global i,j,k coordinates touches the real boundaries of...
bool IsNodeInterior(const int i, const int j, const int k, int GridExtent[6])
Checks if the node, corresponding to the given global i,j,k coordinates is within the interior of the...
vtkIdList * GetNeighbors(const int gridID, int *extents)
Returns the list of neighboring blocks for the given grid and the corresponding overlapping extents a...
bool IsNodeWithinExtent(const int i, const int j, const int k, int GridExtent[6])
Checks if the node corresponding to the given global i,j,k coordinates is within the given extent,...
int GetNumberOfNeighbors(const int gridID)
Returns the number of neighbors for the grid corresponding to the given grid ID.
int Get1DOrientation(const int idx, const int ExtentLo, const int ExtentHi, const int OnLo, const int OnHi, const int NotOnBoundary)
A helper method that computes the 1-D i-j-k orientation to facilitate the implementation of GetNodeBl...
unsigned int NumberOfGrids
void CreateGhostedExtent(const int gridID, const int N)
Creates the ghosted extent of the grid corresponding to the given gridID.
bool IsNodeOnBoundaryOfExtent(const int i, const int j, const int k, int ext[6])
Checks if the node corresponding to the given global i,j,k coordinates is on the boundary of the give...
represent and manipulate cell attribute data
virtual void RegisterGrid(const int gridID, int extents[6], vtkUnsignedCharArray *nodesGhostArray, vtkUnsignedCharArray *cellGhostArray, vtkPointData *pointData, vtkCellData *cellData, vtkPoints *gridNodes)
Registers the current grid corresponding to the grid ID by its global extent w.r.t.
bool InBounds(const int idx, const int Lo, const int Hi)
Returns true iff Lo <= idx <= Hi, otherwise false.
a simple class to control print indentation
void CopyCoordinates(vtkPoints *source, vtkIdType sourceIdx, vtkPoints *target, vtkIdType targetIdx)
Copies the coordinates from the source points to the target points.
void RemoveBlockConnection(const int gridID, const int blockDirection)
Removes a block connection along the given direction for the block corresponding to the given gridID.
void GetGridExtent(const int gridID, int extent[6])
Returns the grid extent of the grid corresponding to the given grid ID.
list of point or cell ids
void MarkCellProperty(unsigned char &pfield, unsigned char *nodeGhostFields, const int numNodes)
Marks the cell property for the cell composed by the nodes with the given ghost fields.
int DoPartialOverlap(int s[2], int S[2], int overlap[2])
Checks if the internals s,S partially overlap where |s| < |S|.
void EstablishNeighbors(const int i, const int j)
Establishes the neighboring information between the two grids corresponding to grid ids "i" and "j" w...
void TransferLocalNeighborData(const int gridID, const vtkStructuredNeighbor &Neighor)
This method transfers the fields.
virtual void TransferGhostDataFromNeighbors(const int gridID)
This method transfers the fields (point data and cell data) to the ghost extents from the neighboring...
void DetermineNeighborOrientation(const int idx, int A[2], int B[2], int overlap[2], int orient[3])
Given two overlapping extents A,B and the corresponding overlap extent this method computes A's relat...
bool IsGhostNode(int GridExtent[6], int RealExtent[6], const int i, const int j, const int k)
Checks if the node corresponding to the given global i,j,k coordinates is a ghost node or not.
void InitializeGhostData(const int gridID)
This method initializes the ghost data according to the computed ghosted grid extent for the grid wit...
void SearchNeighbors(const int gridID, const int i, const int j, const int k, vtkIdList *neiList)
Given a point (i,j,k) belonging to the grid corresponding to the given gridID, this method searches f...
void MarkNodeProperty(const int gridID, const int i, const int j, const int k, int ext[6], int RealExtent[6], unsigned char &pfield)
Marks the node properties with the node with the given global i,j,k grid coordinates w....
std::vector< int > GhostedExtents
void FillCellsGhostArray(const int dataDescription, const int numNodesPerCell, int dims[3], int CellExtent[6], vtkUnsignedCharArray *nodesArray, vtkUnsignedCharArray *cellsArray)
Fills the ghost array for the grid cells.
std::vector< int > GridExtents
static vtkStructuredGridConnectivity * New()
void CreateGhostedMaskArrays(const int gridID)
This method creates the ghosted mask arrays, i.e., the NodeGhostArrays and the CellGhostArrays for th...
~vtkStructuredGridConnectivity() override
bool StrictlyInsideBounds(const int idx, const int Lo, const int Hi)
Returns true iff Lo < idx < Hi, otherwise false.
int Cardinality(int S[2])
Returns the cardinality of a range S.
void GetIJKBlockOrientation(const int i, const int j, const int k, int ext[6], int orientation[3])
Given i-j-k coordinates and the grid defined by tis extent, ext, this method determines IJK orientati...
int PartialOverlap(int A[2], const int CofA, int B[2], const int CofB, int overlap[2])
Checks if the intervals A,B partially overlap.
bool IsSubset(int A[2], int B[2])
Returns true iff A is a subset of B, otherwise false.
int GetNumberOfConnectingBlockFaces(const int gridID)
Returns the number of faces of the block corresponding to the given grid ID that are adjacent to at l...
void CreateGhostLayers(const int N=1) override
Creates ghost layers.
void GetRealExtent(const int gridID, int GridExtent[6], int RealExtent[6])
Given a grid extent, this method computes the RealExtent.
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
void GetGhostedGridExtent(const int gridID, int ext[6])
Returns the ghosted grid extent for the block corresponding the.
void FillNodesGhostArray(const int gridID, const int dataDescription, int GridExtent[6], int RealExtent[6], vtkUnsignedCharArray *nodeArray)
Fills the ghost array for the nodes.
void PrintExtent(int extent[6])
Prints the extent, used for debugging.
void TransferRegisteredDataToGhostedData(const int gridID)
This method transfers the registered grid data to the corresponding ghosted grid data.
std::vector< unsigned char > BlockTopology