34 #ifndef vtkStructuredAMRGridConnectivity_h 35 #define vtkStructuredAMRGridConnectivity_h 37 #include "vtkFiltersGeometryModule.h" 65 const unsigned int NumberOfLevels,
66 const unsigned int N,
const int RefinementRatio=-1);
83 virtual void RegisterGrid(
84 const int gridIdx,
const int level,
const int refinementRatio,
97 virtual void RegisterGrid(
98 const int gridIdx,
const int level,
int extents[6],
111 vtkSetMacro(BalancedRefinement,
bool);
112 vtkGetMacro(BalancedRefinement,
bool);
121 vtkSetMacro(NodeCentered,
bool);
122 vtkGetMacro(NodeCentered,
bool);
130 vtkSetMacro(CellCentered,
bool);
131 vtkGetMacro(CellCentered,
bool);
138 int GetNumberOfNeighbors(
const int gridID);
143 void GetGhostedExtent(
const int gridID,
int ext[6]);
162 void CreateGhostedMaskArrays(
const int gridID);
167 void CreateGhostedExtent(
const int gridID,
const int N);
172 void SetGhostedExtent(
const int gridID,
int ext[6]);
177 void GetCoarsenedExtent(
178 const int gridIdx,
int fromLevel,
int toLevel,
int ext[6]);
183 void GetRefinedExtent(
184 const int gridIdx,
int fromLevel,
int toLevel,
int ext[6]);
190 int orient[3],
int ndim,
int fromLevel,
int toLevel,
int ext[6]);
196 void GetCellRefinedExtent(
197 int orient[3],
int ndim,
198 const int i,
const int j,
const int k,
199 const int fromLevel,
const int toLevel,
206 int orient[3],
int ndim,
int fromLevel,
int toLevel,
int ext[6]);
211 void GetGridExtent(
const int gridIdx,
int ext[6] );
216 int GetGridLevel(
const int gridIdx );
221 bool LevelExists(
const int level );
227 const int i,
const int j,
const int k,
int ext[6]);
232 bool IsNodeWithinExtent(
233 const int i,
const int j,
const int k,
int ext[6]);
238 bool IsNodeOnSharedBoundary(
239 const int i,
const int j,
const int k,
240 const int gridId,
int gridExt[6]);
245 bool IsNodeOnBoundaryOfExtent(
246 const int i,
const int j,
const int k,
int ext[6] );
251 void InsertGridAtLevel(
const int level,
const int gridID);
257 void ComputeNeighborSendAndRcvExtent(
const int gridID,
const int N);
263 void ComputeWholeExtent();
269 void GetWholeExtentAtLevel(
const int level,
int ext[6]);
275 void EstablishNeighbors(
const int i,
const int j);
280 void GetNodeOrientation(
281 const int i,
const int j,
const int k,
282 int gridExt[6],
int nodeOrientation[3]);
291 void GetOrientationVector(
292 const int dataDescription,
int orient[3],
int &ndim);
297 bool HasConstantRefinementRatio( );
302 void SetRefinementRatioAtLevel(
const int level,
const int r);
307 int GetRefinementRatioAtLevel(
const int level);
312 bool AreExtentsEqual(
int ext1[6],
int ext2[6] );
317 void SetBlockTopology(
const int gridID);
326 int GetNumberOfConnectingBlockFaces(
const int gridID );
346 assert(
"pre: gridID is out-of-bounds" &&
347 (gridID >=0) && (gridID < static_cast<int>(this->NumberOfGrids)));
348 assert(
"pre: BlockTopology has not been properly allocated" &&
349 (this->NumberOfGrids == this->BlockTopology.size()));
350 assert(
"pre: blockDirection is out-of-bounds" &&
351 (blockDirection >= 0) && (blockDirection < 6) );
353 if( this->BlockTopology[ gridID ] & (1 << blockDirection) )
375 void RemoveBlockConnection(
const int gridID,
const int blockDirection);
391 void AddBlockConnection(
const int gridID,
const int blockDirection);
397 void ClearBlockConnections(
const int gridID );
402 virtual void MarkNodeProperty(
403 const int gridId,
const int i,
const int j,
const int k,
404 int gridExt[6],
int wholeExt[6],
410 virtual void FillNodesGhostArray(
416 virtual void FillCellsGhostArray(
439 const int i,
const int iLevel,
int next1[6],
440 const int j,
const int jLevel,
int next2[6],
441 const int normalizedLevel,
450 void ComputeAMRNeighborOverlapExtents(
451 const int iLevel,
const int jLevel,
const int normalizedLevel,
453 int orient[3],
int ndim,
454 int gridOverlapExtent[6],
455 int neiOverlapExtent[6]);
460 int Get1DOrientation(
461 const int idx,
const int ExtentLo,
const int ExtentHi,
462 const int OnLo,
const int OnHi,
const int NotOnBoundary);
467 void PrintExtent(std::ostream& os,
int ext[6]);
472 void InitializeGhostData(
const int gridID );
477 void TransferRegisteredDataToGhostedData(
const int gridID );
482 void TransferLocalNodeCenteredNeighborData(
489 void GetLocalCellCentersFromCoarserLevel(
495 void GetLocalCellCentersFromFinerLevel(
502 void GetLocalCellCentersAtSameLevel(
508 void TransferLocalCellCenteredNeighborData(
514 void TransferLocalNeighborData(
520 virtual void TransferGhostDataFromNeighbors(
const int gridID);
526 void AverageFieldData(
566 std::vector< std::vector<vtkStructuredAMRNeighbor> >
Neighbors;
592 assert(
"pre: grid ID is out-of-bounds" &&
593 (gridID >= 0) && (gridID < static_cast<int>(this->NumberOfGrids)));
594 assert(
"pre: neighbors vector has not been properly allocated" &&
596 return( static_cast<int>(this->Neighbors[gridID].
size()) );
602 const int gridID,
const int nei)
604 assert(
"pre: grid ID is out-of-bounds" &&
605 (gridID >= 0) && (gridID < static_cast<int>(this->NumberOfGrids)));
606 assert(
"pre: neighbors vector has not been properly allocated" &&
608 assert(
"pre: nei index is out-of-bounds" &&
610 (nei < static_cast<int>(this->Neighbors[gridID].
size())));
611 return( this->Neighbors[gridID][nei] );
617 const int idx,
const int ExtentLo,
const int ExtentHi,
618 const int OnLo,
const int OnHi,
const int NotOnBoundary)
620 if( idx == ExtentLo )
624 else if( idx == ExtentHi )
628 return NotOnBoundary;
637 assert(
"pre: gridID is out-of-bounds" &&
638 (gridID >=0) && (gridID < static_cast<int>(this->NumberOfGrids)));
639 assert(
"pre: BlockTopology has not been properly allocated" &&
640 (this->NumberOfGrids == this->BlockTopology.size()));
643 for(
int i=0; i < 6; ++i )
645 if( this->HasBlockConnection( gridID, i ) )
650 assert(
"post: count must be in [0,5]" && (count >=0 && count <= 6) );
656 const int gridID,
const int blockDirection )
659 assert(
"pre: gridID is out-of-bounds" &&
660 (gridID >=0) && (gridID < static_cast<int>(this->NumberOfGrids)));
661 assert(
"pre: BlockTopology has not been properly allocated" &&
662 (this->NumberOfGrids == this->BlockTopology.size()));
663 assert(
"pre: blockDirection is out-of-bounds" &&
664 (blockDirection >= 0) && (blockDirection < 6) );
666 this->BlockTopology[ gridID ] &= ~(1 << blockDirection);
671 const int gridID,
const int blockDirection )
674 assert(
"pre: gridID is out-of-bounds" &&
675 (gridID >=0) && (gridID < static_cast<int>(this->NumberOfGrids)));
676 assert(
"pre: BlockTopology has not been properly allocated" &&
677 (this->NumberOfGrids == this->BlockTopology.size()));
678 assert(
"pre: blockDirection is out-of-bounds" &&
679 (blockDirection >= 0) && (blockDirection < 6) );
680 this->BlockTopology[ gridID ] |= (1 << blockDirection);
688 assert(
"pre: gridID is out-of-bounds" &&
689 (gridID >=0) && (gridID < static_cast<int>(this->NumberOfGrids)));
690 assert(
"pre: BlockTopology has not been properly allocated" &&
691 (this->NumberOfGrids == this->BlockTopology.size()));
692 for(
int i=0; i < 6; ++i )
694 this->RemoveBlockConnection( gridID, i );
701 int ext1[6],
int ext2[6])
703 for(
int i=0; i < 6; ++i )
705 if( ext1[i] != ext2[i] )
716 std::ostream& os,
int ext[6])
718 for(
int i=0; i < 6; i+=2 )
722 os << ext[i+1] <<
"] ";
730 assert(
"pre: grid Index is out-of-bounds!" &&
731 (gridIdx < static_cast<int>(this->NumberOfGrids)));
732 assert(
"pre: grid levels vector has not been allocated" &&
734 return( this->GridLevels[gridIdx] );
740 const int level,
const int r)
742 assert(
"pre: RefinementRatios vector is not propertly allocated" &&
743 this->RefinementRatios.size()==this->NumberOfLevels);
744 assert(
"pre: leve is out-of-bounds!" &&
746 (level < static_cast<int>(this->RefinementRatios.size())) );
747 assert(
"pre: invalid refinement ratio" && (r >= 2) );
749 this->RefinementRatios[
level ] = r;
757 assert(
"pre: RefinementRatios vector is not propertly allocated" &&
758 this->RefinementRatios.size()==this->NumberOfLevels);
759 assert(
"pre: leve is out-of-bounds!" &&
761 (level < static_cast<int>(this->RefinementRatios.size())));
762 assert(
"pre: refinement ratio for level has not been set" &&
763 (this->RefinementRatios[ level ] >= 2) );
765 return(this->RefinementRatios[level]);
772 if( this->RefinementRatio < 2 )
781 const int gridIdx,
int ext[6])
783 assert(
"pre: grid index is out-of-bounds" &&
785 (gridIdx < static_cast<int>(this->GridExtents.size()) ) ) );
787 for(
int i=0; i < 6; ++i )
789 ext[ i ] = this->GridExtents[ gridIdx*6+i ];
797 if( this->AMRHierarchy.find(level) != this->AMRHierarchy.end() )
806 const int level,
const int gridID )
808 if( this->LevelExists( level ) )
810 this->AMRHierarchy[
level ].insert( gridID );
815 grids.insert( gridID );
816 this->AMRHierarchy[
level ] = grids;
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
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...
bool LevelExists(const int level)
Checks if the given level has been registered.
boost::graph_traits< vtkGraph * >::vertex_descriptor target(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
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.
unsigned int NumberOfLevels
std::vector< int > GhostedExtents
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.
std::vector< std::vector< vtkStructuredAMRNeighbor > > Neighbors
represent and manipulate cell attribute data
int GetRefinementRatioAtLevel(const int level)
Returns the refinement ratio at the given level.
int Get1DOrientation(const int idx, const int ExtentLo, const int ExtentHi, const int OnLo, const int OnHi, const int NotOnBoundary)
Get 1-D orientation.
std::vector< std::vector< int > > CellCenteredDonorLevel
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.
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.
std::vector< int > RefinementRatios
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.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
void PrintExtent(std::ostream &os, int ext[6])
Prints the extent.
std::map< int, std::set< int > > AMRHierarchy
void ClearBlockConnections(const int gridID)
Clears all block connections for the block corresponding to the given grid ID.
An internal, light-weight object used to store neighbor information for AMR grids.
std::vector< int > GridLevels
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
std::vector< int > GridExtents
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.