Chaste Commit::baa90ac2819b962188b7562f2326be23c47859a7
|
#include <DistributedBoxCollection.hpp>
Public Member Functions | |
DistributedBoxCollection (double boxWidth, c_vector< double, 2 *DIM > domainSize, bool isPeriodicInX=false, bool isPeriodicInY=false, bool isPeriodicInZ=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 |
bool | GetIsPeriodicInY () const |
bool | GetIsPeriodicInZ () const |
bool | GetIsPeriodicAcrossProcs () const |
c_vector< bool, DIM > | GetIsPeriodicAllDims () 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< unsigned > | mHalosRight |
std::vector< unsigned > | mHalosLeft |
std::vector< unsigned > | mHaloNodesRight |
std::vector< unsigned > | mHaloNodesLeft |
std::map< unsigned, unsigned > | mHaloBoxesMapping |
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 | mIsPeriodicInY |
bool | mIsPeriodicInZ |
bool | mIsPeriodicAcrossProcs |
bool | mAreLocalBoxesSet |
DistributedVectorFactory * | mpDistributedBoxStackFactory |
bool | mCalculateNodeNeighbours |
Static Private Attributes | |
static const double | msFudge = 5e-14 |
Friends | |
class | TestDistributedBoxCollection |
class | boost::serialization::access |
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.
DistributedBoxCollection< DIM >::DistributedBoxCollection | ( | double | boxWidth, |
c_vector< double, 2 *DIM > | domainSize, | ||
bool | isPeriodicInX = false , |
||
bool | isPeriodicInY = false , |
||
bool | isPeriodicInZ = false , |
||
int | localRows = PETSC_DECIDE |
||
) |
boxWidth | the width of each box (cut-off length in NodeBasedCellPopulation simulations) |
domainSize | the size of the domain, in the form (xmin, xmax, ymin, ymax) (etc) |
isPeriodicInX | whether the domain is periodic in the x direction (defaults to false) |
isPeriodicInY | whether the domain is periodic in the y direction (defaults to true) |
isPeriodicInZ | whether the domain is periodic in the z direction (defaults to true) |
localRows | the 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 >::mIsPeriodicAcrossProcs, DistributedBoxCollection< DIM >::mIsPeriodicInX, DistributedBoxCollection< DIM >::mIsPeriodicInY, DistributedBoxCollection< DIM >::mIsPeriodicInZ, 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().
DistributedBoxCollection< DIM >::~DistributedBoxCollection | ( | ) |
Destructor - frees memory allocated to distributed vector.
Definition at line 112 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::AddPairsFromBox | ( | unsigned | boxIndex, |
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > & | rNodePairs | ||
) |
A method pulled out of CalculateNodePairs methods that adds all pairs of nodes from neighbouring boxes of the box with index boxIndex.
boxIndex | the box to add neighbours to. |
rNodePairs | the return value, a set of pairs of nodes |
Definition at line 1779 of file DistributedBoxCollection.cpp.
References Box< DIM >::rGetNodesContained().
void DistributedBoxCollection< DIM >::CalculateBoundaryNodePairs | ( | std::vector< Node< DIM > * > & | rNodes, |
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > & | rNodePairs | ||
) |
The same as CalculateNodePairs() only we only work on boxes that are ''not'' interior on this process. I.e. some of their local boxes are halo boxes.
rNodes | all the nodes to be consider |
rNodePairs | the return value, a set of pairs of nodes |
Definition at line 1751 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::CalculateContainingBox | ( | c_vector< double, DIM > & | rLocation | ) |
rLocation | The point |
Definition at line 315 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::CalculateContainingBox | ( | Node< DIM > * | pNode | ) |
pNode | address of the node |
Definition at line 307 of file DistributedBoxCollection.cpp.
References Node< SPACE_DIM >::rGetLocation().
Referenced by FineCoarseMeshPair< DIM >::SetUpBoxes().
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.
gridIndices | the (i,j,k) grid indices of the box |
Definition at line 273 of file DistributedBoxCollection.cpp.
c_vector< unsigned, DIM > DistributedBoxCollection< DIM >::CalculateGridIndices | ( | unsigned | globalIndex | ) |
Calculate x,y,z indices of box given its 'global' index.
globalIndex | the global index of the box |
Definition at line 357 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::CalculateInteriorNodePairs | ( | std::vector< Node< DIM > * > & | rNodes, |
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > & | rNodePairs | ||
) |
The same as CalculateNodePairs() only we only work on boxes that are interior on this process. I.e. none of their local boxes are halo boxes.
rNodes | all the nodes to be consider |
rNodePairs | the return value, a set of pairs of nodes |
Definition at line 1707 of file DistributedBoxCollection.cpp.
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.
rNodes | all the nodes to be consider |
rNodePairs | the return value, a set of pairs of nodes |
Definition at line 1668 of file DistributedBoxCollection.cpp.
std::vector< int > DistributedBoxCollection< DIM >::CalculateNumberOfNodesInEachStrip | ( | ) |
Calculate how many cells lie in each strip / face of boxes, used in load balancing
Definition at line 1844 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::EmptyBoxes | ( | ) |
Remove the list of nodes stored in each box.
Definition at line 118 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetAreLocalBoxesSet | ( | ) | const |
Definition at line 435 of file DistributedBoxCollection.cpp.
double DistributedBoxCollection< DIM >::GetBoxWidth | ( | ) | const |
Definition at line 441 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetIsPeriodicAcrossProcs | ( | ) | const |
Definition at line 465 of file DistributedBoxCollection.cpp.
c_vector< bool, DIM > DistributedBoxCollection< DIM >::GetIsPeriodicAllDims | ( | ) | const |
A function to get whether each dimension is periodic
Definition at line 471 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetIsPeriodicInX | ( | ) | const |
Definition at line 447 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetIsPeriodicInY | ( | ) | const |
Definition at line 453 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetIsPeriodicInZ | ( | ) | const |
Definition at line 459 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumBoxes | ( | ) |
Definition at line 417 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumLocalBoxes | ( | ) |
Definition at line 423 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumLocalRows | ( | ) | const |
Definition at line 231 of file DistributedBoxCollection.cpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
unsigned DistributedBoxCollection< DIM >::GetNumRowsOfBoxes | ( | ) | const |
Definition at line 495 of file DistributedBoxCollection.cpp.
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.
pNode | the node to be tested |
Definition at line 1617 of file DistributedBoxCollection.cpp.
References PetscTools::AmMaster(), PetscTools::AmTopMost(), PetscTools::GetMyRank(), and PetscTools::GetNumProcs().
bool DistributedBoxCollection< DIM >::IsBoxOwned | ( | unsigned | globalIndex | ) |
globalIndex | the global index of the box. |
Definition at line 237 of file DistributedBoxCollection.cpp.
Referenced by FineCoarseMeshPair< DIM >::SetUpBoxes().
bool DistributedBoxCollection< DIM >::IsHaloBox | ( | unsigned | globalIndex | ) |
globalIndex | the global index of the box. |
Definition at line 243 of file DistributedBoxCollection.cpp.
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.
globalIndex | the global index of the box to check. |
Definition at line 265 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::IsOwned | ( | c_vector< double, DIM > & | location | ) |
location | the location to test. |
Definition at line 1609 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::IsOwned | ( | Node< DIM > * | pNode | ) |
pNode | the node to test. |
Definition at line 1601 of file DistributedBoxCollection.cpp.
Referenced by FineCoarseMeshPair< DIM >::SetUpBoxes().
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.
localDistribution | a vector containing the number of nodes in each row/face of boxes in 2d/3d |
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 501 of file DistributedBoxCollection.cpp.
References PetscTools::AmMaster(), PetscTools::AmTopMost(), and PetscTools::GetMyRank().
Box< DIM > & DistributedBoxCollection< DIM >::rGetBox | ( | unsigned | boxIndex | ) |
If this box is out-of-bounds to the local process then it will attempt to return a halo box (and trip an assertion is the box is completely out of scope.
boxIndex | the index of the box to return |
Definition at line 394 of file DistributedBoxCollection.cpp.
Referenced by FineCoarseMeshPair< DIM >::CollectElementsInContainingBox(), FineCoarseMeshPair< DIM >::CollectElementsInLocalBoxes(), and FineCoarseMeshPair< DIM >::SetUpBoxes().
c_vector< double, 2 *DIM > DistributedBoxCollection< DIM >::rGetDomainSize | ( | ) | const |
Definition at line 429 of file DistributedBoxCollection.cpp.
Box< DIM > & DistributedBoxCollection< DIM >::rGetHaloBox | ( | unsigned | boxIndex | ) |
Get a halo box.
boxIndex | the index of the box to return |
Definition at line 407 of file DistributedBoxCollection.cpp.
std::vector< unsigned > & DistributedBoxCollection< DIM >::rGetHaloNodesLeft | ( | ) |
Definition at line 1656 of file DistributedBoxCollection.cpp.
std::vector< unsigned > & DistributedBoxCollection< DIM >::rGetHaloNodesRight | ( | ) |
Definition at line 1650 of file DistributedBoxCollection.cpp.
std::set< unsigned > & DistributedBoxCollection< DIM >::rGetLocalBoxes | ( | unsigned | boxIndex | ) |
Get the set of all the local boxes, i.e. itself and its nearest-neighbours.
boxIndex | the index of the box |
Definition at line 1593 of file DistributedBoxCollection.cpp.
Referenced by FineCoarseMeshPair< DIM >::CollectElementsInLocalBoxes().
|
inlineprivate |
Serialize the box collection. It is possible to save and load on a different # of processes.
archive | the archive. |
version | the version number. |
Definition at line 146 of file DistributedBoxCollection.hpp.
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.
calculateNodeNeighbours | whether to store the neighbours. |
Definition at line 1662 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::SetupAllLocalBoxes | ( | ) |
Set up the local boxes (ie itself and its nearest-neighbours) for each of the boxes.
Definition at line 842 of file DistributedBoxCollection.cpp.
References NEVER_REACHED.
Referenced by FineCoarseMeshPair< DIM >::SetUpBoxes().
|
private |
Setup the halo box structure on this process. (Private method since this is called as a helper method by the constructor.)
Sets up the containers mHaloBoxes, mHalosRight, mHalosLeft
Definition at line 131 of file DistributedBoxCollection.cpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
void DistributedBoxCollection< DIM >::SetupLocalBoxesHalfOnly | ( | ) |
Set up the local boxes (ie itself and its nearest-neighbours) for each of the boxes. This method just sets up half of the local boxes (for example, in 1D, local boxes for box0 = {1} local boxes for box1 = {2} not {0,2}, and so on. Similar to 2d, 3d.
Definition at line 589 of file DistributedBoxCollection.cpp.
References EXCEPTION, and NEVER_REACHED.
void DistributedBoxCollection< DIM >::UpdateHaloBoxes | ( | ) |
Update the halo boxes on this process, by transferring the nodes to be sent into the lists mHaloNodesRight / Left.
Definition at line 204 of file DistributedBoxCollection.cpp.
|
friend |
Needed for serialization
Definition at line 137 of file DistributedBoxCollection.hpp.
|
friend |
Definition at line 57 of file DistributedBoxCollection.hpp.
|
private |
Whether the local boxes have been setup or not.
Definition at line 117 of file DistributedBoxCollection.hpp.
|
private |
A vector of boxes to store rough node/element positions.
Definition at line 60 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The width of each box.
Definition at line 84 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
A flag that can be set to not save rNodeNeighbours in CalculateNodePairs - for efficiency
Definition at line 126 of file DistributedBoxCollection.hpp.
|
private |
The domain being partitioned.
Definition at line 81 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
A vector of boxes owned on other processes sharing a boundary with this process
Definition at line 63 of file DistributedBoxCollection.hpp.
|
private |
Map of global to local indices of halo boxes in mHaloBoxes.
Definition at line 78 of file DistributedBoxCollection.hpp.
|
private |
Set of Nodes that are halos of adjacent left process, but lie locally
Definition at line 75 of file DistributedBoxCollection.hpp.
|
private |
Set of Nodes that are halos of adjacent right process, but lie locally
Definition at line 72 of file DistributedBoxCollection.hpp.
|
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.
|
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.
|
private |
Whether the domain is periodic across different processors (i.e. in parallel if DIM==3 and periodic in z, or DIM==2 and periodic in Y)
Definition at line 114 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
Whether the domain is periodic in the X dimension.
Definition at line 105 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
Whether the domain is periodic in the Y dimension.
Definition at line 108 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
Whether the domain is periodic in the Z dimension.
Definition at line 111 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The boxes local (itself and nearest neighbour) to a given box.
Definition at line 96 of file DistributedBoxCollection.hpp.
|
private |
The largest index of the boxes owned by this process.
Definition at line 102 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The smallest index of the boxes owned by this process.
Definition at line 99 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The total number of boxes across all processes
Definition at line 87 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
Number of boxes in each direction.
Definition at line 90 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
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().
|
private |
A distributed vector factory that governs ownership of rows of boxes
Definition at line 123 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
staticprivate |
A fudge (box swelling) factor to deal with 32-bit floating point issues.
Definition at line 120 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().