Chaste  Release::2017.1
DistributedBoxCollection< DIM > Class Template Reference

#include <DistributedBoxCollection.hpp>

+ Inheritance diagram for DistributedBoxCollection< DIM >:
+ Collaboration diagram for DistributedBoxCollection< DIM >:

Public Member Functions

 DistributedBoxCollection (double boxWidth, c_vector< double, 2 *DIM > domainSize, bool isPeriodicInX=false, int localRows=PETSC_DECIDE)
 
 ~DistributedBoxCollection ()
 
void EmptyBoxes ()
 
void UpdateHaloBoxes ()
 
unsigned GetNumLocalRows () const
 
bool IsBoxOwned (unsigned globalIndex)
 
bool IsInteriorBox (unsigned globalIndex)
 
bool IsHaloBox (unsigned globalIndex)
 
unsigned CalculateGlobalIndex (c_vector< unsigned, DIM > gridIndices)
 
unsigned CalculateContainingBox (Node< DIM > *pNode)
 
unsigned CalculateContainingBox (c_vector< double, DIM > &rLocation)
 
c_vector< unsigned, DIM > CalculateGridIndices (unsigned globalIndex)
 
Box< DIM > & rGetBox (unsigned boxIndex)
 
Box< DIM > & rGetHaloBox (unsigned boxIndex)
 
unsigned GetNumBoxes ()
 
unsigned GetNumLocalBoxes ()
 
c_vector< double, 2 *DIM > rGetDomainSize () const
 
bool GetAreLocalBoxesSet () const
 
double GetBoxWidth () const
 
bool GetIsPeriodicInX () const
 
unsigned GetNumRowsOfBoxes () const
 
int LoadBalance (std::vector< int > localDistribution)
 
void SetupLocalBoxesHalfOnly ()
 
void SetupAllLocalBoxes ()
 
std::set< unsigned > & rGetLocalBoxes (unsigned boxIndex)
 
bool IsOwned (Node< DIM > *pNode)
 
bool IsOwned (c_vector< double, DIM > &location)
 
unsigned GetProcessOwningNode (Node< DIM > *pNode)
 
std::vector< unsigned > & rGetHaloNodesRight ()
 
std::vector< unsigned > & rGetHaloNodesLeft ()
 
void SetCalculateNodeNeighbours (bool calculateNodeNeighbours)
 
void CalculateNodePairs (std::vector< Node< DIM > * > &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs)
 
void CalculateInteriorNodePairs (std::vector< Node< DIM > * > &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs)
 
void CalculateBoundaryNodePairs (std::vector< Node< DIM > * > &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs)
 
void AddPairsFromBox (unsigned boxIndex, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs)
 
std::vector< int > CalculateNumberOfNodesInEachStrip ()
 

Private Member Functions

void SetupHaloBoxes ()
 
template<class Archive >
void serialize (Archive &archive, const unsigned int version)
 

Private Attributes

std::vector< Box< DIM > > mBoxes
 
std::vector< Box< DIM > > mHaloBoxes
 
std::vector< unsignedmHalosRight
 
std::vector< unsignedmHalosLeft
 
std::vector< unsignedmHaloNodesRight
 
std::vector< unsignedmHaloNodesLeft
 
std::map< unsigned, unsignedmHaloBoxesMapping
 
c_vector< double, 2 *DIM > mDomainSize
 
double mBoxWidth
 
unsigned mNumBoxes
 
c_vector< unsigned, DIM > mNumBoxesEachDirection
 
unsigned mNumBoxesInAFace
 
std::vector< std::set< unsigned > > mLocalBoxes
 
unsigned mMinBoxIndex
 
unsigned mMaxBoxIndex
 
bool mIsPeriodicInX
 
bool mAreLocalBoxesSet
 
DistributedVectorFactorympDistributedBoxStackFactory
 
bool mCalculateNodeNeighbours
 

Static Private Attributes

static const double msFudge = 5e-14
 

Friends

class TestDistributedBoxCollection
 
class boost::serialization::access
 

Detailed Description

template<unsigned DIM>
class DistributedBoxCollection< DIM >

A collection of 'boxes' partitioning the domain with information on which nodes are located in which box.

Definition at line 54 of file DistributedBoxCollection.hpp.

Constructor & Destructor Documentation

template<unsigned DIM>
DistributedBoxCollection< DIM >::DistributedBoxCollection ( double  boxWidth,
c_vector< double, 2 *DIM >  domainSize,
bool  isPeriodicInX = false,
int  localRows = PETSC_DECIDE 
)
Parameters
boxWidththe width of each box (cut-off length in NodeBasedCellPopulation simulations)
domainSizethe size of the domain, in the form (xmin, xmax, ymin, ymax) (etc)
isPeriodicInXwhether the domain is periodic in the x direction
localRowsthe number of local rows in a parallel DistributedBoxCollection.

Note that the domain size may be increased because each process should have at least one slice of boxes in the largest dimension. For example, if the box size is 1 and the domain is [(0,0,0), (3,3,3)] then, if there are more than 3 processes the domain will be swollen to [(0,0,0), (3,3,num_procs)]. The user is warned when this happens.

Definition at line 45 of file DistributedBoxCollection.cpp.

References DistributedVectorFactory::GetHigh(), DistributedVectorFactory::GetLow(), DistributedBoxCollection< DIM >::GetNumLocalRows(), PetscTools::GetNumProcs(), DistributedBoxCollection< DIM >::mBoxes, DistributedBoxCollection< DIM >::mBoxWidth, DistributedBoxCollection< DIM >::mDomainSize, DistributedBoxCollection< DIM >::mMaxBoxIndex, DistributedBoxCollection< DIM >::mMinBoxIndex, DistributedBoxCollection< DIM >::mNumBoxes, DistributedBoxCollection< DIM >::mNumBoxesEachDirection, DistributedBoxCollection< DIM >::mNumBoxesInAFace, DistributedBoxCollection< DIM >::mpDistributedBoxStackFactory, DistributedBoxCollection< DIM >::msFudge, and DistributedBoxCollection< DIM >::SetupHaloBoxes().

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
DistributedBoxCollection< DIM >::~DistributedBoxCollection ( )

Destructor - frees memory allocated to distributed vector.

Definition at line 113 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mpDistributedBoxStackFactory.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

Member Function Documentation

template<unsigned DIM>
void DistributedBoxCollection< DIM >::CalculateBoundaryNodePairs ( std::vector< Node< DIM > * > &  rNodes,
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &  rNodePairs 
)
template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::CalculateContainingBox ( c_vector< double, DIM > &  rLocation)
template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::CalculateGlobalIndex ( c_vector< unsigned, DIM >  gridIndices)

Given the (i,j,k) grid indices of a box in the collection, calculate its global index.

Parameters
gridIndicesthe (i,j,k) grid indices of the box
Returns
the global index of the box in the collection.
Todo:
#2308 etc. We need to make allowance for periodicity here...

Definition at line 225 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mNumBoxesEachDirection, and NEVER_REACHED.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
c_vector< unsigned, DIM > DistributedBoxCollection< DIM >::CalculateGridIndices ( unsigned  globalIndex)

Calculate x,y,z indices of box given its 'global' index.

Parameters
globalIndexthe global index of the box
Returns
the grid indices (boxes across, boxes up, boxes deep) of a box

Definition at line 309 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mNumBoxesEachDirection, and NEVER_REACHED.

Referenced by DistributedBoxCollection< DIM >::CalculateNumberOfNodesInEachStrip(), DistributedBoxCollection< SPACE_DIM >::serialize(), and DistributedBoxCollection< DIM >::SetupLocalBoxesHalfOnly().

template<unsigned DIM>
void DistributedBoxCollection< DIM >::CalculateInteriorNodePairs ( std::vector< Node< DIM > * > &  rNodes,
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &  rNodePairs 
)
template<unsigned DIM>
void DistributedBoxCollection< DIM >::CalculateNodePairs ( std::vector< Node< DIM > * > &  rNodes,
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &  rNodePairs 
)

Compute all the pairs of (potentially) connected nodes for cell_based simulations, ie nodes which are in a local box to the box containing the first node. **Note: the user still has to check that the node pairs are less than the cut-off distance apart.** The pairs are checked so that index1 < index2, so each connected pair of nodes is only in the set once.

Parameters
rNodesall the nodes to be consider
rNodePairsthe return value, a set of pairs of nodes

Definition at line 1140 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::AddPairsFromBox(), DistributedBoxCollection< DIM >::CalculateContainingBox(), DistributedBoxCollection< DIM >::IsBoxOwned(), DistributedBoxCollection< DIM >::mCalculateNodeNeighbours, DistributedBoxCollection< DIM >::mMaxBoxIndex, and DistributedBoxCollection< DIM >::mMinBoxIndex.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
std::vector< int > DistributedBoxCollection< DIM >::CalculateNumberOfNodesInEachStrip ( )
template<unsigned DIM>
void DistributedBoxCollection< DIM >::EmptyBoxes ( )
template<unsigned DIM>
bool DistributedBoxCollection< DIM >::GetAreLocalBoxesSet ( ) const
Returns
Whether or not the local boxes have been set up.

Definition at line 387 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mAreLocalBoxesSet.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
double DistributedBoxCollection< DIM >::GetBoxWidth ( ) const
template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::GetNumBoxes ( )
Returns
the total (global) number of boxes.

Definition at line 369 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mNumBoxes.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::GetNumLocalBoxes ( )
Returns
the number of locally owned boxes. Not including halos.

Definition at line 375 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mBoxes.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::GetNumRowsOfBoxes ( ) const
template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::GetProcessOwningNode ( Node< DIM > *  pNode)

Get the process that should own this node. Currently only returns +/-1 of this process so assumes nodes don't move too far. //\ todo this should be fixed.

Parameters
pNodethe node to be tested
Returns
the ID of the process that should own the node.

Definition at line 1104 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::CalculateContainingBox(), PetscTools::GetMyRank(), DistributedBoxCollection< DIM >::mMaxBoxIndex, and DistributedBoxCollection< DIM >::mMinBoxIndex.

Referenced by NodesOnlyMesh< SPACE_DIM >::CalculateNodesOutsideLocalDomain(), and DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
bool DistributedBoxCollection< DIM >::IsHaloBox ( unsigned  globalIndex)
Parameters
globalIndexthe global index of the box.
Returns
whether the box with global index globalIndex is a halo to this process.

Definition at line 208 of file DistributedBoxCollection.cpp.

References PetscTools::IsParallel(), DistributedBoxCollection< DIM >::mMaxBoxIndex, DistributedBoxCollection< DIM >::mMinBoxIndex, and DistributedBoxCollection< DIM >::mNumBoxesInAFace.

Referenced by DistributedBoxCollection< DIM >::rGetHaloBox(), and DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
bool DistributedBoxCollection< DIM >::IsInteriorBox ( unsigned  globalIndex)

Get whether the box with global index globalIndex is interior on this process. A box is interior if it doesn't share any boundary (even of zero length) with a halo box.

Parameters
globalIndexthe global index of the box to check.
Returns
whether the box is interior or not.

Definition at line 217 of file DistributedBoxCollection.cpp.

References PetscTools::IsSequential(), DistributedBoxCollection< DIM >::mMaxBoxIndex, DistributedBoxCollection< DIM >::mMinBoxIndex, and DistributedBoxCollection< DIM >::mNumBoxesInAFace.

Referenced by DistributedBoxCollection< DIM >::CalculateBoundaryNodePairs(), DistributedBoxCollection< DIM >::CalculateInteriorNodePairs(), and DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
bool DistributedBoxCollection< DIM >::IsOwned ( Node< DIM > *  pNode)
template<unsigned DIM>
bool DistributedBoxCollection< DIM >::IsOwned ( c_vector< double, DIM > &  location)
Parameters
locationthe location to test.
Returns
whether the point at location is owned on this process.

Definition at line 1096 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::CalculateContainingBox(), and DistributedBoxCollection< DIM >::IsBoxOwned().

template<unsigned DIM>
int DistributedBoxCollection< DIM >::LoadBalance ( std::vector< int >  localDistribution)

A helper function to work out the optimal number of rows to be owned by this process, to balance the number of nodes.

Parameters
localDistributiona vector containing the number of nodes in each row/face of boxes in 2d/3d
Returns
the updated number of rows, which will differ from current number by at most 2.

Shift information on distribution of nodes to the right, so processes can manage their left/bottom/back boundary (1d/2d/3d)

Calculate change in balance of loads by shifting the left/bottom boundary in either direction

Definition at line 411 of file DistributedBoxCollection.cpp.

References PetscTools::AmMaster(), PetscTools::AmTopMost(), and PetscTools::GetMyRank().

Referenced by NodesOnlyMesh< SPACE_DIM >::LoadBalanceMesh(), and DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
Box< DIM > & DistributedBoxCollection< DIM >::rGetBox ( unsigned  boxIndex)
template<unsigned DIM>
Box< DIM > & DistributedBoxCollection< DIM >::rGetHaloBox ( unsigned  boxIndex)
template<unsigned DIM>
std::vector< unsigned > & DistributedBoxCollection< DIM >::rGetHaloNodesLeft ( )
template<unsigned DIM>
std::vector< unsigned > & DistributedBoxCollection< DIM >::rGetHaloNodesRight ( )
template<unsigned DIM>
std::set< unsigned > & DistributedBoxCollection< DIM >::rGetLocalBoxes ( unsigned  boxIndex)

Get the set of all the local boxes, i.e. itself and its nearest-neighbours.

Parameters
boxIndexthe index of the box
Returns
the set containing the indices of boxes local to box boxIndex. i.e. the box boxIndex itself and its nearest-neighbours.

Definition at line 1080 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mLocalBoxes, DistributedBoxCollection< DIM >::mMaxBoxIndex, and DistributedBoxCollection< DIM >::mMinBoxIndex.

Referenced by DistributedBoxCollection< DIM >::AddPairsFromBox(), FineCoarseMeshPair< DIM >::CollectElementsInLocalBoxes(), and DistributedBoxCollection< SPACE_DIM >::serialize().

template<unsigned DIM>
template<class Archive >
void DistributedBoxCollection< DIM >::serialize ( Archive &  archive,
const unsigned int  version 
)
inlineprivate

Serialize the box collection. It is possible to save and load on a different # of processes.

Parameters
archivethe archive.
versionthe version number.

Definition at line 137 of file DistributedBoxCollection.hpp.

template<unsigned DIM>
void DistributedBoxCollection< DIM >::SetCalculateNodeNeighbours ( bool  calculateNodeNeighbours)

Set whether to record node neighbour in the map rNodeNeighbours during CalculateNodePairs. Set to false for efficiency if not needed.

Parameters
calculateNodeNeighbourswhether to store the neighbours.

Definition at line 1134 of file DistributedBoxCollection.cpp.

References DistributedBoxCollection< DIM >::mCalculateNodeNeighbours.

Referenced by DistributedBoxCollection< SPACE_DIM >::serialize(), and NodesOnlyMesh< SPACE_DIM >::SetUpBoxCollection().

Friends And Related Function Documentation

template<unsigned DIM>
friend class boost::serialization::access
friend

Needed for serialization

Definition at line 128 of file DistributedBoxCollection.hpp.

Member Data Documentation

template<unsigned DIM>
bool DistributedBoxCollection< DIM >::mAreLocalBoxesSet
private
template<unsigned DIM>
c_vector<double, 2*DIM> DistributedBoxCollection< DIM >::mDomainSize
private
template<unsigned DIM>
std::vector< Box<DIM> > DistributedBoxCollection< DIM >::mHaloBoxes
private
template<unsigned DIM>
std::map<unsigned, unsigned> DistributedBoxCollection< DIM >::mHaloBoxesMapping
private
template<unsigned DIM>
std::vector<unsigned> DistributedBoxCollection< DIM >::mHaloNodesLeft
private

Set of Nodes that are halos of adjacent left process, but lie locally

Definition at line 75 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::rGetHaloNodesLeft(), and DistributedBoxCollection< DIM >::UpdateHaloBoxes().

template<unsigned DIM>
std::vector<unsigned> DistributedBoxCollection< DIM >::mHaloNodesRight
private

Set of Nodes that are halos of adjacent right process, but lie locally

Definition at line 72 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::rGetHaloNodesRight(), and DistributedBoxCollection< DIM >::UpdateHaloBoxes().

template<unsigned DIM>
std::vector<unsigned> DistributedBoxCollection< DIM >::mHalosLeft
private

A vector of the global indices of boxes, owned by this process, but on a boundary with left process.

Definition at line 69 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::SetupHaloBoxes(), and DistributedBoxCollection< DIM >::UpdateHaloBoxes().

template<unsigned DIM>
std::vector<unsigned> DistributedBoxCollection< DIM >::mHalosRight
private

A vector of the global indices of boxes, owned by this process, but on a boundary with right process.

Definition at line 66 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::SetupHaloBoxes(), and DistributedBoxCollection< DIM >::UpdateHaloBoxes().

template<unsigned DIM>
bool DistributedBoxCollection< DIM >::mIsPeriodicInX
private

Whether the domain is periodic in the X dimension Note this currently only works for DIM=2.

Definition at line 105 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::GetIsPeriodicInX(), DistributedBoxCollection< DIM >::SetupAllLocalBoxes(), and DistributedBoxCollection< DIM >::SetupLocalBoxesHalfOnly().

template<unsigned DIM>
std::vector< std::set<unsigned> > DistributedBoxCollection< DIM >::mLocalBoxes
private
template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::mNumBoxes
private
template<unsigned DIM>
unsigned DistributedBoxCollection< DIM >::mNumBoxesInAFace
private

Number of boxes in a face (1 in 1d, mNumBoxesEachDirection(0) in 2d, mNumBoxesEachDirection(0)*mNumBoxesEachDirection(1) in 3d

Definition at line 93 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection(), DistributedBoxCollection< DIM >::IsHaloBox(), DistributedBoxCollection< DIM >::IsInteriorBox(), and DistributedBoxCollection< DIM >::SetupHaloBoxes().

template<unsigned DIM>
const double DistributedBoxCollection< DIM >::msFudge = 5e-14
staticprivate

A fudge (box swelling) factor to deal with 32-bit floating point issues.

Definition at line 111 of file DistributedBoxCollection.hpp.

Referenced by DistributedBoxCollection< DIM >::CalculateContainingBox(), and DistributedBoxCollection< DIM >::DistributedBoxCollection().


The documentation for this class was generated from the following files: