![]() |
Chaste
Release::3.4
|
#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 | 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().