35 template <
int dim,
int spacedim>
49 template <
int dim,
int spacedim>
58 template <
int dim,
int spacedim>
60 const double tolerance,
61 const bool enforce_unique_mapping,
62 const unsigned int rtree_level,
63 const std::function<std::vector<bool>()> &marked_vertices)
65 enforce_unique_mapping,
73 template <
int dim,
int spacedim>
82 template <
int dim,
int spacedim>
91 this->
reinit(cache, points);
96 template <
int dim,
int spacedim>
102#ifndef DEAL_II_WITH_MPI
114 std::vector<std::vector<BoundingBox<spacedim>>> global_bboxes;
115 global_bboxes.emplace_back(
136 template <
int dim,
int spacedim>
140 DistributedComputePointLocationsInternal<dim, spacedim> &data,
155 this->
point_ptrs.assign(data.n_searched_points + 1, 0);
156 for (
unsigned int i = 0; i < data.recv_components.size(); ++i)
159 this->recv_permutation.size());
163 this->point_ptrs.size());
164 this->
point_ptrs[std::get<1>(data.recv_components[i]) + 1]++;
167 std::pair<unsigned int, unsigned int> n_owning_processes_default{
169 std::pair<unsigned int, unsigned int> n_owning_processes_local =
170 n_owning_processes_default;
172 for (
unsigned int i = 0; i < data.n_searched_points; ++i)
174 std::get<0>(n_owning_processes_local) =
175 std::min(std::get<0>(n_owning_processes_local),
176 this->point_ptrs[i + 1]);
177 std::get<1>(n_owning_processes_local) =
178 std::max(std::get<1>(n_owning_processes_local),
184 const auto n_owning_processes_global =
186 n_owning_processes_local,
189 const auto &b) -> std::pair<unsigned int, unsigned int> {
190 if (a == n_owning_processes_default)
193 if (b == n_owning_processes_default)
196 return std::pair<unsigned int, unsigned int>{
197 std::min(std::get<0>(a), std::get<0>(b)),
198 std::max(std::get<1>(a), std::get<1>(b))};
201 if (n_owning_processes_global == n_owning_processes_default)
203 unique_mapping =
true;
204 all_points_found_flag =
true;
208 unique_mapping = (std::get<0>(n_owning_processes_global) == 1) &&
209 (std::get<1>(n_owning_processes_global) == 1);
210 all_points_found_flag = std::get<0>(n_owning_processes_global) > 0;
213 Assert(additional_data.enforce_unique_mapping ==
false || unique_mapping,
216 cell_data = std::make_unique<CellData>(tria);
217 send_permutation = {};
219 std::pair<int, int> dummy{-1, -1};
220 for (
const auto &i : data.send_components)
222 if (dummy != std::get<0>(i))
224 dummy = std::get<0>(i);
226 cell_data->reference_point_ptrs.emplace_back(
227 cell_data->reference_point_values.size());
230 cell_data->reference_point_values.emplace_back(std::get<3>(i));
234 cell_data->reference_point_ptrs.emplace_back(
235 cell_data->reference_point_values.size());
237 unsigned int max_size_recv = 0;
238 for (
unsigned int i = 0; i < recv_ranks.size(); ++i)
240 std::max(max_size_recv, recv_ptrs[i + 1] - recv_ptrs[i]);
242 unsigned int max_size_send = 0;
243 for (
unsigned int i = 0; i < send_ranks.size(); ++i)
245 std::max(max_size_send, send_ptrs[i + 1] - send_ptrs[i]);
247 this->buffer_size_with_sorting =
248 std::max(send_permutation.size() * 2 + max_size_recv,
249 point_ptrs.back() + send_permutation.size() + max_size_send);
251 this->buffer_size_without_sorting = send_permutation.size();
267 template <
int dim,
int spacedim>
275 template <
int dim,
int spacedim>
276 std_cxx20::ranges::iota_view<unsigned int, unsigned int>
279 return std_cxx20::ranges::iota_view<unsigned int, unsigned int>(
280 0,
static_cast<unsigned int>(
cells.size()));
285 template <
int dim,
int spacedim>
288 const unsigned int cell)
const
296 template <
int dim,
int spacedim>
299 const unsigned int cell)
const
308 template <
int dim,
int spacedim>
317 template <
int dim,
int spacedim>
318 const std::vector<unsigned int> &
326 template <
int dim,
int spacedim>
335 template <
int dim,
int spacedim>
344 template <
int dim,
int spacedim>
347 const unsigned int i)
const
359 template <
int dim,
int spacedim>
368 template <
int dim,
int spacedim>
377 template <
int dim,
int spacedim>
386 template <
int dim,
int spacedim>
387 const std::vector<unsigned int> &
395 template <
int dim,
int spacedim>
396 const std::vector<unsigned int> &
405#include "base/mpi_remote_point_evaluation.inst"
Abstract base class for mapping classes.
virtual MPI_Comm get_mpi_communicator() const
std::vector< std::pair< int, int > > cells
std_cxx20::ranges::iota_view< unsigned int, unsigned int > cell_indices() const
ArrayView< const Point< dim > > get_unit_points(const unsigned int cell) const
Triangulation< dim, spacedim >::active_cell_iterator get_active_cell_iterator(const unsigned int cell) const
const Triangulation< dim, spacedim > & triangulation
CellData(const Triangulation< dim, spacedim > &triangulation)
std::vector< unsigned int > reference_point_ptrs
std::vector< Point< dim > > reference_point_values
const std::vector< unsigned int > & get_send_permutation() const
std::vector< unsigned int > send_ptrs
std::unique_ptr< CellData > cell_data
bool all_points_found() const
ObserverPointer< const Mapping< dim, spacedim > > mapping
boost::signals2::connection tria_signal
std::vector< unsigned int > point_ptrs
RemotePointEvaluation(const AdditionalData &additional_data=AdditionalData())
std::vector< unsigned int > recv_permutation
const Triangulation< dim, spacedim > & get_triangulation() const
ObserverPointer< const Triangulation< dim, spacedim > > tria
const std::vector< unsigned int > & get_point_ptrs() const
const std::vector< unsigned int > & get_inverse_recv_permutation() const
std::vector< unsigned int > send_permutation_inv
const AdditionalData additional_data
bool is_map_unique() const
std::vector< unsigned int > recv_ranks
std::vector< unsigned int > recv_permutation_inv
std::vector< unsigned int > recv_ptrs
const Mapping< dim, spacedim > & get_mapping() const
const CellData & get_cell_data() const
std::vector< unsigned int > send_ranks
bool all_points_found_flag
void reinit(const std::vector< Point< spacedim > > &points, const Triangulation< dim, spacedim > &tria, const Mapping< dim, spacedim > &mapping)
bool point_found(const unsigned int i) const
std::vector< unsigned int > send_permutation
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNeedsMPI()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
TriaActiveIterator< CellAccessor< dim, spacedim > > active_cell_iterator
T all_reduce(const T &local_value, const MPI_Comm comm, const std::function< T(const T &, const T &)> &combiner)
constexpr unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
std::vector< BoundingBox< boost::geometry::dimension< typename Rtree::indexable_type >::value > > extract_rtree_level(const Rtree &tree, const unsigned int level)
AdditionalData(const double tolerance=1e-6, const bool enforce_unique_mapping=false, const unsigned int rtree_level=0, const std::function< std::vector< bool >()> &marked_vertices={})
std::function< std::vector< bool >()> marked_vertices
bool enforce_unique_mapping