191 typedef typename Tpetra::Map<int, id_t>
map_t;
192 typedef typename Teuchos::RCP<const map_t> rcpmap_t;
194 typedef typename Tpetra::Vector<scalar_t, int, id_t> vector_t;
195 typedef typename Teuchos::ArrayRCP<scalar_t> vectordata_t;
202 id_t minId = std::numeric_limits<id_t>::max();
204 std::unordered_map<id_t, size_t> uniqueIds;
205 uniqueIds.reserve(nIds);
207 for (
size_t i = 0; i < nIds; i++) {
209 if (
id < minId) minId = id;
210 if (uniqueIds.find(
id) == uniqueIds.end())
219 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MIN, 1, &minId, &indexBase);
223 size_t nUniqueIds = uniqueIds.size();
224 Teuchos::Array<id_t> uniqueIdsList(nUniqueIds);
227 for (
auto it = uniqueIds.begin(); it != uniqueIds.end(); it++)
228 uniqueIdsList[cnt++] = it->first;
232 size_t dummy = Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid();
234 rcpmap_t idMap = Teuchos::rcp(
new map_t(dummy, uniqueIdsList(), indexBase,
240 vector_t idVec(idMap, 0.);
245 vectordata_t idData = idVec.getDataNonConst();
246 for (
auto it = uniqueIds.begin(); it != uniqueIds.end(); it++) {
247 id_t idx = idMap->getLocalElement(it->first);
248 idData[idx] = it->second;
263 id_t gnUnique = idMap->getMaxAllGlobalIndex() - indexBase + 1;
264 oto_idMap = Teuchos::rcp(
new map_t(gnUnique, indexBase, comm));
268 oto_idMap = Tpetra::createOneToOne(idMap);
271 vector_t oto_idVec(oto_idMap);
277 typedef Tpetra::Export<int, id_t> export_t;
279 export_t idExporter(idMap, oto_idMap);
290 oto_idVec.doExport(idVec, idExporter, Tpetra::ADD);
299 idVec.doImport(oto_idVec, idExporter, Tpetra::REPLACE);
304 size_t cntShared = 0;
306 auto idData = idVec.getDataNonConst();
307 for (
size_t i = 0; i < idVec.getLocalLength(); i++)
308 if (idData[i] > 1) cntShared++;
311 std::cout << comm->getRank() <<
" cntShared = " << cntShared
312 <<
"; nShared = " << nShared << std::endl;
314 return (cntShared == nShared);
328 if (nIds >
size_t(std::numeric_limits<int>::max()))
329 throw std::runtime_error(
"Problem too large for Zoltan_DD");
331 int inIds = int(nIds);
336 MPI_Comm mpicomm = Teuchos::getRawMpiComm(*comm);
340 MPI_Initialized(&flag);
344 MPI_Init(&narg, &argv);
347 MPI_Comm mpicomm = MPI_COMM_WORLD;
352 Zoltan_DD zz(mpicomm, nIdEnt, 0,
sizeof(scalar_t), inIds, 0);
360 std::vector<scalar_t> user(nIds, 1.);
365 ZOLTAN_ID_PTR zgids = NULL;
367 Teuchos::ArrayView<id_t> av(&(ids[0]), nIds);
374 zz.Update(zgids, NULL, (
char*)(nIds ? &(user[0]) : NULL), NULL, inIds);
377 zz.Find(zgids, NULL, (
char*)(nIds ? &(user[0]) : NULL), NULL, inIds, NULL);
381 size_t cntShared = 0;
382 std::unordered_set<id_t> alreadyCounted;
383 for (
size_t i = 0; i < nIds; i++) {
386 if (alreadyCounted.find(ids[i]) == alreadyCounted.end()) {
387 alreadyCounted.insert(ids[i]);
393 if ((nIds * comm->getSize()) <=
TOOMANY) zz.Print();
395 return (cntShared == nShared);
401 Tpetra::ScopeGuard tscope(&narg, &arg);
402 Teuchos::RCP<const Teuchos::Comm<int> > comm = Tpetra::getDefaultComm();
407 float fracShared = 0.2;
411 typedef Tpetra::Map<>::global_ordinal_type
gno_t;
412 IDs<gno_t> myIds(nIds, fracShared, idBase, idStride, comm);
422 float fracShared = 0.2;
426 typedef Tpetra::Map<>::global_ordinal_type
gno_t;
427 IDs<gno_t> myIds(nIds, fracShared, idBase, idStride, comm);
434#ifdef HAVE_TPETRA_INT_INT
438 float fracShared = 0.2;
442 IDs<int> myIds(nIds, fracShared, idBase, idStride, comm);
452 float fracShared = 0.2;
456 IDs<int> myIds(nIds, fracShared, idBase, idStride, comm);
464#ifdef HAVE_TPETRA_INT_LONG_LONG
468 float fracShared = 0.4;