1 #include <deal.II/distributed/p4est_wrappers.h> 2 #include <deal.II/distributed/tria.h> 6 #ifdef DEAL_II_WITH_P4EST 14 template <
int dim,
int spacedim>
15 typename ::Triangulation<dim, spacedim>::cell_iterator
17 const ::parallel::distributed::Triangulation<dim, spacedim>
19 const typename ::internal::p4est::types<dim>::topidx treeidx,
20 const typename ::internal::p4est::types<dim>::quadrant &quad)
22 int i,
l = quad.level;
24 triangulation->get_p4est_tree_to_coarse_cell_permutation()[treeidx];
26 for (i = 0; i < l; i++)
28 typename ::Triangulation<dim, spacedim>::cell_iterator cell(
29 triangulation, i, dealii_index);
33 Assert(cell->has_children(),
34 ExcMessage(
"p4est quadrant does not correspond to a cell!"));
35 dealii_index = cell->child_index(child_id);
38 typename ::Triangulation<dim, spacedim>::cell_iterator out_cell(
39 triangulation, l, dealii_index);
48 template <
int dim,
int spacedim>
51 const typename ::parallel::distributed::Triangulation<dim,
55 std::map<unsigned int, std::set<::types::subdomain_id>>
56 *vertices_with_ghost_neighbors;
65 template <
int dim,
int spacedim>
68 typename ::internal::p4est::iter<dim>::corner_info *info,
72 int nsides = info->sides.elem_count;
73 typename ::internal::p4est::iter<dim>::corner_side *sides =
74 (typename ::internal::p4est::iter<dim>::corner_side
75 *)(info->sides.array);
76 FindGhosts<dim, spacedim> *fg =
77 static_cast<FindGhosts<dim, spacedim> *
>(user_data);
78 sc_array_t *subids = fg->subids;
79 const ::parallel::distributed::Triangulation<dim, spacedim>
80 * triangulation = fg->triangulation;
83 std::map<unsigned int, std::set<::types::subdomain_id>>
84 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
86 subids->elem_count = 0;
87 for (i = 0; i < nsides; i++)
89 if (sides[i].is_ghost)
91 typename ::parallel::distributed::
92 Triangulation<dim, spacedim>::cell_iterator cell =
93 cell_from_quad(triangulation,
97 ExcMessage(
"ghost quad did not find ghost cell"));
100 sc_array_push(subids));
101 *subid = cell->subdomain_id();
105 if (!subids->elem_count)
110 nsubs = (int)subids->elem_count;
113 for (i = 0; i < nsides; i++)
115 if (!sides[i].is_ghost)
117 typename ::parallel::distributed::
118 Triangulation<dim, spacedim>::cell_iterator cell =
119 cell_from_quad(triangulation,
126 for (j = 0; j < nsubs; j++)
128 (*vertices_with_ghost_neighbors)[cell->vertex_index(
130 .insert(subdomain_ids[j]);
135 subids->elem_count = 0;
141 template <
int dim,
int spacedim>
144 typename ::internal::p4est::iter<dim>::edge_info *info,
148 int nsides = info->sides.elem_count;
149 typename ::internal::p4est::iter<dim>::edge_side *sides =
150 (typename ::internal::p4est::iter<dim>::edge_side *)(info->sides
152 FindGhosts<dim, spacedim> *fg =
153 static_cast<FindGhosts<dim, spacedim> *
>(user_data);
154 sc_array_t *subids = fg->subids;
155 const ::parallel::distributed::Triangulation<dim, spacedim>
156 * triangulation = fg->triangulation;
159 std::map<unsigned int, std::set<::types::subdomain_id>>
160 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
162 subids->elem_count = 0;
163 for (i = 0; i < nsides; i++)
165 if (sides[i].is_hanging)
167 for (j = 0; j < 2; j++)
169 if (sides[i].is.hanging.is_ghost[j])
171 typename ::parallel::distributed::
172 Triangulation<dim, spacedim>::cell_iterator cell =
173 cell_from_quad(triangulation,
175 *(sides[i].is.hanging.quad[j]));
178 sc_array_push(subids));
179 *subid = cell->subdomain_id();
185 if (!subids->elem_count)
190 nsubs = (int)subids->elem_count;
193 for (i = 0; i < nsides; i++)
195 if (sides[i].is_hanging)
197 for (j = 0; j < 2; j++)
199 if (!sides[i].is.hanging.is_ghost[j])
201 typename ::parallel::distributed::
202 Triangulation<dim, spacedim>::cell_iterator cell =
203 cell_from_quad(triangulation,
205 *(sides[i].is.hanging.quad[j]));
207 for (k = 0; k < nsubs; k++)
209 (*vertices_with_ghost_neighbors)
211 p8est_edge_corners[sides[i].edge][1 ^ j])]
212 .insert(subdomain_ids[k]);
219 subids->elem_count = 0;
225 template <
int dim,
int spacedim>
228 typename ::internal::p4est::iter<dim>::face_info *info,
232 int nsides = info->sides.elem_count;
233 typename ::internal::p4est::iter<dim>::face_side *sides =
234 (typename ::internal::p4est::iter<dim>::face_side *)(info->sides
236 FindGhosts<dim, spacedim> *fg =
237 static_cast<FindGhosts<dim, spacedim> *
>(user_data);
238 sc_array_t *subids = fg->subids;
239 const ::parallel::distributed::Triangulation<dim, spacedim>
240 * triangulation = fg->triangulation;
243 std::map<unsigned int, std::set<::types::subdomain_id>>
244 * vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
245 int limit = (dim == 2) ? 2 : 4;
247 subids->elem_count = 0;
248 for (i = 0; i < nsides; i++)
250 if (sides[i].is_hanging)
252 for (j = 0; j < limit; j++)
254 if (sides[i].is.hanging.is_ghost[j])
256 typename ::parallel::distributed::
257 Triangulation<dim, spacedim>::cell_iterator cell =
258 cell_from_quad(triangulation,
260 *(sides[i].is.hanging.quad[j]));
263 sc_array_push(subids));
264 *subid = cell->subdomain_id();
270 if (!subids->elem_count)
275 nsubs = (int)subids->elem_count;
278 for (i = 0; i < nsides; i++)
280 if (sides[i].is_hanging)
282 for (j = 0; j < limit; j++)
284 if (!sides[i].is.hanging.is_ghost[j])
286 typename ::parallel::distributed::
287 Triangulation<dim, spacedim>::cell_iterator cell =
288 cell_from_quad(triangulation,
290 *(sides[i].is.hanging.quad[j]));
292 for (k = 0; k < nsubs; k++)
296 (*vertices_with_ghost_neighbors)
298 p4est_face_corners[sides[i].face]
300 .insert(subdomain_ids[k]);
304 (*vertices_with_ghost_neighbors)
306 p8est_face_corners[sides[i].face]
308 .insert(subdomain_ids[k]);
316 subids->elem_count = 0;
321 int (&functions<2>::quadrant_compare)(
const void *v1,
const void *v2) =
322 p4est_quadrant_compare;
324 void (&functions<2>::quadrant_childrenv)(
const types<2>::quadrant *q,
325 types<2>::quadrant c[]) =
326 p4est_quadrant_childrenv;
328 int (&functions<2>::quadrant_overlaps_tree)(types<2>::tree * tree,
329 const types<2>::quadrant *q) =
330 p4est_quadrant_overlaps_tree;
332 void (&functions<2>::quadrant_set_morton)(types<2>::quadrant *quadrant,
335 p4est_quadrant_set_morton;
337 int (&functions<2>::quadrant_is_equal)(
const types<2>::quadrant *q1,
338 const types<2>::quadrant *q2) =
339 p4est_quadrant_is_equal;
341 int (&functions<2>::quadrant_is_sibling)(
const types<2>::quadrant *q1,
342 const types<2>::quadrant *q2) =
343 p4est_quadrant_is_sibling;
345 int (&functions<2>::quadrant_is_ancestor)(
const types<2>::quadrant *q1,
346 const types<2>::quadrant *q2) =
347 p4est_quadrant_is_ancestor;
349 int (&functions<2>::quadrant_ancestor_id)(
const types<2>::quadrant *q,
351 p4est_quadrant_ancestor_id;
353 int (&functions<2>::comm_find_owner)(types<2>::forest * p4est,
354 const types<2>::locidx which_tree,
355 const types<2>::quadrant *q,
357 p4est_comm_find_owner;
359 types<2>::connectivity *(&functions<2>::connectivity_new)(
360 types<2>::topidx num_vertices,
361 types<2>::topidx num_trees,
362 types<2>::topidx num_corners,
363 types<2>::topidx num_vtt) = p4est_connectivity_new;
365 void (&functions<2>::connectivity_join_faces)(types<2>::connectivity *conn,
366 types<2>::topidx tree_left,
367 types<2>::topidx tree_right,
371 p4est_connectivity_join_faces;
373 void (&functions<2>::connectivity_destroy)(
374 p4est_connectivity_t *connectivity) = p4est_connectivity_destroy;
376 types<2>::forest *(&functions<2>::new_forest)(
378 types<2>::connectivity *connectivity,
379 types<2>::locidx min_quadrants,
383 p4est_init_t init_fn,
384 void * user_pointer) = p4est_new_ext;
386 void (&functions<2>::destroy)(types<2>::forest *p4est) = p4est_destroy;
388 void (&functions<2>::refine)(types<2>::forest *p4est,
389 int refine_recursive,
390 p4est_refine_t refine_fn,
391 p4est_init_t init_fn) = p4est_refine;
393 void (&functions<2>::coarsen)(types<2>::forest *p4est,
394 int coarsen_recursive,
395 p4est_coarsen_t coarsen_fn,
396 p4est_init_t init_fn) = p4est_coarsen;
398 void (&functions<2>::balance)(types<2>::forest * p4est,
399 types<2>::balance_type btype,
400 p4est_init_t init_fn) = p4est_balance;
402 types<2>::gloidx (&functions<2>::partition)(types<2>::forest *p4est,
403 int partition_for_coarsening,
404 p4est_weight_t weight_fn) =
407 void (&functions<2>::save)(
const char * filename,
408 types<2>::forest *p4est,
409 int save_data) = p4est_save;
411 types<2>::forest *(&functions<2>::load_ext)(
412 const char * filename,
414 std::size_t data_size,
419 types<2>::connectivity **p4est) = p4est_load_ext;
421 int (&functions<2>::connectivity_save)(
422 const char * filename,
423 types<2>::connectivity *connectivity) = p4est_connectivity_save;
425 int (&functions<2>::connectivity_is_valid)(
426 types<2>::connectivity *connectivity) = p4est_connectivity_is_valid;
428 types<2>::connectivity *(&functions<2>::connectivity_load)(
429 const char *filename,
430 size_t * length) = p4est_connectivity_load;
432 unsigned int (&functions<2>::checksum)(types<2>::forest *p4est) =
435 void (&functions<2>::vtk_write_file)(types<2>::forest *p4est,
437 const char *baseName) =
438 p4est_vtk_write_file;
440 types<2>::ghost *(&functions<2>::ghost_new)(types<2>::forest * p4est,
441 types<2>::balance_type btype) =
444 void (&functions<2>::ghost_destroy)(types<2>::ghost *ghost) =
447 void (&functions<2>::reset_data)(types<2>::forest *p4est,
449 p4est_init_t init_fn,
450 void *user_pointer) = p4est_reset_data;
452 size_t (&functions<2>::forest_memory_used)(types<2>::forest *p4est) =
455 size_t (&functions<2>::connectivity_memory_used)(
456 types<2>::connectivity *p4est) = p4est_connectivity_memory_used;
458 template <
int dim,
int spacedim>
459 std::map<unsigned int, std::set<::types::subdomain_id>>
460 compute_vertices_with_ghost_neighbors(
461 const typename ::parallel::distributed::Triangulation<dim, spacedim>
463 typename ::internal::p4est::types<dim>::forest *parallel_forest,
464 typename ::internal::p4est::types<dim>::ghost * parallel_ghost)
466 std::map<unsigned int, std::set<::types::subdomain_id>>
467 vertices_with_ghost_neighbors;
469 ::internal::p4est::FindGhosts<dim, spacedim> fg;
471 fg.triangulation = &tria;
472 fg.vertices_with_ghost_neighbors = &vertices_with_ghost_neighbors;
482 static_cast<void *>(&fg),
484 find_ghosts_face<2, spacedim>,
485 find_ghosts_corner<2, spacedim>);
494 static_cast<void *>(&fg),
496 find_ghosts_face<3, 3>,
497 find_ghosts_edge<3, 3>,
498 find_ghosts_corner<3, 3>);
505 sc_array_destroy(fg.subids);
507 return vertices_with_ghost_neighbors;
510 constexpr
unsigned int functions<2>::max_level;
512 void (&functions<2>::transfer_fixed)(
const types<2>::gloidx *dest_gfq,
513 const types<2>::gloidx *src_gfq,
517 const void * src_data,
519 p4est_transfer_fixed;
521 types<2>::transfer_context *(&functions<2>::transfer_fixed_begin)(
522 const types<2>::gloidx *dest_gfq,
523 const types<2>::gloidx *src_gfq,
527 const void * src_data,
528 size_t data_size) = p4est_transfer_fixed_begin;
530 void (&functions<2>::transfer_fixed_end)(types<2>::transfer_context *tc) =
531 p4est_transfer_fixed_end;
533 void (&functions<2>::transfer_custom)(
const types<2>::gloidx *dest_gfq,
534 const types<2>::gloidx *src_gfq,
538 const int * dest_sizes,
539 const void * src_data,
540 const int * src_sizes) =
541 p4est_transfer_custom;
543 types<2>::transfer_context *(&functions<2>::transfer_custom_begin)(
544 const types<2>::gloidx *dest_gfq,
545 const types<2>::gloidx *src_gfq,
549 const int * dest_sizes,
550 const void * src_data,
551 const int * src_sizes) = p4est_transfer_custom_begin;
553 void (&functions<2>::transfer_custom_end)(types<2>::transfer_context *tc) =
554 p4est_transfer_custom_end;
558 int (&functions<3>::quadrant_compare)(
const void *v1,
const void *v2) =
559 p8est_quadrant_compare;
561 void (&functions<3>::quadrant_childrenv)(
const types<3>::quadrant *q,
562 types<3>::quadrant c[]) =
563 p8est_quadrant_childrenv;
565 int (&functions<3>::quadrant_overlaps_tree)(types<3>::tree * tree,
566 const types<3>::quadrant *q) =
567 p8est_quadrant_overlaps_tree;
569 void (&functions<3>::quadrant_set_morton)(types<3>::quadrant *quadrant,
572 p8est_quadrant_set_morton;
574 int (&functions<3>::quadrant_is_equal)(
const types<3>::quadrant *q1,
575 const types<3>::quadrant *q2) =
576 p8est_quadrant_is_equal;
578 int (&functions<3>::quadrant_is_sibling)(
const types<3>::quadrant *q1,
579 const types<3>::quadrant *q2) =
580 p8est_quadrant_is_sibling;
582 int (&functions<3>::quadrant_is_ancestor)(
const types<3>::quadrant *q1,
583 const types<3>::quadrant *q2) =
584 p8est_quadrant_is_ancestor;
586 int (&functions<3>::quadrant_ancestor_id)(
const types<3>::quadrant *q,
588 p8est_quadrant_ancestor_id;
590 int (&functions<3>::comm_find_owner)(types<3>::forest * p4est,
591 const types<3>::locidx which_tree,
592 const types<3>::quadrant *q,
594 p8est_comm_find_owner;
596 types<3>::connectivity *(&functions<3>::connectivity_new)(
597 types<3>::topidx num_vertices,
598 types<3>::topidx num_trees,
599 types<3>::topidx num_edges,
600 types<3>::topidx num_ett,
601 types<3>::topidx num_corners,
602 types<3>::topidx num_ctt) = p8est_connectivity_new;
604 void (&functions<3>::connectivity_destroy)(
605 p8est_connectivity_t *connectivity) = p8est_connectivity_destroy;
607 void (&functions<3>::connectivity_join_faces)(types<3>::connectivity *conn,
608 types<3>::topidx tree_left,
609 types<3>::topidx tree_right,
613 p8est_connectivity_join_faces;
615 types<3>::forest *(&functions<3>::new_forest)(
617 types<3>::connectivity *connectivity,
618 types<3>::locidx min_quadrants,
622 p8est_init_t init_fn,
623 void * user_pointer) = p8est_new_ext;
625 void (&functions<3>::destroy)(types<3>::forest *p8est) = p8est_destroy;
627 void (&functions<3>::refine)(types<3>::forest *p8est,
628 int refine_recursive,
629 p8est_refine_t refine_fn,
630 p8est_init_t init_fn) = p8est_refine;
632 void (&functions<3>::coarsen)(types<3>::forest *p8est,
633 int coarsen_recursive,
634 p8est_coarsen_t coarsen_fn,
635 p8est_init_t init_fn) = p8est_coarsen;
637 void (&functions<3>::balance)(types<3>::forest * p8est,
638 types<3>::balance_type btype,
639 p8est_init_t init_fn) = p8est_balance;
641 types<3>::gloidx (&functions<3>::partition)(types<3>::forest *p8est,
642 int partition_for_coarsening,
643 p8est_weight_t weight_fn) =
646 void (&functions<3>::save)(
const char * filename,
647 types<3>::forest *p4est,
648 int save_data) = p8est_save;
650 types<3>::forest *(&functions<3>::load_ext)(
651 const char * filename,
653 std::size_t data_size,
658 types<3>::connectivity **p4est) = p8est_load_ext;
660 int (&functions<3>::connectivity_save)(
661 const char * filename,
662 types<3>::connectivity *connectivity) = p8est_connectivity_save;
664 int (&functions<3>::connectivity_is_valid)(
665 types<3>::connectivity *connectivity) = p8est_connectivity_is_valid;
667 types<3>::connectivity *(&functions<3>::connectivity_load)(
668 const char *filename,
669 size_t * length) = p8est_connectivity_load;
671 unsigned int (&functions<3>::checksum)(types<3>::forest *p8est) =
674 void (&functions<3>::vtk_write_file)(types<3>::forest *p8est,
676 const char *baseName) =
677 p8est_vtk_write_file;
679 types<3>::ghost *(&functions<3>::ghost_new)(types<3>::forest * p4est,
680 types<3>::balance_type btype) =
683 void (&functions<3>::ghost_destroy)(types<3>::ghost *ghost) =
686 void (&functions<3>::reset_data)(types<3>::forest *p4est,
688 p8est_init_t init_fn,
689 void *user_pointer) = p8est_reset_data;
691 size_t (&functions<3>::forest_memory_used)(types<3>::forest *p4est) =
694 size_t (&functions<3>::connectivity_memory_used)(
695 types<3>::connectivity *p4est) = p8est_connectivity_memory_used;
697 constexpr
unsigned int functions<3>::max_level;
699 void (&functions<3>::transfer_fixed)(
const types<3>::gloidx *dest_gfq,
700 const types<3>::gloidx *src_gfq,
704 const void * src_data,
706 p8est_transfer_fixed;
708 types<3>::transfer_context *(&functions<3>::transfer_fixed_begin)(
709 const types<3>::gloidx *dest_gfq,
710 const types<3>::gloidx *src_gfq,
714 const void * src_data,
715 size_t data_size) = p8est_transfer_fixed_begin;
717 void (&functions<3>::transfer_fixed_end)(types<3>::transfer_context *tc) =
718 p8est_transfer_fixed_end;
720 void (&functions<3>::transfer_custom)(
const types<3>::gloidx *dest_gfq,
721 const types<3>::gloidx *src_gfq,
725 const int * dest_sizes,
726 const void * src_data,
727 const int * src_sizes) =
728 p8est_transfer_custom;
730 types<3>::transfer_context *(&functions<3>::transfer_custom_begin)(
731 const types<3>::gloidx *dest_gfq,
732 const types<3>::gloidx *src_gfq,
736 const int * dest_sizes,
737 const void * src_data,
738 const int * src_sizes) = p8est_transfer_custom_begin;
740 void (&functions<3>::transfer_custom_end)(types<3>::transfer_context *tc) =
741 p8est_transfer_custom_end;
747 init_quadrant_children(
748 const typename types<dim>::quadrant &p4est_cell,
749 typename types<dim>::quadrant (
752 for (
unsigned int c = 0;
753 c < ::GeometryInfo<dim>::max_children_per_cell;
758 P4EST_QUADRANT_INIT(&p4est_children[c]);
761 P8EST_QUADRANT_INIT(&p4est_children[c]);
768 functions<dim>::quadrant_childrenv(&p4est_cell, p4est_children);
773 init_coarse_quadrant(
typename types<dim>::quadrant &quad)
778 P4EST_QUADRANT_INIT(&quad);
781 P8EST_QUADRANT_INIT(&quad);
786 functions<dim>::quadrant_set_morton(&quad,
793 quadrant_is_equal(
const typename types<dim>::quadrant &q1,
794 const typename types<dim>::quadrant &q2)
796 return functions<dim>::quadrant_is_equal(&q1, &q2);
803 quadrant_is_ancestor(
const typename types<dim>::quadrant &q1,
804 const typename types<dim>::quadrant &q2)
806 return functions<dim>::quadrant_is_ancestor(&q1, &q2);
811 tree_exists_locally(
const typename types<dim>::forest *parallel_forest,
812 const typename types<dim>::topidx coarse_grid_cell)
814 Assert(coarse_grid_cell < parallel_forest->connectivity->num_trees,
816 return ((coarse_grid_cell >= parallel_forest->first_local_tree) &&
817 (coarse_grid_cell <= parallel_forest->last_local_tree));
822 #endif // DEAL_II_WITH_P4EST 825 #include "p4est_wrappers.inst" 828 DEAL_II_NAMESPACE_CLOSE
unsigned long long int global_dof_index
static::ExceptionBase & ExcMessage(std::string arg1)
unsigned int subdomain_id
#define Assert(cond, exc)
static::ExceptionBase & ExcNotImplemented()
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
static::ExceptionBase & ExcInternalError()