30#ifndef INCLUDED_DECOMP_HPP
31#define INCLUDED_DECOMP_HPP
46 static constexpr int Dim=3;
69 fileStream << it->first.getIndex() <<
" " << it->second <<
" ";
76 int sizeKeyRankMap(0), rank(0);
77 fileStream >> sizeKeyRankMap;
79 for (
int i = 0; i < sizeKeyRankMap; ++i)
92 std::vector<key_type>
initialize(
int nProcs,
int _rank,
int restartSimulation)
noexcept
94 std::vector<key_type> keys;
96 if (restartSimulation == 0) {
98 std::multiplies<int>());
100 float chunks =
static_cast<float>(nCells_t+0.5)/nProcs;
102 std::vector<int> nCells_per_rank;
103 for (
int i = 0; i < nProcs; ++i)
105 size_t start = (size_t)(i*chunks);
106 size_t end = std::min(
static_cast<int>((i+1)*chunks), nCells_t);
107 const int nlocal = end-start;
110 nCells_per_rank.emplace_back(nlocal);
112 while (count < nlocal)
121 nCells_per_rank.emplace_back(0);
127 std::advance(key_it, _rank);
129 auto nCells = nCells_per_rank[_rank];
132 for (
int i = 0; i < nCells; ++i)
148 auto map_key_next = std::next(map_key);
150 if (map_key->second == _rank) {
151 auto key = map_key->first;
152 while (key != map_key_next->first) {
174 return _key0 == _key1;
182 if (range.first->first == range.second->first) {
183 auto it = range.first;
184 return (--it)->second;
187 return range.first->second;
198 template<
class Coord>
201 for (
int d = 0; d <
Dim; ++d)
213 if (it->second == itPrev->second) {
223 void communicateMaps(
int _nCpu, std::vector<typename key_type::value_type>& localKeys, std::vector<int>& localRanks)
226 int localMapSize = localKeys.size();
229 std::vector<int> mapSizes(_nCpu);
230 MPI_Allgather(&localMapSize, 1, MPI_INT, &mapSizes[0], 1, MPI_INT, MPI_COMM_WORLD);
233 std::vector<int> displacements(_nCpu);
235 for (
int i = 0; i < _nCpu; ++i)
237 displacements[i] = sumMapSizes;
238 sumMapSizes += mapSizes[i];
240 std::vector<typename key_type::value_type> globalKeys(sumMapSizes);
241 std::vector<int> globalRanks(sumMapSizes);
242 MPI_Allgatherv(&localKeys[0], localMapSize, MPI_UNSIGNED_LONG_LONG, &globalKeys[0], &mapSizes[0], &displacements[0], MPI_UNSIGNED_LONG_LONG, MPI_COMM_WORLD);
243 MPI_Allgatherv(&localRanks[0], localMapSize, MPI_INT, &globalRanks[0], &mapSizes[0], &displacements[0], MPI_INT, MPI_COMM_WORLD);
249 for (std::size_t i = 0; i < globalKeys.size(); ++i)
Class for a coordinate system object such as coordinates of the vertex or a vector.
Definition Coord.h:43
Definition decomposition.hpp:43
void printDomainDecomposition(std::ofstream &fileStream) const noexcept
Definition decomposition.hpp:64
void communicateMaps(int _nCpu, std::vector< typename key_type::value_type > &localKeys, std::vector< int > &localRanks)
Definition decomposition.hpp:223
bool is_inside(const Coord &_coord)
Definition decomposition.hpp:199
void readDomainDecomposition(std::ifstream &fileStream) noexcept
Definition decomposition.hpp:74
Decomposition(const Decomposition &)=default
bool is_valid(const key_type &_key) const noexcept
Definition decomposition.hpp:191
bool areConsecutive(key_type _key0, key_type _key1)
Definition decomposition.hpp:167
std::map< key_type, int > key_rank_map_
Definition decomposition.hpp:258
static constexpr int Dim
Definition decomposition.hpp:46
Decomposition(Decomposition &&)=default
std::vector< key_type > initialize(int nProcs, int _rank, int restartSimulation) noexcept
Definition decomposition.hpp:92
Decomposition & operator=(Decomposition &&) &=default
void updatePhysicalDomainSizes(std::array< int, Dim > _nCells) noexcept
Definition decomposition.hpp:87
int get_rank(const key_type &_key)
Definition decomposition.hpp:179
Decomposition(std::array< int, Dim > _nCells)
Definition decomposition.hpp:60
Decomposition & operator=(const Decomposition &) &=default
std::array< int, Dim > nCells_global_
Definition decomposition.hpp:257
void recombineStarts()
Definition decomposition.hpp:209
Definition decomposition.hpp:40
unsigned long long int value_type
Definition key.hpp:54