37 template <
int dim,
int spacedim>
39 const double tolerance,
40 const bool enforce_unique_mapping,
41 const unsigned int rtree_level,
42 const std::function<std::vector<bool>()> &marked_vertices)
43 : tolerance(tolerance)
44 , enforce_unique_mapping(enforce_unique_mapping)
45 , rtree_level(rtree_level)
46 , marked_vertices(marked_vertices)
51 template <
int dim,
int spacedim>
60 template <
int dim,
int spacedim>
62 const double tolerance,
63 const bool enforce_unique_mapping,
64 const unsigned int rtree_level,
65 const std::function<std::vector<bool>()> &marked_vertices)
66 : additional_data(tolerance,
67 enforce_unique_mapping,
75 template <
int dim,
int spacedim>
78 if (tria_signal.connected())
79 tria_signal.disconnect();
84 template <
int dim,
int spacedim>
91#ifndef DEAL_II_WITH_MPI
97 if (tria_signal.connected())
98 tria_signal.disconnect();
101 tria.
signals.any_change.connect([&]() { this->ready_flag =
false; });
103 std::vector<BoundingBox<spacedim>> local_boxes;
104 for (
const auto &cell :
106 local_boxes.push_back(mapping.get_bounding_box(cell));
109 const auto local_tree =
pack_rtree(local_boxes);
112 std::vector<std::vector<BoundingBox<spacedim>>> global_bboxes(1);
123 additional_data.marked_vertices ? additional_data.marked_vertices() :
125 additional_data.tolerance,
127 additional_data.enforce_unique_mapping);
129 this->reinit(data, tria, mapping);
135 template <
int dim,
int spacedim>
139 DistributedComputePointLocationsInternal<dim, spacedim> &data,
141 const
Mapping<dim, spacedim> &mapping)
154 this->
point_ptrs.assign(data.n_searched_points + 1, 0);
155 for (
unsigned int i = 0; i < data.recv_components.size(); ++i)
158 this->recv_permutation.size());
162 this->point_ptrs.size());
163 this->
point_ptrs[std::get<1>(data.recv_components[i]) + 1]++;
166 std::tuple<unsigned int, unsigned int> n_owning_processes_default{
168 std::tuple<unsigned int, unsigned int> n_owning_processes_local =
169 n_owning_processes_default;
171 for (
unsigned int i = 0; i < data.n_searched_points; ++i)
173 std::get<0>(n_owning_processes_local) =
174 std::min(std::get<0>(n_owning_processes_local),
176 std::get<1>(n_owning_processes_local) =
177 std::max(std::get<1>(n_owning_processes_local),
183 const auto n_owning_processes_global =
184 Utilities::MPI::all_reduce<std::tuple<unsigned int, unsigned int>>(
185 n_owning_processes_local,
186 tria.get_communicator(),
188 const auto &b) -> std::tuple<unsigned int, unsigned int> {
189 if (a == n_owning_processes_default)
192 if (b == n_owning_processes_default)
195 return std::tuple<unsigned int, unsigned int>{
196 std::min(std::get<0>(a), std::get<0>(b)),
197 std::max(std::get<1>(a), std::get<1>(b))};
200 if (n_owning_processes_global == n_owning_processes_default)
208 (std::get<1>(n_owning_processes_global) == 1);
218 std::pair<int, int> dummy{-1, -1};
219 for (
const auto &i : data.send_components)
221 if (dummy != std::get<0>(i))
223 dummy = std::get<0>(i);
225 cell_data->reference_point_ptrs.emplace_back(
226 cell_data->reference_point_values.size());
229 cell_data->reference_point_values.emplace_back(std::get<3>(i));
233 cell_data->reference_point_ptrs.emplace_back(
234 cell_data->reference_point_values.size());
241 template <
int dim,
int spacedim>
249 template <
int dim,
int spacedim>
253 return {0,
static_cast<unsigned int>(cells.size())};
258 template <
int dim,
int spacedim>
261 const unsigned int cell)
const
264 return {&
triangulation, cells[cell].first, cells[cell].second};
269 template <
int dim,
int spacedim>
272 const unsigned int cell)
const
275 return {reference_point_values.data() + reference_point_ptrs[cell],
276 reference_point_ptrs[cell + 1] - reference_point_ptrs[cell]};
281 template <
int dim,
int spacedim>
290 template <
int dim,
int spacedim>
291 const std::vector<unsigned int> &
299 template <
int dim,
int spacedim>
308 template <
int dim,
int spacedim>
317 template <
int dim,
int spacedim>
320 const unsigned int i)
const
332 template <
int dim,
int spacedim>
341 template <
int dim,
int spacedim>
350 template <
int dim,
int spacedim>
360#include "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)
std::vector< unsigned int > send_ptrs
std::unique_ptr< CellData > cell_data
bool all_points_found() const
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
SmartPointer< const Mapping< dim, spacedim > > mapping
const std::vector< unsigned int > & get_point_ptrs() const
const AdditionalData additional_data
bool is_map_unique() const
std::vector< unsigned int > recv_ranks
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
SmartPointer< const Triangulation< dim, spacedim > > tria
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()
static const 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 > &)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation
std::vector< BoundingBox< boost::geometry::dimension< typename Rtree::indexable_type >::value > > extract_rtree_level(const Rtree &tree, const unsigned int level)
RTree< typename LeafTypeIterator::value_type, IndexType, IndexableGetter > pack_rtree(const LeafTypeIterator &begin, const LeafTypeIterator &end)
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