18#include <deal.II/base/mpi.templates.h>
26#include <boost/serialization/utility.hpp>
36 namespace MatrixFreeFunctions
38 namespace VectorDataExchange
41 const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner)
42 : partitioner(partitioner)
94 std::vector<MPI_Request> & requests)
const
97#ifndef DEAL_II_WITH_MPI
119 std::vector<MPI_Request> & requests)
const
123#ifndef DEAL_II_WITH_MPI
141 std::vector<MPI_Request> & requests)
const
145#ifndef DEAL_II_WITH_MPI
169 std::vector<MPI_Request> & requests)
const
172#ifndef DEAL_II_WITH_MPI
205 std::vector<MPI_Request> & requests)
const
208#ifndef DEAL_II_WITH_MPI
230 std::vector<MPI_Request> & requests)
const
234#ifndef DEAL_II_WITH_MPI
252 std::vector<MPI_Request> & requests)
const
256#ifndef DEAL_II_WITH_MPI
280 std::vector<MPI_Request> & requests)
const
283#ifndef DEAL_II_WITH_MPI
309 template <
typename Number>
315 partitioner->ghost_indices_within_larger_ghost_set())
324 std::pair<std::vector<unsigned int>,
325 std::vector<std::pair<unsigned int, unsigned int>>>
330 std::vector<unsigned int> recv_ptr = {0};
331 std::vector<unsigned int> recv_indices;
344 if (recv_indices.back() +
recv_len.back() !=
353 recv_ptr.push_back(recv_indices.size());
356 std::pair<std::vector<unsigned int>,
357 std::vector<std::pair<unsigned int, unsigned int>>>
362 for (
unsigned int i = 0; i < recv_indices.size(); ++i)
373 const std::shared_ptr<const Utilities::MPI::Partitioner> &partitioner,
375 :
comm(partitioner->get_mpi_communicator())
376 , comm_sm(communicator_sm)
377 , n_local_elements(partitioner->locally_owned_range().n_elements())
378 , n_ghost_elements(partitioner->ghost_indices().n_elements())
379 , n_global_elements(partitioner->locally_owned_range().size())
381#ifndef DEAL_II_WITH_MPI
387 const auto &is_locally_owned = partitioner->locally_owned_range();
389 const auto &ghost_indices_within_larger_ghost_set =
390 partitioner->ghost_indices_within_larger_ghost_set();
436 process(is_locally_owned,
444 std::pair<types::global_dof_index, types::global_dof_index>>,
445 std::vector<unsigned int>>
452 for (
const auto &pair : ghost_indices_within_larger_ghost_set)
453 for (
unsigned int k = pair.first;
k < pair.second; ++
k)
459 std::map<unsigned int, std::vector<types::global_dof_index>>
478 static_cast<unsigned int>(
482 for (
unsigned int i = 0;
542 static_cast<unsigned int>(
544 static_cast<unsigned int>(
550 is_locally_owned.index_within_set(i));
562 is_locally_owned.index_within_set(i));
588 requests.data() + i);
625 requests.data() + i);
648 this->n_ghost_indices_in_larger_set_by_remote_rank =
695 std::vector<MPI_Request> & requests)
const
712 std::vector<MPI_Request> & requests)
const
730 std::vector<MPI_Request> & requests)
const
750 std::vector<MPI_Request> & requests)
const
769 std::vector<MPI_Request> & requests)
const
786 std::vector<MPI_Request> & requests)
const
804 std::vector<MPI_Request> & requests)
const
824 std::vector<MPI_Request> & requests)
const
836 template <
typename Number>
844 std::vector<MPI_Request> & requests)
const
846#ifndef DEAL_II_WITH_MPI
885 requests.data() + i);
892 const unsigned int offset =
936 template <
typename Number>
942 std::vector<MPI_Request> & requests)
const
946#ifndef DEAL_II_WITH_MPI
960 [&](
const unsigned int i) -> std::pair<unsigned int, unsigned int> {
970 for (
unsigned int c = 0;
982 const auto s = split(i);
1020 const unsigned int offset =
1024 for (
unsigned int c = 0,
1033 const unsigned int idx_1 =
1035 const unsigned int idx_2 =
1075 template <
typename Number>
1084 std::vector<MPI_Request> & requests)
const
1088#ifndef DEAL_II_WITH_MPI
1117 requests.data() + i);
1136 for (
unsigned int c = 0,
1144 const unsigned int idx_1 =
1204 template <
typename Number>
1212 std::vector<MPI_Request> & requests)
const
1214#ifndef DEAL_II_WITH_MPI
1235 [&](
const unsigned int i) -> std::pair<unsigned int, unsigned int> {
1248 for (
unsigned int c = 0;
1262 const auto &s = split(i);
1301 else if (s.first == 1)
1307 for (
unsigned int l = 0;
1395 template <
typename Number>
1404 sizeof(Number) * i.second);
1410 sizeof(Number) * i.second);
std::map< unsigned int, IndexSet > get_requesters()
virtual unsigned int n_ghost_indices() const =0
virtual types::global_dof_index size() const =0
virtual unsigned int locally_owned_size() const =0
virtual unsigned int n_import_indices() const =0
virtual void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< double > &locally_owned_storage, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< const double > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const =0
virtual void export_to_ghosted_array_finish(const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, std::vector< MPI_Request > &requests) const =0
void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
std::vector< unsigned int > n_ghost_indices_in_larger_set_by_remote_rank
unsigned int locally_owned_size() const override
unsigned int n_ghost_indices() const override
void reset_ghost_values(const ArrayView< double > &ghost_array) const override
std::vector< unsigned int > sm_import_ranks
std::vector< std::array< unsigned int, 3 > > ghost_targets_data
const unsigned int n_ghost_elements
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_export_data_this
virtual unsigned int n_import_sm_procs() const override
void export_to_ghosted_array_finish(const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, std::vector< MPI_Request > &requests) const override
void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
const unsigned int n_local_elements
void export_to_ghosted_array_start_impl(const unsigned int communication_channel, const ArrayView< const Number > &locally_owned_array, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, const ArrayView< Number > &temporary_storage, std::vector< MPI_Request > &requests) const
unsigned int n_import_indices() const override
void import_from_ghosted_array_finish_impl(const VectorOperation::values vector_operation, const ArrayView< Number > &locally_owned_storage, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, const ArrayView< const Number > &temporary_storage, std::vector< MPI_Request > &requests) const
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_export_data
std::vector< std::array< unsigned int, 3 > > import_targets_data
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > ghost_indices_subset_data
void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< double > &locally_owned_storage, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< const double > &temporary_storage, std::vector< MPI_Request > &requests) const override
std::vector< unsigned int > sm_ghost_ranks
MPI_Comm get_sm_mpi_communicator() const
void export_to_ghosted_array_finish_impl(const ArrayView< const Number > &locally_owned_array, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, std::vector< MPI_Request > &requests) const
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_import_data
void import_from_ghosted_array_start_impl(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const Number > &locally_owned_array, const std::vector< ArrayView< const Number > > &shared_arrays, const ArrayView< Number > &ghost_array, const ArrayView< Number > &temporary_storage, std::vector< MPI_Request > &requests) const
Full(const std::shared_ptr< const Utilities::MPI::Partitioner > &partitioner, const MPI_Comm communicator_sm)
void reset_ghost_values_impl(const ArrayView< Number > &ghost_array) const
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > sm_import_data_this
const types::global_dof_index n_global_elements
virtual types::global_dof_index size() const override
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > import_indices_data
const std::shared_ptr< const Utilities::MPI::Partitioner > partitioner
void export_to_ghosted_array_finish(const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, std::vector< MPI_Request > &requests) const override
PartitionerWrapper(const std::shared_ptr< const Utilities::MPI::Partitioner > &partitioner)
types::global_dof_index size() const override
unsigned int n_import_indices() const override
unsigned int locally_owned_size() const override
void export_to_ghosted_array_start(const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void reset_ghost_values_impl(const ArrayView< Number > &ghost_array) const
void import_from_ghosted_array_finish(const VectorOperation::values vector_operation, const ArrayView< double > &locally_owned_storage, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< const double > &temporary_storage, std::vector< MPI_Request > &requests) const override
void reset_ghost_values(const ArrayView< double > &ghost_array) const override
unsigned int n_ghost_indices() const override
unsigned int n_import_sm_procs() const override
void import_from_ghosted_array_start(const VectorOperation::values vector_operation, const unsigned int communication_channel, const ArrayView< const double > &locally_owned_array, const std::vector< ArrayView< const double > > &shared_arrays, const ArrayView< double > &ghost_array, const ArrayView< double > &temporary_storage, std::vector< MPI_Request > &requests) const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcNeedsMPI()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertThrowMPI(error_code)
#define AssertIndexRange(index, range)
const std::vector< unsigned int > mpi_processes_within_communicator(const MPI_Comm comm_large, const MPI_Comm comm_small)
const MPI_Datatype mpi_type_id_for_type
std::pair< std::vector< unsigned int >, std::vector< std::pair< unsigned int, unsigned int > > > compress_to_contiguous_ranges(const std::vector< unsigned int > &sm_export_ptr, const std::vector< unsigned int > &sm_export_indices)