261 if (this->verbose ()) {
262 std::ostringstream os;
263 os << *prefix <<
"numPermutes: " << numPermutes
264 <<
", numExports: " << numExports << endl;
265 this->verboseOutputStream () << os.str ();
267 TEUCHOS_ASSERT( numPermutes + numExports ==
268 numSrcLids - numSameGids );
270 typename decltype (this->TransferData_->permuteToLIDs_)::t_host
271 permuteToLIDs (view_alloc_no_init (
"permuteToLIDs"), numPermutes);
272 typename decltype (this->TransferData_->permuteToLIDs_)::t_host
273 permuteFromLIDs (view_alloc_no_init (
"permuteFromLIDs"), numPermutes);
274 typename decltype (this->TransferData_->permuteToLIDs_)::t_host
275 exportLIDs (view_alloc_no_init (
"exportLIDs"), numExports);
279 exportGIDs.resize (numExports);
284 for (LO srcLid = numSameGids; srcLid < numSrcLids; ++srcLid) {
285 const GO curSrcGid = rawSrcGids[srcLid];
287 if (tgtLid != LINVALID) {
288 permuteToLIDs[numPermutes2] = tgtLid;
289 permuteFromLIDs[numPermutes2] = srcLid;
293 exportGIDs[numExports2] = curSrcGid;
294 exportLIDs[numExports2] = srcLid;
298 TEUCHOS_ASSERT( numPermutes == numPermutes2 );
299 TEUCHOS_ASSERT( numExports == numExports2 );
300 TEUCHOS_ASSERT(
size_t (numExports) ==
size_t (exportGIDs.size ()) );
319 this->TransferData_->isLocallyComplete_ =
false;
320 if (this->verbose ()) {
321 std::ostringstream os;
322 os << *prefix <<
"Export is not locally complete" << endl;
323 this->verboseOutputStream () << os.str ();
328 (
true, std::runtime_error,
"::setupSamePermuteExport(): Source has "
329 "export LIDs but Source is not distributed globally. Exporting to "
330 "a submap of the target map.");
345 if (this->verbose ()) {
346 std::ostringstream os;
347 os << *prefix <<
"Source Map is distributed; "
348 "call targetMap.getRemoteiNdexList" << endl;
349 this->verboseOutputStream () << os.str ();
351 this->TransferData_->exportPIDs_.resize(exportGIDs.size ());
357 this->TransferData_->exportPIDs_ ());
361 "::setupSamePermuteExport(): The source Map has GIDs not found "
362 "in the target Map.");
371 this->TransferData_->isLocallyComplete_ =
false;
373 Teuchos::Array<int>& exportPIDs = this->TransferData_->exportPIDs_;
375 const size_type totalNumExports = exportPIDs.size ();
376 const size_type numInvalidExports =
377 std::count_if (exportPIDs.begin (), exportPIDs.end (),
378 [] (
const int procId) { return procId == -1; });
379 if (this->verbose ()) {
380 std::ostringstream os;
381 os << *prefix <<
"totalNumExports: " << totalNumExports
382 <<
", numInvalidExports: " << numInvalidExports << endl;
383 this->verboseOutputStream () << os.str ();
385 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
386 (numInvalidExports == 0, std::logic_error,
387 "targetMap.getRemoteIndexList returned IDNotPresent, but no export "
388 "PIDs are -1. Please report this bug to the Tpetra developers.");
396 if (numInvalidExports == totalNumExports) {
397 exportGIDs.resize (0);
398 exportLIDs =
decltype (exportLIDs) ();
399 exportPIDs.resize (0);
402 size_type numValidExports = 0;
403 for (size_type e = 0; e < totalNumExports; ++e) {
404 if (this->TransferData_->exportPIDs_[e] != -1) {
405 exportGIDs[numValidExports] = exportGIDs[e];
406 exportLIDs[numValidExports] = exportLIDs[e];
407 exportPIDs[numValidExports] = exportPIDs[e];
411 exportGIDs.resize (numValidExports);
412 Kokkos::resize (exportLIDs, numValidExports);
413 exportPIDs.resize (numValidExports);
425 if (this->verbose ()) {
426 std::ostringstream os;
427 os << *prefix <<
"Done!" << std::endl;
428 this->verboseOutputStream () << os.str ();
432 template <
class LocalOrdinal,
class GlobalOrdinal,
class Node>
435 setupRemote (Teuchos::Array<GlobalOrdinal>& exportGIDs)
439 using Teuchos::Array;
441 using LO = LocalOrdinal;
442 using GO = GlobalOrdinal;
444 std::unique_ptr<std::string> prefix;
445 if (this->verbose ()) {
446 auto srcMap = this->getSourceMap ();
447 auto comm = srcMap.is_null () ? Teuchos::null : srcMap->getComm ();
448 const int myRank = comm.is_null () ? -1 : comm->getRank ();
450 std::ostringstream os;
451 os <<
"Proc " << myRank <<
": Tpetra::Export::setupRemote: ";
452 prefix = std::unique_ptr<std::string> (
new std::string (os.str ()));
454 std::ostringstream os2;
455 os2 << *prefix <<
"Start" << std::endl;
456 this->verboseOutputStream () << os2.str ();
459 TEUCHOS_ASSERT( ! this->getTargetMap ().is_null () );
460 const map_type& tgtMap = * (this->getTargetMap ());
467 TEUCHOS_ASSERT(
size_t (this->TransferData_->exportLIDs_.extent (0)) ==
468 size_t (this->TransferData_->exportPIDs_.size ()) );
469 this->TransferData_->exportLIDs_.modify_host ();
470 auto exportLIDs = this->TransferData_->exportLIDs_.view_host ();
471 sort3 (this->TransferData_->exportPIDs_.begin (),
472 this->TransferData_->exportPIDs_.end (),
473 exportGIDs.getRawPtr (),
475 this->TransferData_->exportLIDs_.sync_device ();
481 if (this->verbose ()) {
482 std::ostringstream os;
483 os << *prefix <<
"Call createFromSends" << endl;
484 this->verboseOutputStream () << os.str ();
493 Teuchos::Array<int>& exportPIDs = this->TransferData_->exportPIDs_;
494 Distributor& distributor = this->TransferData_->distributor_;
495 const size_t numRemoteIDs = distributor.
createFromSends (exportPIDs ());
497 if (this->verbose ()) {
498 std::ostringstream os;
499 os << *prefix <<
"numRemoteIDs: " << numRemoteIDs
500 <<
"; call doPostsAndWaits" << endl;
501 this->verboseOutputStream () << os.str ();
508 Kokkos::View<const GO*, Kokkos::HostSpace> exportGIDsConst(exportGIDs.data(), exportGIDs.size());
509 Kokkos::View<GO*, Kokkos::HostSpace> remoteGIDs(
"remoteGIDs", numRemoteIDs);
510 distributor.doPostsAndWaits(exportGIDsConst, 1, remoteGIDs);
514 using host_remote_lids_type =
515 typename decltype (this->TransferData_->remoteLIDs_)::t_host;
516 host_remote_lids_type remoteLIDs
517 (view_alloc_no_init (
"remoteLIDs"), numRemoteIDs);
519 for (LO j = 0; j < LO (numRemoteIDs); ++j) {
520 remoteLIDs[j] = tgtMap.getLocalElement (remoteGIDs[j]);
524 if (this->verbose ()) {
525 std::ostringstream os;
526 os << *prefix <<
"Done!" << endl;
527 this->verboseOutputStream () << os.str ();
540#define TPETRA_EXPORT_INSTANT(LO, GO, NODE) \
541 template class Export< LO , GO , NODE >;