Reference documentation for deal.II version 9.1.0-pre
p4est_wrappers.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2016 - 2017 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_p4est_wrappers_h
17 #define dealii_p4est_wrappers_h
18 
19 #include <deal.II/base/geometry_info.h>
20 
21 #ifdef DEAL_II_WITH_P4EST
22 # include <p4est_bits.h>
23 # include <p4est_communication.h>
24 # include <p4est_extended.h>
25 # include <p4est_ghost.h>
26 # include <p4est_iterate.h>
27 # include <p4est_vtk.h>
28 # include <p8est_bits.h>
29 # include <p8est_communication.h>
30 # include <p8est_extended.h>
31 # include <p8est_ghost.h>
32 # include <p8est_iterate.h>
33 # include <p8est_vtk.h>
34 
35 # include <map>
36 # include <set>
37 
38 
39 DEAL_II_NAMESPACE_OPEN
40 
41 namespace parallel
42 {
43  namespace distributed
44  {
45  template <int dim, int spacedim>
47  }
48 } // namespace parallel
49 
50 
51 namespace internal
52 {
53  namespace p4est
54  {
62  template <int>
63  struct types;
64 
65  template <>
66  struct types<2>
67  {
68  using connectivity = p4est_connectivity_t;
69  using forest = p4est_t;
70  using tree = p4est_tree_t;
71  using quadrant = p4est_quadrant_t;
72  using topidx = p4est_topidx_t;
73  using locidx = p4est_locidx_t;
74  using gloidx = p4est_gloidx_t;
75  using balance_type = p4est_connect_type_t;
76  using ghost = p4est_ghost_t;
77  using transfer_context = p4est_transfer_context_t;
78  };
79 
80  template <>
81  struct types<3>
82  {
83  using connectivity = p8est_connectivity_t;
84  using forest = p8est_t;
85  using tree = p8est_tree_t;
86  using quadrant = p8est_quadrant_t;
87  using topidx = p4est_topidx_t;
88  using locidx = p4est_locidx_t;
89  using gloidx = p4est_gloidx_t;
90  using balance_type = p8est_connect_type_t;
91  using ghost = p8est_ghost_t;
92  using transfer_context = p8est_transfer_context_t;
93  };
94 
95 
96 
104  template <int dim>
105  struct functions;
106 
107  template <>
108  struct functions<2>
109  {
110  static int (&quadrant_compare)(const void *v1, const void *v2);
111 
112  static void (&quadrant_childrenv)(const types<2>::quadrant *q,
113  types<2>::quadrant c[]);
114 
115  static int (&quadrant_overlaps_tree)(types<2>::tree * tree,
116  const types<2>::quadrant *q);
117 
118  static void (&quadrant_set_morton)(types<2>::quadrant *quadrant,
119  int level,
120  uint64_t id);
121 
122  static int (&quadrant_is_equal)(const types<2>::quadrant *q1,
123  const types<2>::quadrant *q2);
124 
125  static int (&quadrant_is_sibling)(const types<2>::quadrant *q1,
126  const types<2>::quadrant *q2);
127 
128  static int (&quadrant_is_ancestor)(const types<2>::quadrant *q1,
129  const types<2>::quadrant *q2);
130 
131  static int (&quadrant_ancestor_id)(const types<2>::quadrant *q,
132  int level);
133 
134  static int (&comm_find_owner)(types<2>::forest * p4est,
135  const types<2>::locidx which_tree,
136  const types<2>::quadrant *q,
137  const int guess);
138 
139  static types<2>::connectivity *(&connectivity_new)(
140  types<2>::topidx num_vertices,
141  types<2>::topidx num_trees,
142  types<2>::topidx num_corners,
143  types<2>::topidx num_vtt);
144  static void (&connectivity_join_faces)(types<2>::connectivity *conn,
145  types<2>::topidx tree_left,
146  types<2>::topidx tree_right,
147  int face_left,
148  int face_right,
149  int orientation);
150 
151 
152 
153  static void (&connectivity_destroy)(p4est_connectivity_t *connectivity);
154 
155  static types<2>::forest *(&new_forest)(
156  MPI_Comm mpicomm,
157  types<2>::connectivity *connectivity,
158  types<2>::locidx min_quadrants,
159  int min_level,
160  int fill_uniform,
161  size_t data_size,
162  p4est_init_t init_fn,
163  void * user_pointer);
164 
165  static void (&destroy)(types<2>::forest *p4est);
166 
167  static void (&refine)(types<2>::forest *p4est,
168  int refine_recursive,
169  p4est_refine_t refine_fn,
170  p4est_init_t init_fn);
171 
172  static void (&coarsen)(types<2>::forest *p4est,
173  int coarsen_recursive,
174  p4est_coarsen_t coarsen_fn,
175  p4est_init_t init_fn);
176 
177  static void (&balance)(types<2>::forest * p4est,
179  p4est_init_t init_fn);
180 
181  static types<2>::gloidx (&partition)(types<2>::forest *p4est,
182  int partition_for_coarsening,
183  p4est_weight_t weight_fn);
184 
185  static void (&save)(const char * filename,
186  types<2>::forest *p4est,
187  int save_data);
188 
189  static types<2>::forest *(&load_ext)(const char *filename,
190  MPI_Comm mpicomm,
191  size_t data_size,
192  int load_data,
193  int autopartition,
194  int broadcasthead,
195  void * user_pointer,
196  types<2>::connectivity **p4est);
197 
198  static int (&connectivity_save)(const char * filename,
199  types<2>::connectivity *connectivity);
200 
201  static int (&connectivity_is_valid)(types<2>::connectivity *connectivity);
202 
203  static types<2>::connectivity *(&connectivity_load)(const char *filename,
204  size_t * length);
205 
206  static unsigned int (&checksum)(types<2>::forest *p4est);
207 
208  static void (&vtk_write_file)(types<2>::forest *p4est,
209  p4est_geometry_t *,
210  const char *baseName);
211 
212  static types<2>::ghost *(&ghost_new)(types<2>::forest * p4est,
213  types<2>::balance_type btype);
214 
215  static void (&ghost_destroy)(types<2>::ghost *ghost);
216 
217  static void (&reset_data)(types<2>::forest *p4est,
218  size_t data_size,
219  p4est_init_t init_fn,
220  void * user_pointer);
221 
222  static size_t (&forest_memory_used)(types<2>::forest *p4est);
223 
224  static size_t (&connectivity_memory_used)(types<2>::connectivity *p4est);
225 
226  template <int spacedim>
227  static void
228  iterate(::internal::p4est::types<2>::forest *parallel_forest,
229  ::internal::p4est::types<2>::ghost * parallel_ghost,
230  void * user_data);
231 
232  static constexpr unsigned int max_level = P4EST_MAXLEVEL;
233 
234  static void (&transfer_fixed)(const types<2>::gloidx *dest_gfq,
235  const types<2>::gloidx *src_gfq,
236  MPI_Comm mpicomm,
237  int tag,
238  void * dest_data,
239  const void * src_data,
240  size_t data_size);
241 
242  static types<2>::transfer_context *(&transfer_fixed_begin)(
243  const types<2>::gloidx *dest_gfq,
244  const types<2>::gloidx *src_gfq,
245  MPI_Comm mpicomm,
246  int tag,
247  void * dest_data,
248  const void * src_data,
249  size_t data_size);
250 
251  static void (&transfer_fixed_end)(types<2>::transfer_context *tc);
252 
253  static void (&transfer_custom)(const types<2>::gloidx *dest_gfq,
254  const types<2>::gloidx *src_gfq,
255  MPI_Comm mpicomm,
256  int tag,
257  void * dest_data,
258  const int * dest_sizes,
259  const void * src_data,
260  const int * src_sizes);
261 
262  static types<2>::transfer_context *(&transfer_custom_begin)(
263  const types<2>::gloidx *dest_gfq,
264  const types<2>::gloidx *src_gfq,
265  MPI_Comm mpicomm,
266  int tag,
267  void * dest_data,
268  const int * dest_sizes,
269  const void * src_data,
270  const int * src_sizes);
271 
272  static void (&transfer_custom_end)(types<2>::transfer_context *tc);
273  };
274 
275 
276  template <>
277  struct functions<3>
278  {
279  static int (&quadrant_compare)(const void *v1, const void *v2);
280 
281  static void (&quadrant_childrenv)(const types<3>::quadrant *q,
282  types<3>::quadrant c[]);
283 
284  static int (&quadrant_overlaps_tree)(types<3>::tree * tree,
285  const types<3>::quadrant *q);
286 
287  static void (&quadrant_set_morton)(types<3>::quadrant *quadrant,
288  int level,
289  uint64_t id);
290 
291  static int (&quadrant_is_equal)(const types<3>::quadrant *q1,
292  const types<3>::quadrant *q2);
293 
294  static int (&quadrant_is_sibling)(const types<3>::quadrant *q1,
295  const types<3>::quadrant *q2);
296 
297  static int (&quadrant_is_ancestor)(const types<3>::quadrant *q1,
298  const types<3>::quadrant *q2);
299  static int (&quadrant_ancestor_id)(const types<3>::quadrant *q,
300  int level);
301 
302  static int (&comm_find_owner)(types<3>::forest * p4est,
303  const types<3>::locidx which_tree,
304  const types<3>::quadrant *q,
305  const int guess);
306 
307  static types<3>::connectivity *(&connectivity_new)(
308  types<3>::topidx num_vertices,
309  types<3>::topidx num_trees,
310  types<3>::topidx num_edges,
311  types<3>::topidx num_ett,
312  types<3>::topidx num_corners,
313  types<3>::topidx num_ctt);
314 
315  static void (&connectivity_join_faces)(types<3>::connectivity *conn,
316  types<3>::topidx tree_left,
317  types<3>::topidx tree_right,
318  int face_left,
319  int face_right,
320  int orientation);
321 
322  static void (&connectivity_destroy)(p8est_connectivity_t *connectivity);
323 
324  static types<3>::forest *(&new_forest)(
325  MPI_Comm mpicomm,
326  types<3>::connectivity *connectivity,
327  types<3>::locidx min_quadrants,
328  int min_level,
329  int fill_uniform,
330  size_t data_size,
331  p8est_init_t init_fn,
332  void * user_pointer);
333 
334  static void (&destroy)(types<3>::forest *p8est);
335 
336  static void (&refine)(types<3>::forest *p8est,
337  int refine_recursive,
338  p8est_refine_t refine_fn,
339  p8est_init_t init_fn);
340 
341  static void (&coarsen)(types<3>::forest *p8est,
342  int coarsen_recursive,
343  p8est_coarsen_t coarsen_fn,
344  p8est_init_t init_fn);
345 
346  static void (&balance)(types<3>::forest * p8est,
348  p8est_init_t init_fn);
349 
350  static types<3>::gloidx (&partition)(types<3>::forest *p8est,
351  int partition_for_coarsening,
352  p8est_weight_t weight_fn);
353 
354  static void (&save)(const char * filename,
355  types<3>::forest *p4est,
356  int save_data);
357 
358  static types<3>::forest *(&load_ext)(const char *filename,
359  MPI_Comm mpicomm,
360  std::size_t data_size,
361  int load_data,
362  int autopartition,
363  int broadcasthead,
364  void * user_pointer,
365  types<3>::connectivity **p4est);
366 
367  static int (&connectivity_save)(const char * filename,
368  types<3>::connectivity *connectivity);
369 
370  static int (&connectivity_is_valid)(types<3>::connectivity *connectivity);
371 
372  static types<3>::connectivity *(&connectivity_load)(const char *filename,
373  size_t * length);
374 
375  static unsigned int (&checksum)(types<3>::forest *p8est);
376 
377  static void (&vtk_write_file)(types<3>::forest *p8est,
378  p8est_geometry_t *,
379  const char *baseName);
380  static types<3>::ghost *(&ghost_new)(types<3>::forest * p4est,
381  types<3>::balance_type btype);
382 
383  static void (&ghost_destroy)(types<3>::ghost *ghost);
384 
385  static void (&reset_data)(types<3>::forest *p4est,
386  size_t data_size,
387  p8est_init_t init_fn,
388  void * user_pointer);
389 
390  static size_t (&forest_memory_used)(types<3>::forest *p4est);
391 
392  static size_t (&connectivity_memory_used)(types<3>::connectivity *p4est);
393 
394  static constexpr unsigned int max_level = P8EST_MAXLEVEL;
395 
396  static void (&transfer_fixed)(const types<3>::gloidx *dest_gfq,
397  const types<3>::gloidx *src_gfq,
398  MPI_Comm mpicomm,
399  int tag,
400  void * dest_data,
401  const void * src_data,
402  size_t data_size);
403 
404  static types<3>::transfer_context *(&transfer_fixed_begin)(
405  const types<3>::gloidx *dest_gfq,
406  const types<3>::gloidx *src_gfq,
407  MPI_Comm mpicomm,
408  int tag,
409  void * dest_data,
410  const void * src_data,
411  size_t data_size);
412 
413  static void (&transfer_fixed_end)(types<3>::transfer_context *tc);
414 
415  static void (&transfer_custom)(const types<3>::gloidx *dest_gfq,
416  const types<3>::gloidx *src_gfq,
417  MPI_Comm mpicomm,
418  int tag,
419  void * dest_data,
420  const int * dest_sizes,
421  const void * src_data,
422  const int * src_sizes);
423 
424  static types<3>::transfer_context *(&transfer_custom_begin)(
425  const types<3>::gloidx *dest_gfq,
426  const types<3>::gloidx *src_gfq,
427  MPI_Comm mpicomm,
428  int tag,
429  void * dest_data,
430  const int * dest_sizes,
431  const void * src_data,
432  const int * src_sizes);
433 
434  static void (&transfer_custom_end)(types<3>::transfer_context *tc);
435  };
436 
437 
438 
445  template <int dim>
446  struct iter;
447 
448  template <>
449  struct iter<2>
450  {
451  using corner_info = p4est_iter_corner_info_t;
452  using corner_side = p4est_iter_corner_side_t;
453  using corner_iter = p4est_iter_corner_t;
454  using face_info = p4est_iter_face_info_t;
455  using face_side = p4est_iter_face_side_t;
456  using face_iter = p4est_iter_face_t;
457  };
458 
459  template <>
460  struct iter<3>
461  {
462  using corner_info = p8est_iter_corner_info_t;
463  using corner_side = p8est_iter_corner_side_t;
464  using corner_iter = p8est_iter_corner_t;
465  using edge_info = p8est_iter_edge_info_t;
466  using edge_side = p8est_iter_edge_side_t;
467  using edge_iter = p8est_iter_edge_t;
468  using face_info = p8est_iter_face_info_t;
469  using face_side = p8est_iter_face_side_t;
470  using face_iter = p8est_iter_face_t;
471  };
472 
473 
474 
479  template <int dim>
480  void
481  init_quadrant_children(
482  const typename types<dim>::quadrant &p4est_cell,
483  typename types<dim>::quadrant (
484  &p4est_children)[::GeometryInfo<dim>::max_children_per_cell]);
485 
486 
487 
491  template <int dim>
492  void
493  init_coarse_quadrant(typename types<dim>::quadrant &quad);
494 
495 
496 
500  template <int dim>
501  bool
502  quadrant_is_equal(const typename types<dim>::quadrant &q1,
503  const typename types<dim>::quadrant &q2);
504 
505 
506 
510  template <int dim>
511  bool
512  quadrant_is_ancestor(const typename types<dim>::quadrant &q1,
513  const typename types<dim>::quadrant &q2);
514 
515 
516 
520  template <int dim>
521  bool
522  tree_exists_locally(const typename types<dim>::forest *parallel_forest,
523  const typename types<dim>::topidx coarse_grid_cell);
524 
525 
526 
530  template <int dim, int spacedim>
531  std::map<unsigned int, std::set<::types::subdomain_id>>
532  compute_vertices_with_ghost_neighbors(
533  const ::parallel::distributed::Triangulation<dim, spacedim> &tria,
534  typename ::internal::p4est::types<dim>::forest *parallel_forest,
535  typename ::internal::p4est::types<dim>::ghost * parallel_ghost);
536 
537  } // namespace p4est
538 } // namespace internal
539 
540 DEAL_II_NAMESPACE_CLOSE
541 
542 #endif // DEAL_II_WITH_P4EST
543 
544 #endif // dealii_p4est_wrappers_h
Definition: types.h:31