|
| | Triangulation (MPI_Comm mpi_communicator, const typename ::Triangulation< dim, spacedim >::MeshSmoothing smooth_grid=(::Triangulation< dim, spacedim >::none), const Settings settings=default_setting) |
| |
| virtual | ~Triangulation () |
| |
| virtual void | clear () |
| |
| virtual void | copy_triangulation (const ::Triangulation< dim, spacedim > &old_tria) |
| |
| virtual void | create_triangulation (const std::vector< Point< spacedim > > &vertices, const std::vector< CellData< dim > > &cells, const SubCellData &subcelldata) |
| |
| virtual void | execute_coarsening_and_refinement () |
| |
| virtual bool | prepare_coarsening_and_refinement () |
| |
| void | repartition () |
| |
| void | communicate_locally_moved_vertices (const std::vector< bool > &vertex_locally_moved) |
| |
| virtual bool | has_hanging_nodes () const |
| |
| virtual std::size_t | memory_consumption () const |
| |
| virtual std::size_t | memory_consumption_p4est () const |
| |
| void | write_mesh_vtk (const char *file_basename) const |
| |
| unsigned int | get_checksum () const |
| |
| void | save (const char *filename) const |
| |
| void | load (const char *filename, const bool autopartition=true) |
| |
| unsigned int | register_data_attach (const std::size_t size, const std_cxx11::function< void(const cell_iterator &, const CellStatus, void *)> &pack_callback) |
| |
| void | notify_ready_to_unpack (const unsigned int offset, const std_cxx11::function< void(const cell_iterator &, const CellStatus, const void *)> &unpack_callback) |
| |
| const std::vector< types::global_dof_index > & | get_p4est_tree_to_coarse_cell_permutation () const |
| |
| const std::vector< types::global_dof_index > & | get_coarse_cell_to_p4est_tree_permutation () const |
| |
| void | add_periodicity (const std::vector< GridTools::PeriodicFacePair< cell_iterator > > &) |
| |
| | Triangulation (MPI_Comm mpi_communicator, const typename ::Triangulation< dim, spacedim >::MeshSmoothing smooth_grid=(::Triangulation< dim, spacedim >::none), const bool check_for_distorted_cells=false) |
| |
| virtual MPI_Comm | get_communicator () const |
| |
| virtual void | copy_triangulation (const ::Triangulation< dim, spacedim > &old_tria) |
| |
| const std::vector< unsigned int > & | n_locally_owned_active_cells_per_processor () const |
| |
| unsigned int | n_locally_owned_active_cells () const |
| |
| virtual types::global_dof_index | n_global_active_cells () const |
| |
| virtual unsigned int | n_global_levels () const |
| |
| types::subdomain_id | locally_owned_subdomain () const |
| |
| const std::set< unsigned int > & | ghost_owners () const |
| |
| const std::set< unsigned int > & | level_ghost_owners () const |
| |
| | Triangulation (const MeshSmoothing smooth_grid=none, const bool check_for_distorted_cells=false) |
| |
| | Triangulation (const Triangulation< dim, spacedim > &t) |
| |
| virtual void | set_mesh_smoothing (const MeshSmoothing mesh_smoothing) |
| |
| void | set_boundary (const types::manifold_id number, const Boundary< dim, spacedim > &boundary_object) |
| |
| void | set_boundary (const types::manifold_id number) |
| |
| void | set_manifold (const types::manifold_id number, const Manifold< dim, spacedim > &manifold_object) |
| |
| void | set_manifold (const types::manifold_id number) |
| |
| void | set_all_manifold_ids (const types::manifold_id number) |
| |
| void | set_all_manifold_ids_on_boundary (const types::manifold_id number) |
| |
| void | set_all_manifold_ids_on_boundary (const types::boundary_id b_id, const types::manifold_id number) |
| |
| const Boundary< dim, spacedim > & | get_boundary (const types::manifold_id number) const |
| |
| const Manifold< dim, spacedim > & | get_manifold (const types::manifold_id number) const |
| |
| std::vector< types::boundary_id > | get_boundary_ids () const |
| |
| std::vector< types::boundary_id > | get_boundary_indicators () const DEAL_II_DEPRECATED |
| |
| std::vector< types::manifold_id > | get_manifold_ids () const |
| |
| virtual void | copy_triangulation (const Triangulation< dim, spacedim > &old_tria) |
| |
| virtual void | create_triangulation_compatibility (const std::vector< Point< spacedim > > &vertices, const std::vector< CellData< dim > > &cells, const SubCellData &subcelldata) |
| |
| void | flip_all_direction_flags () |
| |
| void | set_all_refine_flags () |
| |
| void | refine_global (const unsigned int times=1) |
| |
| void | save_refine_flags (std::ostream &out) const |
| |
| void | save_refine_flags (std::vector< bool > &v) const |
| |
| void | load_refine_flags (std::istream &in) |
| |
| void | load_refine_flags (const std::vector< bool > &v) |
| |
| void | save_coarsen_flags (std::ostream &out) const |
| |
| void | save_coarsen_flags (std::vector< bool > &v) const |
| |
| void | load_coarsen_flags (std::istream &out) |
| |
| void | load_coarsen_flags (const std::vector< bool > &v) |
| |
| bool | get_anisotropic_refinement_flag () const |
| |
| void | clear_user_flags () |
| |
| void | save_user_flags (std::ostream &out) const |
| |
| void | save_user_flags (std::vector< bool > &v) const |
| |
| void | load_user_flags (std::istream &in) |
| |
| void | load_user_flags (const std::vector< bool > &v) |
| |
| void | clear_user_flags_line () |
| |
| void | save_user_flags_line (std::ostream &out) const |
| |
| void | save_user_flags_line (std::vector< bool > &v) const |
| |
| void | load_user_flags_line (std::istream &in) |
| |
| void | load_user_flags_line (const std::vector< bool > &v) |
| |
| void | clear_user_flags_quad () |
| |
| void | save_user_flags_quad (std::ostream &out) const |
| |
| void | save_user_flags_quad (std::vector< bool > &v) const |
| |
| void | load_user_flags_quad (std::istream &in) |
| |
| void | load_user_flags_quad (const std::vector< bool > &v) |
| |
| void | clear_user_flags_hex () |
| |
| void | save_user_flags_hex (std::ostream &out) const |
| |
| void | save_user_flags_hex (std::vector< bool > &v) const |
| |
| void | load_user_flags_hex (std::istream &in) |
| |
| void | load_user_flags_hex (const std::vector< bool > &v) |
| |
| void | clear_user_data () |
| |
| void | save_user_indices (std::vector< unsigned int > &v) const |
| |
| void | load_user_indices (const std::vector< unsigned int > &v) |
| |
| void | save_user_pointers (std::vector< void *> &v) const |
| |
| void | load_user_pointers (const std::vector< void *> &v) |
| |
| void | save_user_indices_line (std::vector< unsigned int > &v) const |
| |
| void | load_user_indices_line (const std::vector< unsigned int > &v) |
| |
| void | save_user_indices_quad (std::vector< unsigned int > &v) const |
| |
| void | load_user_indices_quad (const std::vector< unsigned int > &v) |
| |
| void | save_user_indices_hex (std::vector< unsigned int > &v) const |
| |
| void | load_user_indices_hex (const std::vector< unsigned int > &v) |
| |
| void | save_user_pointers_line (std::vector< void *> &v) const |
| |
| void | load_user_pointers_line (const std::vector< void *> &v) |
| |
| void | save_user_pointers_quad (std::vector< void *> &v) const |
| |
| void | load_user_pointers_quad (const std::vector< void *> &v) |
| |
| void | save_user_pointers_hex (std::vector< void *> &v) const |
| |
| void | load_user_pointers_hex (const std::vector< void *> &v) |
| |
| cell_iterator | begin (const unsigned int level=0) const |
| |
| active_cell_iterator | begin_active (const unsigned int level=0) const |
| |
| cell_iterator | end () const |
| |
| cell_iterator | end (const unsigned int level) const |
| |
| active_cell_iterator | end_active (const unsigned int level) const |
| |
| cell_iterator | last () const |
| |
| active_cell_iterator | last_active () const |
| |
| IteratorRange< cell_iterator > | cell_iterators () const |
| |
| IteratorRange< active_cell_iterator > | active_cell_iterators () const |
| |
| IteratorRange< cell_iterator > | cell_iterators_on_level (const unsigned int level) const |
| |
| IteratorRange< active_cell_iterator > | active_cell_iterators_on_level (const unsigned int level) const |
| |
| face_iterator | begin_face () const |
| |
| active_face_iterator | begin_active_face () const |
| |
| face_iterator | end_face () const |
| |
| vertex_iterator | begin_vertex () const |
| |
| active_vertex_iterator | begin_active_vertex () const |
| |
| vertex_iterator | end_vertex () const |
| |
| unsigned int | n_lines () const |
| |
| unsigned int | n_lines (const unsigned int level) const |
| |
| unsigned int | n_active_lines () const |
| |
| unsigned int | n_active_lines (const unsigned int level) const |
| |
| unsigned int | n_quads () const |
| |
| unsigned int | n_quads (const unsigned int level) const |
| |
| unsigned int | n_active_quads () const |
| |
| unsigned int | n_active_quads (const unsigned int level) const |
| |
| unsigned int | n_hexs () const |
| |
| unsigned int | n_hexs (const unsigned int level) const |
| |
| unsigned int | n_active_hexs () const |
| |
| unsigned int | n_active_hexs (const unsigned int level) const |
| |
| unsigned int | n_cells () const |
| |
| unsigned int | n_cells (const unsigned int level) const |
| |
| unsigned int | n_active_cells () const |
| |
| unsigned int | n_active_cells (const unsigned int level) const |
| |
| unsigned int | n_faces () const |
| |
| unsigned int | n_active_faces () const |
| |
| unsigned int | n_levels () const |
| |
| unsigned int | n_vertices () const |
| |
| const std::vector< Point< spacedim > > & | get_vertices () const |
| |
| unsigned int | n_used_vertices () const |
| |
| bool | vertex_used (const unsigned int index) const |
| |
| const std::vector< bool > & | get_used_vertices () const |
| |
| unsigned int | max_adjacent_cells () const |
| |
| Triangulation< dim, spacedim > & | get_triangulation () |
| |
| const Triangulation< dim, spacedim > & | get_triangulation () const |
| |
| unsigned int | n_raw_lines () const |
| |
| unsigned int | n_raw_lines (const unsigned int level) const |
| |
| unsigned int | n_raw_quads () const |
| |
| unsigned int | n_raw_quads (const unsigned int level) const |
| |
| unsigned int | n_raw_hexs () const |
| |
| unsigned int | n_raw_hexs (const unsigned int level) const |
| |
| unsigned int | n_raw_cells (const unsigned int level) const |
| |
| unsigned int | n_raw_faces () const |
| |
| template<class Archive > |
| void | save (Archive &ar, const unsigned int version) const |
| |
| template<class Archive > |
| void | load (Archive &ar, const unsigned int version) |
| |
| | DeclException1 (ExcInvalidLevel, int,<< "The given level "<< arg1<< " is not in the valid range!") |
| |
| | DeclException2 (ExcTriangulationNotEmpty, int, int,<< "You are trying to perform an operation on a triangulation "<< "that is only allowed if the triangulation is currently empty. "<< "However, it currently stores "<< arg1<< " vertices and has "<< "cells on "<< arg2<< " levels.") |
| |
| | DeclException0 (ExcGridReadError) |
| |
| | DeclException0 (ExcFacesHaveNoLevel) |
| |
| | DeclException1 (ExcEmptyLevel, int,<< "You tried to do something on level "<< arg1<< ", but this level is empty.") |
| |
| | DeclException0 (ExcNonOrientableTriangulation) |
| |
| | DeclException1 (ExcBoundaryIdNotFound, types::boundary_id,<< "The given boundary_id "<< arg1<< " is not defined in this Triangulation!") |
| |
| | Subscriptor () |
| |
| | Subscriptor (const Subscriptor &) |
| |
| virtual | ~Subscriptor () |
| |
| Subscriptor & | operator= (const Subscriptor &) |
| |
| void | subscribe (const char *identifier=0) const |
| |
| void | unsubscribe (const char *identifier=0) const |
| |
| unsigned int | n_subscriptions () const |
| |
| void | list_subscribers () const |
| |
| | DeclException3 (ExcInUse, int, char *, std::string &,<< "Object of class "<< arg2<< " is still used by "<< arg1<< " other objects."<< "\"<< "(Additional information: "<< arg3<< ")\"<< "See the entry in the Frequently Asked Questions of "<< "deal.II (linked to from http://www.dealii.org/) for "<< "a lot more information on what this error means and "<< "how to fix programs in which it happens.") |
| |
| | DeclException2 (ExcNoSubscriber, char *, char *,<< "No subscriber with identifier <"<< arg2<< "> subscribes to this object of class "<< arg1<< ". Consequently, it cannot be unsubscribed.") |
| |
| template<class Archive > |
| void | serialize (Archive &ar, const unsigned int version) |
| |
template<int dim, int spacedim = dim>
class parallel::distributed::Triangulation< dim, spacedim >
This class acts like the Triangulation class, but it distributes the mesh across a number of different processors when using MPI. The class's interface does not add a lot to the Triangulation class but there are a number of difficult algorithms under the hood that ensure we always have a load-balanced, fully distributed mesh. Use of this class is explained in step-40, step-32, the Parallel computing with multiple processors using distributed memory documentation module, as well as the distributed_paper. See there for more information. This class satisfies the MeshType concept.
- Note
- This class does not support anisotropic refinement, because it relies on the p4est library that does not support this. Attempts to refine cells anisotropically will result in errors.
-
There is currently no support for distributing 1d triangulations.
Interaction with boundary description
Refining and coarsening a distributed triangulation is a complicated process because cells may have to be migrated from one processor to another. On a single processor, materializing that part of the global mesh that we want to store here from what we have stored before therefore may involve several cycles of refining and coarsening the locally stored set of cells until we have finally gotten from the previous to the next triangulation. This process is described in more detail in the distributed_paper. Unfortunately, in this process, some information can get lost relating to flags that are set by user code and that are inherited from mother to child cell but that are not moved along with a cell if that cell is migrated from one processor to another.
An example are boundary indicators. Assume, for example, that you start with a single cell that is refined once globally, yielding four children. If you have four processors, each one owns one cell. Assume now that processor 1 sets the boundary indicators of the external boundaries of the cell it owns to 42. Since processor 0 does not own this cell, it doesn't set the boundary indicators of its ghost cell copy of this cell. Now, assume we do several mesh refinement cycles and end up with a configuration where this processor suddenly finds itself as the owner of this cell. If boundary indicator 42 means that we need to integrate Neumann boundary conditions along this boundary, then processor 0 will forget to do so because it has never set the boundary indicator along this cell's boundary to 42.
The way to avoid this dilemma is to make sure that things like setting boundary indicators or material ids is done immediately every time a parallel triangulation is refined. This is not necessary for sequential triangulations because, there, these flags are inherited from mother to child cell and remain with a cell even if it is refined and the children are later coarsened again, but this does not hold for distributed triangulations. It is made even more difficult by the fact that in the process of refining a parallel distributed triangulation, the triangulation may call Triangulation::execute_coarsening_and_refinement multiple times and this function needs to know about boundaries. In other words, it is not enough to just set boundary indicators on newly created faces only after calling distributed::parallel::Triangulation::execute_coarsening_and_refinement: it actually has to happen while that function is still running.
The way to do this is by writing a function that sets boundary indicators and that will be called by the Triangulation class. The triangulation does not provide a pointer to itself to the function being called, nor any other information, so the trick is to get this information into the function. C++ provides a nice mechanism for this that is best explained using an example:
#include <deal.II/base/std_cxx11/bind.h>
template <int dim>
{
... set boundary indicators on the triangulation object ...
}
template <int dim>
void
MyClass<dim>::
{
... create the coarse mesh ...
(std_cxx11::bind (&set_boundary_ids<dim>,
std_cxx11::ref(coarse_grid)));
}
What the call to std_cxx11::bind does is to produce an object that can be called like a function with no arguments. It does so by taking the address of a function that does, in fact, take an argument but permanently fix this one argument to a reference to the coarse grid triangulation. After each refinement step, the triangulation will then call the object so created which will in turn call set_boundary_ids<dim> with the reference to the coarse grid as argument.
This approach can be generalized. In the example above, we have used a global function that will be called. However, sometimes it is necessary that this function is in fact a member function of the class that generates the mesh, for example because it needs to access run-time parameters. This can be achieved as follows: assuming the set_boundary_ids() function has been declared as a (non- static, but possibly private) member function of the MyClass class, then the following will work:
#include <deal.II/base/std_cxx11/bind.h>
template <int dim>
void
MyClass<dim>::
{
... set boundary indicators on the triangulation object ...
}
template <int dim>
void
MyClass<dim>::
{
... create the coarse mesh ...
(std_cxx11::bind (&MyGeometry<dim>::set_boundary_ids,
std_cxx11::cref(*this),
std_cxx11::ref(coarse_grid)));
}
Here, like any other member function, set_boundary_ids implicitly takes a pointer or reference to the object it belongs to as first argument. std::bind again creates an object that can be called like a global function with no arguments, and this object in turn calls set_boundary_ids with a pointer to the current object and a reference to the triangulation to work on. Note that because the create_coarse_mesh function is declared as const, it is necessary that the set_boundary_ids function is also declared const.
Note:For reasons that have to do with the way the parallel::distributed::Triangulation is implemented, functions that have been attached to the post-refinement signal of the triangulation are called more than once, sometimes several times, every time the triangulation is actually refined.
- Author
- Wolfgang Bangerth, Timo Heister 2008, 2009, 2010, 2011
Definition at line 34 of file grid_refinement.h.