deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
p4est_wrappers.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2016 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_p4est_wrappers_h
14#define dealii_p4est_wrappers_h
15
16#include <deal.II/base/config.h>
17
19
20#ifdef DEAL_II_WITH_P4EST
21
23
24# include <p4est_bits.h>
25# include <p4est_communication.h>
26# include <p4est_extended.h>
27# include <p4est_ghost.h>
28# include <p4est_iterate.h>
29# include <p4est_search.h>
30# include <p4est_vtk.h>
31# include <p8est_bits.h>
32# include <p8est_communication.h>
33# include <p8est_extended.h>
34# include <p8est_ghost.h>
35# include <p8est_iterate.h>
36# include <p8est_search.h>
37# include <p8est_vtk.h>
38
39# include <limits>
40
41#endif // DEAL_II_WITH_P4EST
42
44
45#ifdef DEAL_II_WITH_P4EST
46// Forward declaration
47# ifndef DOXYGEN
48namespace parallel
49{
50 namespace distributed
51 {
52 template <int dim, int spacedim>
54 class Triangulation;
55 }
56} // namespace parallel
57# endif
58
59namespace internal
60{
61 namespace p4est
62 {
70 template <int>
71 struct types;
72
73 // these struct mimics p4est for 1d
74 template <>
75 struct types<1>
76 {
77 // id of a quadrant is an integeger
78 using quadrant = int;
79
80 // maximum number of children
81 static const int max_n_child_indices_bits = 27;
82
83 // number of bits the data type of id has
84 static const int n_bits = std::numeric_limits<quadrant>::digits;
85 };
86
87 template <>
88 struct types<2>
89 {
90 using connectivity = p4est_connectivity_t;
91 using forest = p4est_t;
92 using tree = p4est_tree_t;
93 using quadrant = p4est_quadrant_t;
94 using quadrant_coord = p4est_qcoord_t;
95 using topidx = p4est_topidx_t;
96 using locidx = p4est_locidx_t;
97 using gloidx = p4est_gloidx_t;
98 using balance_type = p4est_connect_type_t;
99 using ghost = p4est_ghost_t;
100 using transfer_context = p4est_transfer_context_t;
101 using search_partition_callback = p4est_search_partition_t;
102 };
103
104 template <>
105 struct types<3>
106 {
107 using connectivity = p8est_connectivity_t;
108 using forest = p8est_t;
109 using tree = p8est_tree_t;
110 using quadrant = p8est_quadrant_t;
111 using quadrant_coord = p4est_qcoord_t;
112 using topidx = p4est_topidx_t;
113 using locidx = p4est_locidx_t;
114 using gloidx = p4est_gloidx_t;
115 using balance_type = p8est_connect_type_t;
116 using ghost = p8est_ghost_t;
117 using transfer_context = p8est_transfer_context_t;
118 using search_partition_callback = p8est_search_partition_t;
119 };
120
121
122
136 template <int dim>
137 struct functions;
138
139 template <>
140 struct functions<2>
141 {
142 static int (&quadrant_compare)(const void *v1, const void *v2);
143
144 static void (&quadrant_childrenv)(const types<2>::quadrant *q,
146
147 static int (&quadrant_overlaps_tree)(types<2>::tree *tree,
148 const types<2>::quadrant *q);
149
150 static void (&quadrant_set_morton)(types<2>::quadrant *quadrant,
151 int level,
152 std::uint64_t id);
153
154 static void
155 quadrant_init(types<2>::quadrant &q);
156
158 const types<2>::quadrant *q2);
159
160 static int (&quadrant_is_sibling)(const types<2>::quadrant *q1,
161 const types<2>::quadrant *q2);
162
164 const types<2>::quadrant *q2);
165
166 static int (&quadrant_ancestor_id)(const types<2>::quadrant *q,
167 int level);
168
169 static int (&comm_find_owner)(types<2>::forest *p4est,
170 const types<2>::locidx which_tree,
171 const types<2>::quadrant *q,
172 const int guess);
173
175 types<2>::topidx num_vertices,
176 types<2>::topidx num_trees,
177 types<2>::topidx num_corners,
178 types<2>::topidx num_vtt);
179
181 types<2>::topidx num_vertices,
182 types<2>::topidx num_trees,
183 types<2>::topidx num_corners,
184 const double *vertices,
185 const types<2>::topidx *ttv,
186 const types<2>::topidx *ttt,
187 const int8_t *ttf,
188 const types<2>::topidx *ttc,
189 const types<2>::topidx *coff,
190 const types<2>::topidx *ctt,
191 const int8_t *ctc);
192
193 static void (&connectivity_join_faces)(types<2>::connectivity *conn,
194 types<2>::topidx tree_left,
195 types<2>::topidx tree_right,
196 int face_left,
197 int face_right,
198 int orientation);
199
200
201
202 static void (&connectivity_destroy)(p4est_connectivity_t *connectivity);
203
205 MPI_Comm mpicomm,
206 types<2>::connectivity *connectivity,
207 types<2>::locidx min_quadrants,
208 int min_level,
209 int fill_uniform,
210 std::size_t data_size,
211 p4est_init_t init_fn,
212 void *user_pointer);
213
215 int copy_data);
216
217 static void (&destroy)(types<2>::forest *p4est);
218
219 static void (&refine)(types<2>::forest *p4est,
220 int refine_recursive,
221 p4est_refine_t refine_fn,
222 p4est_init_t init_fn);
223
224 static void (&coarsen)(types<2>::forest *p4est,
225 int coarsen_recursive,
226 p4est_coarsen_t coarsen_fn,
227 p4est_init_t init_fn);
228
229 static void (&balance)(types<2>::forest *p4est,
231 p4est_init_t init_fn);
232
233 static types<2>::gloidx (&partition)(types<2>::forest *p4est,
234 int partition_for_coarsening,
235 p4est_weight_t weight_fn);
236
237 static void (&save)(const char *filename,
238 types<2>::forest *p4est,
239 int save_data);
240
241 static types<2>::forest *(&load_ext)(const char *filename,
242 MPI_Comm mpicomm,
243 std::size_t data_size,
244 int load_data,
245 int autopartition,
246 int broadcasthead,
247 void *user_pointer,
248 types<2>::connectivity **p4est);
249
250 static int (&connectivity_save)(const char *filename,
251 types<2>::connectivity *connectivity);
252
253 static int (&connectivity_is_valid)(types<2>::connectivity *connectivity);
254
255 static types<2>::connectivity *(&connectivity_load)(const char *filename,
256 std::size_t *length);
257
258 static unsigned int (&checksum)(types<2>::forest *p4est);
259
260 static void (&vtk_write_file)(types<2>::forest *p4est,
261 p4est_geometry_t *,
262 const char *baseName);
263
266
267 static void (&ghost_destroy)(types<2>::ghost *ghost);
268
269 static void (&reset_data)(types<2>::forest *p4est,
270 std::size_t data_size,
271 p4est_init_t init_fn,
272 void *user_pointer);
273
274 static std::size_t (&forest_memory_used)(types<2>::forest *p4est);
275
276 static std::size_t (&connectivity_memory_used)(
278
279 template <int spacedim>
280 static void
283 void *user_data);
284
285 static constexpr unsigned int max_level = P4EST_MAXLEVEL;
286
287 static void (&transfer_fixed)(const types<2>::gloidx *dest_gfq,
288 const types<2>::gloidx *src_gfq,
289 MPI_Comm mpicomm,
290 int tag,
291 void *dest_data,
292 const void *src_data,
293 std::size_t data_size);
294
296 const types<2>::gloidx *dest_gfq,
297 const types<2>::gloidx *src_gfq,
298 MPI_Comm mpicomm,
299 int tag,
300 void *dest_data,
301 const void *src_data,
302 std::size_t data_size);
303
304 static void (&transfer_fixed_end)(types<2>::transfer_context *tc);
305
306 static void (&transfer_custom)(const types<2>::gloidx *dest_gfq,
307 const types<2>::gloidx *src_gfq,
308 MPI_Comm mpicomm,
309 int tag,
310 void *dest_data,
311 const int *dest_sizes,
312 const void *src_data,
313 const int *src_sizes);
314
316 const types<2>::gloidx *dest_gfq,
317 const types<2>::gloidx *src_gfq,
318 MPI_Comm mpicomm,
319 int tag,
320 void *dest_data,
321 const int *dest_sizes,
322 const void *src_data,
323 const int *src_sizes);
324
325 static void (&transfer_custom_end)(types<2>::transfer_context *tc);
326
327 static void (&search_partition)(
328 types<2>::forest *forest,
329 int call_post,
332 sc_array_t *points);
333
334 static void (&quadrant_coord_to_vertex)(
335 types<2>::connectivity *connectivity,
336 types<2>::topidx treeid,
339 double vxyz[3]);
340 };
341
342
343 template <>
344 struct functions<3>
345 {
346 static int (&quadrant_compare)(const void *v1, const void *v2);
347
348 static void (&quadrant_childrenv)(const types<3>::quadrant *q,
350
351 static int (&quadrant_overlaps_tree)(types<3>::tree *tree,
352 const types<3>::quadrant *q);
353
354 static void (&quadrant_set_morton)(types<3>::quadrant *quadrant,
355 int level,
356 std::uint64_t id);
357
358 static void
359 quadrant_init(types<3>::quadrant &q);
360
362 const types<3>::quadrant *q2);
363
364 static int (&quadrant_is_sibling)(const types<3>::quadrant *q1,
365 const types<3>::quadrant *q2);
366
368 const types<3>::quadrant *q2);
369 static int (&quadrant_ancestor_id)(const types<3>::quadrant *q,
370 int level);
371
372 static int (&comm_find_owner)(types<3>::forest *p4est,
373 const types<3>::locidx which_tree,
374 const types<3>::quadrant *q,
375 const int guess);
376
378 types<3>::topidx num_vertices,
379 types<3>::topidx num_trees,
380 types<3>::topidx num_edges,
381 types<3>::topidx num_ett,
382 types<3>::topidx num_corners,
383 types<3>::topidx num_ctt);
384
386 types<3>::topidx num_vertices,
387 types<3>::topidx num_trees,
388 types<3>::topidx num_edges,
389 types<3>::topidx num_corners,
390 const double *vertices,
391 const types<3>::topidx *ttv,
392 const types<3>::topidx *ttt,
393 const int8_t *ttf,
394 const types<3>::topidx *tte,
395 const types<3>::topidx *eoff,
396 const types<3>::topidx *ett,
397 const int8_t *ete,
398 const types<3>::topidx *ttc,
399 const types<3>::topidx *coff,
400 const types<3>::topidx *ctt,
401 const int8_t *ctc);
402
403 static void (&connectivity_join_faces)(types<3>::connectivity *conn,
404 types<3>::topidx tree_left,
405 types<3>::topidx tree_right,
406 int face_left,
407 int face_right,
408 int orientation);
409
410 static void (&connectivity_destroy)(p8est_connectivity_t *connectivity);
411
413 MPI_Comm mpicomm,
414 types<3>::connectivity *connectivity,
415 types<3>::locidx min_quadrants,
416 int min_level,
417 int fill_uniform,
418 std::size_t data_size,
419 p8est_init_t init_fn,
420 void *user_pointer);
421
423 int copy_data);
424
425 static void (&destroy)(types<3>::forest *p8est);
426
427 static void (&refine)(types<3>::forest *p8est,
428 int refine_recursive,
429 p8est_refine_t refine_fn,
430 p8est_init_t init_fn);
431
432 static void (&coarsen)(types<3>::forest *p8est,
433 int coarsen_recursive,
434 p8est_coarsen_t coarsen_fn,
435 p8est_init_t init_fn);
436
437 static void (&balance)(types<3>::forest *p8est,
439 p8est_init_t init_fn);
440
441 static types<3>::gloidx (&partition)(types<3>::forest *p8est,
442 int partition_for_coarsening,
443 p8est_weight_t weight_fn);
444
445 static void (&save)(const char *filename,
446 types<3>::forest *p4est,
447 int save_data);
448
449 static types<3>::forest *(&load_ext)(const char *filename,
450 MPI_Comm mpicomm,
451 std::size_t data_size,
452 int load_data,
453 int autopartition,
454 int broadcasthead,
455 void *user_pointer,
456 types<3>::connectivity **p4est);
457
458 static int (&connectivity_save)(const char *filename,
459 types<3>::connectivity *connectivity);
460
461 static int (&connectivity_is_valid)(types<3>::connectivity *connectivity);
462
463 static types<3>::connectivity *(&connectivity_load)(const char *filename,
464 std::size_t *length);
465
466 static unsigned int (&checksum)(types<3>::forest *p8est);
467
468 static void (&vtk_write_file)(types<3>::forest *p8est,
469 p8est_geometry_t *,
470 const char *baseName);
473
474 static void (&ghost_destroy)(types<3>::ghost *ghost);
475
476 static void (&reset_data)(types<3>::forest *p4est,
477 std::size_t data_size,
478 p8est_init_t init_fn,
479 void *user_pointer);
480
481 static std::size_t (&forest_memory_used)(types<3>::forest *p4est);
482
483 static std::size_t (&connectivity_memory_used)(
485
486 static constexpr unsigned int max_level = P8EST_MAXLEVEL;
487
488 static void (&transfer_fixed)(const types<3>::gloidx *dest_gfq,
489 const types<3>::gloidx *src_gfq,
490 MPI_Comm mpicomm,
491 int tag,
492 void *dest_data,
493 const void *src_data,
494 std::size_t data_size);
495
497 const types<3>::gloidx *dest_gfq,
498 const types<3>::gloidx *src_gfq,
499 MPI_Comm mpicomm,
500 int tag,
501 void *dest_data,
502 const void *src_data,
503 std::size_t data_size);
504
505 static void (&transfer_fixed_end)(types<3>::transfer_context *tc);
506
507 static void (&transfer_custom)(const types<3>::gloidx *dest_gfq,
508 const types<3>::gloidx *src_gfq,
509 MPI_Comm mpicomm,
510 int tag,
511 void *dest_data,
512 const int *dest_sizes,
513 const void *src_data,
514 const int *src_sizes);
515
517 const types<3>::gloidx *dest_gfq,
518 const types<3>::gloidx *src_gfq,
519 MPI_Comm mpicomm,
520 int tag,
521 void *dest_data,
522 const int *dest_sizes,
523 const void *src_data,
524 const int *src_sizes);
525
526 static void (&transfer_custom_end)(types<3>::transfer_context *tc);
527
528 static void (&search_partition)(
529 types<3>::forest *forest,
530 int call_post,
533 sc_array_t *points);
534
535 static void (&quadrant_coord_to_vertex)(
536 types<3>::connectivity *connectivity,
537 types<3>::topidx treeid,
541 double vxyz[3]);
542 };
543
544
545
552 template <int dim>
553 struct iter;
554
555 template <>
556 struct iter<2>
557 {
558 using corner_info = p4est_iter_corner_info_t;
559 using corner_side = p4est_iter_corner_side_t;
560 using corner_iter = p4est_iter_corner_t;
561 using face_info = p4est_iter_face_info_t;
562 using face_side = p4est_iter_face_side_t;
563 using face_iter = p4est_iter_face_t;
564 };
565
566 template <>
567 struct iter<3>
568 {
569 using corner_info = p8est_iter_corner_info_t;
570 using corner_side = p8est_iter_corner_side_t;
571 using corner_iter = p8est_iter_corner_t;
572 using edge_info = p8est_iter_edge_info_t;
573 using edge_side = p8est_iter_edge_side_t;
574 using edge_iter = p8est_iter_edge_t;
575 using face_info = p8est_iter_face_info_t;
576 using face_side = p8est_iter_face_side_t;
577 using face_iter = p8est_iter_face_t;
578 };
579
580
581
586 template <int dim>
587 void
589 const typename types<dim>::quadrant &p4est_cell,
590 typename types<dim>::quadrant (
592
593
594
598 template <int dim>
599 void
601
602
603
607 template <int dim>
608 bool
609 quadrant_is_equal(const typename types<dim>::quadrant &q1,
610 const typename types<dim>::quadrant &q2);
611
612
613
617 template <int dim>
618 bool
620 const typename types<dim>::quadrant &q2);
621
622
623
627 template <int dim>
628 bool
629 tree_exists_locally(const typename types<dim>::forest *parallel_forest,
630 const typename types<dim>::topidx coarse_grid_cell);
631
632
636 template <int dim>
637 typename types<dim>::connectivity *
638 copy_connectivity(const typename types<dim>::connectivity *connectivity);
639
640# ifndef DOXYGEN
641 template <>
642 typename types<2>::connectivity *
643 copy_connectivity<2>(const typename types<2>::connectivity *connectivity);
644
645 template <>
646 typename types<3>::connectivity *
647 copy_connectivity<3>(const typename types<3>::connectivity *connectivity);
648# endif
649 } // namespace p4est
650} // namespace internal
651
652#endif // DEAL_II_WITH_P4EST
653
655
656#endif // dealii_p4est_wrappers_h
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_CXX20_REQUIRES(condition)
Definition config.h:249
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
unsigned int level
Definition grid_out.cc:4642
const unsigned int v1
void init_coarse_quadrant(typename types< dim >::quadrant &quad)
types< 2 >::connectivity * copy_connectivity< 2 >(const typename types< 2 >::connectivity *connectivity)
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)
bool tree_exists_locally(const typename types< dim >::forest *parallel_forest, const typename types< dim >::topidx coarse_grid_cell)
types< dim >::connectivity * copy_connectivity(const typename types< dim >::connectivity *connectivity)
Definition types.h:30
static types< 2 >::forest *(&) new_forest(MPI_Comm mpicomm, types< 2 >::connectivity *connectivity, types< 2 >::locidx min_quadrants, int min_level, int fill_uniform, std::size_t data_size, p4est_init_t init_fn, void *user_pointer)
static types< 2 >::forest *(&) copy_forest(types< 2 >::forest *input, int copy_data)
static types< 2 >::connectivity *(&) connectivity_new(types< 2 >::topidx num_vertices, types< 2 >::topidx num_trees, types< 2 >::topidx num_corners, types< 2 >::topidx num_vtt)
static types< 2 >::forest *(&) load_ext(const char *filename, MPI_Comm mpicomm, std::size_t data_size, int load_data, int autopartition, int broadcasthead, void *user_pointer, types< 2 >::connectivity **p4est)
static types< 2 >::connectivity *(&) connectivity_load(const char *filename, std::size_t *length)
static types< 2 >::connectivity *(&) connectivity_new_copy(types< 2 >::topidx num_vertices, types< 2 >::topidx num_trees, types< 2 >::topidx num_corners, const double *vertices, const types< 2 >::topidx *ttv, const types< 2 >::topidx *ttt, const int8_t *ttf, const types< 2 >::topidx *ttc, const types< 2 >::topidx *coff, const types< 2 >::topidx *ctt, const int8_t *ctc)
static void iterate(::internal::p4est::types< 2 >::forest *parallel_forest, ::internal::p4est::types< 2 >::ghost *parallel_ghost, void *user_data)
static types< 2 >::transfer_context *(&) transfer_fixed_begin(const types< 2 >::gloidx *dest_gfq, const types< 2 >::gloidx *src_gfq, MPI_Comm mpicomm, int tag, void *dest_data, const void *src_data, std::size_t data_size)
static types< 2 >::ghost *(&) ghost_new(types< 2 >::forest *p4est, types< 2 >::balance_type btype)
static types< 2 >::transfer_context *(&) transfer_custom_begin(const types< 2 >::gloidx *dest_gfq, const types< 2 >::gloidx *src_gfq, MPI_Comm mpicomm, int tag, void *dest_data, const int *dest_sizes, const void *src_data, const int *src_sizes)
static types< 3 >::connectivity *(&) connectivity_new_copy(types< 3 >::topidx num_vertices, types< 3 >::topidx num_trees, types< 3 >::topidx num_edges, types< 3 >::topidx num_corners, const double *vertices, const types< 3 >::topidx *ttv, const types< 3 >::topidx *ttt, const int8_t *ttf, const types< 3 >::topidx *tte, const types< 3 >::topidx *eoff, const types< 3 >::topidx *ett, const int8_t *ete, const types< 3 >::topidx *ttc, const types< 3 >::topidx *coff, const types< 3 >::topidx *ctt, const int8_t *ctc)
static types< 3 >::forest *(&) load_ext(const char *filename, MPI_Comm mpicomm, std::size_t data_size, int load_data, int autopartition, int broadcasthead, void *user_pointer, types< 3 >::connectivity **p4est)
static types< 3 >::transfer_context *(&) transfer_custom_begin(const types< 3 >::gloidx *dest_gfq, const types< 3 >::gloidx *src_gfq, MPI_Comm mpicomm, int tag, void *dest_data, const int *dest_sizes, const void *src_data, const int *src_sizes)
static types< 3 >::ghost *(&) ghost_new(types< 3 >::forest *p4est, types< 3 >::balance_type btype)
static types< 3 >::connectivity *(&) connectivity_new(types< 3 >::topidx num_vertices, types< 3 >::topidx num_trees, types< 3 >::topidx num_edges, types< 3 >::topidx num_ett, types< 3 >::topidx num_corners, types< 3 >::topidx num_ctt)
static types< 3 >::connectivity *(&) connectivity_load(const char *filename, std::size_t *length)
static types< 3 >::forest *(&) copy_forest(types< 3 >::forest *input, int copy_data)
static types< 3 >::transfer_context *(&) transfer_fixed_begin(const types< 3 >::gloidx *dest_gfq, const types< 3 >::gloidx *src_gfq, MPI_Comm mpicomm, int tag, void *dest_data, const void *src_data, std::size_t data_size)
static types< 3 >::forest *(&) new_forest(MPI_Comm mpicomm, types< 3 >::connectivity *connectivity, types< 3 >::locidx min_quadrants, int min_level, int fill_uniform, std::size_t data_size, p8est_init_t init_fn, void *user_pointer)
p4est_iter_corner_t corner_iter
p4est_iter_corner_info_t corner_info
p4est_iter_face_info_t face_info
p4est_iter_face_side_t face_side
p4est_iter_corner_side_t corner_side
p4est_iter_face_t face_iter
p8est_iter_corner_t corner_iter
p8est_iter_corner_info_t corner_info
p8est_iter_face_info_t face_info
p8est_iter_edge_side_t edge_side
p8est_iter_edge_t edge_iter
p8est_iter_edge_info_t edge_info
p8est_iter_face_side_t face_side
p8est_iter_face_t face_iter
p8est_iter_corner_side_t corner_side
p4est_search_partition_t search_partition_callback
p4est_connectivity_t connectivity
p4est_connect_type_t balance_type
p4est_transfer_context_t transfer_context
p8est_connectivity_t connectivity
p8est_transfer_context_t transfer_context
p8est_search_partition_t search_partition_callback
p8est_connect_type_t balance_type