VTK  9.7.1
vtkStructuredGridConnectivity.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
20 #ifndef vtkStructuredGridConnectivity_h
21 #define vtkStructuredGridConnectivity_h
22 
23 #define VTK_NO_OVERLAP 0
24 #define VTK_NODE_OVERLAP 1
25 #define VTK_EDGE_OVERLAP 2
26 #define VTK_PARTIAL_OVERLAP 3
27 
28 // VTK include directives
30 #include "vtkFiltersGeometryModule.h" // For export macro
31 #include "vtkStructuredData.h" // For data description definitions
32 #include "vtkStructuredNeighbor.h" // For Structured Neighbor object definition
33 
34 // C++ include directives
35 #include <cassert> // For assert()
36 #include <iostream> // For cout
37 #include <map> // For STL map
38 #include <utility> // For STL pair and overloaded relational operators
39 #include <vector> // For STL vector
40 
41 // Forward Declarations
42 VTK_ABI_NAMESPACE_BEGIN
43 class vtkIdList;
45 class vtkPointData;
46 class vtkCellData;
47 class vtkPoints;
48 
49 class VTKFILTERSGEOMETRY_EXPORT vtkStructuredGridConnectivity : public vtkAbstractGridConnectivity
50 {
51 public:
54  void PrintSelf(ostream& os, vtkIndent indent) override;
55 
57 
60  vtkSetVector6Macro(WholeExtent, int);
61  vtkGetVector6Macro(WholeExtent, int);
63 
65 
68  vtkGetMacro(DataDimension, int);
70 
74  void SetNumberOfGrids(unsigned int N) override;
75 
80  virtual void RegisterGrid(int gridID, int extents[6], vtkUnsignedCharArray* nodesGhostArray,
81  vtkUnsignedCharArray* cellGhostArray, vtkPointData* pointData, vtkCellData* cellData,
82  vtkPoints* gridNodes);
83 
87  void GetGridExtent(int gridID, int extent[6]);
88 
93  void SetGhostedGridExtent(int gridID, int ext[6]);
94 
98  void GetGhostedGridExtent(int gridID, int ext[6]);
99 
103  void ComputeNeighbors() override;
104 
109  int GetNumberOfNeighbors(int gridID)
110  {
111  return (static_cast<int>(this->Neighbors[gridID].size()));
112  }
113 
118  vtkStructuredNeighbor GetGridNeighbor(int gridID, int nei);
119 
127  vtkIdList* GetNeighbors(int gridID, int extents[6]);
128 
134  void FillGhostArrays(
135  int gridID, vtkUnsignedCharArray* nodesArray, vtkUnsignedCharArray* cellsArray) override;
136 
140  void CreateGhostLayers(int N = 1) override;
141 
142 protected:
144  ~vtkStructuredGridConnectivity() override;
145 
149  bool InBounds(int idx, int Lo, int Hi) { return ((idx >= Lo) && (idx <= Hi)); }
150 
154  bool StrictlyInsideBounds(int idx, int Lo, int Hi) { return ((idx > Lo) && (idx < Hi)); }
155 
159  bool IsSubset(int A[2], int B[2])
160  {
161  return (this->InBounds(A[0], B[0], B[1]) && this->InBounds(A[1], B[0], B[1]));
162  }
163 
167  int Cardinality(int S[2]) { return (S[1] - S[0] + 1); }
168 
170 
174  {
175  int numNodes = 0;
176  switch (dim)
177  {
178  case 1:
179  numNodes = 2; // line cell
180  break;
181  case 2:
182  numNodes = 4; // quad cell
183  break;
184  case 3:
185  numNodes = 8; // hex cell
186  break;
187  default:
188  assert("ERROR: code should not reach here!" && false);
189  } // END switch
190  return (numNodes);
191  }
193 
197  void FillNodesGhostArray(int gridID, int dataDescription, int GridExtent[6], int RealExtent[6],
198  vtkUnsignedCharArray* nodesArray);
199 
203  void FillCellsGhostArray(int dataDescription, int numNodesPerCell, int dims[3], int CellExtent[6],
204  vtkUnsignedCharArray* nodesArray, vtkUnsignedCharArray* cellsArray);
205 
211  void SearchNeighbors(int gridID, int i, int j, int k, vtkIdList* neiList);
212 
217  void MarkNodeProperty(
218  int gridID, int i, int j, int k, int ext[6], int RealExtent[6], unsigned char& pfield);
219 
224  void MarkCellProperty(unsigned char& pfield, unsigned char* nodeGhostFields, int numNodes);
225 
229  void GetRealExtent(int gridID, int GridExtent[6], int RealExtent[6]);
230 
235  bool IsGhostNode(int GridExtent[6], int RealExtent[6], int i, int j, int k);
236 
241  bool IsNodeOnBoundaryOfExtent(int i, int j, int k, int ext[6]);
242 
248  bool IsNodeOnSharedBoundary(int gridID, int RealExtent[6], int i, int j, int k);
249 
254  bool IsNodeOnBoundary(int i, int j, int k);
255 
260  bool IsNodeInterior(int i, int j, int k, int GridExtent[6]);
261 
266  bool IsNodeWithinExtent(int i, int j, int k, int GridExtent[6])
267  {
268  bool status = false;
269 
270  switch (this->DataDescription)
271  {
273  if ((GridExtent[0] <= i) && (i <= GridExtent[1]))
274  {
275  status = true;
276  }
277  break;
279  if ((GridExtent[2] <= j) && (j <= GridExtent[3]))
280  {
281  status = true;
282  }
283  break;
285  if ((GridExtent[4] <= k) && (k <= GridExtent[5]))
286  {
287  status = true;
288  }
289  break;
291  if ((GridExtent[0] <= i) && (i <= GridExtent[1]) && (GridExtent[2] <= j) &&
292  (j <= GridExtent[3]))
293  {
294  status = true;
295  }
296  break;
298  if ((GridExtent[2] <= j) && (j <= GridExtent[3]) && (GridExtent[4] <= k) &&
299  (k <= GridExtent[5]))
300  {
301  status = true;
302  }
303  break;
305  if ((GridExtent[0] <= i) && (i <= GridExtent[1]) && (GridExtent[4] <= k) &&
306  (k <= GridExtent[5]))
307  {
308  status = true;
309  }
310  break;
312  if ((GridExtent[0] <= i) && (i <= GridExtent[1]) && (GridExtent[2] <= j) &&
313  (j <= GridExtent[3]) && (GridExtent[4] <= k) && (k <= GridExtent[5]))
314  {
315  status = true;
316  }
317  break;
318  default:
319  std::cout << "Data description is: " << this->DataDescription << "\n";
320  std::cout.flush();
321  assert("pre: Undefined data-description!" && false);
322  } // END switch
323 
324  return (status);
325  }
326 
330  void SetNeighbors(
331  int i, int j, int i2jOrientation[3], int j2iOrientation[3], int overlapExtent[6]);
332 
341  void DetermineNeighborOrientation(int idx, int A[2], int B[2], int overlap[2], int orient[3]);
342 
348  void DetectNeighbors(int i, int j, int ex1[6], int ex2[6], int orientation[3], int ndim);
349 
359  int IntervalOverlap(int A[2], int B[2], int overlap[2]);
360 
370  int DoPartialOverlap(int s[2], int S[2], int overlap[2]);
371 
381  int PartialOverlap(int A[2], int CardinalityOfA, int B[2], int CardinalityOfB, int overlap[2]);
382 
387  void EstablishNeighbors(int i, int j);
388 
394  void AcquireDataDescription();
395 
410  bool HasBlockConnection(int gridID, int blockDirection);
411 
426  void RemoveBlockConnection(int gridID, int blockDirection);
427 
442  void AddBlockConnection(int gridID, int blockDirection);
443 
448  void ClearBlockConnections(int gridID);
449 
457  int GetNumberOfConnectingBlockFaces(int gridID);
458 
462  void SetBlockTopology(int gridID);
463 
470  void GetIJKBlockOrientation(int i, int j, int k, int ext[6], int orientation[3]);
471 
476  int Get1DOrientation(int idx, int ExtentLo, int ExtentHi, int OnLo, int OnHi, int NotOnBoundary);
477 
482  void CreateGhostedExtent(int gridID, int N);
483 
489  void GetGhostedExtent(
490  int ghostedExtent[6], VTK_FUTURE_CONST int GridExtent[6], int minIdx, int maxIdx, int N);
491 
496  void CreateGhostedMaskArrays(int gridID);
497 
504  void InitializeGhostData(int gridID);
505 
511  void AllocatePointData(vtkPointData* RPD, int N, vtkPointData* PD);
512 
518  void AllocateCellData(vtkCellData* RCD, int N, vtkCellData* CD);
519 
524  void TransferRegisteredDataToGhostedData(int gridID);
525 
530  void ComputeNeighborSendAndRcvExtent(int gridID, int N);
531 
537  virtual void TransferGhostDataFromNeighbors(int gridID);
538 
542  void TransferLocalNeighborData(int gridID, const vtkStructuredNeighbor& Neighbor);
543 
547  void CopyCoordinates(
548  vtkPoints* source, vtkIdType sourceIdx, vtkPoints* target, vtkIdType targetIdx);
549 
556  void CopyFieldData(
557  vtkFieldData* source, vtkIdType sourceIdx, vtkFieldData* target, vtkIdType targetIdx);
558 
564  int GetNeighborIndex(int gridIdx, int NeighborGridIdx);
565 
569  void PrintExtent(int extent[6]);
570 
573  int WholeExtent[6];
574 
575  std::vector<int> GridExtents;
576  std::vector<int> GhostedExtents;
577  std::vector<unsigned char> BlockTopology;
578  std::vector<std::vector<vtkStructuredNeighbor>> Neighbors;
579  std::map<std::pair<int, int>, int> NeighborPair2NeighborListIndex;
580 
581 private:
583  void operator=(const vtkStructuredGridConnectivity&) = delete;
584 };
585 
586 //=============================================================================
587 // INLINE METHODS
588 //=============================================================================
589 
590 //------------------------------------------------------------------------------
591 inline int vtkStructuredGridConnectivity::GetNeighborIndex(int gridIdx, int NeighborGridIdx)
592 {
593  assert("pre: Grid index is out-of-bounds!" && (gridIdx >= 0) &&
594  (gridIdx < static_cast<int>(this->NumberOfGrids)));
595  assert("pre: Neighbor grid index is out-of-bounds!" && (NeighborGridIdx >= 0) &&
596  (NeighborGridIdx < static_cast<int>(this->NumberOfGrids)));
597 
598  std::pair<int, int> gridPair = std::make_pair(gridIdx, NeighborGridIdx);
599  assert("pre: Neighboring grid pair does not exist in hash!" &&
600  (this->NeighborPair2NeighborListIndex.find(gridPair) !=
601  this->NeighborPair2NeighborListIndex.end()));
602 
603  return (this->NeighborPair2NeighborListIndex[gridPair]);
604 }
605 
606 //------------------------------------------------------------------------------
608  int ghostedExtent[6], VTK_FUTURE_CONST int GridExtent[6], int minIdx, int maxIdx, int N)
609 {
610  assert("pre: Number of ghost layers must be N >= 1" && (N >= 1));
611  assert("pre: ghosted extent pointer is nullptr" && ghostedExtent != nullptr);
612 
613  ghostedExtent[minIdx] = GridExtent[minIdx] - N;
614  ghostedExtent[maxIdx] = GridExtent[maxIdx] + N;
615 
616  // Clamp the ghosted extent to be within the WholeExtent
617  ghostedExtent[minIdx] = (ghostedExtent[minIdx] < this->WholeExtent[minIdx])
618  ? this->WholeExtent[minIdx]
619  : ghostedExtent[minIdx];
620  ghostedExtent[maxIdx] = (ghostedExtent[maxIdx] > this->WholeExtent[maxIdx])
621  ? this->WholeExtent[maxIdx]
622  : ghostedExtent[maxIdx];
623 }
624 
625 //------------------------------------------------------------------------------
626 inline void vtkStructuredGridConnectivity::SetGhostedGridExtent(int gridID, int ext[6])
627 {
628  assert("pre: gridID is out-of-bounds" && (gridID >= 0) &&
629  (gridID < static_cast<int>(this->NumberOfGrids)));
630  assert("pre: ghosted-extents vector has not been allocated" &&
631  (this->NumberOfGrids == this->GhostedExtents.size() / 6));
632 
633  for (int i = 0; i < 6; ++i)
634  {
635  this->GhostedExtents[gridID * 6 + i] = ext[i];
636  }
637 }
638 
639 //------------------------------------------------------------------------------
640 inline void vtkStructuredGridConnectivity::GetGridExtent(int gridID, int ext[6])
641 {
642  assert("pre: gridID out-of-bounds!" &&
643  (gridID >= 0 && gridID < static_cast<int>(this->NumberOfGrids)));
644  for (int i = 0; i < 6; ++i)
645  {
646  ext[i] = this->GridExtents[gridID * 6 + i];
647  }
648 }
649 
650 //------------------------------------------------------------------------------
651 inline void vtkStructuredGridConnectivity::GetGhostedGridExtent(int gridID, int ext[6])
652 {
653  assert("pre: gridID out-of-bounds!" &&
654  (gridID >= 0 && gridID < static_cast<int>(this->NumberOfGrids)));
655 
656  if (this->GhostedExtents.empty())
657  {
658  ext[0] = ext[2] = ext[4] = -1;
659  ext[1] = ext[3] = ext[5] = 0;
660  vtkErrorMacro("No ghosted extents found for registered grid extends!!!");
661  return;
662  }
663 
664  assert("GhostedExtents are not aligned with registered grid extents" &&
665  (this->GhostedExtents.size() == this->GridExtents.size()));
666  for (int i = 0; i < 6; ++i)
667  {
668  ext[i] = this->GhostedExtents[gridID * 6 + i];
669  }
670 }
671 
672 //------------------------------------------------------------------------------
673 inline bool vtkStructuredGridConnectivity::IsNodeOnBoundaryOfExtent(int i, int j, int k, int ext[6])
674 {
675  if (!this->IsNodeWithinExtent(i, j, k, ext))
676  {
677  return false;
678  }
679 
680  bool status = false;
681  switch (this->DataDescription)
682  {
684  if (i == ext[0] || i == ext[1])
685  {
686  status = true;
687  }
688  break;
690  if (j == ext[2] || j == ext[3])
691  {
692  status = true;
693  }
694  break;
696  if (k == ext[4] || k == ext[5])
697  {
698  status = true;
699  }
700  break;
702  if ((i == ext[0] || i == ext[1]) || (j == ext[2] || j == ext[3]))
703  {
704  status = true;
705  }
706  break;
708  if ((j == ext[2] || j == ext[3]) || (k == ext[4] || k == ext[5]))
709  {
710  status = true;
711  }
712  break;
714  if ((i == ext[0] || i == ext[1]) || (k == ext[4] || k == ext[5]))
715  {
716  status = true;
717  }
718  break;
720  if ((i == ext[0] || i == ext[1]) || (j == ext[2] || j == ext[3]) ||
721  (k == ext[4] || k == ext[5]))
722  {
723  status = true;
724  }
725  break;
726  default:
727  std::cout << "Data description is: " << this->DataDescription << "\n";
728  std::cout.flush();
729  assert("pre: Undefined data-description!" && false);
730  } // END switch
731 
732  return (status);
733 }
734 
735 //------------------------------------------------------------------------------
736 inline bool vtkStructuredGridConnectivity::IsNodeInterior(int i, int j, int k, int GridExtent[6])
737 {
738  bool status = false;
739 
740  switch (this->DataDescription)
741  {
743  if ((GridExtent[0] < i) && (i < GridExtent[1]))
744  {
745  status = true;
746  }
747  break;
749  if ((GridExtent[2] < j) && (j < GridExtent[3]))
750  {
751  status = true;
752  }
753  break;
755  if ((GridExtent[4] < k) && (k < GridExtent[5]))
756  {
757  status = true;
758  }
759  break;
761  if ((GridExtent[0] < i) && (i < GridExtent[1]) && (GridExtent[2] < j) && (j < GridExtent[3]))
762  {
763  status = true;
764  }
765  break;
767  if ((GridExtent[2] < j) && (j < GridExtent[3]) && (GridExtent[4] < k) && (k < GridExtent[5]))
768  {
769  status = true;
770  }
771  break;
773  if ((GridExtent[0] < i) && (i < GridExtent[1]) && (GridExtent[4] < k) && (k < GridExtent[5]))
774  {
775  status = true;
776  }
777  break;
779  if ((GridExtent[0] < i) && (i < GridExtent[1]) && (GridExtent[2] < j) &&
780  (j < GridExtent[3]) && (GridExtent[4] < k) && (k < GridExtent[5]))
781  {
782  status = true;
783  }
784  break;
785  default:
786  std::cout << "Data description is: " << this->DataDescription << "\n";
787  std::cout.flush();
788  assert("pre: Undefined data-description!" && false);
789  } // END switch
790 
791  return (status);
792 }
793 
794 //------------------------------------------------------------------------------
796  int idx, int A[2], int B[2], int overlap[2], int orient[3])
797 {
798  assert("pre: idx is out-of-bounds" && (idx >= 0) && (idx < 3));
799 
800  // A. Non-overlapping cases
801  if (overlap[0] == overlap[1])
802  {
803  if (A[1] == B[0])
804  {
805  orient[idx] = vtkStructuredNeighbor::HI;
806  }
807  else if (A[0] == B[1])
808  {
809  orient[idx] = vtkStructuredNeighbor::LO;
810  }
811  else
812  {
813  orient[idx] = vtkStructuredNeighbor::UNDEFINED;
814  assert("ERROR: Code should not reach here!" && false);
815  }
816  } // END non-overlapping cases
817  // B. Sub-set cases
818  else if (this->IsSubset(A, B))
819  {
820  if ((A[0] == B[0]) && (A[1] == B[1]))
821  {
822  orient[idx] = vtkStructuredNeighbor::ONE_TO_ONE;
823  }
824  else if (this->StrictlyInsideBounds(A[0], B[0], B[1]) &&
825  this->StrictlyInsideBounds(A[1], B[0], B[1]))
826  {
828  }
829  else if (A[0] == B[0])
830  {
831  orient[idx] = vtkStructuredNeighbor::SUBSET_HI;
832  }
833  else if (A[1] == B[1])
834  {
835  orient[idx] = vtkStructuredNeighbor::SUBSET_LO;
836  }
837  else
838  {
839  orient[idx] = vtkStructuredNeighbor::UNDEFINED;
840  assert("ERROR: Code should not reach here!" && false);
841  }
842  }
843  // C. Super-set cases
844  else if (this->IsSubset(B, A))
845  {
846  orient[idx] = vtkStructuredNeighbor::SUPERSET;
847  }
848  // D. Partially-overlapping (non-subset) cases
849  else if (!(this->IsSubset(A, B) || this->IsSubset(A, B)))
850  {
851  if (this->InBounds(A[0], B[0], B[1]))
852  {
853  orient[idx] = vtkStructuredNeighbor::LO;
854  }
855  else if (this->InBounds(A[1], B[0], B[1]))
856  {
857  orient[idx] = vtkStructuredNeighbor::HI;
858  }
859  else
860  {
861  orient[idx] = vtkStructuredNeighbor::UNDEFINED;
862  assert("ERROR: Code should not reach here!" && false);
863  }
864  }
865  else
866  {
867  orient[idx] = vtkStructuredNeighbor::UNDEFINED;
868  assert("ERROR: Code should not reach here!" && false);
869  }
870 }
871 
872 //------------------------------------------------------------------------------
874  int idx, int ExtentLo, int ExtentHi, int OnLo, int OnHi, int NotOnBoundary)
875 {
876  if (idx == ExtentLo)
877  {
878  return OnLo;
879  }
880  else if (idx == ExtentHi)
881  {
882  return OnHi;
883  }
884  return NotOnBoundary;
885 }
886 
887 //------------------------------------------------------------------------------
888 inline bool vtkStructuredGridConnectivity::HasBlockConnection(int gridID, int blockDirection)
889 {
890  // Sanity check
891  assert("pre: gridID is out-of-bounds" && (gridID >= 0) &&
892  (gridID < static_cast<int>(this->NumberOfGrids)));
893  assert("pre: BlockTopology has not been properly allocated" &&
894  (this->NumberOfGrids == this->BlockTopology.size()));
895  assert("pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
896  bool status = false;
897  if (this->BlockTopology[gridID] & (1 << blockDirection))
898  {
899  status = true;
900  }
901  return (status);
902 }
903 
904 //------------------------------------------------------------------------------
905 inline void vtkStructuredGridConnectivity::RemoveBlockConnection(int gridID, int blockDirection)
906 {
907  // Sanity check
908  assert("pre: gridID is out-of-bounds" && (gridID >= 0) &&
909  (gridID < static_cast<int>(this->NumberOfGrids)));
910  assert("pre: BlockTopology has not been properly allocated" &&
911  (this->NumberOfGrids == this->BlockTopology.size()));
912  assert("pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
913 
914  this->BlockTopology[gridID] &= ~(1 << blockDirection);
915 }
916 
917 //------------------------------------------------------------------------------
918 inline void vtkStructuredGridConnectivity::AddBlockConnection(int gridID, int blockDirection)
919 {
920  // Sanity check
921  assert("pre: gridID is out-of-bounds" && (gridID >= 0) &&
922  (gridID < static_cast<int>(this->NumberOfGrids)));
923  assert("pre: BlockTopology has not been properly allocated" &&
924  (this->NumberOfGrids == this->BlockTopology.size()));
925  assert("pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
926  this->BlockTopology[gridID] |= (1 << blockDirection);
927 }
928 
929 //------------------------------------------------------------------------------
931 {
932  // Sanity check
933  assert("pre: gridID is out-of-bounds" && (gridID >= 0) &&
934  (gridID < static_cast<int>(this->NumberOfGrids)));
935  assert("pre: BlockTopology has not been properly allocated" &&
936  (this->NumberOfGrids == this->BlockTopology.size()));
937  for (int i = 0; i < 6; ++i)
938  {
939  this->RemoveBlockConnection(gridID, i);
940  } // END for all block directions
941 }
942 
943 //------------------------------------------------------------------------------
945 {
946  // Sanity check
947  assert("pre: gridID is out-of-bounds" && (gridID >= 0) &&
948  (gridID < static_cast<int>(this->NumberOfGrids)));
949  assert("pre: BlockTopology has not been properly allocated" &&
950  (this->NumberOfGrids == this->BlockTopology.size()));
951 
952  int count = 0;
953  for (int i = 0; i < 6; ++i)
954  {
955  if (this->HasBlockConnection(gridID, i))
956  {
957  ++count;
958  }
959  }
960  assert("post: count must be in [0,5]" && (count >= 0 && count <= 6));
961  return (count);
962 }
963 
964 //------------------------------------------------------------------------------
966 {
967  if (N == 0)
968  {
969  vtkErrorMacro("Number of grids cannot be 0.");
970  return;
971  }
972 
973  this->NumberOfGrids = N;
975 
976  this->GridExtents.resize(6 * N, -1);
977  this->Neighbors.resize(N);
978  this->BlockTopology.resize(N);
979 }
980 VTK_ABI_NAMESPACE_END
981 #endif /* vtkStructuredGridConnectivity_h */
int Cardinality(int S[2])
Returns the cardinality of a range S.
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 PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int GetNeighborIndex(int gridIdx, int NeighborGridIdx)
Given a global grid ID and the neighbor grid ID, this method returns the neighbor index w...
std::vector< std::vector< vtkStructuredNeighbor > > Neighbors
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...
represent and manipulate point attribute data
Definition: vtkPointData.h:30
bool IsSubset(int A[2], int B[2])
Returns true iff A is a subset of B, otherwise false.
void RemoveBlockConnection(int gridID, int blockDirection)
Removes a block connection along the given direction for the block corresponding to the given gridID...
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...
int GetNumberOfNodesPerCell(int dim)
Returns the number of nodes per cell according to the given dimension.
virtual void ComputeNeighbors()=0
Computes the grid neighboring topology for the domain.
represent and manipulate cell attribute data
Definition: vtkCellData.h:31
int vtkIdType
Definition: vtkType.h:363
void GetGhostedGridExtent(int gridID, int ext[6])
Returns the ghosted grid extent for the block corresponding the.
const std::string pointData
void ClearBlockConnections(int gridID)
Clears all block connections for the block corresponding to the given grid ID.
vtkStructuredGridConnectivity is a concrete instance of vtkObject that implements functionality for c...
std::vector< unsigned char > BlockTopology
a simple class to control print indentation
Definition: vtkIndent.h:28
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
list of point or cell ids
Definition: vtkIdList.h:25
A superclass that defines the interface to be implemented by all concrete grid connectivity classes...
void GetGhostedExtent(int ghostedExtent[6], VTK_FUTURE_CONST 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...
virtual void CreateGhostLayers(int N=1)=0
Creates N layers of ghost layers where N is the number of cells that will be added to each grid...
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...
virtual void SetNumberOfGrids(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 *)
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...
dynamic, self-adjusting array of unsigned char
std::map< std::pair< int, int >, int > NeighborPair2NeighborListIndex
An internal, light-weight class used to store neighbor information.
bool InBounds(int idx, int Lo, int Hi)
Returns true iff Lo <= idx <= Hi, otherwise false.
void SetNumberOfGrids(unsigned int N) override
Set/Get the total number of domains distributed among processors.
void AllocateUserRegisterDataStructures()
Allocate/De-allocate the data-structures where the user-supplied grids will be registered.
virtual void FillGhostArrays(int gridId, vtkUnsignedCharArray *nodesArray, vtkUnsignedCharArray *cellsArray)=0
Fills the ghost arrays for the given grid.
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...
int GetNumberOfConnectingBlockFaces(int gridID)
Returns the number of faces of the block corresponding to the given grid ID that are adjacent to at l...
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
void GetGridExtent(int gridID, int extent[6])
Returns the grid extent of 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 SetGhostedGridExtent(int gridID, int ext[6])
Sets the ghosted grid extent for the grid corresponding to the given grid ID to the given extent...
represent and manipulate 3D points
Definition: vtkPoints.h:30
Represents and manipulates a collection of data arrays.
Definition: vtkFieldData.h:51
int GetNumberOfNeighbors(int gridID)
Returns the number of neighbors for the grid corresponding to the given grid ID.
void AddBlockConnection(int gridID, int blockDirection)
Adds a block connection along the given direction for the block corresponding to the given gridID...