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 (typename ::parallel::distributed::Triangulation<dim,spacedim> *triangulation,
18 typename ::internal::p4est::types<dim>::topidx treeidx,
19 typename ::internal::p4est::types<dim>::quadrant &quad)
21 int i,
l = quad.level;
23 triangulation->get_p4est_tree_to_coarse_cell_permutation()[treeidx];
25 for (i = 0; i <
l; i++)
27 typename ::Triangulation<dim,spacedim>::cell_iterator cell (triangulation, i, dealii_index);
29 Assert (cell->has_children (),
ExcMessage (
"p4est quadrant does not correspond to a cell!"));
30 dealii_index = cell->child_index(child_id);
33 typename ::Triangulation<dim,spacedim>::cell_iterator out_cell (triangulation, l, dealii_index);
44 template <
int dim,
int spacedim>
47 (typename ::internal::p4est::iter<dim>::corner_info *info,
51 int nsides = info->sides.elem_count;
52 typename ::internal::p4est::iter<dim>::corner_side *sides =
53 (typename ::internal::p4est::iter<dim>::corner_side *)
55 FindGhosts<dim,spacedim> *fg =
static_cast<FindGhosts<dim,spacedim> *
>(user_data);
56 sc_array_t *subids = fg->subids;
57 typename ::parallel::distributed::Triangulation<dim,spacedim> *triangulation = fg->triangulation;
60 std::map<unsigned int, std::set<::types::subdomain_id> >
61 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
63 subids->elem_count = 0;
64 for (i = 0; i < nsides; i++)
66 if (sides[i].is_ghost)
68 typename ::parallel::distributed::Triangulation<dim,spacedim>::cell_iterator cell = cell_from_quad (triangulation, sides[i].treeid, *(sides[i].quad));
69 Assert (cell->is_ghost(),
ExcMessage (
"ghost quad did not find ghost cell"));
72 *subid = cell->subdomain_id();
76 if (!subids->elem_count)
81 nsubs = (int) subids->elem_count;
84 for (i = 0; i < nsides; i++)
86 if (!sides[i].is_ghost)
88 typename ::parallel::distributed::Triangulation<dim,spacedim>::cell_iterator cell = cell_from_quad (triangulation, sides[i].treeid, *(sides[i].quad));
92 for (j = 0; j < nsubs; j++)
94 (*vertices_with_ghost_neighbors)[cell->vertex_index(sides[i].corner)]
95 .insert (subdomain_ids[j]);
100 subids->elem_count = 0;
106 template <
int dim,
int spacedim>
109 (typename ::internal::p4est::iter<dim>::edge_info *info,
113 int nsides = info->sides.elem_count;
114 typename ::internal::p4est::iter<dim>::edge_side *sides =
115 (typename ::internal::p4est::iter<dim>::edge_side *)
117 FindGhosts<dim,spacedim> *fg =
static_cast<FindGhosts<dim,spacedim> *
>(user_data);
118 sc_array_t *subids = fg->subids;
119 typename ::parallel::distributed::Triangulation<dim,spacedim> *triangulation = fg->triangulation;
122 std::map<unsigned int, std::set<::types::subdomain_id> >
123 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
125 subids->elem_count = 0;
126 for (i = 0; i < nsides; i++)
128 if (sides[i].is_hanging)
130 for (j = 0; j < 2; j++)
132 if (sides[i].is.hanging.is_ghost[j])
134 typename ::parallel::distributed::Triangulation<dim,spacedim>::cell_iterator cell = cell_from_quad (triangulation, sides[i].treeid, *(sides[i].is.hanging.quad[j]));
137 *subid = cell->subdomain_id();
143 if (!subids->elem_count)
148 nsubs = (int) subids->elem_count;
151 for (i = 0; i < nsides; i++)
153 if (sides[i].is_hanging)
155 for (j = 0; j < 2; j++)
157 if (!sides[i].is.hanging.is_ghost[j])
159 typename ::parallel::distributed::Triangulation<dim,spacedim>::cell_iterator cell = cell_from_quad (triangulation, sides[i].treeid, *(sides[i].is.hanging.quad[j]));
161 for (k = 0; k < nsubs; k++)
163 (*vertices_with_ghost_neighbors)[cell->vertex_index(p8est_edge_corners[sides[i].edge][1^j])]
164 .insert (subdomain_ids[k]);
171 subids->elem_count = 0;
177 template <
int dim,
int spacedim>
180 (typename ::internal::p4est::iter<dim>::face_info *info,
184 int nsides = info->sides.elem_count;
185 typename ::internal::p4est::iter<dim>::face_side *sides =
186 (typename ::internal::p4est::iter<dim>::face_side *)
188 FindGhosts<dim,spacedim> *fg =
static_cast<FindGhosts<dim,spacedim> *
>(user_data);
189 sc_array_t *subids = fg->subids;
190 typename ::parallel::distributed::Triangulation<dim,spacedim> *triangulation = fg->triangulation;
193 std::map<unsigned int, std::set<::types::subdomain_id> >
194 *vertices_with_ghost_neighbors = fg->vertices_with_ghost_neighbors;
195 int limit = (dim == 2) ? 2 : 4;
197 subids->elem_count = 0;
198 for (i = 0; i < nsides; i++)
200 if (sides[i].is_hanging)
202 for (j = 0; j < limit; j++)
204 if (sides[i].is.hanging.is_ghost[j])
206 typename ::parallel::distributed::Triangulation<dim,spacedim>::cell_iterator cell = cell_from_quad (triangulation, sides[i].treeid, *(sides[i].is.hanging.quad[j]));
209 *subid = cell->subdomain_id();
215 if (!subids->elem_count)
220 nsubs = (int) subids->elem_count;
223 for (i = 0; i < nsides; i++)
225 if (sides[i].is_hanging)
227 for (j = 0; j < limit; j++)
229 if (!sides[i].is.hanging.is_ghost[j])
231 typename ::parallel::distributed::Triangulation<dim,spacedim>::cell_iterator cell = cell_from_quad (triangulation, sides[i].treeid, *(sides[i].is.hanging.quad[j]));
233 for (k = 0; k < nsubs; k++)
237 (*vertices_with_ghost_neighbors)[cell->vertex_index(p4est_face_corners[sides[i].face][(limit - 1)^j])]
238 .insert (subdomain_ids[k]);
242 (*vertices_with_ghost_neighbors)[cell->vertex_index(p8est_face_corners[sides[i].face][(limit - 1)^j])]
243 .insert (subdomain_ids[k]);
251 subids->elem_count = 0;
256 int (&functions<2>::quadrant_compare) (
const void *v1,
const void *v2)
257 = p4est_quadrant_compare;
259 void (&functions<2>::quadrant_childrenv) (
const types<2>::quadrant *q,
260 types<2>::quadrant c[])
261 = p4est_quadrant_childrenv;
263 int (&functions<2>::quadrant_overlaps_tree) (types<2>::tree *tree,
264 const types<2>::quadrant *q)
265 = p4est_quadrant_overlaps_tree;
267 void (&functions<2>::quadrant_set_morton) (types<2>::quadrant *quadrant,
270 = p4est_quadrant_set_morton;
272 int (&functions<2>::quadrant_is_equal) (
const types<2>::quadrant *q1,
273 const types<2>::quadrant *q2)
274 = p4est_quadrant_is_equal;
276 int (&functions<2>::quadrant_is_sibling) (
const types<2>::quadrant *q1,
277 const types<2>::quadrant *q2)
278 = p4est_quadrant_is_sibling;
280 int (&functions<2>::quadrant_is_ancestor) (
const types<2>::quadrant *q1,
281 const types<2>::quadrant *q2)
282 = p4est_quadrant_is_ancestor;
284 int (&functions<2>::quadrant_ancestor_id) (
const types<2>::quadrant *q,
286 = p4est_quadrant_ancestor_id;
288 int (&functions<2>::comm_find_owner) (types<2>::forest *p4est,
289 const types<2>::locidx which_tree,
290 const types<2>::quadrant *q,
292 = p4est_comm_find_owner;
294 types<2>::connectivity *(&functions<2>::connectivity_new) (types<2>::topidx num_vertices,
295 types<2>::topidx num_trees,
296 types<2>::topidx num_corners,
297 types<2>::topidx num_vtt)
298 = p4est_connectivity_new;
300 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,1) 301 void (&functions<2>::connectivity_join_faces) (types<2>::connectivity *conn,
302 types<2>::topidx tree_left,
303 types<2>::topidx tree_right,
307 = p4est_connectivity_join_faces;
310 void (&functions<2>::connectivity_destroy) (p4est_connectivity_t *connectivity)
311 = p4est_connectivity_destroy;
313 types<2>::forest *(&functions<2>::new_forest) (MPI_Comm mpicomm,
314 types<2>::connectivity *connectivity,
315 types<2>::locidx min_quadrants,
319 p4est_init_t init_fn,
323 void (&functions<2>::destroy) (types<2>::forest *p4est)
326 void (&functions<2>::refine) (types<2>::forest *p4est,
327 int refine_recursive,
328 p4est_refine_t refine_fn,
329 p4est_init_t init_fn)
332 void (&functions<2>::coarsen) (types<2>::forest *p4est,
333 int coarsen_recursive,
334 p4est_coarsen_t coarsen_fn,
335 p4est_init_t init_fn)
338 void (&functions<2>::balance) (types<2>::forest *p4est,
339 types<2>::balance_type btype,
340 p4est_init_t init_fn)
342 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 343 p4est_gloidx_t (&functions<2>::partition) (types<2>::forest *p4est,
344 int partition_for_coarsening,
345 p4est_weight_t weight_fn)
346 = p4est_partition_ext;
349 void (&functions<2>::partition) (types<2>::forest *p4est,
350 int partition_for_coarsening,
351 p4est_weight_t weight_fn)
352 = p4est_partition_ext;
355 void (&functions<2>::save) (
const char *filename,
356 types<2>::forest *p4est,
360 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 362 (&functions<2>::load_ext) (
const char *filename,
364 std::size_t data_size,
369 types<2>::connectivity **p4est)
373 (&functions<2>::load) (
const char *filename,
375 std::size_t data_size,
378 types<2>::connectivity **p4est)
382 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 383 int (&functions<2>::connectivity_save) (
const char *filename,
384 types<2>::connectivity *connectivity)
385 = p4est_connectivity_save;
387 void (&functions<2>::connectivity_save) (
const char *filename,
388 types<2>::connectivity *connectivity)
389 = p4est_connectivity_save;
392 int (&functions<2>::connectivity_is_valid) (types<2>::connectivity
394 = p4est_connectivity_is_valid;
395 #if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) 396 types<2>::connectivity *
397 (&functions<2>::connectivity_load) (
const char *filename,
399 = p4est_connectivity_load;
400 #elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 401 types<2>::connectivity *
402 (&functions<2>::connectivity_load) (
const char *filename,
403 long unsigned *length)
404 = p4est_connectivity_load;
406 types<2>::connectivity *
407 (&functions<2>::connectivity_load) (
const char *filename,
409 = p4est_connectivity_load;
412 unsigned int (&functions<2>::checksum) (types<2>::forest *p4est)
415 void (&functions<2>::vtk_write_file) (types<2>::forest *p4est,
417 const char *baseName)
418 = p4est_vtk_write_file;
420 types<2>::ghost *(&functions<2>::ghost_new) (types<2>::forest *p4est,
421 types<2>::balance_type btype)
424 void (&functions<2>::ghost_destroy) (types<2>::ghost *ghost)
425 = p4est_ghost_destroy;
427 void (&functions<2>::reset_data) (types<2>::forest *p4est,
429 p4est_init_t init_fn,
433 size_t (&functions<2>::forest_memory_used) (types<2>::forest *p4est)
436 size_t (&functions<2>::connectivity_memory_used) (types<2>::connectivity *p4est)
437 = p4est_connectivity_memory_used;
439 template <
int spacedim>
444 p4est_iterate (parallel_forest, parallel_ghost, user_data,
446 find_ghosts_face<2,spacedim>,
447 find_ghosts_corner<2,spacedim>);
450 const unsigned int functions<2>::max_level;
455 int (&functions<3>::quadrant_compare) (
const void *v1,
const void *v2)
456 = p8est_quadrant_compare;
458 void (&functions<3>::quadrant_childrenv) (
const types<3>::quadrant *q,
459 types<3>::quadrant c[])
460 = p8est_quadrant_childrenv;
462 int (&functions<3>::quadrant_overlaps_tree) (types<3>::tree *tree,
463 const types<3>::quadrant *q)
464 = p8est_quadrant_overlaps_tree;
466 void (&functions<3>::quadrant_set_morton) (types<3>::quadrant *quadrant,
469 = p8est_quadrant_set_morton;
471 int (&functions<3>::quadrant_is_equal) (
const types<3>::quadrant *q1,
472 const types<3>::quadrant *q2)
473 = p8est_quadrant_is_equal;
475 int (&functions<3>::quadrant_is_sibling) (
const types<3>::quadrant *q1,
476 const types<3>::quadrant *q2)
477 = p8est_quadrant_is_sibling;
479 int (&functions<3>::quadrant_is_ancestor) (
const types<3>::quadrant *q1,
480 const types<3>::quadrant *q2)
481 = p8est_quadrant_is_ancestor;
483 int (&functions<3>::quadrant_ancestor_id) (
const types<3>::quadrant *q,
485 = p8est_quadrant_ancestor_id;
487 int (&functions<3>::comm_find_owner) (types<3>::forest *p4est,
488 const types<3>::locidx which_tree,
489 const types<3>::quadrant *q,
491 = p8est_comm_find_owner;
493 types<3>::connectivity *(&functions<3>::connectivity_new) (types<3>::topidx num_vertices,
494 types<3>::topidx num_trees,
495 types<3>::topidx num_edges,
496 types<3>::topidx num_ett,
497 types<3>::topidx num_corners,
498 types<3>::topidx num_ctt)
499 = p8est_connectivity_new;
501 void (&functions<3>::connectivity_destroy) (p8est_connectivity_t *connectivity)
502 = p8est_connectivity_destroy;
504 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,1) 505 void (&functions<3>::connectivity_join_faces) (types<3>::connectivity *conn,
506 types<3>::topidx tree_left,
507 types<3>::topidx tree_right,
511 = p8est_connectivity_join_faces;
514 types<3>::forest *(&functions<3>::new_forest) (MPI_Comm mpicomm,
515 types<3>::connectivity *connectivity,
516 types<3>::locidx min_quadrants,
520 p8est_init_t init_fn,
524 void (&functions<3>::destroy) (types<3>::forest *p8est)
527 void (&functions<3>::refine) (types<3>::forest *p8est,
528 int refine_recursive,
529 p8est_refine_t refine_fn,
530 p8est_init_t init_fn)
533 void (&functions<3>::coarsen) (types<3>::forest *p8est,
534 int coarsen_recursive,
535 p8est_coarsen_t coarsen_fn,
536 p8est_init_t init_fn)
539 void (&functions<3>::balance) (types<3>::forest *p8est,
540 types<3>::balance_type btype,
541 p8est_init_t init_fn)
544 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 545 p4est_gloidx_t (&functions<3>::partition) (types<3>::forest *p8est,
546 int partition_for_coarsening,
547 p8est_weight_t weight_fn)
548 = p8est_partition_ext;
550 void (&functions<3>::partition) (types<3>::forest *p8est,
551 int partition_for_coarsening,
552 p8est_weight_t weight_fn)
553 = p8est_partition_ext;
556 void (&functions<3>::save) (
const char *filename,
557 types<3>::forest *p4est,
561 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 563 (&functions<3>::load_ext) (
const char *filename,
565 std::size_t data_size,
570 types<3>::connectivity **p4est)
574 (&functions<3>::load) (
const char *filename,
576 std::size_t data_size,
579 types<3>::connectivity **p4est)
583 #if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 584 int (&functions<3>::connectivity_save) (
const char *filename,
585 types<3>::connectivity *connectivity)
586 = p8est_connectivity_save;
588 void (&functions<3>::connectivity_save) (
const char *filename,
589 types<3>::connectivity *connectivity)
590 = p8est_connectivity_save;
593 int (&functions<3>::connectivity_is_valid) (types<3>::connectivity
595 = p8est_connectivity_is_valid;
597 #if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) 598 types<3>::connectivity *
599 (&functions<3>::connectivity_load) (
const char *filename,
601 = p8est_connectivity_load;
602 #elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) 603 types<3>::connectivity *
604 (&functions<3>::connectivity_load) (
const char *filename,
605 long unsigned *length)
606 = p8est_connectivity_load;
608 types<3>::connectivity *
609 (&functions<3>::connectivity_load) (
const char *filename,
611 = p8est_connectivity_load;
614 unsigned int (&functions<3>::checksum) (types<3>::forest *p8est)
617 void (&functions<3>::vtk_write_file) (types<3>::forest *p8est,
619 const char *baseName)
620 = p8est_vtk_write_file;
622 types<3>::ghost *(&functions<3>::ghost_new) (types<3>::forest *p4est,
623 types<3>::balance_type btype)
626 void (&functions<3>::ghost_destroy) (types<3>::ghost *ghost)
627 = p8est_ghost_destroy;
629 void (&functions<3>::reset_data) (types<3>::forest *p4est,
631 p8est_init_t init_fn,
635 size_t (&functions<3>::forest_memory_used) (types<3>::forest *p4est)
638 size_t (&functions<3>::connectivity_memory_used) (types<3>::connectivity *p4est)
639 = p8est_connectivity_memory_used;
641 template <
int spacedim>
646 p8est_iterate (parallel_forest, parallel_ghost, user_data,
648 find_ghosts_face<3,spacedim>,
649 find_ghosts_edge<3,spacedim>,
650 find_ghosts_corner<3,spacedim>);
653 const unsigned int functions<3>::max_level;
660 init_quadrant_children
661 (
const typename types<dim>::quadrant &p4est_cell,
665 for (
unsigned int c=0;
666 c<::GeometryInfo<dim>::max_children_per_cell; ++c)
670 P4EST_QUADRANT_INIT(&p4est_children[c]);
673 P8EST_QUADRANT_INIT(&p4est_children[c]);
680 functions<dim>::quadrant_childrenv (&p4est_cell,
687 init_coarse_quadrant(
typename types<dim>::quadrant &quad)
692 P4EST_QUADRANT_INIT(&quad);
695 P8EST_QUADRANT_INIT(&quad);
700 functions<dim>::quadrant_set_morton (&quad,
707 quadrant_is_equal (
const typename types<dim>::quadrant &q1,
708 const typename types<dim>::quadrant &q2)
710 return functions<dim>::quadrant_is_equal(&q1, &q2);
717 quadrant_is_ancestor (
const typename types<dim>::quadrant &q1,
718 const typename types<dim>::quadrant &q2)
720 return functions<dim>::quadrant_is_ancestor(&q1, &q2);
725 tree_exists_locally (
const typename types<dim>::forest *parallel_forest,
726 const typename types<dim>::topidx coarse_grid_cell)
728 Assert (coarse_grid_cell < parallel_forest->connectivity->num_trees,
730 return ((coarse_grid_cell >= parallel_forest->first_local_tree)
732 (coarse_grid_cell <= parallel_forest->last_local_tree));
737 #endif //DEAL_II_WITH_P4EST 740 #include "p4est_wrappers.inst" 743 DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcMessage(std::string arg1)
unsigned int global_dof_index
#define Assert(cond, exc)
unsigned int subdomain_id
static ::ExceptionBase & ExcNotImplemented()
Tensor< 2, dim, Number > l(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
static ::ExceptionBase & ExcInternalError()