50 #ifndef _ZOLTAN2_MAPPINGSOLUTION_HPP_ 51 #define _ZOLTAN2_MAPPINGSOLUTION_HPP_ 52 #include "Teuchos_Comm.hpp" 55 #include <unordered_map> 62 template <
typename Adapter>
67 #ifndef DOXYGEN_SHOULD_SKIP_THIS 68 typedef typename Adapter::part_t part_t;
74 const RCP<
const Teuchos::Comm<int> > &comm,
76 : nParts(0), nRanks(1), myRank(comm->getRank()), maxPart(0),
77 algorithm(algorithm_) {}
92 if (algorithm != Teuchos::null) {
94 algorithm->getMyPartsView(numParts, parts);
109 if ((partsForRank==Teuchos::null) && (rankForPart==Teuchos::null)) {
112 throw std::runtime_error(
"No mapping solution available.");
115 if (partsForRank == Teuchos::null) {
117 Teuchos::Array<part_t> tmp;
120 for (
typename rankmap_t::iterator it = rankForPart->begin();
121 it != rankForPart->end(); it++) {
122 if (it->second == myRank) {
123 tmp.push_back(it->first);
128 partsForRank = arcp(&tmp[0], 0, cnt,
true);
131 numParts = partsForRank.size();
133 parts = partsForRank.getRawPtr();
153 if (algorithm != Teuchos::null) {
155 r = algorithm->getRankForPart(part);
165 if (rankForPart==Teuchos::null) {
166 throw std::runtime_error(
"No mapping solution available.");
169 if (part < 0 || part > maxPart) {
170 throw std::runtime_error(
"Invalid part number input to getRankForPart");
174 typename rankmap_t::iterator it;
175 if ((it = rankForPart->find(part)) != rankForPart->end())
178 throw std::runtime_error(
"Invalid part number input to getRankForPart");
190 nRanks = idx.size() - 1;
191 nParts = parts.size();
194 rankForPart = rcp(
new rankmap_t(idx[nRanks]));
197 for (
int i = 0; i < nRanks; i++) {
198 for (part_t j = idx[i]; j < idx[i+1]; j++) {
199 (*rankForPart)[parts[j]] = i;
200 if (parts[j] > maxPart) maxPart = parts[j];
206 partsForRank = parts->persistingView(idx[myRank],idx[myRank+1]-idx[myRank]);
210 nParts = parts.size();
214 rankForPart = rcp(
new rankmap_t(parts.size()));
216 for (
size_t i = 0; i < nParts; i++) {
217 (*rankForPart)[parts[i]] = ranks[i];
218 if (parts[i] > maxPart) maxPart = parts[i];
219 if (ranks[i] > maxRank) maxRank = ranks[i];
225 rankForPart = rankmap;
226 nParts = rankForPart.size();
228 typename rankmap_t::iterator it;
229 for (it = rankForPart->begin(); it != rankForPart->end(); it++) {
230 if (it->first > maxPart) maxPart = it->first;
231 if (it->second > maxRank) maxRank = it->second;
247 ArrayRCP<part_t> partsForRankIdx;
248 ArrayRCP<part_t> partsForRank;
249 RCP<rankmap_t> rankForPart;
251 const RCP<Algorithm<Adapter> > algorithm;
void setMap_PartsForRank(ArrayRCP< int > &idx, ArrayRCP< part_t > &parts)
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
std::unordered_map< part_t, int > rankmap_t
PartitionMapping maps a solution or an input distribution to ranks.
Just a placeholder for now.
MappingSolution(const RCP< const Teuchos::Comm< int > > &comm, const RCP< Algorithm< Adapter > > &algorithm_=Teuchos::null)
Constructor.
void setMap_RankForPart(ArrayRCP< part_t > &parts, ArrayRCP< int > &ranks)
Exception thrown when a called base-class method is not implemented.
Algorithm defines the base class for all algorithms.
int getRankForPart(part_t part)
Get the rank containing a part. Simplifying assumption: a part is wholy assigned to a rank; it is not...
void getMyPartsView(part_t &numParts, part_t *&parts)
Get the parts belonging to this rank.
Defines the Environment class.
void setMap_RankForPart(RCP< rankmap_t > &rankmap)