368 const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner,
370 :
comm(partitioner->get_mpi_communicator())
376#ifndef DEAL_II_WITH_MPI
382 const auto &is_locally_owned = partitioner->locally_owned_range();
383 const auto &is_locally_ghost = partitioner->ghost_indices();
384 const auto &ghost_indices_within_larger_ghost_set =
385 partitioner->ghost_indices_within_larger_ghost_set();
399 std::vector<unsigned int> ghost_indices_subset_data_ptr = {0};
400 std::vector<unsigned int> ghost_indices_subset_data_indices;
403 std::vector<unsigned int> import_indices_data_ptr = {0};
404 std::vector<unsigned int> import_indices_data_indices;
407 std::vector<unsigned int> sm_export_data_ptr = {0};
408 std::vector<unsigned int> sm_export_data_indices;
411 std::vector<unsigned int> sm_export_data_this_ptr = {0};
412 std::vector<unsigned int> sm_export_data_this_indices;
415 std::vector<unsigned int> sm_import_data_ptr = {};
416 std::vector<unsigned int> sm_import_data_indices;
419 std::vector<unsigned int> sm_import_data_this_ptr = {0};
420 std::vector<unsigned int> sm_import_data_this_indices;
423 const auto sm_ranks =
427 const auto [owning_ranks_of_ghosts, rank_to_global_indices] =
434 std::vector<unsigned int> shifts_indices;
435 for (
const auto &pair : ghost_indices_within_larger_ghost_set)
436 for (
unsigned int k = pair.first; k < pair.second; ++k)
437 shifts_indices.push_back(k);
442 std::map<unsigned int, std::vector<types::global_dof_index>>
443 rank_to_local_indices;
445 for (
unsigned int i = 0; i < owning_ranks_of_ghosts.size(); ++i)
446 rank_to_local_indices[owning_ranks_of_ghosts[i]].
push_back(i);
448 unsigned int compressed_offset = 0;
450 for (
const auto &rank_and_local_indices : rank_to_local_indices)
452 const auto sm_ranks_ptr = std::find(sm_ranks.begin(),
454 rank_and_local_indices.first);
456 if (sm_ranks_ptr == sm_ranks.end())
459 rank_and_local_indices.first,
460 shifts_indices[compressed_offset],
461 static_cast<unsigned int>(
462 rank_and_local_indices.second.size())
465 for (
unsigned int i = 0;
466 i < rank_and_local_indices.second.size();
468 ghost_indices_subset_data_indices.push_back(
469 shifts_indices[i + compressed_offset]);
471 ghost_indices_subset_data_ptr.push_back(
472 ghost_indices_subset_data_indices.size());
488 std::distance(sm_ranks.begin(), sm_ranks_ptr));
490 sm_export_data_ptr.push_back(
491 sm_export_data_ptr.back() +
492 rank_and_local_indices.second.size());
494 for (
unsigned int i = compressed_offset;
496 rank_and_local_indices.second.size() + compressed_offset;
498 sm_export_data_this_indices.push_back(
499 shifts_indices[i] + is_locally_owned.n_elements());
501 sm_export_data_this_ptr.push_back(
502 sm_export_data_this_indices.size());
504 compressed_offset += rank_and_local_indices.second.size();
507 sm_export_data_indices.resize(sm_export_data_ptr.back());
512 for (
const auto &rank_and_global_indices : rank_to_global_indices)
514 const auto sm_ranks_ptr =
515 std::find(sm_ranks.begin(),
517 rank_and_global_indices.first);
519 if (sm_ranks_ptr == sm_ranks.end())
522 rank_and_global_indices.first,
523 static_cast<unsigned int>(
524 import_indices_data_indices.size()),
525 static_cast<unsigned int>(
526 rank_and_global_indices.second.n_elements())
529 for (
const auto i : rank_and_global_indices.second)
530 import_indices_data_indices.push_back(
531 is_locally_owned.index_within_set(i));
533 import_indices_data_ptr.push_back(
534 import_indices_data_indices.size());
539 std::distance(sm_ranks.begin(), sm_ranks_ptr));
541 for (
const auto i : rank_and_global_indices.second)
542 sm_import_data_this_indices.push_back(
543 is_locally_owned.index_within_set(i));
545 sm_import_data_this_ptr.push_back(
546 sm_import_data_this_indices.size());
550 sm_import_data_ptr = sm_import_data_this_ptr;
551 sm_import_data_indices.resize(sm_import_data_this_ptr.back());
561 const int ierr = MPI_Isend(sm_export_data_this_indices.data() +
562 sm_export_data_this_ptr[i],
563 sm_export_data_this_ptr[i + 1] -
564 sm_export_data_this_ptr[i],
569 requests.data() + i);
576 MPI_Irecv(sm_import_data_indices.data() + sm_import_data_ptr[i],
577 sm_import_data_ptr[i + 1] - sm_import_data_ptr[i],
587 MPI_Waitall(requests.size(), requests.data(), MPI_STATUSES_IGNORE);
598 const int ierr = MPI_Isend(sm_import_data_this_indices.data() +
599 sm_import_data_this_ptr[i],
600 sm_import_data_this_ptr[i + 1] -
601 sm_import_data_this_ptr[i],
606 requests.data() + i);
613 MPI_Irecv(sm_export_data_indices.data() + sm_export_data_ptr[i],
614 sm_export_data_ptr[i + 1] - sm_export_data_ptr[i],
624 MPI_Waitall(requests.size(), requests.data(), MPI_STATUSES_IGNORE);
629 this->n_ghost_indices_in_larger_set_by_remote_rank =
634 ghost_indices_subset_data_ptr, ghost_indices_subset_data_indices);
642 import_indices_data_indices);
648 sm_export_data_indices);
652 sm_export_data_this_indices);
658 sm_import_data_indices);
662 sm_import_data_this_indices);