31 #ifndef vtkStructuredAMRGridConnectivity_h 32 #define vtkStructuredAMRGridConnectivity_h 35 #include "vtkFiltersGeometryModule.h" 61 const unsigned int NumberOfLevels,
const unsigned int N,
const int RefinementRatio = -1);
78 virtual void RegisterGrid(
const int gridIdx,
const int level,
const int refinementRatio,
87 virtual void RegisterGrid(
const int gridIdx,
const int level,
int extents[6],
97 vtkSetMacro(BalancedRefinement,
bool);
98 vtkGetMacro(BalancedRefinement,
bool);
107 vtkSetMacro(NodeCentered,
bool);
108 vtkGetMacro(NodeCentered,
bool);
116 vtkSetMacro(CellCentered,
bool);
117 vtkGetMacro(CellCentered,
bool);
124 int GetNumberOfNeighbors(
const int gridID);
129 void GetGhostedExtent(
const int gridID,
int ext[6]);
148 void CreateGhostedMaskArrays(
const int gridID);
153 void CreateGhostedExtent(
const int gridID,
const int N);
158 void SetGhostedExtent(
const int gridID,
int ext[6]);
163 void GetCoarsenedExtent(
const int gridIdx,
int fromLevel,
int toLevel,
int ext[6]);
168 void GetRefinedExtent(
const int gridIdx,
int fromLevel,
int toLevel,
int ext[6]);
173 void RefineExtent(
int orient[3],
int ndim,
int fromLevel,
int toLevel,
int ext[6]);
179 void GetCellRefinedExtent(
int orient[3],
int ndim,
const int i,
const int j,
const int k,
180 const int fromLevel,
const int toLevel,
int ext[6]);
185 void CoarsenExtent(
int orient[3],
int ndim,
int fromLevel,
int toLevel,
int ext[6]);
190 void GetGridExtent(
const int gridIdx,
int ext[6]);
195 int GetGridLevel(
const int gridIdx);
200 bool LevelExists(
const int level);
205 bool IsNodeInterior(
const int i,
const int j,
const int k,
int ext[6]);
210 bool IsNodeWithinExtent(
const int i,
const int j,
const int k,
int ext[6]);
215 bool IsNodeOnSharedBoundary(
216 const int i,
const int j,
const int k,
const int gridId,
int gridExt[6]);
221 bool IsNodeOnBoundaryOfExtent(
const int i,
const int j,
const int k,
int ext[6]);
226 void InsertGridAtLevel(
const int level,
const int gridID);
232 void ComputeNeighborSendAndRcvExtent(
const int gridID,
const int N);
238 void ComputeWholeExtent();
244 void GetWholeExtentAtLevel(
const int level,
int ext[6]);
250 void EstablishNeighbors(
const int i,
const int j);
255 void GetNodeOrientation(
256 const int i,
const int j,
const int k,
int gridExt[6],
int nodeOrientation[3]);
265 void GetOrientationVector(
const int dataDescription,
int orient[3],
int& ndim);
270 bool HasConstantRefinementRatio();
275 void SetRefinementRatioAtLevel(
const int level,
const int r);
280 int GetRefinementRatioAtLevel(
const int level);
285 bool AreExtentsEqual(
int ext1[6],
int ext2[6]);
290 void SetBlockTopology(
const int gridID);
299 int GetNumberOfConnectingBlockFaces(
const int gridID);
319 assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
320 (gridID < static_cast<int>(this->NumberOfGrids)));
321 assert(
"pre: BlockTopology has not been properly allocated" &&
322 (this->NumberOfGrids == this->BlockTopology.size()));
323 assert(
"pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
325 if (this->BlockTopology[gridID] & (1 << blockDirection))
347 void RemoveBlockConnection(
const int gridID,
const int blockDirection);
363 void AddBlockConnection(
const int gridID,
const int blockDirection);
369 void ClearBlockConnections(
const int gridID);
374 virtual void MarkNodeProperty(
const int gridId,
const int i,
const int j,
const int k,
375 int gridExt[6],
int wholeExt[6],
unsigned char& p);
405 const int jLevel,
int next2[6],
const int normalizedLevel,
const int levelDiff,
413 void ComputeAMRNeighborOverlapExtents(
const int iLevel,
const int jLevel,
415 int gridOverlapExtent[6],
int neiOverlapExtent[6]);
420 int Get1DOrientation(
const int idx,
const int ExtentLo,
const int ExtentHi,
const int OnLo,
421 const int OnHi,
const int NotOnBoundary);
426 void PrintExtent(std::ostream& os,
int ext[6]);
431 void InitializeGhostData(
const int gridID);
436 void TransferRegisteredDataToGhostedData(
const int gridID);
473 virtual void TransferGhostDataFromNeighbors(
const int gridID);
516 std::vector<std::vector<vtkStructuredAMRNeighbor> >
Neighbors;
539 assert(
"pre: grid ID is out-of-bounds" && (gridID >= 0) &&
541 assert(
"pre: neighbors vector has not been properly allocated" &&
548 const int gridID,
const int nei)
550 assert(
"pre: grid ID is out-of-bounds" && (gridID >= 0) &&
552 assert(
"pre: neighbors vector has not been properly allocated" &&
554 assert(
"pre: nei index is out-of-bounds" && (nei >= 0) &&
561 const int ExtentHi,
const int OnLo,
const int OnHi,
const int NotOnBoundary)
567 else if (idx == ExtentHi)
571 return NotOnBoundary;
578 assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
580 assert(
"pre: BlockTopology has not been properly allocated" &&
584 for (
int i = 0; i < 6; ++i)
591 assert(
"post: count must be in [0,5]" && (count >= 0 && count <= 6));
597 const int gridID,
const int blockDirection)
600 assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
602 assert(
"pre: BlockTopology has not been properly allocated" &&
604 assert(
"pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
611 const int gridID,
const int blockDirection)
614 assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
616 assert(
"pre: BlockTopology has not been properly allocated" &&
618 assert(
"pre: blockDirection is out-of-bounds" && (blockDirection >= 0) && (blockDirection < 6));
626 assert(
"pre: gridID is out-of-bounds" && (gridID >= 0) &&
628 assert(
"pre: BlockTopology has not been properly allocated" &&
630 for (
int i = 0; i < 6; ++i)
639 for (
int i = 0; i < 6; ++i)
641 if (ext1[i] != ext2[i])
652 for (
int i = 0; i < 6; i += 2)
656 os << ext[i + 1] <<
"] ";
663 assert(
"pre: grid Index is out-of-bounds!" && (gridIdx < static_cast<int>(this->
NumberOfGrids)));
664 assert(
"pre: grid levels vector has not been allocated" &&
671 const int level,
const int r)
673 assert(
"pre: RefinementRatios vector is not properly allocated" &&
675 assert(
"pre: leve is out-of-bounds!" && (
level >= 0) &&
677 assert(
"pre: invalid refinement ratio" && (r >= 2));
685 assert(
"pre: RefinementRatios vector is not properly allocated" &&
687 assert(
"pre: leve is out-of-bounds!" && (
level >= 0) &&
690 "pre: refinement ratio for level has not been set" && (this->
RefinementRatios[level] >= 2));
708 assert(
"pre: grid index is out-of-bounds" &&
709 ((gridIdx >= 0) && (gridIdx < static_cast<int>(this->
GridExtents.size()))));
711 for (
int i = 0; i < 6; ++i)
737 grids.insert(gridID);
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void RemoveBlockConnection(const int gridID, const int blockDirection)
Removes a block connection along the given direction for the block corresponding to the given gridID...
std::vector< unsigned char > BlockTopology
std::vector< int > GridExtents
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph *>::edge_descriptor e, vtkGraph *)
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...
std::vector< int > RefinementRatios
bool LevelExists(const int level)
Checks if the given level has been registered.
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 ...
represent and manipulate point attribute data
int GetGridLevel(const int gridIdx)
Returns the level of the grid with the corresponding grid ID.
std::map< int, std::set< int > > AMRHierarchy
unsigned int NumberOfLevels
void SetRefinementRatioAtLevel(const int level, const int r)
Sets the refinement ratio at the given level.
virtual void ComputeNeighbors()=0
Computes the grid neighboring topology for the domain.
represent and manipulate cell attribute data
int GetRefinementRatioAtLevel(const int level)
Returns the refinement ratio at the given level.
std::vector< int > GridLevels
std::vector< std::vector< int > > CellCenteredDonorLevel
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph *>::edge_descriptor e, vtkGraph *)
int Get1DOrientation(const int idx, const int ExtentLo, const int ExtentHi, const int OnLo, const int OnHi, const int NotOnBoundary)
Get 1-D orientation.
a simple class to control print indentation
void GetGridExtent(const int gridIdx, int ext[6])
Gets the grid extent for the grid with the given grid ID.
std::vector< int > GhostedExtents
A superclass that defines the interface to be implemented by all concrete grid connectivity classes...
virtual void SetNumberOfGrids(const unsigned int N)=0
Sets the total number of grids in the domain.
dynamic, self-adjusting array of unsigned char
unsigned int NumberOfGrids
An internal, light-weight class used to store neighbor information.
int GetNumberOfNeighbors(const int gridID)
Returns the number of neighbors for the grid corresponding to the given grid ID.
void PrintExtent(std::ostream &os, int ext[6])
Prints the extent.
void ClearBlockConnections(const int gridID)
Clears all block connections for the block corresponding to the given grid ID.
std::vector< std::vector< vtkStructuredAMRNeighbor > > Neighbors
An internal, light-weight object used to store neighbor information for AMR grids.
vtkStructuredAMRNeighbor GetNeighbor(const int gridID, const int nei)
Returns the AMR neighbor for the patch with the corresponding grid ID.
virtual void FillGhostArrays(const int gridId, vtkUnsignedCharArray *nodesArray, vtkUnsignedCharArray *cellsArray)=0
Fills the ghost arrays for the given grid.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
bool AreExtentsEqual(int ext1[6], int ext2[6])
Checks if the extent ext1 and ext2 are equal.
virtual void CreateGhostLayers(const int N=1)=0
Creates N layers of ghost layers where N is the number of cells that will be added to each grid...
bool HasConstantRefinementRatio()
Checks if a constant refinement ratio has been specified.
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 3D points
represent and manipulate fields of data
void InsertGridAtLevel(const int level, const int gridID)
Inserts the grid corresponding to the given ID at the prescribed level.