}
}
- template <>
- void
- Triangulation<1,1>::
- fill_vertices_with_ghost_neighbors
- (std::map<unsigned int, std::set<dealii::types::subdomain_id> >
- &vertices_with_ghost_neighbors)
- {
- Assert (false, ExcNotImplemented());
- }
-
- template <>
- void
- Triangulation<1,2>::
- fill_vertices_with_ghost_neighbors
- (std::map<unsigned int, std::set<dealii::types::subdomain_id> >
- &vertices_with_ghost_neighbors)
- {
- Assert (false, ExcNotImplemented());
- }
-
- template <>
- void
- Triangulation<1,3>::
- fill_vertices_with_ghost_neighbors
- (std::map<unsigned int, std::set<dealii::types::subdomain_id> >
- &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 <int dim, int spacedim>
void
- Triangulation<2,2>::
+ Triangulation<dim,spacedim>::
fill_vertices_with_ghost_neighbors
(std::map<unsigned int, std::set<dealii::types::subdomain_id> >
&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<void *>(&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<unsigned int, std::set<dealii::types::subdomain_id> >
- &vertices_with_ghost_neighbors)
- {
- struct find_ghosts<2,3> fg;
+ struct find_ghosts<dim,spacedim> 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<void *>(&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<internal::p4est::types<2>::forest*>(this->parallel_forest),
+ reinterpret_cast<internal::p4est::types<2>::ghost*>(this->parallel_ghost),
+ static_cast<void *>(&fg),
+ NULL, find_ghosts_face<2,spacedim>, find_ghosts_corner<2,spacedim>);
+ break;
+
+ case 3:
+ p8est_iterate (reinterpret_cast<internal::p4est::types<3>::forest*>(this->parallel_forest),
+ reinterpret_cast<internal::p4est::types<3>::ghost*>(this->parallel_ghost),
+ static_cast<void *>(&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<unsigned int, std::set<dealii::types::subdomain_id> >
- &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<void *>(&fg),
- NULL, find_ghosts_face<3,3>, find_ghosts_edge<3,3>, find_ghosts_corner<3,3>);
-
- sc_array_destroy (fg.subids);
- }
template <int dim, int spacedim>
MPI_Comm
return mpi_communicator;
}
+
template<int dim, int spacedim>
void
Triangulation<dim,spacedim>::add_periodicity