Chaste
Release::3.4
|
#include <DistributedBoxCollection.hpp>
Public Member Functions | |
DistributedBoxCollection (double boxWidth, c_vector< double, 2 *DIM > domainSize, bool isPeriodicInX=false, int localRows=PETSC_DECIDE) | |
~DistributedBoxCollection () | |
void | EmptyBoxes () |
void | SetupHaloBoxes () |
void | UpdateHaloBoxes () |
unsigned | GetNumLocalRows () const |
bool | GetBoxOwnership (unsigned globalIndex) |
bool | IsInteriorBox (unsigned globalIndex) |
bool | GetHaloBoxOwnership (unsigned globalIndex) |
unsigned | CalculateGlobalIndex (c_vector< unsigned, DIM > coordinateIndices) |
unsigned | CalculateContainingBox (Node< DIM > *pNode) |
unsigned | CalculateContainingBox (c_vector< double, DIM > &rLocation) |
c_vector< unsigned, DIM > | CalculateCoordinateIndices (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 |
unsigned | GetNumRowsOfBoxes () const |
int | LoadBalance (std::vector< int > localDistribution) |
void | SetupLocalBoxesHalfOnly () |
void | SetupAllLocalBoxes () |
std::set< unsigned > | GetLocalBoxes (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, std::map< unsigned, std::set< unsigned > > &rNodeNeighbours) |
void | CalculateInteriorNodePairs (std::vector< Node< DIM > * > &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs, std::map< unsigned, std::set< unsigned > > &rNodeNeighbours) |
void | CalculateBoundaryNodePairs (std::vector< Node< DIM > * > &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs, std::map< unsigned, std::set< unsigned > > &rNodeNeighbours) |
void | AddPairsFromBox (unsigned boxIndex, std::vector< std::pair< Node< DIM > *, Node< DIM > * > > &rNodePairs, std::map< unsigned, std::set< unsigned > > &rNodeNeighbours) |
std::vector< int > | CalculateNumberOfNodesInEachStrip () |
Private Member Functions | |
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 > | mBoxesMapping |
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 | 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 , |
||
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 |
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(), PetscTools::GetNumProcs(), PetscTools::IsSequential(), DistributedBoxCollection< DIM >::mBoxes, DistributedBoxCollection< DIM >::mBoxesMapping, DistributedBoxCollection< DIM >::mBoxWidth, DistributedBoxCollection< DIM >::mDomainSize, DistributedBoxCollection< DIM >::mMaxBoxIndex, DistributedBoxCollection< DIM >::mMinBoxIndex, DistributedBoxCollection< DIM >::mNumBoxes, DistributedBoxCollection< DIM >::mNumBoxesEachDirection, DistributedBoxCollection< DIM >::mNumBoxesInAFace, DistributedBoxCollection< DIM >::mpDistributedBoxStackFactory, and DistributedBoxCollection< DIM >::msFudge.
DistributedBoxCollection< DIM >::~DistributedBoxCollection | ( | ) |
Destructor - frees memory allocated to distributed vector.
Definition at line 124 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::AddPairsFromBox | ( | unsigned | boxIndex, |
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > & | rNodePairs, | ||
std::map< unsigned, std::set< unsigned > > & | rNodeNeighbours | ||
) |
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 |
rNodeNeighbours | the other return value, the neighbours of each node. |
Definition at line 1210 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, | ||
std::map< unsigned, std::set< unsigned > > & | rNodeNeighbours | ||
) |
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 |
rNodeNeighbours | the other return value, the neighbours of each node. |
Definition at line 1193 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::CalculateContainingBox | ( | Node< DIM > * | pNode | ) |
pNode | address of the node |
Definition at line 255 of file DistributedBoxCollection.cpp.
References Node< SPACE_DIM >::rGetLocation().
unsigned DistributedBoxCollection< DIM >::CalculateContainingBox | ( | c_vector< double, DIM > & | rLocation | ) |
rLocation | The point |
Definition at line 264 of file DistributedBoxCollection.cpp.
References EXCEPTION.
c_vector< unsigned, DIM > DistributedBoxCollection< DIM >::CalculateCoordinateIndices | ( | unsigned | globalIndex | ) |
Calculate x,y,z indices of box given its 'global' index.
globalIndex | the global index of the box |
Definition at line 306 of file DistributedBoxCollection.cpp.
References NEVER_REACHED.
unsigned DistributedBoxCollection< DIM >::CalculateGlobalIndex | ( | c_vector< unsigned, DIM > | coordinateIndices | ) |
Given the (i,j,k) co-ordniates of a box in the collection, calculate its global index.
coordinateIndices | the co-ordinate indices of the box (across, up, deep) |
Definition at line 238 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::CalculateInteriorNodePairs | ( | std::vector< Node< DIM > * > & | rNodes, |
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > & | rNodePairs, | ||
std::map< unsigned, std::set< unsigned > > & | rNodeNeighbours | ||
) |
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 |
rNodeNeighbours | the other return value, the neighbours of each node. |
Definition at line 1159 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::CalculateNodePairs | ( | std::vector< Node< DIM > * > & | rNodes, |
std::vector< std::pair< Node< DIM > *, Node< DIM > * > > & | rNodePairs, | ||
std::map< unsigned, std::set< unsigned > > & | rNodeNeighbours | ||
) |
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 |
rNodeNeighbours | the other return value, the neighbours of each node. |
Definition at line 1128 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 1286 of file DistributedBoxCollection.cpp.
void DistributedBoxCollection< DIM >::EmptyBoxes | ( | ) |
Remove the list of nodes stored in each box.
Definition at line 130 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetAreLocalBoxesSet | ( | ) | const |
Definition at line 379 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetBoxOwnership | ( | unsigned | globalIndex | ) |
globalIndex | the global index of the box. |
Definition at line 215 of file DistributedBoxCollection.cpp.
double DistributedBoxCollection< DIM >::GetBoxWidth | ( | ) | const |
Definition at line 385 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::GetHaloBoxOwnership | ( | unsigned | globalIndex | ) |
globalIndex | the global index of the box. |
Definition at line 221 of file DistributedBoxCollection.cpp.
References PetscTools::IsParallel().
std::set< unsigned > DistributedBoxCollection< DIM >::GetLocalBoxes | ( | 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 1068 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumBoxes | ( | ) |
Definition at line 361 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumLocalBoxes | ( | ) |
Definition at line 367 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumLocalRows | ( | ) | const |
Definition at line 209 of file DistributedBoxCollection.cpp.
unsigned DistributedBoxCollection< DIM >::GetNumRowsOfBoxes | ( | ) | const |
Definition at line 391 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 1092 of file DistributedBoxCollection.cpp.
References PetscTools::GetMyRank().
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 230 of file DistributedBoxCollection.cpp.
References PetscTools::IsSequential().
bool DistributedBoxCollection< DIM >::IsOwned | ( | Node< DIM > * | pNode | ) |
pNode | the node to test. |
Definition at line 1076 of file DistributedBoxCollection.cpp.
bool DistributedBoxCollection< DIM >::IsOwned | ( | c_vector< double, DIM > & | location | ) |
location | the location to test. |
Definition at line 1084 of file DistributedBoxCollection.cpp.
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 397 of file DistributedBoxCollection.cpp.
References PetscTools::AmMaster(), PetscTools::AmTopMost(), and PetscTools::GetMyRank().
Box< DIM > & DistributedBoxCollection< DIM >::rGetBox | ( | unsigned | boxIndex | ) |
boxIndex | the index of the box to return |
Definition at line 344 of file DistributedBoxCollection.cpp.
c_vector< double, 2 *DIM > DistributedBoxCollection< DIM >::rGetDomainSize | ( | ) | const |
Definition at line 373 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 351 of file DistributedBoxCollection.cpp.
std::vector< unsigned > & DistributedBoxCollection< DIM >::rGetHaloNodesLeft | ( | ) |
Definition at line 1116 of file DistributedBoxCollection.cpp.
std::vector< unsigned > & DistributedBoxCollection< DIM >::rGetHaloNodesRight | ( | ) |
Definition at line 1110 of file DistributedBoxCollection.cpp.
|
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 132 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 1122 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 747 of file DistributedBoxCollection.cpp.
References NEVER_REACHED.
void DistributedBoxCollection< DIM >::SetupHaloBoxes | ( | ) |
Setup the halo box structure on this process.
Sets up the containers mHaloBoxes, mHalosRight, mHalosLeft
Definition at line 143 of file DistributedBoxCollection.cpp.
References PetscTools::AmMaster(), and PetscTools::AmTopMost().
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 485 of file DistributedBoxCollection.cpp.
References EXCEPTION, and NEVER_REACHED.
Referenced by NodesOnlyMesh< SPACE_DIM >::SetUpBoxCollection().
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 182 of file DistributedBoxCollection.cpp.
|
friend |
Needed for serialization
Definition at line 123 of file DistributedBoxCollection.hpp.
|
private |
Whether the local boxes have been setup or not.
Definition at line 111 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 |
Map of global to local indices of boxes.
Definition at line 78 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The width of each box.
Definition at line 87 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 120 of file DistributedBoxCollection.hpp.
|
private |
The domain being partitioned.
Definition at line 84 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 81 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 in the X dimension Note this currently only works for DIM=2.
Definition at line 108 of file DistributedBoxCollection.hpp.
|
private |
The boxes local (itself and nearest neighbour) to a given box.
Definition at line 99 of file DistributedBoxCollection.hpp.
|
private |
The largest index of the boxes owned by this process.
Definition at line 105 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The smallest index of the boxes owned by this process.
Definition at line 102 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
The total number of boxes across all processes
Definition at line 90 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
Number of boxes in each direction.
Definition at line 93 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 96 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().
|
private |
A distributed vector factory that governs ownership of rows of boxes
Definition at line 117 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 114 of file DistributedBoxCollection.hpp.
Referenced by DistributedBoxCollection< DIM >::DistributedBoxCollection().