From 48b17ff7d0376cf344910459428ba9bc179d48cb Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Thu, 3 Apr 2014 00:51:26 +0000 Subject: [PATCH] Unify several copies of the same function into a single templated one. Saves a good amount of duplicated code. git-svn-id: https://svn.dealii.org/trunk@32708 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/source/distributed/tria.cc | 109 ++++++++--------------------- 1 file changed, 29 insertions(+), 80 deletions(-) diff --git a/deal.II/source/distributed/tria.cc b/deal.II/source/distributed/tria.cc index 4085903ce0..770dc964bb 100644 --- a/deal.II/source/distributed/tria.cc +++ b/deal.II/source/distributed/tria.cc @@ -3530,104 +3530,52 @@ namespace parallel } } - template <> - void - Triangulation<1,1>:: - fill_vertices_with_ghost_neighbors - (std::map > - &vertices_with_ghost_neighbors) - { - Assert (false, ExcNotImplemented()); - } - - template <> - void - Triangulation<1,2>:: - fill_vertices_with_ghost_neighbors - (std::map > - &vertices_with_ghost_neighbors) - { - Assert (false, ExcNotImplemented()); - } - - template <> - void - Triangulation<1,3>:: - fill_vertices_with_ghost_neighbors - (std::map > - &vertices_with_ghost_neighbors) - { - Assert (false, ExcNotImplemented()); - } /** * Determine the neighboring subdomains that are adjacent to each vertex. - * This is achieved via the p4est_iterate tool + * This is achieved via the p4est_iterate/p8est_iterate tool */ - template <> + template void - Triangulation<2,2>:: + Triangulation:: fill_vertices_with_ghost_neighbors (std::map > &vertices_with_ghost_neighbors) { - struct find_ghosts<2,2> fg; + Assert (dim>1, ExcNotImplemented()); - fg.subids = sc_array_new (sizeof (dealii::types::subdomain_id)); - fg.triangulation = this; - fg.vertices_with_ghost_neighbors = &(vertices_with_ghost_neighbors); - - p4est_iterate (this->parallel_forest, this->parallel_ghost, static_cast(&fg), - NULL, find_ghosts_face<2,2>, find_ghosts_corner<2,2>); - - sc_array_destroy (fg.subids); - } - - /** - * Determine the neighboring subdomains that are adjacent to each vertex. - * This is achieved via the p4est_iterate tool - */ - template <> - void - Triangulation<2,3>:: - fill_vertices_with_ghost_neighbors - (std::map > - &vertices_with_ghost_neighbors) - { - struct find_ghosts<2,3> fg; + struct find_ghosts fg; fg.subids = sc_array_new (sizeof (dealii::types::subdomain_id)); fg.triangulation = this; - fg.vertices_with_ghost_neighbors = &(vertices_with_ghost_neighbors); + fg.vertices_with_ghost_neighbors = &vertices_with_ghost_neighbors; - p4est_iterate (this->parallel_forest, this->parallel_ghost, static_cast(&fg), - NULL, find_ghosts_face<2,3>, find_ghosts_corner<2,3>); + // switch between functions. to make the compiler happy, we need to cast + // the first two arguments to the type p[48]est_iterate wants to see. this + // cast is the identity cast in each of the two branches, so it is safe. + switch (dim) + { + case 2: + p4est_iterate (reinterpret_cast::forest*>(this->parallel_forest), + reinterpret_cast::ghost*>(this->parallel_ghost), + static_cast(&fg), + NULL, find_ghosts_face<2,spacedim>, find_ghosts_corner<2,spacedim>); + break; + + case 3: + p8est_iterate (reinterpret_cast::forest*>(this->parallel_forest), + reinterpret_cast::ghost*>(this->parallel_ghost), + static_cast(&fg), + NULL, find_ghosts_face<3,spacedim>, find_ghosts_edge<3,spacedim>, find_ghosts_corner<3,spacedim>); + break; + + default: + Assert (false, ExcNotImplemented()); + } sc_array_destroy (fg.subids); } - /** - * Determine the neighboring subdomains that are adjacent to each vertex. - * This is achieved via the p8est_iterate tool - */ - template <> - void - Triangulation<3,3>:: - fill_vertices_with_ghost_neighbors - (std::map > - &vertices_with_ghost_neighbors) - { - struct find_ghosts<3,3> fg; - - fg.subids = sc_array_new (sizeof (dealii::types::subdomain_id)); - fg.triangulation = this; - fg.vertices_with_ghost_neighbors = &(vertices_with_ghost_neighbors); - - p8est_iterate (this->parallel_forest, this->parallel_ghost, static_cast(&fg), - NULL, find_ghosts_face<3,3>, find_ghosts_edge<3,3>, find_ghosts_corner<3,3>); - - sc_array_destroy (fg.subids); - } template MPI_Comm @@ -3636,6 +3584,7 @@ namespace parallel return mpi_communicator; } + template void Triangulation::add_periodicity -- 2.39.5