18 #include <deal.II/base/mpi_noncontiguous_partitioner.templates.h>
22 #include <boost/serialization/utility.hpp>
34 const MPI_Comm communicator)
42 const std::vector<types::global_dof_index> &indices_has,
43 const std::vector<types::global_dof_index> &indices_want,
44 const MPI_Comm communicator)
51 std::pair<unsigned int, unsigned int>
93 const MPI_Comm communicator)
108 std::vector<unsigned int> owning_ranks_of_ghosts(
113 process(indexset_has,
116 owning_ranks_of_ghosts,
121 std::pair<types::global_dof_index, types::global_dof_index>>,
122 std::vector<unsigned int>>
128 std::map<unsigned int, std::vector<types::global_dof_index>> recv_map;
130 for (
const auto &owner : owning_ranks_of_ghosts)
131 recv_map[owner] = std::vector<types::global_dof_index>();
135 recv_map[owning_ranks_of_ghosts[i]].push_back(i);
138 for (
const auto &target_with_indexset : recv_map)
140 recv_ranks.push_back(target_with_indexset.first);
142 for (
const auto cell_index : target_with_indexset.second)
153 for (
const auto &target_with_indexset : targets_with_indexset)
155 send_ranks.push_back(target_with_indexset.first);
157 for (
const auto cell_index : target_with_indexset.second)
169 const std::vector<types::global_dof_index> &indices_has,
170 const std::vector<types::global_dof_index> &indices_want,
171 const MPI_Comm communicator)
175 std::vector<types::global_dof_index> indices_has_clean;
176 indices_has_clean.reserve(indices_has.size());
178 for (
const auto i : indices_has)
180 indices_has_clean.push_back(i);
182 std::vector<types::global_dof_index> indices_want_clean;
183 indices_want_clean.reserve(indices_want.size());
185 for (
const auto i : indices_want)
187 indices_want_clean.push_back(i);
191 indices_has_clean.empty() ?
193 (*std::max_element(indices_has_clean.begin(),
194 indices_has_clean.end()) +
198 indices_want_clean.empty() ?
200 (*std::max_element(indices_want_clean.begin(),
201 indices_want_clean.end()) +
210 index_set_has.
add_indices(indices_has_clean.begin(),
211 indices_has_clean.end());
214 index_set_want.
add_indices(indices_want_clean.begin(),
215 indices_want_clean.end());
223 std::vector<types::global_dof_index> temp_map_send(
231 i = temp_map_send[i];
235 std::vector<types::global_dof_index> temp_map_recv(
243 i = temp_map_recv[i];
249 #include "mpi_noncontiguous_partitioner.inst"
size_type index_within_set(const size_type global_index) const
size_type n_elements() const
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
virtual std::vector< unsigned int > run(const std::vector< unsigned int > &targets, const std::function< RequestType(const unsigned int)> &create_request, const std::function< AnswerType(const unsigned int, const RequestType &)> &answer_request, const std::function< void(const unsigned int, const AnswerType &)> &process_answer, const MPI_Comm comm) override
void reinit(const IndexSet &locally_owned_indices, const IndexSet &ghost_indices, const MPI_Comm communicator) override
std::vector< std::uint8_t > buffers
MPI_Comm get_mpi_communicator() const override
std::vector< MPI_Request > requests
types::global_dof_index memory_consumption()
unsigned int temporary_storage_size() const
std::vector< types::global_dof_index > recv_ptr
std::vector< types::global_dof_index > send_ptr
std::vector< unsigned int > send_ranks
std::vector< types::global_dof_index > recv_indices
std::pair< unsigned int, unsigned int > n_targets() const
std::vector< types::global_dof_index > send_indices
std::vector< unsigned int > recv_ranks
NoncontiguousPartitioner()=default
std::map< unsigned int, IndexSet > get_requesters()
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
T max(const T &t, const MPI_Comm mpi_communicator)
const types::global_dof_index invalid_dof_index
unsigned int global_dof_index