155 typedef typename Tpetra::Map<int, id_t>
map_t;
156 typedef typename Teuchos::RCP<const map_t> rcpmap_t;
158 typedef typename Tpetra::Vector<scalar_t, int, id_t> vector_t;
159 typedef typename Teuchos::ArrayRCP<scalar_t> vectordata_t;
166 id_t minId = std::numeric_limits<id_t>::max();
168 std::unordered_map<id_t, size_t> uniqueIds;
169 uniqueIds.reserve(nIds);
171 for (
size_t i = 0; i < nIds; i++) {
173 if (
id < minId) minId = id;
174 if (uniqueIds.find(
id) == uniqueIds.end())
183 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MIN, 1, &minId, &indexBase);
187 size_t nUniqueIds = uniqueIds.size();
188 Teuchos::Array<id_t> uniqueIdsList(nUniqueIds);
191 for (
auto it = uniqueIds.begin(); it != uniqueIds.end(); it++)
192 uniqueIdsList[cnt++] = it->first;
196 size_t dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
198 rcpmap_t idMap = Teuchos::rcp(
new map_t(dummy, uniqueIdsList(), indexBase,
204 vector_t idVec(idMap, 0.);
209 vectordata_t idData = idVec.getDataNonConst();
210 for (
auto it = uniqueIds.begin(); it != uniqueIds.end(); it++) {
211 id_t idx = idMap->getLocalElement(it->first);
212 idData[idx] = it->second;
227 id_t gnUnique = idMap->getMaxAllGlobalIndex() - indexBase + 1;
228 oto_idMap = Teuchos::rcp(
new map_t(gnUnique, indexBase, comm));
232 oto_idMap = Tpetra::createOneToOne(idMap);
235 vector_t oto_idVec(oto_idMap);
241 typedef Tpetra::Export<int, id_t> export_t;
243 export_t idExporter(idMap, oto_idMap);
254 oto_idVec.doExport(idVec, idExporter, Tpetra::ADD);
263 idVec.doImport(oto_idVec, idExporter, Tpetra::REPLACE);
268 size_t cntShared = 0;
270 auto idData = idVec.getDataNonConst();
271 for (
size_t i = 0; i < idVec.getLocalLength(); i++)
272 if (idData[i] > 1) cntShared++;
275 std::cout << comm->getRank() <<
" cntShared = " << cntShared
276 <<
"; nShared = " << nShared << std::endl;
278 return (cntShared == nShared);
292 if (nIds >
size_t(std::numeric_limits<int>::max()))
293 throw std::runtime_error(
"Problem too large for Zoltan_DD");
295 int inIds = int(nIds);
300 MPI_Comm mpicomm = Teuchos::getRawMpiComm(*comm);
304 MPI_Initialized(&flag);
308 MPI_Init(&narg, &argv);
311 MPI_Comm mpicomm = MPI_COMM_WORLD;
316 Zoltan_DD zz(mpicomm, nIdEnt, 0,
sizeof(scalar_t), inIds, 0);
324 std::vector<scalar_t> user(nIds, 1.);
329 ZOLTAN_ID_PTR zgids = NULL;
331 Teuchos::ArrayView<id_t> av(&(ids[0]), nIds);
338 zz.Update(zgids, NULL, (
char*)(nIds ? &(user[0]) : NULL), NULL, inIds);
341 zz.Find(zgids, NULL, (
char*)(nIds ? &(user[0]) : NULL), NULL, inIds, NULL);
345 size_t cntShared = 0;
346 std::unordered_set<id_t> alreadyCounted;
347 for (
size_t i = 0; i < nIds; i++) {
350 if (alreadyCounted.find(ids[i]) == alreadyCounted.end()) {
351 alreadyCounted.insert(ids[i]);
357 if ((nIds * comm->getSize()) <=
TOOMANY) zz.Print();
359 return (cntShared == nShared);
365 Tpetra::ScopeGuard tscope(&narg, &arg);
366 Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::getDefaultComm();
371 float fracShared = 0.2;
375 typedef Tpetra::Map<>::global_ordinal_type
gno_t;
376 IDs<gno_t> myIds(nIds, fracShared, idBase, idStride, comm);
386 float fracShared = 0.2;
390 typedef Tpetra::Map<>::global_ordinal_type
gno_t;
391 IDs<gno_t> myIds(nIds, fracShared, idBase, idStride, comm);
398#ifdef HAVE_TPETRA_INT_INT
402 float fracShared = 0.2;
406 IDs<int> myIds(nIds, fracShared, idBase, idStride, comm);
416 float fracShared = 0.2;
420 IDs<int> myIds(nIds, fracShared, idBase, idStride, comm);
428#ifdef HAVE_TPETRA_INT_LONG_LONG
432 float fracShared = 0.4;