35 template <
int dim,
int spacedim>
37 const double tolerance,
38 const bool enforce_unique_mapping,
39 const unsigned int rtree_level,
40 const std::function<std::vector<bool>()> &marked_vertices)
41 : tolerance(tolerance)
42 , enforce_unique_mapping(enforce_unique_mapping)
43 , rtree_level(rtree_level)
44 , marked_vertices(marked_vertices)
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)
64 : additional_data(tolerance,
65 enforce_unique_mapping,
73 template <
int dim,
int spacedim>
76 if (tria_signal.connected())
77 tria_signal.disconnect();
82 template <
int dim,
int spacedim>
91 this->reinit(cache, points);
96 template <
int dim,
int spacedim>
102#ifndef DEAL_II_WITH_MPI
107 if (tria_signal.connected())
108 tria_signal.disconnect();
111 [&]() { this->ready_flag =
false; });
114 std::vector<std::vector<BoundingBox<spacedim>>> global_bboxes;
115 global_bboxes.emplace_back(
117 additional_data.rtree_level));
124 additional_data.marked_vertices ? additional_data.marked_vertices() :
126 additional_data.tolerance,
128 additional_data.enforce_unique_mapping);
136 template <
int dim,
int spacedim>
140 DistributedComputePointLocationsInternal<dim, spacedim> &
data,
142 const
Mapping<dim, spacedim> &mapping)
156 for (
unsigned int i = 0; i <
data.recv_components.size(); ++i)
159 this->recv_permutation.size());
163 this->point_ptrs.size());
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),
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 =
185 Utilities::MPI::all_reduce<std::pair<unsigned int, unsigned int>>(
186 n_owning_processes_local,
187 tria.get_mpi_communicator(),
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)
209 (std::get<1>(n_owning_processes_global) == 1);
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)
242 unsigned int max_size_send = 0;
243 for (
unsigned int i = 0; i <
send_ranks.size(); ++i)
267 template <
int dim,
int spacedim>
270 : triangulation(triangulation)
275 template <
int dim,
int spacedim>
280 0,
static_cast<unsigned int>(cells.size()));
285 template <
int dim,
int spacedim>
288 const unsigned int cell)
const
291 return {&triangulation, cells[cell].first, cells[cell].second};
296 template <
int dim,
int spacedim>
299 const unsigned int cell)
const
302 return {reference_point_values.data() + reference_point_ptrs[cell],
303 reference_point_ptrs[cell + 1] - reference_point_ptrs[cell]};
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.
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
CellData(const Triangulation< dim, spacedim > &triangulation)
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
unsigned int buffer_size_without_sorting
ObserverPointer< const Mapping< dim, spacedim > > mapping
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
unsigned int buffer_size_with_sorting
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()
std::vector< index_type > data
constexpr unsigned int invalid_unsigned_int
boost::integer_range< IncrementableType > iota_view
::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={})
bool enforce_unique_mapping