20#ifndef vtkStructuredGridConnectivity_h 
   21#define vtkStructuredGridConnectivity_h 
   23#define VTK_NO_OVERLAP 0 
   24#define VTK_NODE_OVERLAP 1 
   25#define VTK_EDGE_OVERLAP 2 
   26#define VTK_PARTIAL_OVERLAP 3 
   30#include "vtkFiltersGeometryModule.h"  
   42VTK_ABI_NAMESPACE_BEGIN
 
   60  vtkSetVector6Macro(WholeExtent, 
int);
 
   61  vtkGetVector6Macro(WholeExtent, 
int);
 
   68  vtkGetMacro(DataDimension, 
int);
 
   87  void GetGridExtent(
int gridID, 
int extent[6]);
 
   93  void SetGhostedGridExtent(
int gridID, 
int ext[6]);
 
   98  void GetGhostedGridExtent(
int gridID, 
int ext[6]);
 
  111    return (
static_cast<int>(this->Neighbors[gridID].size()));
 
  149  bool InBounds(
int idx, 
int Lo, 
int Hi) { 
return ((idx >= Lo) && (idx <= Hi)); }
 
  161    return (this->InBounds(A[0], B[0], B[1]) && this->InBounds(A[1], B[0], B[1]));
 
  188        assert(
"ERROR: code should not reach here!" && 
false);
 
  218    int gridID, 
int i, 
int j, 
int k, 
int ext[6], 
int RealExtent[6], 
unsigned char& pfield);
 
  224  void MarkCellProperty(
unsigned char& pfield, 
unsigned char* nodeGhostFields, 
int numNodes);
 
  235  bool IsGhostNode(
int GridExtent[6], 
int RealExtent[6], 
int i, 
int j, 
int k);
 
  241  bool IsNodeOnBoundaryOfExtent(
int i, 
int j, 
int k, 
int ext[6]);
 
  260  bool IsNodeInterior(
int i, 
int j, 
int k, 
int GridExtent[6]);
 
  270    switch (this->DataDescription)
 
  273        if ((GridExtent[0] <= i) && (i <= GridExtent[1]))
 
  279        if ((GridExtent[2] <= j) && (j <= GridExtent[3]))
 
  285        if ((GridExtent[4] <= k) && (k <= GridExtent[5]))
 
  291        if ((GridExtent[0] <= i) && (i <= GridExtent[1]) && (GridExtent[2] <= j) &&
 
  292          (j <= GridExtent[3]))
 
  298        if ((GridExtent[2] <= j) && (j <= GridExtent[3]) && (GridExtent[4] <= k) &&
 
  299          (k <= GridExtent[5]))
 
  305        if ((GridExtent[0] <= i) && (i <= GridExtent[1]) && (GridExtent[4] <= k) &&
 
  306          (k <= GridExtent[5]))
 
  312        if ((GridExtent[0] <= i) && (i <= GridExtent[1]) && (GridExtent[2] <= j) &&
 
  313          (j <= GridExtent[3]) && (GridExtent[4] <= k) && (k <= GridExtent[5]))
 
  319        std::cout << 
"Data description is: " << this->DataDescription << 
"\n";
 
  321        assert(
"pre: Undefined data-description!" && 
false);
 
  331    int i, 
int j, 
int i2jOrientation[3], 
int j2iOrientation[3], 
int overlapExtent[6]);
 
  341  void DetermineNeighborOrientation(
int idx, 
int A[2], 
int B[2], 
int overlap[2], 
int orient[3]);
 
  348  void DetectNeighbors(
int i, 
int j, 
int ex1[6], 
int ex2[6], 
int orientation[3], 
int ndim);
 
  381  int PartialOverlap(
int A[2], 
int CardinalityOfA, 
int B[2], 
int CardinalityOfB, 
int overlap[2]);
 
  410  bool HasBlockConnection(
int gridID, 
int blockDirection);
 
  426  void RemoveBlockConnection(
int gridID, 
int blockDirection);
 
  442  void AddBlockConnection(
int gridID, 
int blockDirection);
 
  448  void ClearBlockConnections(
int gridID);
 
  457  int GetNumberOfConnectingBlockFaces(
int gridID);
 
  476  int Get1DOrientation(
int idx, 
int ExtentLo, 
int ExtentHi, 
int OnLo, 
int OnHi, 
int NotOnBoundary);
 
  489  void GetGhostedExtent(
int* ghostedExtent, 
int GridExtent[6], 
int minIdx, 
int maxIdx, 
int N);
 
  563  int GetNeighborIndex(
int gridIdx, 
int NeighborGridIdx);
 
  577  std::vector<std::vector<vtkStructuredNeighbor>> 
Neighbors;
 
  592  assert(
"pre: Grid index is out-of-bounds!" && (gridIdx >= 0) &&
 
  594  assert(
"pre: Neighbor grid index is out-of-bounds!" && (NeighborGridIdx >= 0) &&
 
  597  std::pair<int, int> gridPair = std::make_pair(gridIdx, NeighborGridIdx);
 
  598  assert(
"pre: Neighboring grid pair does not exist in hash!" &&
 
  600      this->NeighborPair2NeighborListIndex.end()));
 
  607  int* ghostedExtent, 
int GridExtent[6], 
int minIdx, 
int maxIdx, 
int N)
 
  609  assert(
"pre: Number of ghost layers must be N >= 1" && (N >= 1));
 
  610  assert(
"pre: ghosted extent pointer is nullptr" && ghostedExtent != 
nullptr);
 
  612  ghostedExtent[minIdx] = GridExtent[minIdx] - N;
 
  613  ghostedExtent[maxIdx] = GridExtent[maxIdx] + N;
 
  616  ghostedExtent[minIdx] = (ghostedExtent[minIdx] < this->
WholeExtent[minIdx])
 
  618    : ghostedExtent[minIdx];
 
  619  ghostedExtent[maxIdx] = (ghostedExtent[maxIdx] > this->
WholeExtent[maxIdx])
 
  621    : ghostedExtent[maxIdx];
 
  627  assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
 
  629  assert(
"pre: ghosted-extents vector has not been allocated" &&
 
  632  for (
int i = 0; i < 6; ++i)
 
  641  assert(
"pre: gridID out-of-bounds!" &&
 
  642    (gridID >= 0 && gridID < 
static_cast<int>(this->
NumberOfGrids)));
 
  643  for (
int i = 0; i < 6; ++i)
 
  652  assert(
"pre: gridID out-of-bounds!" &&
 
  653    (gridID >= 0 && gridID < 
static_cast<int>(this->
NumberOfGrids)));
 
  657    ext[0] = ext[2] = ext[4] = -1;
 
  658    ext[1] = ext[3] = ext[5] = 0;
 
  659    vtkErrorMacro(
"No ghosted extents found for registered grid extends!!!");
 
  663  assert(
"GhostedExtents are not aligned with registered grid extents" &&
 
  665  for (
int i = 0; i < 6; ++i)
 
  683      if (i == ext[0] || i == ext[1])
 
  689      if (j == ext[2] || j == ext[3])
 
  695      if (k == ext[4] || k == ext[5])
 
  701      if ((i == ext[0] || i == ext[1]) || (j == ext[2] || j == ext[3]))
 
  707      if ((j == ext[2] || j == ext[3]) || (k == ext[4] || k == ext[5]))
 
  713      if ((i == ext[0] || i == ext[1]) || (k == ext[4] || k == ext[5]))
 
  719      if ((i == ext[0] || i == ext[1]) || (j == ext[2] || j == ext[3]) ||
 
  720        (k == ext[4] || k == ext[5]))
 
  728      assert(
"pre: Undefined data-description!" && 
false);
 
  742      if ((GridExtent[0] < i) && (i < GridExtent[1]))
 
  748      if ((GridExtent[2] < j) && (j < GridExtent[3]))
 
  754      if ((GridExtent[4] < k) && (k < GridExtent[5]))
 
  760      if ((GridExtent[0] < i) && (i < GridExtent[1]) && (GridExtent[2] < j) && (j < GridExtent[3]))
 
  766      if ((GridExtent[2] < j) && (j < GridExtent[3]) && (GridExtent[4] < k) && (k < GridExtent[5]))
 
  772      if ((GridExtent[0] < i) && (i < GridExtent[1]) && (GridExtent[4] < k) && (k < GridExtent[5]))
 
  778      if ((GridExtent[0] < i) && (i < GridExtent[1]) && (GridExtent[2] < j) &&
 
  779        (j < GridExtent[3]) && (GridExtent[4] < k) && (k < GridExtent[5]))
 
  787      assert(
"pre: Undefined data-description!" && 
false);
 
  795  int idx, 
int A[2], 
int B[2], 
int overlap[2], 
int orient[3])
 
  797  assert(
"pre: idx is out-of-bounds" && (idx >= 0) && (idx < 3));
 
  800  if (overlap[0] == overlap[1])
 
  806    else if (A[0] == B[1])
 
  813      assert(
"ERROR: Code should not reach here!" && 
false);
 
  819    if ((A[0] == B[0]) && (A[1] == B[1]))
 
  828    else if (A[0] == B[0])
 
  832    else if (A[1] == B[1])
 
  839      assert(
"ERROR: Code should not reach here!" && 
false);
 
  850    if (this->
InBounds(A[0], B[0], B[1]))
 
  854    else if (this->
InBounds(A[1], B[0], B[1]))
 
  861      assert(
"ERROR: Code should not reach here!" && 
false);
 
  867    assert(
"ERROR: Code should not reach here!" && 
false);
 
  873  int idx, 
int ExtentLo, 
int ExtentHi, 
int OnLo, 
int OnHi, 
int NotOnBoundary)
 
  879  else if (idx == ExtentHi)
 
  883  return NotOnBoundary;
 
  890  assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
 
  892  assert(
"pre: BlockTopology has not been properly allocated" &&
 
  894  assert(
"pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
 
  907  assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
 
  909  assert(
"pre: BlockTopology has not been properly allocated" &&
 
  911  assert(
"pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
 
  920  assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
 
  922  assert(
"pre: BlockTopology has not been properly allocated" &&
 
  924  assert(
"pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
 
  932  assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
 
  934  assert(
"pre: BlockTopology has not been properly allocated" &&
 
  936  for (
int i = 0; i < 6; ++i)
 
  946  assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
 
  948  assert(
"pre: BlockTopology has not been properly allocated" &&
 
  952  for (
int i = 0; i < 6; ++i)
 
  959  assert(
"post: count must be in [0,5]" && (count >= 0 && count <= 6));
 
  968    vtkErrorMacro(
"Number of grids cannot be 0.");
 
A superclass that defines the interface to be implemented by all concrete grid connectivity classes.
 
void AllocateUserRegisterDataStructures()
Allocate/De-allocate the data-structures where the user-supplied grids will be registered.
 
unsigned int NumberOfGrids
 
virtual void SetNumberOfGrids(unsigned int N)=0
Sets the total number of grids in the domain.
 
represent and manipulate cell attribute data
 
Represents and manipulates a collection of data arrays.
 
list of point or cell ids
 
a simple class to control print indentation
 
represent and manipulate point attribute data
 
represent and manipulate 3D points
 
@ VTK_STRUCTURED_XZ_PLANE
 
@ VTK_STRUCTURED_XY_PLANE
 
@ VTK_STRUCTURED_XYZ_GRID
 
@ VTK_STRUCTURED_YZ_PLANE
 
vtkStructuredGridConnectivity is a concrete instance of vtkObject that implements functionality for c...
 
void SetBlockTopology(int gridID)
Sets the block topology connections for the grid corresponding to gridID.
 
void SetNeighbors(int i, int j, int i2jOrientation[3], int j2iOrientation[3], int overlapExtent[6])
Creates a neighbor from i-to-j and from j-to-i.
 
void SearchNeighbors(int gridID, int i, int j, int k, vtkIdList *neiList)
Given a point (i,j,k) belonging to the grid corresponding to the given gridID, this method searches f...
 
int GetNumberOfConnectingBlockFaces(int gridID)
Returns the number of faces of the block corresponding to the given grid ID that are adjacent to at l...
 
int GetNeighborIndex(int gridIdx, int NeighborGridIdx)
Given a global grid ID and the neighbor grid ID, this method returns the neighbor index w....
 
bool IsSubset(int A[2], int B[2])
Returns true iff A is a subset of B, otherwise false.
 
void FillNodesGhostArray(int gridID, int dataDescription, int GridExtent[6], int RealExtent[6], vtkUnsignedCharArray *nodesArray)
Fills the ghost array for the nodes.
 
~vtkStructuredGridConnectivity() override
 
void ComputeNeighborSendAndRcvExtent(int gridID, int N)
This method computes, the send and rcv extents for each neighbor of each grid.
 
void CreateGhostedMaskArrays(int gridID)
This method creates the ghosted mask arrays, i.e., the NodeGhostArrays and the CellGhostArrays for th...
 
bool IsGhostNode(int GridExtent[6], int RealExtent[6], int i, int j, int k)
Checks if the node corresponding to the given global i,j,k coordinates is a ghost node or not.
 
void TransferLocalNeighborData(int gridID, const vtkStructuredNeighbor &Neighbor)
This method transfers the fields.
 
void CreateGhostLayers(int N=1) override
Creates ghost layers.
 
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...
 
void DetermineNeighborOrientation(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...
 
void EstablishNeighbors(int i, int j)
Establishes the neighboring information between the two grids corresponding to grid ids "i" and "j" w...
 
void ClearBlockConnections(int gridID)
Clears all block connections for the block corresponding to the given grid ID.
 
bool IsNodeOnSharedBoundary(int gridID, int RealExtent[6], int i, int j, int k)
Checks if the node corresponding to the given global i,j,k coordinates is on the shared boundary,...
 
void PrintExtent(int extent[6])
Prints the extent, used for debugging.
 
bool IsNodeOnBoundary(int i, int j, int k)
Checks if the node corresponding to the given global i,j,k coordinates touches the real boundaries of...
 
void AddBlockConnection(int gridID, int blockDirection)
Adds a block connection along the given direction for the block corresponding to the given gridID.
 
void FillGhostArrays(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 InitializeGhostData(int gridID)
This method initializes the ghost data according to the computed ghosted grid extent for the grid wit...
 
vtkIdList * GetNeighbors(int gridID, int *extents)
Returns the list of neighboring blocks for the given grid and the corresponding overlapping extents a...
 
int Cardinality(int S[2])
Returns the cardinality of a range S.
 
void DetectNeighbors(int i, 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,...
 
bool IsNodeWithinExtent(int i, int j, int k, int GridExtent[6])
Checks if the node corresponding to the given global i,j,k coordinates is within the given extent,...
 
bool IsNodeOnBoundaryOfExtent(int i, int j, 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...
 
void ComputeNeighbors() override
Computes neighboring information.
 
bool InBounds(int idx, int Lo, int Hi)
Returns true iff Lo <= idx <= Hi, otherwise false.
 
void MarkCellProperty(unsigned char &pfield, unsigned char *nodeGhostFields, int numNodes)
Marks the cell property for the cell composed by the nodes with the given ghost fields.
 
std::vector< unsigned char > BlockTopology
 
void GetGhostedGridExtent(int gridID, int ext[6])
Returns the ghosted grid extent for the block corresponding the.
 
void GetRealExtent(int gridID, int GridExtent[6], int RealExtent[6])
Given a grid extent, this method computes the RealExtent.
 
vtkStructuredNeighbor GetGridNeighbor(int gridID, int nei)
Returns the neighbor corresponding to the index nei for the grid with the given (global) grid ID.
 
void SetNumberOfGrids(unsigned int N) override
Set/Get the total number of domains distributed among processors.
 
void RemoveBlockConnection(int gridID, int blockDirection)
Removes a block connection along the given direction for the block corresponding to the given gridID.
 
std::vector< int > GhostedExtents
 
int GetNumberOfNodesPerCell(int dim)
Returns the number of nodes per cell according to the given dimension.
 
void GetIJKBlockOrientation(int i, int j, 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...
 
void CopyCoordinates(vtkPoints *source, vtkIdType sourceIdx, vtkPoints *target, vtkIdType targetIdx)
Copies the coordinates from the source points to the target points.
 
void MarkNodeProperty(int gridID, int i, int j, 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....
 
bool HasBlockConnection(int gridID, int blockDirection)
Checks if the block corresponding to the given grid ID has a block adjacent to it in the given block ...
 
void CreateGhostedExtent(int gridID, int N)
Creates the ghosted extent of the grid corresponding to the given gridID.
 
void GetGridExtent(int gridID, int extent[6])
Returns the grid extent of the grid corresponding to the given grid ID.
 
virtual void RegisterGrid(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.
 
int Get1DOrientation(int idx, int ExtentLo, int ExtentHi, int OnLo, int OnHi, int NotOnBoundary)
A helper method that computes the 1-D i-j-k orientation to facilitate the implementation of GetNodeBl...
 
void FillCellsGhostArray(int dataDescription, int numNodesPerCell, int dims[3], int CellExtent[6], vtkUnsignedCharArray *nodesArray, vtkUnsignedCharArray *cellsArray)
Fills the ghost array for the grid cells.
 
bool IsNodeInterior(int i, int j, int k, int GridExtent[6])
Checks if the node, corresponding to the given global i,j,k coordinates is within the interior of the...
 
std::map< std::pair< int, int >, int > NeighborPair2NeighborListIndex
 
int GetNumberOfNeighbors(int gridID)
Returns the number of neighbors for the grid corresponding to the given grid ID.
 
bool StrictlyInsideBounds(int idx, int Lo, int Hi)
Returns true iff Lo < idx < Hi, otherwise false.
 
void AllocatePointData(vtkPointData *RPD, int N, vtkPointData *PD)
Adds/creates all the arrays in the reference grid point data, RPD, to the user-supplied point data in...
 
void TransferRegisteredDataToGhostedData(int gridID)
This method transfers the registered grid data to the corresponding ghosted grid data.
 
int DoPartialOverlap(int s[2], int S[2], int overlap[2])
Checks if the internals s,S partially overlap where |s| < |S|.
 
std::vector< int > GridExtents
 
vtkStructuredGridConnectivity()
 
void SetGhostedGridExtent(int gridID, int ext[6])
Sets the ghosted grid extent for the grid corresponding to the given grid ID to the given extent.
 
void AllocateCellData(vtkCellData *RCD, int N, vtkCellData *CD)
Adds/creates all the arrays in the reference grid cell data, RCD, to the user-supplied cell data inst...
 
void GetGhostedExtent(int *ghostedExtent, int GridExtent[6], int minIdx, int maxIdx, int N)
Gets the ghosted extent from the given grid extent along the dimension given by minIdx and maxIdx.
 
std::vector< std::vector< vtkStructuredNeighbor > > Neighbors
 
static vtkStructuredGridConnectivity * New()
 
int IntervalOverlap(int A[2], int B[2], int overlap[2])
Checks if the intervals A,B overlap.
 
int PartialOverlap(int A[2], int CardinalityOfA, int B[2], int CardinalityOfB, int overlap[2])
Checks if the intervals A,B partially overlap.
 
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
 
virtual void TransferGhostDataFromNeighbors(int gridID)
This method transfers the fields (point data and cell data) to the ghost extents from the neighboring...
 
void AcquireDataDescription()
Based on the user-supplied WholeExtent, this method determines the topology of the structured domain,...
 
An internal, light-weight class used to store neighbor information.
 
dynamic, self-adjusting array of unsigned char
 
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
 
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)