17#ifdef DEAL_II_WITH_P4EST
20# include <sc_containers.h>
29# ifndef P4EST_QUADRANT_INIT
30# define P4EST_QUADRANT_INIT(q) \
31 ((void)std::memset((q), -1, sizeof(p4est_quadrant_t)))
34# ifndef P8EST_QUADRANT_INIT
35# define P8EST_QUADRANT_INIT(q) \
36 ((void)std::memset((q), -1, sizeof(p8est_quadrant_t)))
44#ifdef DEAL_II_WITH_P4EST
52 template <
int dim,
int spacedim>
53 typename ::Triangulation<dim, spacedim>::cell_iterator
55 const ::parallel::distributed::Triangulation<dim, spacedim>
57 const typename ::internal::p4est::types<dim>::topidx treeidx,
58 const typename ::internal::p4est::types<dim>::quadrant &quad)
60 int i, l = quad.level;
62 triangulation->get_p4est_tree_to_coarse_cell_permutation()[treeidx];
64 for (i = 0; i < l; ++i)
66 typename ::Triangulation<dim, spacedim>::cell_iterator cell(
67 triangulation, i, dealii_index);
71 Assert(cell->has_children(),
72 ExcMessage(
"p4est quadrant does not correspond to a cell!"));
73 dealii_index = cell->child_index(child_id);
76 typename ::Triangulation<dim, spacedim>::cell_iterator out_cell(
77 triangulation, l, dealii_index);
86 template <
int dim,
int spacedim>
89 const typename ::parallel::distributed::Triangulation<dim,
93 std::map<unsigned int, std::set<::types::subdomain_id>>
94 *vertices_with_ghost_neighbors;
103 template <
int dim,
int spacedim>
106 typename ::internal::p4est::iter<dim>::corner_info *info,
110 int nsides = info->sides.elem_count;
111 auto *sides =
reinterpret_cast<
112 typename ::internal::p4est::iter<dim>::corner_side *
>(
114 FindGhosts<dim, spacedim> *fg =
115 static_cast<FindGhosts<dim, spacedim> *
>(user_data);
116 sc_array_t *subids = fg->subids;
117 const ::parallel::distributed::Triangulation<dim, spacedim>
118 *triangulation = fg->triangulation;
121 std::map<unsigned int, std::set<::types::subdomain_id>>
122 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
124 subids->elem_count = 0;
125 for (i = 0; i < nsides; ++i)
127 if (sides[i].is_ghost)
129 typename ::parallel::distributed::
130 Triangulation<dim, spacedim>::cell_iterator cell =
131 cell_from_quad(triangulation,
135 ExcMessage(
"ghost quad did not find ghost cell"));
138 sc_array_push(subids));
139 *subid = cell->subdomain_id();
143 if (!subids->elem_count)
148 nsubs =
static_cast<int>(subids->elem_count);
152 for (i = 0; i < nsides; ++i)
154 if (!sides[i].is_ghost)
156 typename ::parallel::distributed::
157 Triangulation<dim, spacedim>::cell_iterator cell =
158 cell_from_quad(triangulation,
165 for (j = 0; j < nsubs; ++j)
167 (*vertices_with_ghost_neighbors)[cell->vertex_index(
169 .insert(subdomain_ids[j]);
174 subids->elem_count = 0;
180 template <
int dim,
int spacedim>
183 typename ::internal::p4est::iter<dim>::edge_info *info,
187 int nsides = info->sides.elem_count;
188 auto *sides =
reinterpret_cast<
189 typename ::internal::p4est::iter<dim>::edge_side *
>(
191 auto *fg =
static_cast<FindGhosts<dim, spacedim> *
>(user_data);
192 sc_array_t *subids = fg->subids;
193 const ::parallel::distributed::Triangulation<dim, spacedim>
194 *triangulation = fg->triangulation;
197 std::map<unsigned int, std::set<::types::subdomain_id>>
198 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
200 subids->elem_count = 0;
201 for (i = 0; i < nsides; ++i)
203 if (sides[i].is_hanging)
205 for (j = 0; j < 2; ++j)
207 if (sides[i].is.hanging.is_ghost[j])
209 typename ::parallel::distributed::
210 Triangulation<dim, spacedim>::cell_iterator cell =
211 cell_from_quad(triangulation,
213 *(sides[i].is.hanging.quad[j]));
216 sc_array_push(subids));
217 *subid = cell->subdomain_id();
223 if (!subids->elem_count)
228 nsubs =
static_cast<int>(subids->elem_count);
232 for (i = 0; i < nsides; ++i)
234 if (sides[i].is_hanging)
236 for (j = 0; j < 2; ++j)
238 if (!sides[i].is.hanging.is_ghost[j])
240 typename ::parallel::distributed::
241 Triangulation<dim, spacedim>::cell_iterator cell =
242 cell_from_quad(triangulation,
244 *(sides[i].is.hanging.quad[j]));
246 for (k = 0; k < nsubs; ++k)
248 (*vertices_with_ghost_neighbors)
250 p8est_edge_corners[sides[i].edge][1 ^ j])]
251 .insert(subdomain_ids[k]);
258 subids->elem_count = 0;
264 template <
int dim,
int spacedim>
267 typename ::internal::p4est::iter<dim>::face_info *info,
271 int nsides = info->sides.elem_count;
272 auto *sides =
reinterpret_cast<
273 typename ::internal::p4est::iter<dim>::face_side *
>(
275 FindGhosts<dim, spacedim> *fg =
276 static_cast<FindGhosts<dim, spacedim> *
>(user_data);
277 sc_array_t *subids = fg->subids;
278 const ::parallel::distributed::Triangulation<dim, spacedim>
279 *triangulation = fg->triangulation;
282 std::map<unsigned int, std::set<::types::subdomain_id>>
283 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
284 int limit = (dim == 2) ? 2 : 4;
286 subids->elem_count = 0;
287 for (i = 0; i < nsides; ++i)
289 if (sides[i].is_hanging)
291 for (j = 0; j < limit; ++j)
293 if (sides[i].is.hanging.is_ghost[j])
295 typename ::parallel::distributed::
296 Triangulation<dim, spacedim>::cell_iterator cell =
297 cell_from_quad(triangulation,
299 *(sides[i].is.hanging.quad[j]));
302 sc_array_push(subids));
303 *subid = cell->subdomain_id();
309 if (!subids->elem_count)
314 nsubs =
static_cast<int>(subids->elem_count);
318 for (i = 0; i < nsides; ++i)
320 if (sides[i].is_hanging)
322 for (j = 0; j < limit; ++j)
324 if (!sides[i].is.hanging.is_ghost[j])
326 typename ::parallel::distributed::
327 Triangulation<dim, spacedim>::cell_iterator cell =
328 cell_from_quad(triangulation,
330 *(sides[i].is.hanging.quad[j]));
332 for (k = 0; k < nsubs; ++k)
336 (*vertices_with_ghost_neighbors)
338 p4est_face_corners[sides[i].face]
340 .insert(subdomain_ids[k]);
344 (*vertices_with_ghost_neighbors)
346 p8est_face_corners[sides[i].face]
348 .insert(subdomain_ids[k]);
356 subids->elem_count = 0;
362 p4est_quadrant_compare;
366 p4est_quadrant_childrenv;
370 p4est_quadrant_overlaps_tree;
375 p4est_quadrant_set_morton;
385 p4est_quadrant_is_equal;
389 p4est_quadrant_is_sibling;
393 p4est_quadrant_is_ancestor;
397 p4est_quadrant_ancestor_id;
403 p4est_comm_find_owner;
415 const double *vertices,
422 const int8_t *ctc) = p4est_connectivity_new_copy;
430 p4est_connectivity_join_faces;
433 p4est_connectivity_t *connectivity) = p4est_connectivity_destroy;
441 std::size_t data_size,
442 p4est_init_t init_fn,
443 void *user_pointer) = p4est_new_ext;
446 int copy_data) = p4est_copy;
451 int refine_recursive,
452 p4est_refine_t refine_fn,
453 p4est_init_t init_fn) = p4est_refine;
456 int coarsen_recursive,
457 p4est_coarsen_t coarsen_fn,
458 p4est_init_t init_fn) = p4est_coarsen;
462 p4est_init_t init_fn) = p4est_balance;
465 int partition_for_coarsening,
466 p4est_weight_t weight_fn) =
471 int save_data) = p4est_save;
474 const char *filename,
476 std::size_t data_size,
484 const char *filename,
491 const char *filename,
492 std::size_t *length) = p4est_connectivity_load;
499 const char *baseName) =
500 p4est_vtk_write_file;
510 std::size_t data_size,
511 p4est_init_t init_fn,
512 void *user_pointer) = p4est_reset_data;
527 const void *src_data,
528 std::size_t data_size) =
529 p4est_transfer_fixed;
537 const void *src_data,
538 std::size_t data_size) = p4est_transfer_fixed_begin;
541 p4est_transfer_fixed_end;
548 const int *dest_sizes,
549 const void *src_data,
550 const int *src_sizes) =
551 p4est_transfer_custom;
559 const int *dest_sizes,
560 const void *src_data,
561 const int *src_sizes) = p4est_transfer_custom_begin;
564 p4est_transfer_custom_end;
571 sc_array_t *points) = p4est_search_partition;
578 double vxyz[3]) = p4est_qcoord_to_vertex;
581 p8est_quadrant_compare;
585 p8est_quadrant_childrenv;
589 p8est_quadrant_overlaps_tree;
594 p8est_quadrant_set_morton;
604 p8est_quadrant_is_equal;
608 p8est_quadrant_is_sibling;
612 p8est_quadrant_is_ancestor;
616 p8est_quadrant_ancestor_id;
622 p8est_comm_find_owner;
637 const double *vertices,
648 const int8_t *ctc) = p8est_connectivity_new_copy;
651 p8est_connectivity_t *connectivity) = p8est_connectivity_destroy;
659 p8est_connectivity_join_faces;
667 std::size_t data_size,
668 p8est_init_t init_fn,
669 void *user_pointer) = p8est_new_ext;
672 int copy_data) = p8est_copy;
677 int refine_recursive,
678 p8est_refine_t refine_fn,
679 p8est_init_t init_fn) = p8est_refine;
682 int coarsen_recursive,
683 p8est_coarsen_t coarsen_fn,
684 p8est_init_t init_fn) = p8est_coarsen;
688 p8est_init_t init_fn) = p8est_balance;
691 int partition_for_coarsening,
692 p8est_weight_t weight_fn) =
697 int save_data) = p8est_save;
700 const char *filename,
702 std::size_t data_size,
710 const char *filename,
717 const char *filename,
718 std::size_t *length) = p8est_connectivity_load;
725 const char *baseName) =
726 p8est_vtk_write_file;
736 std::size_t data_size,
737 p8est_init_t init_fn,
738 void *user_pointer) = p8est_reset_data;
753 const void *src_data,
754 std::size_t data_size) =
755 p8est_transfer_fixed;
763 const void *src_data,
764 std::size_t data_size) = p8est_transfer_fixed_begin;
767 p8est_transfer_fixed_end;
774 const int *dest_sizes,
775 const void *src_data,
776 const int *src_sizes) =
777 p8est_transfer_custom;
785 const int *dest_sizes,
786 const void *src_data,
787 const int *src_sizes) = p8est_transfer_custom_begin;
790 p8est_transfer_custom_end;
797 sc_array_t *points) = p8est_search_partition;
805 double vxyz[3]) = p8est_qcoord_to_vertex;
814 for (
unsigned int c = 0;
815 c < ::GeometryInfo<dim>::max_children_per_cell;
855 Assert(coarse_grid_cell < parallel_forest->connectivity->num_trees,
857 return ((coarse_grid_cell >= parallel_forest->first_local_tree) &&
858 (coarse_grid_cell <= parallel_forest->last_local_tree));
870 connectivity->num_vertices,
871 connectivity->num_trees,
872 connectivity->num_corners,
873 connectivity->vertices,
874 connectivity->tree_to_vertex,
875 connectivity->tree_to_tree,
876 connectivity->tree_to_face,
877 connectivity->tree_to_corner,
878 connectivity->ctt_offset,
879 connectivity->corner_to_tree,
880 connectivity->corner_to_corner);
888 connectivity->num_vertices,
889 connectivity->num_trees,
890 connectivity->num_edges,
891 connectivity->num_corners,
892 connectivity->vertices,
893 connectivity->tree_to_vertex,
894 connectivity->tree_to_tree,
895 connectivity->tree_to_face,
896 connectivity->tree_to_edge,
897 connectivity->ett_offset,
898 connectivity->edge_to_tree,
899 connectivity->edge_to_edge,
900 connectivity->tree_to_corner,
901 connectivity->ctt_offset,
902 connectivity->corner_to_tree,
903 connectivity->corner_to_corner);
924 const int level_1 = (q1 << types<1>::max_n_child_indices_bits) >>
926 const int level_2 = (q2 << types<1>::max_n_child_indices_bits) >>
930 if (level_1 >= level_2)
940 return truncated_id_1 == truncated_id_2;
953 const int level_parent = (q << types<1>::max_n_child_indices_bits) >>
955 const int level_child = level_parent + 1;
958 p4est_children[0] = (q + 1);
980#include "distributed/p4est_wrappers.inst"
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
void init_quadrant_children< 1 >(const typename types< 1 >::quadrant &q, typename types< 1 >::quadrant(&p4est_children)[::GeometryInfo< 1 >::max_children_per_cell])
void init_coarse_quadrant(typename types< dim >::quadrant &quad)
bool quadrant_is_equal< 1 >(const typename types< 1 >::quadrant &q1, const typename types< 1 >::quadrant &q2)
types< 2 >::connectivity * copy_connectivity< 2 >(const typename types< 2 >::connectivity *connectivity)
bool quadrant_is_ancestor< 1 >(const types< 1 >::quadrant &q1, const types< 1 >::quadrant &q2)
types< 3 >::connectivity * copy_connectivity< 3 >(const typename types< 3 >::connectivity *connectivity)
bool quadrant_is_equal(const typename types< dim >::quadrant &q1, const typename types< dim >::quadrant &q2)
void init_quadrant_children(const typename types< dim >::quadrant &p4est_cell, typename types< dim >::quadrant(&p4est_children)[::GeometryInfo< dim >::max_children_per_cell])
bool quadrant_is_ancestor(const typename types< dim >::quadrant &q1, const typename types< dim >::quadrant &q2)
void init_coarse_quadrant< 1 >(typename types< 1 >::quadrant &quad)
bool tree_exists_locally(const typename types< dim >::forest *parallel_forest, const typename types< dim >::topidx coarse_grid_cell)
unsigned int subdomain_id
unsigned int global_dof_index
#define P8EST_QUADRANT_INIT(q)
#define P4EST_QUADRANT_INIT(q)
static constexpr unsigned int max_children_per_cell