24 template <
int dim,
int spacedim>
37 template <
int dim,
int spacedim>
48 if (
tria.get_reference_cells().size() == 0)
54 .template get_default_linear_mapping<spacedim>();
61 .template get_default_linear_mapping<spacedim>();
65 template <
int dim,
int spacedim>
68 if (tria_change_signal.connected())
69 tria_change_signal.disconnect();
70 if (tria_create_signal.connected())
71 tria_create_signal.disconnect();
76 template <
int dim,
int spacedim>
80 update_flags |= flags;
85 template <
int dim,
int spacedim>
87 std::set<typename Triangulation<dim, spacedim>::active_cell_iterator>> &
95 std::scoped_lock lock(vertex_to_cells_mutex);
103 update_flags &= ~update_vertex_to_cell_map;
105 return vertex_to_cells;
110 template <
int dim,
int spacedim>
111 const std::vector<std::vector<Tensor<1, spacedim>>> &
119 std::scoped_lock lock(vertex_to_cell_centers_mutex);
124 *tria, get_vertex_to_cell_map());
128 update_flags &= ~update_vertex_to_cell_centers_directions;
130 return vertex_to_cell_centers;
135 template <
int dim,
int spacedim>
136 const std::map<unsigned int, Point<spacedim>> &
144 std::scoped_lock lock(used_vertices_mutex);
152 update_flags &= ~update_used_vertices;
154 return used_vertices;
159 template <
int dim,
int spacedim>
168 std::scoped_lock lock(used_vertices_rtree_mutex);
172 const auto &used_vertices = get_used_vertices();
173 std::vector<std::pair<Point<spacedim>,
unsigned int>> vertices(
174 used_vertices.size());
176 for (
const auto &it : used_vertices)
177 vertices[i++] = std::make_pair(it.second, it.first);
182 update_flags &= ~update_used_vertices_rtree;
184 return used_vertices_rtree;
189 template <
int dim,
int spacedim>
191 std::pair<BoundingBox<spacedim>,
200 std::scoped_lock lock(cell_bounding_boxes_rtree_mutex);
204 std::vector<std::pair<
208 boxes.reserve(tria->n_active_cells());
209 for (
const auto &cell : tria->active_cell_iterators())
210 boxes.emplace_back(mapping->get_bounding_box(cell), cell);
212 cell_bounding_boxes_rtree =
pack_rtree(boxes);
216 update_flags &= ~update_cell_bounding_boxes_rtree;
218 return cell_bounding_boxes_rtree;
223 template <
int dim,
int spacedim>
225 std::pair<BoundingBox<spacedim>,
234 std::scoped_lock lock(locally_owned_cell_bounding_boxes_rtree_mutex);
238 std::vector<std::pair<
245 boxes.reserve(parallel_tria->n_locally_owned_active_cells());
247 boxes.reserve(tria->n_active_cells());
248 for (
const auto &cell : tria->active_cell_iterators() |
250 boxes.emplace_back(mapping->get_bounding_box(cell), cell);
252 locally_owned_cell_bounding_boxes_rtree =
pack_rtree(boxes);
256 update_flags &= ~update_locally_owned_cell_bounding_boxes_rtree;
258 return locally_owned_cell_bounding_boxes_rtree;
263 template <
int dim,
int spacedim>
272 std::scoped_lock lock(covering_rtree_mutex);
275 covering_rtree.find(
level) == covering_rtree.end())
281 if (
const auto tria_mpi =
286 boxes, tria_mpi->get_mpi_communicator());
290 covering_rtree[
level] =
296 update_flags &= ~update_covering_rtree;
299 return covering_rtree[
level];
304 template <
int dim,
int spacedim>
305 const std::vector<std::set<unsigned int>> &
313 std::scoped_lock lock(vertex_to_neighbor_subdomain_mutex);
317 vertex_to_neighbor_subdomain.clear();
318 vertex_to_neighbor_subdomain.resize(tria->n_vertices());
319 for (
const auto &cell : tria->active_cell_iterators())
321 if (cell->is_ghost())
322 for (
const unsigned int v : cell->vertex_indices())
323 vertex_to_neighbor_subdomain[cell->vertex_index(v)].insert(
324 cell->subdomain_id());
328 update_flags &= ~update_vertex_to_neighbor_subdomain;
330 return vertex_to_neighbor_subdomain;
335 template <
int dim,
int spacedim>
336 const std::map<unsigned int, std::set<types::subdomain_id>> &
344 std::scoped_lock lock(vertices_with_ghost_neighbors_mutex);
348 vertices_with_ghost_neighbors =
353 update_flags &= ~update_vertex_with_ghost_neighbors;
356 return vertices_with_ghost_neighbors;
359#include "grid/grid_tools_cache.inst"
Abstract base class for mapping classes.
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcInternalError()
std::vector< BoundingBox< boost::geometry::dimension< typename Rtree::indexable_type >::value > > extract_rtree_level(const Rtree &tree, const unsigned int level)
boost::geometry::index::rtree< LeafType, IndexType, IndexableGetter > RTree
RTree< typename LeafTypeIterator::value_type, IndexType, IndexableGetter > pack_rtree(const LeafTypeIterator &begin, const LeafTypeIterator &end)
boost::signals2::signal< void()> any_change