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