35 #include "DistributedBoxCollection.hpp" 38 #include "Warnings.hpp" 41 template<
unsigned DIM>
44 template<
unsigned DIM>
46 : mBoxWidth(boxWidth),
47 mIsPeriodicInX(isPeriodicInX),
48 mIsPeriodicInY(isPeriodicInY),
49 mIsPeriodicInZ(isPeriodicInZ),
50 mAreLocalBoxesSet(false),
51 mCalculateNodeNeighbours(true)
54 for (
unsigned i=0; i<DIM; i++)
56 double r = fmod((domainSize[2*i+1]-domainSize[2*i]), boxWidth);
59 domainSize[2*i+1] += boxWidth - r;
71 for (
unsigned i=0; i<DIM; i++)
84 WARNING(
"There are more processes than convenient for the domain/mesh/box size. The domain size has been swollen.")
94 for (
unsigned dim=0; dim<DIM; dim++)
107 mBoxes.resize(num_local_boxes);
111 template<
unsigned DIM>
117 template<
unsigned DIM>
120 for (
unsigned i=0; i<
mBoxes.size(); i++)
130 template<
unsigned DIM>
151 unsigned global_index = hi * mNumBoxesInAFace + i;
153 mHalosRight.push_back(global_index - mNumBoxesInAFace);
167 mHalosRight.push_back( (hi-1)*mNumBoxesInAFace + i );
179 unsigned global_index = (lo - 1) * mNumBoxesInAFace + i;
182 mHalosLeft.push_back(global_index + mNumBoxesInAFace);
203 template<
unsigned DIM>
230 template<
unsigned DIM>
236 template<
unsigned DIM>
242 template<
unsigned DIM>
264 template<
unsigned DIM>
272 template<
unsigned DIM>
276 unsigned global_index;
282 global_index = gridIndices(0);
287 global_index = gridIndices(0) +
293 global_index = gridIndices(0) +
306 template<
unsigned DIM>
314 template<
unsigned DIM>
318 for (
unsigned i=0; i<DIM; i++)
322 EXCEPTION(
"The point provided is outside all of the boxes");
327 c_vector<unsigned, DIM> containing_box_indices = scalar_vector<unsigned>(DIM, 0u);
328 for (
unsigned i=0; i<DIM; i++)
333 containing_box_indices[i]++;
339 unsigned containing_box_index = 0;
340 for (
unsigned i=0; i<DIM; i++)
343 for (
unsigned j=0; j<i; j++)
347 containing_box_index += temp*containing_box_indices[i];
351 assert(containing_box_index <
mNumBoxes);
353 return containing_box_index;
356 template<
unsigned DIM>
359 c_vector<unsigned, DIM> grid_indices;
365 grid_indices(0) = globalIndex;
371 grid_indices(0) = globalIndex % num_x;
372 grid_indices(1) = (globalIndex - grid_indices(0)) / num_x;
379 grid_indices(0) = globalIndex % num_x;
380 grid_indices(1) = (globalIndex % num_xy - grid_indices(0)) / num_x;
381 grid_indices(2) = globalIndex / num_xy;
393 template<
unsigned DIM>
406 template<
unsigned DIM>
416 template<
unsigned DIM>
422 template<
unsigned DIM>
428 template<
unsigned DIM>
434 template<
unsigned DIM>
440 template<
unsigned DIM>
446 template<
unsigned DIM>
452 template<
unsigned DIM>
458 template<
unsigned DIM>
464 template<
unsigned DIM>
470 template<
unsigned DIM>
473 c_vector<bool, DIM> periodic_dims;
483 return periodic_dims;
486 template<
unsigned DIM>
492 template<
unsigned DIM>
501 int new_rows = localDistribution.size();
506 unsigned rows_on_left_process = 0;
507 std::vector<int> node_distr_on_left_process;
509 unsigned num_local_rows = localDistribution.size();
511 MPI_Send(&num_local_rows, 1, MPI_UNSIGNED, proc_right, 123, PETSC_COMM_WORLD);
512 MPI_Recv(&rows_on_left_process, 1, MPI_UNSIGNED, proc_left, 123, PETSC_COMM_WORLD, &status);
514 node_distr_on_left_process.resize(rows_on_left_process > 0 ? rows_on_left_process : 1);
516 MPI_Send(&localDistribution[0], num_local_rows, MPI_INT, proc_right, 123, PETSC_COMM_WORLD);
517 MPI_Recv(&node_distr_on_left_process[0], rows_on_left_process, MPI_INT, proc_left, 123, PETSC_COMM_WORLD, &status);
523 for (
unsigned i=0; i<localDistribution.size(); i++)
525 local_load += localDistribution[i];
527 int load_on_left_proc = 0;
528 for (
unsigned i=0; i<node_distr_on_left_process.size(); i++)
530 load_on_left_proc += node_distr_on_left_process[i];
537 int local_to_left_sq = (local_load - load_on_left_proc) * (local_load - load_on_left_proc);
538 int delta_left = ( (local_load + node_distr_on_left_process[node_distr_on_left_process.size() - 1]) - (load_on_left_proc - node_distr_on_left_process[node_distr_on_left_process.size() - 1]) );
539 delta_left = delta_left*delta_left - local_to_left_sq;
541 int delta_right = ( (local_load - localDistribution[0]) - (load_on_left_proc + localDistribution[0]));
542 delta_right = delta_right*delta_right - local_to_left_sq;
545 int local_change = 0;
546 bool move_left = (!(delta_left > 0) && (node_distr_on_left_process.size() > 1));
552 bool move_right = !(delta_right > 0) && (localDistribution.size() > 2);
558 if (move_left && move_right)
560 local_change = (fabs((
double)delta_right) > fabs((
double)delta_left)) ? -1 : 1;
564 new_rows += local_change;
567 MPI_Send(&local_change, 1, MPI_INT, proc_left, 123, PETSC_COMM_WORLD);
571 int remote_change = 0;
572 MPI_Recv(&remote_change, 1, MPI_INT, proc_right, 123, PETSC_COMM_WORLD, &status);
575 new_rows -= remote_change;
580 template<
unsigned DIM>
585 EXCEPTION(
"Local Boxes Are Already Set");
599 std::set<unsigned> local_boxes;
602 local_boxes.insert(global_index);
606 bool left = (global_index == 0);
612 local_boxes.insert(global_index+1);
615 if (proc_left && !left)
617 local_boxes.insert(global_index-1);
640 for (
unsigned j = j_start; j < (j_end+1); j++ )
643 for (
unsigned i = 0; i < nI; i++ )
645 std::set<unsigned> local_boxes;
652 int dj = -1 * (int)(j == bottom_proc && (j > 0 || (
mIsPeriodicInY && top_proc < nJ)) );
655 for (; dj < std::min((
int)nJ-j_mod,(
int)2); dj++ )
661 j_mod_2 = ( dj < 0 ) ? nJ : 0;
666 int boxi = std::max((
int) i-1*std::abs(dj),(
int) 0);
667 for ( ; boxi < std::min((
int)i+2,(
int)nI); boxi++ )
669 local_boxes.insert( (j_mod+dj+j_mod_2)*nI + boxi );
674 local_boxes.insert( (j_mod+dj+j_mod_2)*nI );
688 local_boxes.insert( (j+2)*nI - 1 );
691 local_boxes.insert( nI*nJ - 1 );
696 local_boxes.insert( nI-1 );
700 if ( j == bottom_proc && j > 0 )
702 local_boxes.insert( j*nI - 1 );
732 for (
unsigned k = k_start; k <= k_end; k++ )
735 for (
unsigned j = 0; j < nJ; j++ )
738 for (
unsigned i = 0; i < nI; i++ )
740 std::set<unsigned> local_boxes;
743 unsigned z_offset = k*nI*nJ;
746 for (
int dj = 0; dj < std::min((
int)nJ-j_mod,2); dj++ )
748 for (
int boxi = std::max((
int)i-1*dj,0);
749 boxi < std::min((
int)i+2,(
int)nI); boxi++ )
751 local_boxes.insert( z_offset + (j_mod+dj)*nI + boxi );
755 local_boxes.insert( z_offset + (j_mod+dj)*nI );
767 local_boxes.insert( z_offset + (j+2)*nI - 1 );
771 local_boxes.insert( z_offset + nI-1 );
776 std::vector<unsigned> k_offset;
779 k_offset.push_back(k+1);
781 if ( k == bottom_proc && k > 0 )
784 k_offset.push_back(k-1);
788 k_offset.push_back(0);
792 k_offset.push_back(nK-1);
795 for ( std::vector<unsigned>::iterator k_offset_it = k_offset.begin(); k_offset_it != k_offset.end(); ++k_offset_it )
797 z_offset = (*k_offset_it)*nI*nJ;
801 for (
int boxi = std::max((
int)i-1,-1*pX); boxi < std::min((
int)i+2,(
int)nI+pX); boxi++ )
803 for (
int boxj = std::max((
int)j-1,-1*pY); boxj < std::min((
int)j+2,(
int)nJ+pY); boxj++ )
805 int box_to_add = z_offset + (boxj*(int)nI) + boxi;
814 local_boxes.insert( box_to_add );
833 template<
unsigned DIM>
843 std::set<unsigned> local_boxes;
845 local_boxes.insert(i);
850 local_boxes.insert(i-1);
854 local_boxes.insert(i+1);
868 std::vector<bool> is_xmin(N*M);
869 std::vector<bool> is_xmax(N*M);
870 std::vector<bool> is_ymin(N*M);
871 std::vector<bool> is_ymax(N*M);
873 for (
unsigned i=0; i<M*N; i++)
875 is_xmin[i] = (i%M==0);
876 is_xmax[i] = ((i+1)%M==0);
877 is_ymin[i] = (i%(M*N)<M);
878 is_ymax[i] = (i%(M*N)>=(N-1)*M);
883 std::set<unsigned> local_boxes;
885 local_boxes.insert(i);
890 local_boxes.insert(i-1);
896 local_boxes.insert(i+M-1);
903 local_boxes.insert(i+1);
909 local_boxes.insert(i-M+1);
916 local_boxes.insert(i-M);
922 local_boxes.insert(i+(N-1)*M);
929 local_boxes.insert(i+M);
935 local_boxes.insert(i-(N-1)*M);
941 if ( (!is_xmin[i]) && (!is_ymin[i]) )
943 local_boxes.insert(i-1-M);
945 if ( (!is_xmin[i]) && (!is_ymax[i]) )
947 local_boxes.insert(i-1+M);
949 if ( (!is_xmax[i]) && (!is_ymin[i]) )
951 local_boxes.insert(i+1-M);
953 if ( (!is_xmax[i]) && (!is_ymax[i]) )
955 local_boxes.insert(i+1+M);
961 if ( (is_xmin[i]) && (!is_ymin[i]) )
963 local_boxes.insert(i-1);
965 if ( (is_xmin[i]) && (!is_ymax[i]) )
967 local_boxes.insert(i-1+2*M);
969 if ( (is_xmax[i]) && (!is_ymin[i]) )
971 local_boxes.insert(i+1-2*M);
973 if ( (is_xmax[i]) && (!is_ymax[i]) )
975 local_boxes.insert(i+1);
980 if( (is_ymin[i]) && !(is_xmin[i]) )
982 local_boxes.insert(i+(N-1)*M-1);
984 if( (is_ymin[i]) && !(is_xmax[i]) )
986 local_boxes.insert(i+(N-1)*M+1);
988 if( (is_ymax[i]) && !(is_xmin[i]) )
990 local_boxes.insert(i-(N-1)*M-1);
992 if( (is_ymax[i]) && !(is_xmax[i]) )
994 local_boxes.insert(i-(N-1)*M+1);
1001 local_boxes.insert(M*N-1);
1005 local_boxes.insert(M*(N-1));
1007 else if( i==(M*(N-1)) )
1009 local_boxes.insert(M-1);
1011 else if( i==(M*N-1) )
1013 local_boxes.insert(0);
1029 std::vector<bool> is_xmin(N*M*P);
1030 std::vector<bool> is_xmax(N*M*P);
1031 std::vector<bool> is_ymin(N*M*P);
1032 std::vector<bool> is_ymax(N*M*P);
1033 std::vector<bool> is_zmin(N*M*P);
1034 std::vector<bool> is_zmax(N*M*P);
1036 for (
unsigned i=0; i<M*N*P; i++)
1038 is_xmin[i] = (i%M==0);
1039 is_xmax[i] = ((i+1)%M==0);
1040 is_ymin[i] = (i%(M*N)<M);
1041 is_ymax[i] = (i%(M*N)>=(N-1)*M);
1042 is_zmin[i] = (i<M*N);
1043 is_zmax[i] = (i>=M*N*(P-1));
1048 std::set<unsigned> local_boxes;
1051 local_boxes.insert(i);
1058 local_boxes.insert(i-1);
1063 local_boxes.insert(i-1-M);
1068 local_boxes.insert(i-1+M);
1073 local_boxes.insert(i-1-M*N);
1078 local_boxes.insert(i-1+M*N);
1085 local_boxes.insert(i+1);
1090 local_boxes.insert(i+1-M);
1095 local_boxes.insert(i+1+M);
1100 local_boxes.insert(i+1-M*N);
1105 local_boxes.insert(i+1+M*N);
1112 local_boxes.insert(i-M);
1117 local_boxes.insert(i-M-M*N);
1122 local_boxes.insert(i-M+M*N);
1129 local_boxes.insert(i+M);
1134 local_boxes.insert(i+M-M*N);
1139 local_boxes.insert(i+M+M*N);
1146 local_boxes.insert(i-N*M);
1152 local_boxes.insert(i+N*M);
1157 if ( (!is_xmin[i]) && (!is_ymin[i]) && (!is_zmin[i]) )
1159 local_boxes.insert(i-1-M-M*N);
1162 if ( (!is_xmin[i]) && (!is_ymin[i]) && (!is_zmax[i]) )
1164 local_boxes.insert(i-1-M+M*N);
1167 if ( (!is_xmin[i]) && (!is_ymax[i]) && (!is_zmin[i]) )
1169 local_boxes.insert(i-1+M-M*N);
1172 if ( (!is_xmin[i]) && (!is_ymax[i]) && (!is_zmax[i]) )
1174 local_boxes.insert(i-1+M+M*N);
1177 if ( (!is_xmax[i]) && (!is_ymin[i]) && (!is_zmin[i]) )
1179 local_boxes.insert(i+1-M-M*N);
1182 if ( (!is_xmax[i]) && (!is_ymin[i]) && (!is_zmax[i]) )
1184 local_boxes.insert(i+1-M+M*N);
1187 if ( (!is_xmax[i]) && (!is_ymax[i]) && (!is_zmin[i]) )
1189 local_boxes.insert(i+1+M-M*N);
1192 if ( (!is_xmax[i]) && (!is_ymax[i]) && (!is_zmax[i]) )
1194 local_boxes.insert(i+1+M+M*N);
1202 std::vector< int > z_i_offsets(1,0);
1205 z_i_offsets.push_back(-M*N);
1209 z_i_offsets.push_back(M*N);
1216 for ( std::vector<int>::iterator it = z_i_offsets.begin(); it != z_i_offsets.end(); it++ )
1218 local_boxes.insert( i + (*it) + (M-1) );
1222 local_boxes.insert( i + (*it) - 1 );
1226 local_boxes.insert( i + (*it) + (2*M-1) );
1232 else if ( is_xmax[i] )
1235 for ( std::vector<int>::iterator it = z_i_offsets.begin(); it != z_i_offsets.end(); it++ )
1237 local_boxes.insert( i + (*it) - (M-1) );
1241 local_boxes.insert( i + (*it) - (2*M-1) );
1245 local_boxes.insert( i + (*it) + 1 );
1255 std::vector<unsigned> opp_box_i(0);
1258 opp_box_i.push_back(i + (N-1)*M);
1261 opp_box_i.push_back( i - M );
1265 opp_box_i.push_back(i + 2*M*N - M);
1268 else if ( is_ymax[i] )
1270 opp_box_i.push_back( i - (N-1)*M );
1273 opp_box_i.push_back( i - 2*M*N + M );
1277 opp_box_i.push_back( i + M );
1282 for ( std::vector<unsigned>::iterator it_opp_box = opp_box_i.begin(); it_opp_box != opp_box_i.end(); it_opp_box++ )
1284 local_boxes.insert( *it_opp_box );
1287 local_boxes.insert( *it_opp_box - 1 );
1291 local_boxes.insert( *it_opp_box + 1 );
1299 if ( is_xmin[i] && is_ymin[i] )
1302 local_boxes.insert(i+M*N-1);
1306 local_boxes.insert(i+2*M*N-1);
1311 local_boxes.insert(i-1);
1314 if ( is_xmax[i] && is_ymin[i] )
1316 local_boxes.insert(i + (N-2)*M + 1);
1319 local_boxes.insert(i + M*N + (N-2)*M + 1);
1324 local_boxes.insert(i-2*M+1);
1327 if ( is_xmin[i] && is_ymax[i] )
1329 local_boxes.insert(i + (N-2)*M - 1);
1333 local_boxes.insert(i - 2*M - 1);
1338 local_boxes.insert(i-2*(N-1)*M-1);
1342 if ( is_xmax[i] && is_ymax[i] )
1347 local_boxes.insert(i + 1);
1352 local_boxes.insert(i - 2*M*N + 1);
1363 unsigned above_box = i+(P-1)*M*N;
1364 local_boxes.insert(above_box);
1368 local_boxes.insert(above_box-1);
1371 local_boxes.insert(above_box+M-1);
1376 local_boxes.insert(above_box-M-1);
1382 local_boxes.insert(above_box+M-1);
1385 local_boxes.insert(above_box+2*M-1);
1390 local_boxes.insert(above_box+M*N-1);
1394 local_boxes.insert(above_box+2*M-1);
1399 local_boxes.insert(above_box-M*(N-2)-1);
1406 local_boxes.insert(above_box+1);
1409 local_boxes.insert(above_box+M+1);
1413 local_boxes.insert(above_box-M+1);
1419 local_boxes.insert(above_box - M+1);
1425 local_boxes.insert(above_box+M*(N-2)+1);
1427 else if ( is_ymax[i] )
1430 local_boxes.insert(above_box-M*N+1);
1438 local_boxes.insert(above_box+M);
1442 local_boxes.insert(above_box-M*(N-1));
1445 local_boxes.insert(above_box-M*(N-1)-1);
1449 local_boxes.insert(above_box-M*(N-1)+1);
1454 local_boxes.insert(above_box-M);
1458 local_boxes.insert(above_box+M*(N-1));
1461 local_boxes.insert(above_box+M*(N-1)-1);
1465 local_boxes.insert(above_box+M*(N-1)+1);
1469 else if ( is_zmax[i] )
1472 unsigned below_box = i-(P-1)*M*N;
1473 local_boxes.insert(below_box);
1477 local_boxes.insert(below_box-1);
1480 local_boxes.insert(below_box+M-1);
1485 local_boxes.insert(below_box-M-1);
1491 local_boxes.insert(below_box+M-1);
1497 local_boxes.insert(below_box+M*N-1);
1499 else if ( is_ymax[i] )
1502 local_boxes.insert(below_box-M*(N-2)-1);
1510 local_boxes.insert(below_box+1);
1513 local_boxes.insert(below_box+M+1);
1517 local_boxes.insert(below_box-M+1);
1523 local_boxes.insert(below_box - M+1);
1529 local_boxes.insert(below_box+M*(N-2)+1);
1531 else if ( is_ymax[i] )
1534 local_boxes.insert(below_box-M*N+1);
1542 local_boxes.insert(below_box+M);
1546 local_boxes.insert(below_box-M*(N-1));
1549 local_boxes.insert(below_box-M*(N-1)+1);
1553 local_boxes.insert(below_box-M*(N-1)-1);
1558 local_boxes.insert(below_box-M);
1562 local_boxes.insert(below_box+M*(N-1));
1565 local_boxes.insert(below_box+M*(N-1)+1);
1569 local_boxes.insert(below_box+M*(N-1)-1);
1584 template<
unsigned DIM>
1592 template<
unsigned DIM>
1600 template<
unsigned DIM>
1608 template<
unsigned DIM>
1616 containing_process++;
1620 containing_process--;
1634 containing_process = 0;
1638 return containing_process;
1641 template<
unsigned DIM>
1647 template<
unsigned DIM>
1653 template<
unsigned DIM>
1659 template<
unsigned DIM>
1665 for (
unsigned i=0; i<rNodes.size(); i++)
1673 rNodes[i]->ClearNeighbours();
1684 for (
unsigned i = 0; i < rNodes.size(); i++)
1692 rNodes[i]->RemoveDuplicateNeighbours();
1698 template<
unsigned DIM>
1704 for (
unsigned i=0; i<rNodes.size(); i++)
1712 rNodes[i]->ClearNeighbours();
1713 rNodes[i]->SetNeighboursSetUp(
false);
1727 for (
unsigned i = 0; i < rNodes.size(); i++)
1735 rNodes[i]->RemoveDuplicateNeighbours();
1736 rNodes[i]->SetNeighboursSetUp(
true);
1742 template<
unsigned DIM>
1755 for (
unsigned i = 0; i < rNodes.size(); i++)
1763 rNodes[i]->RemoveDuplicateNeighbours();
1764 rNodes[i]->SetNeighboursSetUp(
true);
1770 template<
unsigned DIM>
1781 const std::set<unsigned>& local_boxes_indices =
rGetLocalBoxes(boxIndex);
1784 for (std::set<unsigned>::iterator box_iter = local_boxes_indices.begin();
1785 box_iter != local_boxes_indices.end();
1799 assert(p_neighbour_box);
1802 std::set< Node<DIM>* >& r_contained_neighbour_nodes = p_neighbour_box->
rGetNodesContained();
1805 for (
typename std::set<
Node<DIM>*>::iterator neighbour_node_iter = r_contained_neighbour_nodes.begin();
1806 neighbour_node_iter != r_contained_neighbour_nodes.end();
1807 ++neighbour_node_iter)
1810 unsigned other_node_index = (*neighbour_node_iter)->GetIndex();
1813 for (
typename std::set<
Node<DIM>*>::iterator node_iter = r_contained_nodes.begin();
1814 node_iter != r_contained_nodes.end();
1817 unsigned node_index = (*node_iter)->GetIndex();
1820 if (*box_iter != boxIndex || other_node_index > node_index)
1822 rNodePairs.push_back(std::pair<
Node<DIM>*,
Node<DIM>*>((*node_iter), (*neighbour_node_iter)));
1825 (*node_iter)->AddNeighbour(other_node_index);
1826 (*neighbour_node_iter)->AddNeighbour(node_index);
1835 template<
unsigned DIM>
1845 cell_numbers[location_in_vector] +=
mBoxes[local_index].rGetNodesContained().size();
1848 return cell_numbers;
std::vector< Box< DIM > > mBoxes
bool IsBoxOwned(unsigned globalIndex)
std::vector< unsigned > & rGetHaloNodesRight()
std::vector< unsigned > mHalosRight
unsigned CalculateContainingBox(Node< DIM > *pNode)
unsigned GetNumLocalBoxes()
~DistributedBoxCollection()
double GetBoxWidth() const
bool IsInteriorBox(unsigned globalIndex)
DistributedBoxCollection(double boxWidth, c_vector< double, 2 *DIM > domainSize, bool isPeriodicInX=false, bool mIsPeriodicInY=false, bool mIsPeriodicInZ=false, int localRows=PETSC_DECIDE)
void CalculateBoundaryNodePairs(std::vector< Node< DIM > *> &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > *> > &rNodePairs)
c_vector< double, 2 *DIM > rGetDomainSize() const
c_vector< double, 2 *DIM > mDomainSize
std::vector< std::set< unsigned > > mLocalBoxes
#define EXCEPTION(message)
void AddPairsFromBox(unsigned boxIndex, std::vector< std::pair< Node< DIM > *, Node< DIM > *> > &rNodePairs)
std::vector< unsigned > mHalosLeft
void SetCalculateNodeNeighbours(bool calculateNodeNeighbours)
unsigned CalculateGlobalIndex(c_vector< unsigned, DIM > gridIndices)
std::vector< Box< DIM > > mHaloBoxes
std::vector< int > CalculateNumberOfNodesInEachStrip()
unsigned GetNumLocalRows() const
unsigned GetProcessOwningNode(Node< DIM > *pNode)
std::set< unsigned > & rGetLocalBoxes(unsigned boxIndex)
void SetupLocalBoxesHalfOnly()
const c_vector< double, SPACE_DIM > & rGetLocation() const
static const double msFudge
bool mIsPeriodicAcrossProcs
c_vector< unsigned, DIM > mNumBoxesEachDirection
std::vector< unsigned > & rGetHaloNodesLeft()
std::set< Node< DIM > *> & rGetNodesContained()
bool IsOwned(Node< DIM > *pNode)
std::vector< unsigned > mHaloNodesRight
bool GetIsPeriodicAcrossProcs() const
std::map< unsigned, unsigned > mHaloBoxesMapping
bool GetIsPeriodicInX() const
int LoadBalance(std::vector< int > localDistribution)
void CalculateInteriorNodePairs(std::vector< Node< DIM > *> &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > *> > &rNodePairs)
bool GetIsPeriodicInY() const
bool mCalculateNodeNeighbours
bool GetIsPeriodicInZ() const
c_vector< unsigned, DIM > CalculateGridIndices(unsigned globalIndex)
bool IsHaloBox(unsigned globalIndex)
Box< DIM > & rGetHaloBox(unsigned boxIndex)
unsigned mNumBoxesInAFace
Box< DIM > & rGetBox(unsigned boxIndex)
void CalculateNodePairs(std::vector< Node< DIM > *> &rNodes, std::vector< std::pair< Node< DIM > *, Node< DIM > *> > &rNodePairs)
c_vector< bool, DIM > GetIsPeriodicAllDims() const
std::vector< unsigned > mHaloNodesLeft
bool GetAreLocalBoxesSet() const
DistributedVectorFactory * mpDistributedBoxStackFactory
void SetupAllLocalBoxes()
unsigned GetNumRowsOfBoxes() const