12 #include <dolfinx/common/MPI.h>
59 MPI_Comm
mpi_comm, std::int32_t local_size,
60 const Eigen::Ref<
const Eigen::Array<std::int64_t, Eigen::Dynamic, 1>>&
90 const Eigen::Array<std::int64_t, Eigen::Dynamic, 1>&
ghosts()
const;
99 const Eigen::Ref<
const Eigen::Array<std::int32_t, Eigen::Dynamic, 1>>&
101 bool blocked =
true)
const;
112 std::vector<std::int64_t>
114 bool blocked =
true)
const;
122 std::vector<std::int32_t>
124 bool blocked =
true)
const;
133 const Eigen::Ref<
const Eigen::Array<std::int64_t, Eigen::Dynamic, 1>>&
135 bool blocked =
true)
const;
140 std::vector<std::int64_t>
global_indices(
bool blocked =
true)
const;
146 assert(local_index >= 0);
147 const std::int32_t local_size
148 = _all_ranges[_myrank + 1] - _all_ranges[_myrank];
149 if (local_index < local_size)
151 const std::int64_t global_offset = _all_ranges[_myrank];
152 return global_offset + local_index;
156 assert((local_index - local_size) < _ghosts.size());
157 return _ghosts[local_index - local_size];
167 return _forward_indices;
171 Eigen::Array<std::int32_t, Eigen::Dynamic, 1>
ghost_owners()
const;
174 int owner(std::int64_t global_index)
const;
178 Eigen::Array<std::int64_t, Eigen::Dynamic, 1>
179 indices(
bool unroll_block)
const;
186 const std::vector<std::int32_t>&
neighbours()
const;
204 void scatter_fwd(
const std::vector<std::int64_t>& local_data,
205 std::vector<std::int64_t>& remote_data,
int n)
const;
216 void scatter_fwd(
const std::vector<std::int32_t>& local_data,
217 std::vector<std::int32_t>& remote_data,
int n)
const;
228 std::vector<std::int64_t>
229 scatter_fwd(
const std::vector<std::int64_t>& local_data,
int n)
const;
239 std::vector<std::int32_t>
240 scatter_fwd(
const std::vector<std::int32_t>& local_data,
int n)
const;
250 void scatter_rev(std::vector<std::int64_t>& local_data,
251 const std::vector<std::int64_t>& remote_data,
int n,
262 void scatter_rev(std::vector<std::int32_t>& local_data,
263 const std::vector<std::int32_t>& remote_data,
int n,
276 std::vector<std::int32_t> _neighbours;
285 std::vector<std::int64_t> _all_ranges;
289 Eigen::Array<std::int64_t, Eigen::Dynamic, 1> _ghosts;
292 Eigen::Array<std::int32_t, Eigen::Dynamic, 1> _ghost_owners;
296 std::vector<std::int32_t> _forward_sizes;
299 std::vector<std::int32_t> _forward_indices;
301 template <
typename T>
302 void scatter_fwd_impl(
const std::vector<T>& local_data,
303 std::vector<T>& remote_data,
int n)
const;
304 template <
typename T>
305 void scatter_rev_impl(std::vector<T>& local_data,
306 const std::vector<T>& remote_data,
int n,