From a4ba31ae50b5175f2a5520c6e1bc54122a05720c Mon Sep 17 00:00:00 2001 From: Daniel Arndt Date: Fri, 2 Sep 2016 23:09:14 +0200 Subject: [PATCH] move p4est wrappers --- include/deal.II/distributed/p4est_wrappers.h | 534 ++++++++++++ include/deal.II/distributed/tria.h | 90 +- source/distributed/CMakeLists.txt | 2 + source/distributed/p4est_wrappers.cc | 469 ++++++++++ source/distributed/p4est_wrappers.inst.in | 60 ++ source/distributed/tria.cc | 873 +------------------ source/distributed/tria.inst.in | 35 - 7 files changed, 1067 insertions(+), 996 deletions(-) create mode 100644 include/deal.II/distributed/p4est_wrappers.h create mode 100644 source/distributed/p4est_wrappers.cc create mode 100644 source/distributed/p4est_wrappers.inst.in diff --git a/include/deal.II/distributed/p4est_wrappers.h b/include/deal.II/distributed/p4est_wrappers.h new file mode 100644 index 0000000000..1bbad8f114 --- /dev/null +++ b/include/deal.II/distributed/p4est_wrappers.h @@ -0,0 +1,534 @@ +#ifndef P4EST_WRAPPERS_H +#define P4EST_WRAPPERS_H + +#include + +#ifdef DEAL_II_WITH_P4EST +# include +# include +# include +# include +# include +# include + +# include +# include +# include +# include +# include +# include + +DEAL_II_NAMESPACE_OPEN + +namespace internal +{ + namespace p4est + { + /** + * A structure whose explicit specializations contain typedefs to the + * relevant p4est_* and p8est_* types. Using this structure, for example + * by saying types::connectivity we can write code in a + * dimension independent way, either referring to p4est_connectivity_t or + * p8est_connectivity_t, depending on template argument. + */ + template struct types; + + template <> + struct types<2> + { + typedef p4est_connectivity_t connectivity; + typedef p4est_t forest; + typedef p4est_tree_t tree; + typedef p4est_quadrant_t quadrant; + typedef p4est_topidx_t topidx; + typedef p4est_locidx_t locidx; +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + typedef p4est_connect_type_t balance_type; +#else + typedef p4est_balance_type_t balance_type; +#endif + typedef p4est_ghost_t ghost; + }; + + template <> + struct types<3> + { + typedef p8est_connectivity_t connectivity; + typedef p8est_t forest; + typedef p8est_tree_t tree; + typedef p8est_quadrant_t quadrant; + typedef p4est_topidx_t topidx; + typedef p4est_locidx_t locidx; +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + typedef p8est_connect_type_t balance_type; +#else + typedef p8est_balance_type_t balance_type; +#endif + typedef p8est_ghost_t ghost; + }; + + + + /** + * A structure whose explicit specializations contain pointers to the + * relevant p4est_* and p8est_* functions. Using this structure, for + * example by saying functions::quadrant_compare, we can write code + * in a dimension independent way, either calling p4est_quadrant_compare + * or p8est_quadrant_compare, depending on template argument. + */ + template struct functions; + + template <> struct functions<2> + { + static + int (&quadrant_compare) (const void *v1, const void *v2); + + static + void (&quadrant_childrenv) (const types<2>::quadrant *q, + types<2>::quadrant c[]); + + static + int (&quadrant_overlaps_tree) (types<2>::tree *tree, + const types<2>::quadrant *q); + + static + void (&quadrant_set_morton) (types<2>::quadrant *quadrant, + int level, + uint64_t id); + + static + int (&quadrant_is_equal) (const types<2>::quadrant *q1, + const types<2>::quadrant *q2); + + static + int (&quadrant_is_sibling) (const types<2>::quadrant *q1, + const types<2>::quadrant *q2); + + static + int (&quadrant_is_ancestor) (const types<2>::quadrant *q1, + const types<2>::quadrant *q2); + + static + int (&quadrant_ancestor_id) (const types<2>::quadrant *q, + int level); + + static + int (&comm_find_owner) (types<2>::forest *p4est, + const types<2>::locidx which_tree, + const types<2>::quadrant *q, + const int guess); + + 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 + void (&connectivity_join_faces) (types<2>::connectivity *conn, + types<2>::topidx tree_left, + types<2>::topidx tree_right, + int face_left, + int face_right, + int orientation); + + + + static + void (&connectivity_destroy) (p4est_connectivity_t *connectivity); + + static + types<2>::forest *(&new_forest) (MPI_Comm mpicomm, + types<2>::connectivity *connectivity, + types<2>::locidx min_quadrants, + int min_level, + int fill_uniform, + size_t data_size, + p4est_init_t init_fn, + void *user_pointer); + + static + void (&destroy) (types<2>::forest *p4est); + + static + void (&refine) (types<2>::forest *p4est, + int refine_recursive, + p4est_refine_t refine_fn, + p4est_init_t init_fn); + + static + void (&coarsen) (types<2>::forest *p4est, + int coarsen_recursive, + p4est_coarsen_t coarsen_fn, + p4est_init_t init_fn); + + static + void (&balance) (types<2>::forest *p4est, + types<2>::balance_type btype, + p4est_init_t init_fn); + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + p4est_gloidx_t (&partition) (types<2>::forest *p4est, + int partition_for_coarsening, + p4est_weight_t weight_fn); +#else + static + void (&partition) (types<2>::forest *p4est, + int partition_for_coarsening, + p4est_weight_t weight_fn); +#endif + + static + void (&save) (const char *filename, + types<2>::forest *p4est, + int save_data); + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + types<2>::forest *(&load_ext) (const char *filename, + MPI_Comm mpicomm, + size_t data_size, + int load_data, + int autopartition, + int broadcasthead, + void *user_pointer, + types<2>::connectivity **p4est); +#else + static + types<2>::forest *(&load) (const char *filename, + MPI_Comm mpicomm, + size_t data_size, + int load_data, + void *user_pointer, + types<2>::connectivity **p4est); +#endif + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + int (&connectivity_save) (const char *filename, + types<2>::connectivity *connectivity); +#else + static + void (&connectivity_save) (const char *filename, + types<2>::connectivity *connectivity); +#endif + + static + int (&connectivity_is_valid) (types<2>::connectivity *connectivity); + +#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) + static + types<2>::connectivity *(&connectivity_load) (const char *filename, + size_t *length); +#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + types<2>::connectivity *(&connectivity_load) (const char *filename, + long unsigned *length); +#else + static + types<2>::connectivity *(&connectivity_load) (const char *filename, + long *length); +#endif + + static + unsigned int (&checksum) (types<2>::forest *p4est); + + static + void (&vtk_write_file) (types<2>::forest *p4est, + p4est_geometry_t *, + const char *baseName); + + static + types<2>::ghost *(&ghost_new) (types<2>::forest *p4est, + types<2>::balance_type btype); + + static + void (&ghost_destroy) (types<2>::ghost *ghost); + + static + void (&reset_data) (types<2>::forest *p4est, + size_t data_size, + p4est_init_t init_fn, + void *user_pointer); + + static + size_t (&forest_memory_used) (types<2>::forest *p4est); + + static + size_t (&connectivity_memory_used) (types<2>::connectivity *p4est); + + static const unsigned max_level; + }; + + + template <> struct functions<3> + { + static + int (&quadrant_compare) (const void *v1, const void *v2); + + static + void (&quadrant_childrenv) (const types<3>::quadrant *q, + types<3>::quadrant c[]); + + static + int (&quadrant_overlaps_tree) (types<3>::tree *tree, + const types<3>::quadrant *q); + + static + void (&quadrant_set_morton) (types<3>::quadrant *quadrant, + int level, + uint64_t id); + + static + int (&quadrant_is_equal) (const types<3>::quadrant *q1, + const types<3>::quadrant *q2); + + static + int (&quadrant_is_sibling) (const types<3>::quadrant *q1, + const types<3>::quadrant *q2); + + static + int (&quadrant_is_ancestor) (const types<3>::quadrant *q1, + const types<3>::quadrant *q2); + static + int (&quadrant_ancestor_id) (const types<3>::quadrant *q, + int level); + + static + int (&comm_find_owner) (types<3>::forest *p4est, + const types<3>::locidx which_tree, + const types<3>::quadrant *q, + const int guess); + + 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 + void (&connectivity_join_faces) (types<3>::connectivity *conn, + types<3>::topidx tree_left, + types<3>::topidx tree_right, + int face_left, + int face_right, + int orientation); + + static + void (&connectivity_destroy) (p8est_connectivity_t *connectivity); + + static + types<3>::forest *(&new_forest) (MPI_Comm mpicomm, + types<3>::connectivity *connectivity, + types<3>::locidx min_quadrants, + int min_level, + int fill_uniform, + size_t data_size, + p8est_init_t init_fn, + void *user_pointer); + + static + void (&destroy) (types<3>::forest *p8est); + + static + void (&refine) (types<3>::forest *p8est, + int refine_recursive, + p8est_refine_t refine_fn, + p8est_init_t init_fn); + + static + void (&coarsen) (types<3>::forest *p8est, + int coarsen_recursive, + p8est_coarsen_t coarsen_fn, + p8est_init_t init_fn); + + static + void (&balance) (types<3>::forest *p8est, + types<3>::balance_type btype, + p8est_init_t init_fn); + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + p4est_gloidx_t (&partition) (types<3>::forest *p8est, + int partition_for_coarsening, + p8est_weight_t weight_fn); +#else + static + void (&partition) (types<3>::forest *p8est, + int partition_for_coarsening, + p8est_weight_t weight_fn); +#endif + + static + void (&save) (const char *filename, + types<3>::forest *p4est, + int save_data); + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + 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); +#else + static + types<3>::forest *(&load) (const char *filename, + MPI_Comm mpicomm, + std::size_t data_size, + int load_data, + void *user_pointer, + types<3>::connectivity **p4est); +#endif + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + int (&connectivity_save) (const char *filename, + types<3>::connectivity *connectivity); +#else + static + void (&connectivity_save) (const char *filename, + types<3>::connectivity *connectivity); +#endif + + static + int (&connectivity_is_valid) (types<3>::connectivity *connectivity); + +#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) + static + types<3>::connectivity *(&connectivity_load) (const char *filename, + size_t *length); +#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + static + types<3>::connectivity *(&connectivity_load) (const char *filename, + long unsigned *length); +#else + static + types<3>::connectivity *(&connectivity_load) (const char *filename, + long *length); +#endif + + static + unsigned int (&checksum) (types<3>::forest *p8est); + + static + void (&vtk_write_file) (types<3>::forest *p8est, + p8est_geometry_t *, + const char *baseName); + static + types<3>::ghost *(&ghost_new) (types<3>::forest *p4est, + types<3>::balance_type btype); + + static + void (&ghost_destroy) (types<3>::ghost *ghost); + + static + void (&reset_data) (types<3>::forest *p4est, + size_t data_size, + p8est_init_t init_fn, + void *user_pointer); + + static + size_t (&forest_memory_used) (types<3>::forest *p4est); + + static + size_t (&connectivity_memory_used) (types<3>::connectivity *p4est); + + static const unsigned max_level; + }; + + + + /** + * This struct templatizes the p4est iterate structs and function + * prototypes, which are used to execute callback functions for faces, + * edges, and corners that require local neighborhood information, i.e. + * the neighboring cells */ + template struct iter; + + template <> struct iter<2> + { + typedef p4est_iter_corner_info_t corner_info; + typedef p4est_iter_corner_side_t corner_side; + typedef p4est_iter_corner_t corner_iter; + typedef p4est_iter_face_info_t face_info; + typedef p4est_iter_face_side_t face_side; + typedef p4est_iter_face_t face_iter; + }; + + template <> struct iter<3> + { + typedef p8est_iter_corner_info_t corner_info; + typedef p8est_iter_corner_side_t corner_side; + typedef p8est_iter_corner_t corner_iter; + typedef p8est_iter_edge_info_t edge_info; + typedef p8est_iter_edge_side_t edge_side; + typedef p8est_iter_edge_t edge_iter; + typedef p8est_iter_face_info_t face_info; + typedef p8est_iter_face_side_t face_side; + typedef p8est_iter_face_t face_iter; + }; + + + + /** + * Initialize the GeometryInfo::max_children_per_cell children of the + * cell p4est_cell. + */ + template + void + init_quadrant_children + (const typename types::quadrant &p4est_cell, + typename types::quadrant (&p4est_children)[dealii::GeometryInfo::max_children_per_cell]); + + + + /** + * Initialize quadrant to represent a coarse cell. + */ + template + void + init_coarse_quadrant(typename types::quadrant &quad); + + + + /** + * Returns whether q1 and q2 are equal + */ + template + bool + quadrant_is_equal (const typename types::quadrant &q1, + const typename types::quadrant &q2); + + + + /** + * Returns whether q1 is an ancestor of q2 + */ + template + bool + quadrant_is_ancestor (const typename types::quadrant &q1, + const typename types::quadrant &q2); + + + + /** + * Returns whether the children of a coarse cell are stored locally + */ + template + bool + tree_exists_locally (const typename types::forest *parallel_forest, + const typename types::topidx coarse_grid_cell); + } +} + +DEAL_II_NAMESPACE_CLOSE + +#endif //DEAL_II_WITH_P4EST + +#endif //P4EST_WRAPPERS_H diff --git a/include/deal.II/distributed/tria.h b/include/deal.II/distributed/tria.h index 1873b0198e..6047b034f2 100644 --- a/include/deal.II/distributed/tria.h +++ b/include/deal.II/distributed/tria.h @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -71,95 +72,6 @@ namespace FETools } } -namespace internal -{ - namespace p4est - { - /** - * A structure whose explicit specializations contain typedefs to the - * relevant p4est_* and p8est_* types. Using this structure, for example - * by saying types::connectivity we can write code in a - * dimension independent way, either referring to p4est_connectivity_t or - * p8est_connectivity_t, depending on template argument. - */ - template struct types; - - template <> - struct types<2> - { - typedef p4est_connectivity_t connectivity; - typedef p4est_t forest; - typedef p4est_tree_t tree; - typedef p4est_quadrant_t quadrant; - typedef p4est_topidx_t topidx; - typedef p4est_locidx_t locidx; -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - typedef p4est_connect_type_t balance_type; -#else - typedef p4est_balance_type_t balance_type; -#endif - typedef p4est_ghost_t ghost; - }; - - template <> - struct types<3> - { - typedef p8est_connectivity_t connectivity; - typedef p8est_t forest; - typedef p8est_tree_t tree; - typedef p8est_quadrant_t quadrant; - typedef p4est_topidx_t topidx; - typedef p4est_locidx_t locidx; -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - typedef p8est_connect_type_t balance_type; -#else - typedef p8est_balance_type_t balance_type; -#endif - typedef p8est_ghost_t ghost; - }; - - - /** - * Initialize the GeometryInfo::max_children_per_cell children of the - * cell p4est_cell. - */ - template - void - init_quadrant_children - (const typename types::quadrant &p4est_cell, - typename types::quadrant (&p4est_children)[GeometryInfo::max_children_per_cell]); - - - /** - * Initialize quadrant to represent a coarse cell. - */ - template - void - init_coarse_quadrant(typename types::quadrant &quad); - - - - /** - * Return whether q1 and q2 are equal - */ - template - bool - quadrant_is_equal (const typename types::quadrant &q1, - const typename types::quadrant &q2); - - //TODO: remove these functions from - //public interface somehow? [TH] - - /** - * returns whether q1 is an ancestor of q2 - */ - template - bool - quadrant_is_ancestor (const typename types::quadrant &q1, - const typename types::quadrant &q2); - } -} - //forward declaration of the data type for periodic face pairs namespace GridTools { diff --git a/source/distributed/CMakeLists.txt b/source/distributed/CMakeLists.txt index b52d2055df..7065f150d1 100644 --- a/source/distributed/CMakeLists.txt +++ b/source/distributed/CMakeLists.txt @@ -21,6 +21,7 @@ SET(_src tria.cc tria_base.cc shared_tria.cc + p4est_wrappers.cc ) SET(_inst @@ -29,6 +30,7 @@ SET(_inst tria.inst.in shared_tria.inst.in tria_base.inst.in + p4est_wrappers.inst.in ) FILE(GLOB _header diff --git a/source/distributed/p4est_wrappers.cc b/source/distributed/p4est_wrappers.cc new file mode 100644 index 0000000000..77abbfcf40 --- /dev/null +++ b/source/distributed/p4est_wrappers.cc @@ -0,0 +1,469 @@ +#include + +DEAL_II_NAMESPACE_OPEN + +#ifdef DEAL_II_WITH_P4EST + +namespace internal +{ + namespace p4est + { + int (&functions<2>::quadrant_compare) (const void *v1, const void *v2) + = p4est_quadrant_compare; + + void (&functions<2>::quadrant_childrenv) (const types<2>::quadrant *q, + types<2>::quadrant c[]) + = p4est_quadrant_childrenv; + + int (&functions<2>::quadrant_overlaps_tree) (types<2>::tree *tree, + const types<2>::quadrant *q) + = p4est_quadrant_overlaps_tree; + + void (&functions<2>::quadrant_set_morton) (types<2>::quadrant *quadrant, + int level, + uint64_t id) + = p4est_quadrant_set_morton; + + int (&functions<2>::quadrant_is_equal) (const types<2>::quadrant *q1, + const types<2>::quadrant *q2) + = p4est_quadrant_is_equal; + + int (&functions<2>::quadrant_is_sibling) (const types<2>::quadrant *q1, + const types<2>::quadrant *q2) + = p4est_quadrant_is_sibling; + + int (&functions<2>::quadrant_is_ancestor) (const types<2>::quadrant *q1, + const types<2>::quadrant *q2) + = p4est_quadrant_is_ancestor; + + int (&functions<2>::quadrant_ancestor_id) (const types<2>::quadrant *q, + int level) + = p4est_quadrant_ancestor_id; + + int (&functions<2>::comm_find_owner) (types<2>::forest *p4est, + const types<2>::locidx which_tree, + const types<2>::quadrant *q, + const int guess) + = p4est_comm_find_owner; + + types<2>::connectivity *(&functions<2>::connectivity_new) (types<2>::topidx num_vertices, + types<2>::topidx num_trees, + types<2>::topidx num_corners, + types<2>::topidx num_vtt) + = p4est_connectivity_new; + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,1) + void (&functions<2>::connectivity_join_faces) (types<2>::connectivity *conn, + types<2>::topidx tree_left, + types<2>::topidx tree_right, + int face_left, + int face_right, + int orientation) + = p4est_connectivity_join_faces; +#endif + + void (&functions<2>::connectivity_destroy) (p4est_connectivity_t *connectivity) + = p4est_connectivity_destroy; + + types<2>::forest *(&functions<2>::new_forest) (MPI_Comm mpicomm, + types<2>::connectivity *connectivity, + types<2>::locidx min_quadrants, + int min_level, + int fill_uniform, + size_t data_size, + p4est_init_t init_fn, + void *user_pointer) + = p4est_new_ext; + + void (&functions<2>::destroy) (types<2>::forest *p4est) + = p4est_destroy; + + void (&functions<2>::refine) (types<2>::forest *p4est, + int refine_recursive, + p4est_refine_t refine_fn, + p4est_init_t init_fn) + = p4est_refine; + + void (&functions<2>::coarsen) (types<2>::forest *p4est, + int coarsen_recursive, + p4est_coarsen_t coarsen_fn, + p4est_init_t init_fn) + = p4est_coarsen; + + void (&functions<2>::balance) (types<2>::forest *p4est, + types<2>::balance_type btype, + p4est_init_t init_fn) + = p4est_balance; +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + p4est_gloidx_t (&functions<2>::partition) (types<2>::forest *p4est, + int partition_for_coarsening, + p4est_weight_t weight_fn) + = p4est_partition_ext; +#else + + void (&functions<2>::partition) (types<2>::forest *p4est, + int partition_for_coarsening, + p4est_weight_t weight_fn) + = p4est_partition_ext; +#endif + + void (&functions<2>::save) (const char *filename, + types<2>::forest *p4est, + int save_data) + = p4est_save; + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + types<2>::forest * + (&functions<2>::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) + = p4est_load_ext; +#else + types<2>::forest * + (&functions<2>::load) (const char *filename, + MPI_Comm mpicomm, + std::size_t data_size, + int load_data, + void *user_pointer, + types<2>::connectivity **p4est) + = p4est_load; +#endif + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + int (&functions<2>::connectivity_save) (const char *filename, + types<2>::connectivity *connectivity) + = p4est_connectivity_save; +#else + void (&functions<2>::connectivity_save) (const char *filename, + types<2>::connectivity *connectivity) + = p4est_connectivity_save; +#endif + + int (&functions<2>::connectivity_is_valid) (types<2>::connectivity + *connectivity) + = p4est_connectivity_is_valid; +#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) + types<2>::connectivity * + (&functions<2>::connectivity_load) (const char *filename, + size_t *length) + = p4est_connectivity_load; +#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + types<2>::connectivity * + (&functions<2>::connectivity_load) (const char *filename, + long unsigned *length) + = p4est_connectivity_load; +#else + types<2>::connectivity * + (&functions<2>::connectivity_load) (const char *filename, + long *length) + = p4est_connectivity_load; +#endif + + unsigned int (&functions<2>::checksum) (types<2>::forest *p4est) + = p4est_checksum; + + void (&functions<2>::vtk_write_file) (types<2>::forest *p4est, + p4est_geometry_t *, + const char *baseName) + = p4est_vtk_write_file; + + types<2>::ghost *(&functions<2>::ghost_new) (types<2>::forest *p4est, + types<2>::balance_type btype) + = p4est_ghost_new; + + void (&functions<2>::ghost_destroy) (types<2>::ghost *ghost) + = p4est_ghost_destroy; + + void (&functions<2>::reset_data) (types<2>::forest *p4est, + size_t data_size, + p4est_init_t init_fn, + void *user_pointer) + = p4est_reset_data; + + size_t (&functions<2>::forest_memory_used) (types<2>::forest *p4est) + = p4est_memory_used; + + size_t (&functions<2>::connectivity_memory_used) (types<2>::connectivity *p4est) + = p4est_connectivity_memory_used; + + const unsigned int functions<2>::max_level = P4EST_MAXLEVEL; + + int (&functions<3>::quadrant_compare) (const void *v1, const void *v2) + = p8est_quadrant_compare; + + void (&functions<3>::quadrant_childrenv) (const types<3>::quadrant *q, + types<3>::quadrant c[]) + = p8est_quadrant_childrenv; + + int (&functions<3>::quadrant_overlaps_tree) (types<3>::tree *tree, + const types<3>::quadrant *q) + = p8est_quadrant_overlaps_tree; + + void (&functions<3>::quadrant_set_morton) (types<3>::quadrant *quadrant, + int level, + uint64_t id) + = p8est_quadrant_set_morton; + + int (&functions<3>::quadrant_is_equal) (const types<3>::quadrant *q1, + const types<3>::quadrant *q2) + = p8est_quadrant_is_equal; + + int (&functions<3>::quadrant_is_sibling) (const types<3>::quadrant *q1, + const types<3>::quadrant *q2) + = p8est_quadrant_is_sibling; + + int (&functions<3>::quadrant_is_ancestor) (const types<3>::quadrant *q1, + const types<3>::quadrant *q2) + = p8est_quadrant_is_ancestor; + + int (&functions<3>::quadrant_ancestor_id) (const types<3>::quadrant *q, + int level) + = p8est_quadrant_ancestor_id; + + int (&functions<3>::comm_find_owner) (types<3>::forest *p4est, + const types<3>::locidx which_tree, + const types<3>::quadrant *q, + const int guess) + = p8est_comm_find_owner; + + types<3>::connectivity *(&functions<3>::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) + = p8est_connectivity_new; + + void (&functions<3>::connectivity_destroy) (p8est_connectivity_t *connectivity) + = p8est_connectivity_destroy; + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,1) + void (&functions<3>::connectivity_join_faces) (types<3>::connectivity *conn, + types<3>::topidx tree_left, + types<3>::topidx tree_right, + int face_left, + int face_right, + int orientation) + = p8est_connectivity_join_faces; +#endif + + types<3>::forest *(&functions<3>::new_forest) (MPI_Comm mpicomm, + types<3>::connectivity *connectivity, + types<3>::locidx min_quadrants, + int min_level, + int fill_uniform, + size_t data_size, + p8est_init_t init_fn, + void *user_pointer) + = p8est_new_ext; + + void (&functions<3>::destroy) (types<3>::forest *p8est) + = p8est_destroy; + + void (&functions<3>::refine) (types<3>::forest *p8est, + int refine_recursive, + p8est_refine_t refine_fn, + p8est_init_t init_fn) + = p8est_refine; + + void (&functions<3>::coarsen) (types<3>::forest *p8est, + int coarsen_recursive, + p8est_coarsen_t coarsen_fn, + p8est_init_t init_fn) + = p8est_coarsen; + + void (&functions<3>::balance) (types<3>::forest *p8est, + types<3>::balance_type btype, + p8est_init_t init_fn) + = p8est_balance; + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + p4est_gloidx_t (&functions<3>::partition) (types<3>::forest *p8est, + int partition_for_coarsening, + p8est_weight_t weight_fn) + = p8est_partition_ext; +#else + void (&functions<3>::partition) (types<3>::forest *p8est, + int partition_for_coarsening, + p8est_weight_t weight_fn) + = p8est_partition_ext; +#endif + + void (&functions<3>::save) (const char *filename, + types<3>::forest *p4est, + int save_data) + = p8est_save; + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + types<3>::forest * + (&functions<3>::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) + = p8est_load_ext; +#else + types<3>::forest * + (&functions<3>::load) (const char *filename, + MPI_Comm mpicomm, + std::size_t data_size, + int load_data, + void *user_pointer, + types<3>::connectivity **p4est) + = p8est_load; +#endif + +#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + int (&functions<3>::connectivity_save) (const char *filename, + types<3>::connectivity *connectivity) + = p8est_connectivity_save; +#else + void (&functions<3>::connectivity_save) (const char *filename, + types<3>::connectivity *connectivity) + = p8est_connectivity_save; +#endif + + int (&functions<3>::connectivity_is_valid) (types<3>::connectivity + *connectivity) + = p8est_connectivity_is_valid; + +#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) + types<3>::connectivity * + (&functions<3>::connectivity_load) (const char *filename, + size_t *length) + = p8est_connectivity_load; +#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) + types<3>::connectivity * + (&functions<3>::connectivity_load) (const char *filename, + long unsigned *length) + = p8est_connectivity_load; +#else + types<3>::connectivity * + (&functions<3>::connectivity_load) (const char *filename, + long *length) + = p8est_connectivity_load; +#endif + + unsigned int (&functions<3>::checksum) (types<3>::forest *p8est) + = p8est_checksum; + + void (&functions<3>::vtk_write_file) (types<3>::forest *p8est, + p8est_geometry_t *, + const char *baseName) + = p8est_vtk_write_file; + + types<3>::ghost *(&functions<3>::ghost_new) (types<3>::forest *p4est, + types<3>::balance_type btype) + = p8est_ghost_new; + + void (&functions<3>::ghost_destroy) (types<3>::ghost *ghost) + = p8est_ghost_destroy; + + void (&functions<3>::reset_data) (types<3>::forest *p4est, + size_t data_size, + p8est_init_t init_fn, + void *user_pointer) + = p8est_reset_data; + + size_t (&functions<3>::forest_memory_used) (types<3>::forest *p4est) + = p8est_memory_used; + + size_t (&functions<3>::connectivity_memory_used) (types<3>::connectivity *p4est) + = p8est_connectivity_memory_used; + + const unsigned int functions<3>::max_level = P8EST_MAXLEVEL; + + template + void + init_quadrant_children + (const typename types::quadrant &p4est_cell, + typename types::quadrant (&p4est_children)[dealii::GeometryInfo::max_children_per_cell]) + { + + for (unsigned int c=0; + c::max_children_per_cell; ++c) + switch (dim) + { + case 2: + P4EST_QUADRANT_INIT(&p4est_children[c]); + break; + case 3: + P8EST_QUADRANT_INIT(&p4est_children[c]); + break; + default: + Assert (false, ExcNotImplemented()); + } + + + functions::quadrant_childrenv (&p4est_cell, + p4est_children); + + } + + template + void + init_coarse_quadrant(typename types::quadrant &quad) + { + switch (dim) + { + case 2: + P4EST_QUADRANT_INIT(&quad); + break; + case 3: + P8EST_QUADRANT_INIT(&quad); + break; + default: + Assert (false, ExcNotImplemented()); + } + functions::quadrant_set_morton (&quad, + /*level=*/0, + /*index=*/0); + } + + template + bool + quadrant_is_equal (const typename types::quadrant &q1, + const typename types::quadrant &q2) + { + return functions::quadrant_is_equal(&q1, &q2); + } + + + + template + bool + quadrant_is_ancestor (const typename types::quadrant &q1, + const typename types::quadrant &q2) + { + return functions::quadrant_is_ancestor(&q1, &q2); + } + + template + bool + tree_exists_locally (const typename types::forest *parallel_forest, + const typename types::topidx coarse_grid_cell) + { + Assert (coarse_grid_cell < parallel_forest->connectivity->num_trees, + ExcInternalError()); + return ((coarse_grid_cell >= parallel_forest->first_local_tree) + && + (coarse_grid_cell <= parallel_forest->last_local_tree)); + } + } +} + +#endif //DEAL_II_WITH_P4EST + +/*-------------- Explicit Instantiations -------------------------------*/ +#include "p4est_wrappers.inst" + + +DEAL_II_NAMESPACE_CLOSE diff --git a/source/distributed/p4est_wrappers.inst.in b/source/distributed/p4est_wrappers.inst.in new file mode 100644 index 0000000000..ec5547c9e4 --- /dev/null +++ b/source/distributed/p4est_wrappers.inst.in @@ -0,0 +1,60 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2010 - 2014 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +for (deal_II_dimension : DIMENSIONS) +{ +# ifdef DEAL_II_WITH_P4EST + + namespace internal + \{ + namespace p4est + \{ +#if deal_II_dimension > 1 + + template + void + init_quadrant_children + (const types::quadrant & p4est_cell, + types::quadrant (&p4est_children)[GeometryInfo::max_children_per_cell]); + + template + void + init_coarse_quadrant + (types::quadrant & quad); + + template + bool + quadrant_is_equal + (const types::quadrant & q1, + const types::quadrant & q2); + + template + bool + quadrant_is_ancestor + (const types::quadrant & q1, + const types::quadrant & q2); + + template + bool + tree_exists_locally + (const types::forest *parallel_forest, + const types::topidx coarse_grid_cell); + +# endif + \} + \} +# endif // DEAL_II_WITH_P4EST +} diff --git a/source/distributed/tria.cc b/source/distributed/tria.cc index 0787af97fc..2712756b45 100644 --- a/source/distributed/tria.cc +++ b/source/distributed/tria.cc @@ -24,22 +24,7 @@ #include #include #include - -#ifdef DEAL_II_WITH_P4EST -# include -# include -# include -# include -# include -# include - -# include -# include -# include -# include -# include -# include -#endif +#include #include #include @@ -52,862 +37,6 @@ DEAL_II_NAMESPACE_OPEN #ifdef DEAL_II_WITH_P4EST -namespace internal -{ - namespace p4est - { - /** - * A structure whose explicit specializations contain pointers to the - * relevant p4est_* and p8est_* functions. Using this structure, for - * example by saying functions::quadrant_compare, we can write code - * in a dimension independent way, either calling p4est_quadrant_compare - * or p8est_quadrant_compare, depending on template argument. - */ - template struct functions; - - template <> struct functions<2> - { - static - int (&quadrant_compare) (const void *v1, const void *v2); - - static - void (&quadrant_childrenv) (const types<2>::quadrant *q, - types<2>::quadrant c[]); - - static - int (&quadrant_overlaps_tree) (types<2>::tree *tree, - const types<2>::quadrant *q); - - static - void (&quadrant_set_morton) (types<2>::quadrant *quadrant, - int level, - uint64_t id); - - static - int (&quadrant_is_equal) (const types<2>::quadrant *q1, - const types<2>::quadrant *q2); - - static - int (&quadrant_is_sibling) (const types<2>::quadrant *q1, - const types<2>::quadrant *q2); - - static - int (&quadrant_is_ancestor) (const types<2>::quadrant *q1, - const types<2>::quadrant *q2); - - static - int (&quadrant_ancestor_id) (const types<2>::quadrant *q, - int level); - - static - int (&comm_find_owner) (types<2>::forest *p4est, - const types<2>::locidx which_tree, - const types<2>::quadrant *q, - const int guess); - - 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 - void (&connectivity_join_faces) (types<2>::connectivity *conn, - types<2>::topidx tree_left, - types<2>::topidx tree_right, - int face_left, - int face_right, - int orientation); - - - - static - void (&connectivity_destroy) (p4est_connectivity_t *connectivity); - - static - types<2>::forest *(&new_forest) (MPI_Comm mpicomm, - types<2>::connectivity *connectivity, - types<2>::locidx min_quadrants, - int min_level, - int fill_uniform, - size_t data_size, - p4est_init_t init_fn, - void *user_pointer); - - static - void (&destroy) (types<2>::forest *p4est); - - static - void (&refine) (types<2>::forest *p4est, - int refine_recursive, - p4est_refine_t refine_fn, - p4est_init_t init_fn); - - static - void (&coarsen) (types<2>::forest *p4est, - int coarsen_recursive, - p4est_coarsen_t coarsen_fn, - p4est_init_t init_fn); - - static - void (&balance) (types<2>::forest *p4est, - types<2>::balance_type btype, - p4est_init_t init_fn); - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - p4est_gloidx_t (&partition) (types<2>::forest *p4est, - int partition_for_coarsening, - p4est_weight_t weight_fn); -#else - static - void (&partition) (types<2>::forest *p4est, - int partition_for_coarsening, - p4est_weight_t weight_fn); -#endif - - static - void (&save) (const char *filename, - types<2>::forest *p4est, - int save_data); - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - types<2>::forest *(&load_ext) (const char *filename, - MPI_Comm mpicomm, - size_t data_size, - int load_data, - int autopartition, - int broadcasthead, - void *user_pointer, - types<2>::connectivity **p4est); -#else - static - types<2>::forest *(&load) (const char *filename, - MPI_Comm mpicomm, - size_t data_size, - int load_data, - void *user_pointer, - types<2>::connectivity **p4est); -#endif - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - int (&connectivity_save) (const char *filename, - types<2>::connectivity *connectivity); -#else - static - void (&connectivity_save) (const char *filename, - types<2>::connectivity *connectivity); -#endif - - static - int (&connectivity_is_valid) (types<2>::connectivity *connectivity); - -#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) - static - types<2>::connectivity *(&connectivity_load) (const char *filename, - size_t *length); -#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - types<2>::connectivity *(&connectivity_load) (const char *filename, - long unsigned *length); -#else - static - types<2>::connectivity *(&connectivity_load) (const char *filename, - long *length); -#endif - - static - unsigned int (&checksum) (types<2>::forest *p4est); - - static - void (&vtk_write_file) (types<2>::forest *p4est, - p4est_geometry_t *, - const char *baseName); - - static - types<2>::ghost *(&ghost_new) (types<2>::forest *p4est, - types<2>::balance_type btype); - - static - void (&ghost_destroy) (types<2>::ghost *ghost); - - static - void (&reset_data) (types<2>::forest *p4est, - size_t data_size, - p4est_init_t init_fn, - void *user_pointer); - - static - size_t (&forest_memory_used) (types<2>::forest *p4est); - - static - size_t (&connectivity_memory_used) (types<2>::connectivity *p4est); - - static const unsigned max_level; - }; - - int (&functions<2>::quadrant_compare) (const void *v1, const void *v2) - = p4est_quadrant_compare; - - void (&functions<2>::quadrant_childrenv) (const types<2>::quadrant *q, - types<2>::quadrant c[]) - = p4est_quadrant_childrenv; - - int (&functions<2>::quadrant_overlaps_tree) (types<2>::tree *tree, - const types<2>::quadrant *q) - = p4est_quadrant_overlaps_tree; - - void (&functions<2>::quadrant_set_morton) (types<2>::quadrant *quadrant, - int level, - uint64_t id) - = p4est_quadrant_set_morton; - - int (&functions<2>::quadrant_is_equal) (const types<2>::quadrant *q1, - const types<2>::quadrant *q2) - = p4est_quadrant_is_equal; - - int (&functions<2>::quadrant_is_sibling) (const types<2>::quadrant *q1, - const types<2>::quadrant *q2) - = p4est_quadrant_is_sibling; - - int (&functions<2>::quadrant_is_ancestor) (const types<2>::quadrant *q1, - const types<2>::quadrant *q2) - = p4est_quadrant_is_ancestor; - - int (&functions<2>::quadrant_ancestor_id) (const types<2>::quadrant *q, - int level) - = p4est_quadrant_ancestor_id; - - int (&functions<2>::comm_find_owner) (types<2>::forest *p4est, - const types<2>::locidx which_tree, - const types<2>::quadrant *q, - const int guess) - = p4est_comm_find_owner; - - types<2>::connectivity *(&functions<2>::connectivity_new) (types<2>::topidx num_vertices, - types<2>::topidx num_trees, - types<2>::topidx num_corners, - types<2>::topidx num_vtt) - = p4est_connectivity_new; - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,1) - void (&functions<2>::connectivity_join_faces) (types<2>::connectivity *conn, - types<2>::topidx tree_left, - types<2>::topidx tree_right, - int face_left, - int face_right, - int orientation) - = p4est_connectivity_join_faces; -#endif - - void (&functions<2>::connectivity_destroy) (p4est_connectivity_t *connectivity) - = p4est_connectivity_destroy; - - types<2>::forest *(&functions<2>::new_forest) (MPI_Comm mpicomm, - types<2>::connectivity *connectivity, - types<2>::locidx min_quadrants, - int min_level, - int fill_uniform, - size_t data_size, - p4est_init_t init_fn, - void *user_pointer) - = p4est_new_ext; - - void (&functions<2>::destroy) (types<2>::forest *p4est) - = p4est_destroy; - - void (&functions<2>::refine) (types<2>::forest *p4est, - int refine_recursive, - p4est_refine_t refine_fn, - p4est_init_t init_fn) - = p4est_refine; - - void (&functions<2>::coarsen) (types<2>::forest *p4est, - int coarsen_recursive, - p4est_coarsen_t coarsen_fn, - p4est_init_t init_fn) - = p4est_coarsen; - - void (&functions<2>::balance) (types<2>::forest *p4est, - types<2>::balance_type btype, - p4est_init_t init_fn) - = p4est_balance; - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - p4est_gloidx_t (&functions<2>::partition) (types<2>::forest *p4est, - int partition_for_coarsening, - p4est_weight_t weight_fn) - = p4est_partition_ext; -#else - void (&functions<2>::partition) (types<2>::forest *p4est, - int partition_for_coarsening, - p4est_weight_t weight_fn) - = p4est_partition_ext; -#endif - - void (&functions<2>::save) (const char *filename, - types<2>::forest *p4est, - int save_data) - = p4est_save; - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - types<2>::forest * - (&functions<2>::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) - = p4est_load_ext; -#else - types<2>::forest * - (&functions<2>::load) (const char *filename, - MPI_Comm mpicomm, - std::size_t data_size, - int load_data, - void *user_pointer, - types<2>::connectivity **p4est) - = p4est_load; -#endif - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - int (&functions<2>::connectivity_save) (const char *filename, - types<2>::connectivity *connectivity) - = p4est_connectivity_save; -#else - void (&functions<2>::connectivity_save) (const char *filename, - types<2>::connectivity *connectivity) - = p4est_connectivity_save; -#endif - - int (&functions<2>::connectivity_is_valid) (types<2>::connectivity - *connectivity) - = p4est_connectivity_is_valid; - -#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) - types<2>::connectivity * - (&functions<2>::connectivity_load) (const char *filename, - size_t *length) - = p4est_connectivity_load; -#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - types<2>::connectivity * - (&functions<2>::connectivity_load) (const char *filename, - long unsigned *length) - = p4est_connectivity_load; -#else - types<2>::connectivity * - (&functions<2>::connectivity_load) (const char *filename, - long *length) - = p4est_connectivity_load; -#endif - - unsigned int (&functions<2>::checksum) (types<2>::forest *p4est) - = p4est_checksum; - - void (&functions<2>::vtk_write_file) (types<2>::forest *p4est, - p4est_geometry_t *, - const char *baseName) - = p4est_vtk_write_file; - - types<2>::ghost *(&functions<2>::ghost_new) (types<2>::forest *p4est, - types<2>::balance_type btype) - = p4est_ghost_new; - - void (&functions<2>::ghost_destroy) (types<2>::ghost *ghost) - = p4est_ghost_destroy; - - void (&functions<2>::reset_data) (types<2>::forest *p4est, - size_t data_size, - p4est_init_t init_fn, - void *user_pointer) - = p4est_reset_data; - - size_t (&functions<2>::forest_memory_used) (types<2>::forest *p4est) - = p4est_memory_used; - - size_t (&functions<2>::connectivity_memory_used) (types<2>::connectivity *p4est) - = p4est_connectivity_memory_used; - - const unsigned int functions<2>::max_level = P4EST_MAXLEVEL; - - template <> struct functions<3> - { - static - int (&quadrant_compare) (const void *v1, const void *v2); - - static - void (&quadrant_childrenv) (const types<3>::quadrant *q, - types<3>::quadrant c[]); - - static - int (&quadrant_overlaps_tree) (types<3>::tree *tree, - const types<3>::quadrant *q); - - static - void (&quadrant_set_morton) (types<3>::quadrant *quadrant, - int level, - uint64_t id); - - static - int (&quadrant_is_equal) (const types<3>::quadrant *q1, - const types<3>::quadrant *q2); - - static - int (&quadrant_is_sibling) (const types<3>::quadrant *q1, - const types<3>::quadrant *q2); - - static - int (&quadrant_is_ancestor) (const types<3>::quadrant *q1, - const types<3>::quadrant *q2); - - static - int (&quadrant_ancestor_id) (const types<3>::quadrant *q, - int level); - - static - int (&comm_find_owner) (types<3>::forest *p4est, - const types<3>::locidx which_tree, - const types<3>::quadrant *q, - const int guess); - - 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 - void (&connectivity_join_faces) (types<3>::connectivity *conn, - types<3>::topidx tree_left, - types<3>::topidx tree_right, - int face_left, - int face_right, - int orientation); - - static - void (&connectivity_destroy) (p8est_connectivity_t *connectivity); - - static - types<3>::forest *(&new_forest) (MPI_Comm mpicomm, - types<3>::connectivity *connectivity, - types<3>::locidx min_quadrants, - int min_level, - int fill_uniform, - size_t data_size, - p8est_init_t init_fn, - void *user_pointer); - - static - void (&destroy) (types<3>::forest *p8est); - - static - void (&refine) (types<3>::forest *p8est, - int refine_recursive, - p8est_refine_t refine_fn, - p8est_init_t init_fn); - - static - void (&coarsen) (types<3>::forest *p8est, - int coarsen_recursive, - p8est_coarsen_t coarsen_fn, - p8est_init_t init_fn); - - static - void (&balance) (types<3>::forest *p8est, - types<3>::balance_type btype, - p8est_init_t init_fn); - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - p4est_gloidx_t (&partition) (types<3>::forest *p8est, - int partition_for_coarsening, - p8est_weight_t weight_fn); -#else - static - void (&partition) (types<3>::forest *p8est, - int partition_for_coarsening, - p8est_weight_t weight_fn); -#endif - - static - void (&save) (const char *filename, - types<3>::forest *p4est, - int save_data); - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - 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); -#else - static - types<3>::forest *(&load) (const char *filename, - MPI_Comm mpicomm, - std::size_t data_size, - int load_data, - void *user_pointer, - types<3>::connectivity **p4est); -#endif - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - int (&connectivity_save) (const char *filename, - types<3>::connectivity *connectivity); -#else - static - void (&connectivity_save) (const char *filename, - types<3>::connectivity *connectivity); -#endif - - static - int (&connectivity_is_valid) (types<3>::connectivity *connectivity); - -#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) - static - types<3>::connectivity *(&connectivity_load) (const char *filename, - size_t *length); -#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - static - types<3>::connectivity *(&connectivity_load) (const char *filename, - long unsigned *length); -#else - static - types<3>::connectivity *(&connectivity_load) (const char *filename, - long *length); -#endif - - static - unsigned int (&checksum) (types<3>::forest *p8est); - - static - void (&vtk_write_file) (types<3>::forest *p8est, - p8est_geometry_t *, - const char *baseName); - - static - types<3>::ghost *(&ghost_new) (types<3>::forest *p4est, - types<3>::balance_type btype); - - static - void (&ghost_destroy) (types<3>::ghost *ghost); - - static - void (&reset_data) (types<3>::forest *p4est, - size_t data_size, - p8est_init_t init_fn, - void *user_pointer); - - static - size_t (&forest_memory_used) (types<3>::forest *p4est); - - static - size_t (&connectivity_memory_used) (types<3>::connectivity *p4est); - - static const unsigned max_level; - }; - - - int (&functions<3>::quadrant_compare) (const void *v1, const void *v2) - = p8est_quadrant_compare; - - void (&functions<3>::quadrant_childrenv) (const types<3>::quadrant *q, - types<3>::quadrant c[]) - = p8est_quadrant_childrenv; - - int (&functions<3>::quadrant_overlaps_tree) (types<3>::tree *tree, - const types<3>::quadrant *q) - = p8est_quadrant_overlaps_tree; - - void (&functions<3>::quadrant_set_morton) (types<3>::quadrant *quadrant, - int level, - uint64_t id) - = p8est_quadrant_set_morton; - - int (&functions<3>::quadrant_is_equal) (const types<3>::quadrant *q1, - const types<3>::quadrant *q2) - = p8est_quadrant_is_equal; - - int (&functions<3>::quadrant_is_sibling) (const types<3>::quadrant *q1, - const types<3>::quadrant *q2) - = p8est_quadrant_is_sibling; - - int (&functions<3>::quadrant_is_ancestor) (const types<3>::quadrant *q1, - const types<3>::quadrant *q2) - = p8est_quadrant_is_ancestor; - - int (&functions<3>::quadrant_ancestor_id) (const types<3>::quadrant *q, - int level) - = p8est_quadrant_ancestor_id; - - int (&functions<3>::comm_find_owner) (types<3>::forest *p4est, - const types<3>::locidx which_tree, - const types<3>::quadrant *q, - const int guess) - = p8est_comm_find_owner; - - types<3>::connectivity *(&functions<3>::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) - = p8est_connectivity_new; - - void (&functions<3>::connectivity_destroy) (p8est_connectivity_t *connectivity) - = p8est_connectivity_destroy; - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,1) - void (&functions<3>::connectivity_join_faces) (types<3>::connectivity *conn, - types<3>::topidx tree_left, - types<3>::topidx tree_right, - int face_left, - int face_right, - int orientation) - = p8est_connectivity_join_faces; -#endif - - types<3>::forest *(&functions<3>::new_forest) (MPI_Comm mpicomm, - types<3>::connectivity *connectivity, - types<3>::locidx min_quadrants, - int min_level, - int fill_uniform, - size_t data_size, - p8est_init_t init_fn, - void *user_pointer) - = p8est_new_ext; - - void (&functions<3>::destroy) (types<3>::forest *p8est) - = p8est_destroy; - - void (&functions<3>::refine) (types<3>::forest *p8est, - int refine_recursive, - p8est_refine_t refine_fn, - p8est_init_t init_fn) - = p8est_refine; - - void (&functions<3>::coarsen) (types<3>::forest *p8est, - int coarsen_recursive, - p8est_coarsen_t coarsen_fn, - p8est_init_t init_fn) - = p8est_coarsen; - - void (&functions<3>::balance) (types<3>::forest *p8est, - types<3>::balance_type btype, - p8est_init_t init_fn) - = p8est_balance; - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - p4est_gloidx_t (&functions<3>::partition) (types<3>::forest *p8est, - int partition_for_coarsening, - p8est_weight_t weight_fn) - = p8est_partition_ext; -#else - void (&functions<3>::partition) (types<3>::forest *p8est, - int partition_for_coarsening, - p8est_weight_t weight_fn) - = p8est_partition_ext; -#endif - - void (&functions<3>::save) (const char *filename, - types<3>::forest *p4est, - int save_data) - = p8est_save; - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - types<3>::forest * - (&functions<3>::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) - = p8est_load_ext; -#else - types<3>::forest * - (&functions<3>::load) (const char *filename, - MPI_Comm mpicomm, - std::size_t data_size, - int load_data, - void *user_pointer, - types<3>::connectivity **p4est) - = p8est_load; -#endif - -#if DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - int (&functions<3>::connectivity_save) (const char *filename, - types<3>::connectivity *connectivity) - = p8est_connectivity_save; -#else - void (&functions<3>::connectivity_save) (const char *filename, - types<3>::connectivity *connectivity) - = p8est_connectivity_save; -#endif - - int (&functions<3>::connectivity_is_valid) (types<3>::connectivity - *connectivity) - = p8est_connectivity_is_valid; - -#if DEAL_II_P4EST_VERSION_GTE(1,0,0,0) - types<3>::connectivity * - (&functions<3>::connectivity_load) (const char *filename, - size_t *length) - = p8est_connectivity_load; -#elif DEAL_II_P4EST_VERSION_GTE(0,3,4,3) - types<3>::connectivity * - (&functions<3>::connectivity_load) (const char *filename, - long unsigned *length) - = p8est_connectivity_load; -#else - types<3>::connectivity * - (&functions<3>::connectivity_load) (const char *filename, - long *length) - = p8est_connectivity_load; -#endif - - unsigned int (&functions<3>::checksum) (types<3>::forest *p8est) - = p8est_checksum; - - void (&functions<3>::vtk_write_file) (types<3>::forest *p8est, - p8est_geometry_t *, - const char *baseName) - = p8est_vtk_write_file; - - types<3>::ghost *(&functions<3>::ghost_new) (types<3>::forest *p4est, - types<3>::balance_type btype) - = p8est_ghost_new; - - void (&functions<3>::ghost_destroy) (types<3>::ghost *ghost) - = p8est_ghost_destroy; - - void (&functions<3>::reset_data) (types<3>::forest *p4est, - size_t data_size, - p8est_init_t init_fn, - void *user_pointer) - = p8est_reset_data; - - size_t (&functions<3>::forest_memory_used) (types<3>::forest *p4est) - = p8est_memory_used; - - size_t (&functions<3>::connectivity_memory_used) (types<3>::connectivity *p4est) - = p8est_connectivity_memory_used; - - const unsigned int functions<3>::max_level = P8EST_MAXLEVEL; - - - template - void - init_quadrant_children - (const typename types::quadrant &p4est_cell, - typename types::quadrant (&p4est_children)[GeometryInfo::max_children_per_cell]) - { - - for (unsigned int c=0; - c::max_children_per_cell; ++c) - switch (dim) - { - case 2: - P4EST_QUADRANT_INIT(&p4est_children[c]); - break; - case 3: - P8EST_QUADRANT_INIT(&p4est_children[c]); - break; - default: - Assert (false, ExcNotImplemented()); - } - - - functions::quadrant_childrenv (&p4est_cell, - p4est_children); - - } - - - template - void - init_coarse_quadrant(typename types::quadrant &quad) - { - switch (dim) - { - case 2: - P4EST_QUADRANT_INIT(&quad); - break; - case 3: - P8EST_QUADRANT_INIT(&quad); - break; - default: - Assert (false, ExcNotImplemented()); - } - functions::quadrant_set_morton (&quad, - /*level=*/0, - /*index=*/0); - } - - - template - bool - quadrant_is_equal (const typename types::quadrant &q1, - const typename types::quadrant &q2) - { - return functions::quadrant_is_equal(&q1, &q2); - } - - - - template - bool - quadrant_is_ancestor (const typename types::quadrant &q1, - const typename types::quadrant &q2) - { - return functions::quadrant_is_ancestor(&q1, &q2); - } - - /** - * This struct templatizes the p4est iterate structs and function - * prototypes, which are used to execute callback functions for faces, - * edges, and corners that require local neighborhood information, i.e. - * the neighboring cells */ - template struct iter; - - template <> struct iter<2> - { - typedef p4est_iter_corner_info_t corner_info; - typedef p4est_iter_corner_side_t corner_side; - typedef p4est_iter_corner_t corner_iter; - typedef p4est_iter_face_info_t face_info; - typedef p4est_iter_face_side_t face_side; - typedef p4est_iter_face_t face_iter; - }; - - template <> struct iter<3> - { - typedef p8est_iter_corner_info_t corner_info; - typedef p8est_iter_corner_side_t corner_side; - typedef p8est_iter_corner_t corner_iter; - typedef p8est_iter_edge_info_t edge_info; - typedef p8est_iter_edge_side_t edge_side; - typedef p8est_iter_edge_t edge_iter; - typedef p8est_iter_face_info_t face_info; - typedef p8est_iter_face_side_t face_side; - typedef p8est_iter_face_t face_iter; - }; - - } -} - - namespace { template diff --git a/source/distributed/tria.inst.in b/source/distributed/tria.inst.in index 97de2c1487..c9cf19e513 100644 --- a/source/distributed/tria.inst.in +++ b/source/distributed/tria.inst.in @@ -17,41 +17,6 @@ for (deal_II_dimension : DIMENSIONS) { - -# ifdef DEAL_II_WITH_P4EST - - namespace internal - \{ - namespace p4est - \{ -#if deal_II_dimension > 1 - template - void - init_quadrant_children - (const types::quadrant & p4est_cell, - types::quadrant (&p4est_children)[GeometryInfo::max_children_per_cell]); - - template - void - init_coarse_quadrant - (types::quadrant & quad); - - template - bool - quadrant_is_equal - (const types::quadrant & q1, - const types::quadrant & q2); - - template - bool - quadrant_is_ancestor - (const types::quadrant & q1, - const types::quadrant & q2); -# endif - \} - \} -# endif // DEAL_II_WITH_P4EST - namespace parallel \{ namespace distributed -- 2.39.5