Reference documentation for deal.II version 9.3.3
|
#include <deal.II/distributed/shared_tria.h>
Public Types | |
enum | Settings { partition_auto = 0x0 , partition_metis = 0x1 , partition_zorder = 0x2 , partition_zoltan = 0x3 , partition_custom_signal = 0x4 , construct_multigrid_hierarchy = 0x8 } |
using | active_cell_iterator = typename ::Triangulation< dim, spacedim >::active_cell_iterator |
using | cell_iterator = typename ::Triangulation< dim, spacedim >::cell_iterator |
enum | MeshSmoothing |
using | level_cell_iterator = cell_iterator |
using | face_iterator = TriaIterator< TriaAccessor< dim - 1, dim, spacedim > > |
using | active_face_iterator = TriaActiveIterator< TriaAccessor< dim - 1, dim, spacedim > > |
using | vertex_iterator = TriaIterator<::TriaAccessor< 0, dim, spacedim > > |
using | active_vertex_iterator = TriaActiveIterator<::TriaAccessor< 0, dim, spacedim > > |
using | line_iterator = typename IteratorSelector::line_iterator |
using | active_line_iterator = typename IteratorSelector::active_line_iterator |
using | quad_iterator = typename IteratorSelector::quad_iterator |
using | active_quad_iterator = typename IteratorSelector::active_quad_iterator |
using | hex_iterator = typename IteratorSelector::hex_iterator |
using | active_hex_iterator = typename IteratorSelector::active_hex_iterator |
Public Member Functions | |
Triangulation (const MPI_Comm &mpi_communicator, const typename ::Triangulation< dim, spacedim >::MeshSmoothing=(::Triangulation< dim, spacedim >::none), const bool allow_artificial_cells=false, const Settings settings=partition_auto) | |
virtual | ~Triangulation () override=default |
virtual bool | is_multilevel_hierarchy_constructed () const override |
virtual void | execute_coarsening_and_refinement () override |
virtual void | create_triangulation (const std::vector< Point< spacedim > > &vertices, const std::vector< CellData< dim > > &cells, const SubCellData &subcelldata) override |
virtual void | create_triangulation (const TriangulationDescription::Description< dim, spacedim > &construction_data) override |
virtual void | copy_triangulation (const ::Triangulation< dim, spacedim > &other_tria) override |
template<class Archive > | |
void | load (Archive &ar, const unsigned int version) |
const std::vector< types::subdomain_id > & | get_true_subdomain_ids_of_cells () const |
const std::vector< types::subdomain_id > & | get_true_level_subdomain_ids_of_cells (const unsigned int level) const |
bool | with_artificial_cells () const |
virtual MPI_Comm | get_communicator () const override |
virtual void | copy_triangulation (const Triangulation< dim, spacedim > &other_tria) |
unsigned int | n_locally_owned_active_cells () const |
virtual types::global_cell_index | n_global_active_cells () const override |
virtual std::size_t | memory_consumption () const override |
virtual unsigned int | n_global_levels () const override |
types::subdomain_id | locally_owned_subdomain () const override |
const std::set< types::subdomain_id > & | ghost_owners () const |
const std::set< types::subdomain_id > & | level_ghost_owners () const |
const std::weak_ptr< const Utilities::MPI::Partitioner > | global_active_cell_index_partitioner () const |
const std::weak_ptr< const Utilities::MPI::Partitioner > | global_level_cell_index_partitioner (const unsigned int level) const |
virtual std::map< unsigned int, std::set<::types::subdomain_id > > | compute_vertices_with_ghost_neighbors () const |
virtual std::vector< types::boundary_id > | get_boundary_ids () const override |
virtual std::vector< types::manifold_id > | get_manifold_ids () const override |
void | communicate_locally_moved_vertices (const std::vector< bool > &vertex_locally_moved) |
virtual void | clear () |
virtual void | set_mesh_smoothing (const MeshSmoothing mesh_smoothing) |
virtual const MeshSmoothing & | get_mesh_smoothing () const |
void | set_manifold (const types::manifold_id number, const Manifold< dim, spacedim > &manifold_object) |
void | reset_manifold (const types::manifold_id manifold_number) |
void | reset_all_manifolds () |
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 Manifold< dim, spacedim > & | get_manifold (const types::manifold_id number) const |
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 () |
bool | prepare_coarsening_and_refinement () |
bool | prepare_coarsening_and_refinement () |
bool | prepare_coarsening_and_refinement () |
unsigned int | n_quads () const |
unsigned int | n_quads (const unsigned int) const |
unsigned int | n_quads () const |
unsigned int | n_quads (const unsigned int) const |
unsigned int | n_quads () const |
unsigned int | n_quads (const unsigned int) const |
unsigned int | n_active_quads (const unsigned int) const |
unsigned int | n_active_quads () const |
unsigned int | n_active_quads (const unsigned int) const |
unsigned int | n_active_quads () const |
unsigned int | n_active_quads (const unsigned int) const |
unsigned int | n_active_quads () 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 | max_adjacent_cells () const |
unsigned int | max_adjacent_cells () const |
unsigned int | max_adjacent_cells () const |
unsigned int | n_raw_quads (const unsigned int) const |
unsigned int | n_raw_quads (const unsigned int) const |
unsigned int | n_raw_quads (const unsigned int) const |
unsigned int | n_raw_quads (const unsigned int level) const |
unsigned int | n_raw_quads (const unsigned int level) const |
unsigned int | n_raw_quads (const unsigned int) const |
unsigned int | n_raw_quads () const |
unsigned int | n_raw_hexs (const unsigned int) const |
unsigned int | n_raw_hexs (const unsigned int) const |
unsigned int | n_raw_hexs (const unsigned int) const |
unsigned int | n_raw_hexs (const unsigned int level) const |
Mesh refinement | |
void | set_all_refine_flags () |
void | refine_global (const unsigned int times=1) |
void | coarsen_global (const unsigned int times=1) |
virtual bool | prepare_coarsening_and_refinement () |
History of a triangulation | |
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 |
User data | |
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 functions | |
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 |
cell_iterator | create_cell_iterator (const CellId &cell_id) const |
Cell iterator functions returning ranges of iterators | |
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 functions | |
face_iterator | begin_face () const |
active_face_iterator | begin_active_face () const |
face_iterator | end_face () const |
IteratorRange< active_face_iterator > | active_face_iterators () const |
Vertex iterator functions | |
vertex_iterator | begin_vertex () const |
active_vertex_iterator | begin_active_vertex () const |
vertex_iterator | end_vertex () const |
Information about the triangulation | |
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 |
virtual bool | has_hanging_nodes () 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 |
Internal information about the number of objects | |
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 level) const |
unsigned int | n_raw_cells (const unsigned int level) const |
unsigned int | n_raw_faces () const |
void | save (Archive &ar, const unsigned int version) const |
virtual void | add_periodicity (const std::vector< GridTools::PeriodicFacePair< cell_iterator > > &) |
const std::map< std::pair< cell_iterator, unsigned int >, std::pair< std::pair< cell_iterator, unsigned int >, std::bitset< 3 > > > & | get_periodic_face_map () const |
const std::vector< ReferenceCell > & | get_reference_cells () const |
bool | all_reference_cells_are_hyper_cube () const |
void | serialize (Archive &archive, const unsigned int version) |
Static Public Attributes | |
static const unsigned int | dimension |
static const unsigned int | space_dimension |
Protected Member Functions | |
virtual void | update_number_cache () |
void | update_reference_cells () override |
void | reset_global_cell_indices () |
Protected Attributes | |
const MPI_Comm | mpi_communicator |
types::subdomain_id | my_subdomain |
types::subdomain_id | n_subdomains |
NumberCache | number_cache |
Private Types | |
using | IteratorSelector = ::internal::TriangulationImplementation::Iterators< dim, spacedim > |
Private Member Functions | |
void | partition () |
Line iterator functions for internal use | |
raw_line_iterator | begin_raw_line (const unsigned int level=0) const |
line_iterator | begin_line (const unsigned int level=0) const |
active_line_iterator | begin_active_line (const unsigned int level=0) const |
line_iterator | end_line () const |
Quad iterator functions for internal use | |
raw_quad_iterator | begin_raw_quad (const unsigned int level=0) const |
quad_iterator | begin_quad (const unsigned int level=0) const |
active_quad_iterator | begin_active_quad (const unsigned int level=0) const |
quad_iterator | end_quad () const |
Private Attributes | |
const Settings | settings |
const bool | allow_artificial_cells |
std::vector< types::subdomain_id > | true_subdomain_ids_of_cells |
std::vector< std::vector< types::subdomain_id > > | true_level_subdomain_ids_of_cells |
Keeping up with what happens to a triangulation | |
enum | CellStatus |
Signals | signals |
Subscriptor functionality | |
Classes derived from Subscriptor provide a facility to subscribe to this object. This is mostly used by the SmartPointer class. | |
std::atomic< unsigned int > | counter |
std::map< std::string, unsigned int > | counter_map |
std::vector< std::atomic< bool > * > | validity_pointers |
const std::type_info * | object_info |
void | subscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
void | unsubscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
unsigned int | n_subscriptions () const |
template<typename StreamType > | |
void | list_subscribers (StreamType &stream) const |
void | list_subscribers () const |
void | check_no_subscribers () const noexcept |
using | map_value_type = decltype(counter_map)::value_type |
using | map_iterator = decltype(counter_map)::iterator |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
static std::mutex | mutex |
Cell iterator functions for internal use | |
raw_cell_iterator | begin_raw (const unsigned int level=0) const |
raw_cell_iterator | end_raw (const unsigned int level) const |
using | raw_cell_iterator = TriaRawIterator< CellAccessor< dim, spacedim > > |
using | raw_face_iterator = TriaRawIterator< TriaAccessor< dim - 1, dim, spacedim > > |
using | raw_vertex_iterator = TriaRawIterator<::TriaAccessor< 0, dim, spacedim > > |
using | raw_line_iterator = typename IteratorSelector::raw_line_iterator |
using | raw_quad_iterator = typename IteratorSelector::raw_quad_iterator |
using | raw_hex_iterator = typename IteratorSelector::raw_hex_iterator |
This class provides a parallel triangulation for which every processor knows about every cell of the global mesh (unlike for the parallel::distributed::Triangulation class) but in which cells are automatically partitioned when run with MPI so that each processor "owns" a subset of cells. The use of this class is demonstrated in step-18.
Different from the parallel::distributed::Triangulation and parallel::fullydistributed::Triangulation classes, this implies that the entire mesh is stored on each processor. While this is clearly a memory bottleneck that limits the use of this class to a few dozen or hundreds of MPI processes, the partitioning of the mesh can be used to partition work such as assembly or postprocessing between participating processors, and it can also be used to partition which processor stores which parts of matrices and vectors. As a consequence, using this class is often a gentler introduction to parallelizing a code than the more involved parallel::distributed::Triangulation class in which processors only know their own part of the mesh, but nothing about cells owned by other processors with the exception of a single layer of ghost cells around their own part of the domain.
As a consequence of storing the entire mesh on each processor, active cells need to be flagged for refinement or coarsening consistently on all processors if you want to adapt them, regardless of being classified as locally owned, ghost or artificial.
The class is also useful in cases where compute time and memory considerations dictate that the program needs to be run in parallel, but where algorithmic concerns require that every processor knows about the entire mesh. An example could be where an application has to have both volume and surface meshes that can then both be partitioned independently, but where it is difficult to ensure that the locally owned set of surface mesh cells is adjacent to the locally owned set of volume mesh cells and the other way around. In such cases, knowing the entirety of both meshes ensures that assembly of coupling terms can be implemented without also implementing overly complicated schemes to transfer information about adjacent cells from processor to processor.
The partitioning of cells between processors is done internally based on a number of different possibilities. By passing appropriate flags to the constructor of this class (see the parallel::shared::Triangulation::Settings enum), it is possible to select different ways of partitioning the mesh, including ways that are dictated by the application and not by the desire to minimize the length of the interface between subdomains owned by processors (as is done by the METIS and Zoltan packages, both of which are options for partitioning). The DoFHandler class knows how to enumerate degrees of freedom in ways appropriate for the partitioned mesh.
Definition at line 105 of file shared_tria.h.
using parallel::shared::Triangulation< dim, spacedim >::active_cell_iterator = typename ::Triangulation<dim, spacedim>::active_cell_iterator |
Definition at line 109 of file shared_tria.h.
using parallel::shared::Triangulation< dim, spacedim >::cell_iterator = typename ::Triangulation<dim, spacedim>::cell_iterator |
Definition at line 111 of file shared_tria.h.
|
privateinherited |
|
inherited |
|
inherited |
An alias that is used to identify iterators that point to faces. The concept of iterators is discussed at length in the iterators documentation module.
The current alias identifies faces in a triangulation. The TriaIterator class works like a pointer to objects that when you dereference it yields an object of type TriaAccessor, i.e., class that can be used to query geometric properties of faces such as their vertices, their area, etc.
|
inherited |
An alias that is used to identify iterators that point to active faces, i.e., to faces that have no children. Active faces must be faces of at least one active cell.
Other than the "active" qualification, this alias is identical to the face_iterator
alias. In particular, dereferencing either yields the same kind of object.
|
inherited |
An alias that defines an iterator type to iterate over vertices of a mesh. The concept of iterators is discussed at length in the iterators documentation module.
|
inherited |
An alias that defines an iterator type to iterate over vertices of a mesh. The concept of iterators is discussed at length in the iterators documentation module.
This alias is in fact identical to the vertex_iterator
alias above since all vertices in a mesh are active (i.e., are a vertex of an active cell).
|
inherited |
|
inherited |
An alias that allows iterating over the active lines, i.e., that subset of lines that have no children. In one-dimensional meshes, these are the cells of the mesh, whereas in two-dimensional meshes the lines are the faces of cells.
In two- or three-dimensional meshes, lines without children (i.e., the active lines) are part of at least one active cell. Each such line may additionally be a child of a line of a coarser cell adjacent to a cell that is active. (This coarser neighbor would then also be active.)
|
inherited |
|
inherited |
An alias that allows iterating over the active quads, i.e., that subset of quads that have no children. In two-dimensional meshes, these are the cells of the mesh, whereas in three-dimensional meshes the quads are the faces of cells.
In three-dimensional meshes, quads without children (i.e., the active quads) are faces of at least one active cell. Each such quad may additionally be a child of a quad face of a coarser cell adjacent to a cell that is active. (This coarser neighbor would then also be active.)
|
inherited |
|
inherited |
An alias that allows iterating over the active hexes of a mesh. This iterator only makes sense in three-dimensional meshes, where hexes are the cells of the mesh. Consequently, in these three-dimensional meshes, this iterator is equivalent to the active_cell_iterator
alias.
|
privateinherited |
Declare a number of iterator types for raw iterators, i.e., iterators that also iterate over holes in the list of cells left by cells that have been coarsened away in previous mesh refinement cycles.
Since users should never have to access these internal properties of how we store data, these iterator types are made private.
|
privateinherited |
|
privateinherited |
|
privateinherited |
|
privateinherited |
|
privateinherited |
Configuration flags for distributed Triangulations to be set in the constructor. Settings can be combined using bitwise OR.
The constructor requires that exactly one of partition_auto
, partition_metis
, partition_zorder
, partition_zoltan
and partition_custom_signal
is set. If partition_auto
is chosen, it will use partition_zoltan
(if available), then partition_metis
(if available) and finally partition_zorder
.
Enumerator | |
---|---|
partition_auto | Choose the partitioner depending on the enabled dependencies that were found when configuring deal.II. In particular, if the Trilinos package Zoltan was found, then use the |
partition_metis | Use METIS partitioner to partition active cells. |
partition_zorder | Partition active cells with the same scheme used in the p4est library. The term "Z-order" originates in the fact that cells are sorted using a space filling curve which in 2d connects the four children of a cell in the order bottom left, bottom right, top left, top right (i.e., with a curve that looks like a reverse "Z"), and does so recursively on all levels of a triangulation. This is also the order in which children are enumerated by the GeometryInfo class. The "Z-order" is also sometimes called "Morton ordering", see https://en.wikipedia.org/wiki/Z-order_curve .
|
partition_zoltan | Use Zoltan to partition active cells. |
partition_custom_signal | Partition cells using a custom, user defined function. This is accomplished by connecting the post_refinement signal to the triangulation whenever it is first created and passing the user defined function through the signal using template <int dim>
void mypartition(parallel::shared::Triangulation<dim> &tria)
{
// user defined partitioning scheme: assign subdomain_ids
// round-robin in a mostly random way:
std::vector<unsigned int> assignment =
{0,0,1,2,0,0,2,1,0,2,2,1,2,2,0,0};
unsigned int index = 0;
cell->set_subdomain_id(assignment[(index++)%16]);
}
int main ()
{
...,
tria.signals.post_refinement.connect(std::bind(&mypartition<dim>,
std::ref(tria)));
}
IteratorRange< active_cell_iterator > active_cell_iterators() const An equivalent code using lambda functions would look like this: int main ()
{
...,
tria.signals.post_refinement.connect (
[&tria]()
{
// user defined partitioning scheme as above
...
});
}
|
construct_multigrid_hierarchy | This flag needs to be set to use the geometric multigrid functionality. This option requires additional computation and communication. Note: This flag should always be set alongside a flag for an active cell partitioning method. |
Definition at line 127 of file shared_tria.h.
|
inherited |
Declare some symbolic names for mesh smoothing algorithms. The meaning of these flags is documented in the Triangulation class.
|
inherited |
Used to inform functions in derived classes how the cell with the given cell_iterator is going to change. Note that this may me different than the refine_flag() and coarsen_flag() in the cell_iterator in parallel calculations because of refinement constraints that this machine does not see.
Triangulation< dim, spacedim >::Triangulation | ( | const MPI_Comm & | mpi_communicator, |
const typename ::Triangulation< dim, spacedim >::MeshSmoothing | smooth_grid = (::Triangulation<dim, spacedim>::none) , |
||
const bool | allow_artificial_cells = false , |
||
const Settings | settings = partition_auto |
||
) |
Constructor.
The flag allow_artificial_cells
can be used to enable artificial cells. If enabled, this class will behave similarly to parallel::distributed::Triangulation and parallel::fullydistributed::Triangulation in the sense that there will be locally owned cells, a single layer of ghost cells, and artificial cells. However, one should not forget that in contrast to those parallel triangulations all cells are duplicated on all processes, leading in most cases to significantly more artificial cells.
If artificial cells are disabled, all non-locally owned cells are considered ghost cells. This might lead to very expensive ghost-value update steps. While in the case of artificial cells, ghost-value updates lead to communication only with the direct process neighbors in a point-to-point fashion, these degenerate to an operation in which every process communicates with every other process (an "all-to-all" communication) if no artificial cells are available. If such ghost-value updates are the bottleneck in your code, you may want to consider enabling artificial cells.
Definition at line 39 of file shared_tria.cc.
|
overridevirtualdefault |
Destructor.
Reimplemented from Triangulation< dim, spacedim >.
|
overridevirtual |
Return if multilevel hierarchy is supported and has been constructed.
Implements parallel::TriangulationBase< dim, dim >.
Definition at line 74 of file shared_tria.cc.
|
overridevirtual |
Coarsen and refine the mesh according to refinement and coarsening flags set.
This step is equivalent to the Triangulation class with an addition of calling GridTools::partition_triangulation() at the end.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 357 of file shared_tria.cc.
|
overridevirtual |
Create a triangulation.
This function also partitions triangulation based on the MPI communicator provided to the constructor.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 368 of file shared_tria.cc.
|
overridevirtual |
Create a triangulation.
This function also partitions triangulation based on the MPI communicator provided to the constructor.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 394 of file shared_tria.cc.
|
overridevirtual |
Copy other_tria
to this triangulation.
This function also partitions triangulation based on the MPI communicator provided to the constructor.
Reimplemented from parallel::TriangulationBase< dim, dim >.
Definition at line 407 of file shared_tria.cc.
void Triangulation< dim, spacedim >::load | ( | Archive & | ar, |
const unsigned int | version | ||
) |
Read the data of this object from a stream for the purpose of serialization. Throw away the previous content.
This function first does the same work as in Triangulation::load, then partitions the triangulation based on the MPI communicator provided to the constructor.
Definition at line 407 of file shared_tria.h.
const std::vector< types::subdomain_id > & Triangulation< dim, spacedim >::get_true_subdomain_ids_of_cells |
Return a vector of length Triangulation::n_active_cells() where each element stores the subdomain id of the owner of this cell. The elements of the vector are obviously the same as the subdomain ids for locally owned and ghost cells, but are also correct for artificial cells that do not store who the owner of the cell is in their subdomain_id field.
Definition at line 333 of file shared_tria.cc.
const std::vector< types::subdomain_id > & Triangulation< dim, spacedim >::get_true_level_subdomain_ids_of_cells | ( | const unsigned int | level | ) | const |
Return a vector of length Triangulation::n_cells(level) where each element stores the level subdomain id of the owner of this cell. The elements of the vector are obviously the same as the level subdomain ids for locally owned and ghost cells, but are also correct for artificial cells that do not store who the owner of the cell is in their level_subdomain_id field.
Definition at line 342 of file shared_tria.cc.
bool Triangulation< dim, spacedim >::with_artificial_cells |
Return allow_artificial_cells , namely true if artificial cells are allowed.
Definition at line 324 of file shared_tria.cc.
|
private |
This function calls GridTools::partition_triangulation () and if requested in the constructor of the class marks artificial cells.
Definition at line 83 of file shared_tria.cc.
|
overridevirtualinherited |
Return MPI communicator used by this triangulation.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 99 of file tria_base.cc.
|
virtualinherited |
Copy other_tria
to this triangulation. This operation is not cheap, so you should be careful with using this. We do not implement this function as a copy constructor, since it makes it easier to maintain collections of triangulations if you can assign them values later on.
Keep in mind that this function also copies the pointer to the boundary descriptor previously set by the set_manifold
function. You must therefore also guarantee that the Manifold objects describing the boundary have a lifetime at least as long as the copied triangulation.
This triangulation must be empty beforehand.
The function is made virtual
since some derived classes might want to disable or extend the functionality of this function.
|
inherited |
Return the number of active cells in the triangulation that are locally owned, i.e. that have a subdomain_id equal to locally_owned_subdomain(). Note that there may be more active cells in the triangulation stored on the present processor, such as for example ghost cells, or cells further away from the locally owned block of cells but that are needed to ensure that the triangulation that stores this processor's set of active cells still remains balanced with respect to the 2:1 size ratio of adjacent cells.
As a consequence of the remark above, the result of this function is always smaller or equal to the result of the function with the same name in the Triangulation base class, which includes the active ghost and artificial cells (see also GlossArtificialCell and GlossGhostCell).
Definition at line 138 of file tria_base.cc.
|
overridevirtualinherited |
Return the sum over all processors of the number of active cells owned by each processor. This equals the overall number of active cells in the triangulation.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 146 of file tria_base.cc.
|
overridevirtualinherited |
Return the local memory consumption in bytes.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 152 of file tria_base.cc.
|
overridevirtualinherited |
Return the global maximum level. This may be bigger than the number Triangulation::n_levels() (a function in this class's base class) returns if the current processor only stores cells in parts of the domain that are not very refined, but if other processors store cells in more deeply refined parts of the domain.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 163 of file tria_base.cc.
|
overridevirtualinherited |
Return the subdomain id of those cells that are owned by the current processor. All cells in the triangulation that do not have this subdomain id are either owned by another processor or have children that only exist on other processors.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 172 of file tria_base.cc.
|
inherited |
Return a set of MPI ranks of the processors that have at least one ghost cell adjacent to the cells of the local processor. In other words, this is the set of subdomain_id() for all ghost cells.
The returned sets are symmetric, that is if i
is contained in the list of processor j
, then j
will also be contained in the list of processor i
.
Definition at line 184 of file tria_base.cc.
|
inherited |
Return a set of MPI ranks of the processors that have at least one level ghost cell adjacent to our cells used in geometric multigrid. In other words, this is the set of level_subdomain_id() for all level ghost cells.
The returned sets are symmetric, that is if i
is contained in the list of processor j
, then j
will also be contained in the list of processor i
.
Definition at line 202 of file tria_base.cc.
|
inherited |
Return partitioner for the global indices of the cells on the active level of the triangulation.
Definition at line 209 of file tria_base.cc.
|
inherited |
Return partitioner for the global indices of the cells on the given level
of the triangulation.
Definition at line 216 of file tria_base.cc.
|
virtualinherited |
Return a map that, for each vertex, lists all the processors whose subdomains are adjacent to that vertex.
Definition at line 228 of file tria_base.cc.
|
overridevirtualinherited |
Return a vector containing all boundary indicators assigned to boundary faces of active cells of this Triangulation object. Note, that each boundary indicator is reported only once. The size of the return vector will represent the number of different indicators (which is greater or equal one).
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 237 of file tria_base.cc.
|
overridevirtualinherited |
Return a vector containing all manifold indicators assigned to the objects of the active cells of this Triangulation. Note, that each manifold indicator is reported only once. The size of the return vector will represent the number of different indicators (which is greater or equal one).
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 246 of file tria_base.cc.
|
inherited |
When vertices have been moved locally, for example using code like
then this function can be used to update the location of vertices between MPI processes.
All the vertices that have been moved and might be in the ghost layer of a process have to be reported in the vertex_locally_moved
argument. This ensures that that part of the information that has to be send between processes is actually sent. Additionally, it is quite important that vertices on the boundary between processes are reported on exactly one process (e.g. the one with the highest id). Otherwise we could expect undesirable results if multiple processes move a vertex differently. A typical strategy is to let processor \(i\) move those vertices that are adjacent to cells whose owners include processor \(i\) but no other processor \(j\) with \(j<i\); in other words, for vertices at the boundary of a subdomain, the processor with the lowest subdomain id "owns" a vertex.
vertex_locally_moved
argument may not contain vertices that aren't at least on ghost cells.vertex_locally_moved | A bitmap indicating which vertices have been moved. The size of this array must be equal to Triangulation::n_vertices() and must be a subset of those vertices flagged by GridTools::get_locally_owned_vertices(). |
Definition at line 301 of file tria_base.cc.
|
protectedvirtualinherited |
Update the number_cache variable after mesh creation or refinement.
Definition at line 376 of file tria_base.cc.
|
overrideprotectedvirtualinherited |
Update the internal reference_cells vector.
Reimplemented from Triangulation< dim, spacedim >.
Definition at line 382 of file tria_base.cc.
|
protectedinherited |
Reset global active cell indices and global level cell indices.
Definition at line 388 of file tria_base.cc.
|
virtualinherited |
Reset this triangulation into a virgin state by deleting all data.
Note that this operation is only allowed if no subscriptions to this object exist any more, such as DoFHandler objects using it.
Reimplemented in parallel::distributed::Triangulation< dim, spacedim >, parallel::DistributedTriangulationBase< dim, spacedim >, parallel::DistributedTriangulationBase< dim, dim >, and parallel::DistributedTriangulationBase< 1, spacedim >.
|
virtualinherited |
Set the mesh smoothing to mesh_smoothing
. This overrides the MeshSmoothing given to the constructor. It is allowed to call this function only if the triangulation is empty.
|
virtualinherited |
Return the mesh smoothing requirements that are obeyed.
|
inherited |
Assign a manifold object to a certain part of the triangulation. If an object with manifold number number
is refined, this object is used to find the location of new vertices (see the results section of step-49 for a more in-depth discussion of this, with examples). It is also used for non-linear (i.e.: non-Q1) transformations of cells to the unit cell in shape function calculations.
A copy of manifold_object
is created using Manifold<dim, spacedim>::clone() and stored internally.
It is possible to remove or replace a Manifold object during the lifetime of a non-empty triangulation. Usually, this is done before the first refinement and is dangerous afterwards. Removal of a manifold object is done by reset_manifold(). This operation then replaces the manifold object given before by a straight manifold approximation.
|
inherited |
Reset those parts of the triangulation with the given manifold_number
to use a FlatManifold object. This is the default state of a non-curved triangulation, and undoes assignment of a different Manifold object by the function Triangulation::set_manifold().
|
inherited |
Reset all parts of the triangulation, regardless of their manifold_id, to use a FlatManifold object. This undoes assignment of all Manifold objects by the function Triangulation::set_manifold().
|
inherited |
Set the manifold_id of all cells and faces to the given argument.
|
inherited |
Set the manifold_id of all boundary faces to the given argument.
|
inherited |
Set the manifold_id of all boundary faces and edges with given boundary_id b_id
to the given manifold_id number
.
|
inherited |
Return a constant reference to a Manifold object used for this triangulation. number
is the same as in set_manifold().
|
virtualinherited |
For backward compatibility, only. This function takes the cell data in the ordering as requested by deal.II versions up to 5.2, converts it to the new (lexicographic) ordering and calls create_triangulation().
|
inherited |
Revert or flip the direction_flags of a dim<spacedim triangulation, see GlossDirectionFlag.
This function throws an exception if dim equals spacedim.
|
inherited |
Flag all active cells for refinement. This will refine all cells of all levels which are not already refined (i.e. only cells are refined which do not yet have children). The cells are only flagged, not refined, thus you have the chance to save the refinement flags.
|
inherited |
Refine all cells times
times. In other words, in each one of the times
iterations, loop over all cells and refine each cell uniformly into \(2^\text{dim}\) children. In practice, this function repeats the following operations times
times: call set_all_refine_flags() followed by execute_coarsening_and_refinement(). The end result is that the number of cells increases by a factor of \((2^\text{dim})^\text{times}=2^{\text{dim} \times \text{times}}\).
The execute_coarsening_and_refinement() function called in this loop may throw an exception if it creates cells that are distorted (see its documentation for an explanation). This exception will be propagated through this function if that happens, and you may not get the actual number of refinement steps in that case.
times > 1
) . See the section on signals in the general documentation of this class.
|
inherited |
Coarsen all cells the given number of times.
In each of one of the times
iterations, all cells will be marked for coarsening. If an active cell is already on the coarsest level, it will be ignored.
times > 1
) . See the section on signals in the general documentation of this class.
|
virtualinherited |
Do both preparation for refinement and coarsening as well as mesh smoothing.
Regarding the refinement process it fixes the closure of the refinement in dim>=2
(make sure that no two cells are adjacent with a refinement level differing with more than one), etc. It performs some mesh smoothing if the according flag was given to the constructor of this class. The function returns whether additional cells have been flagged for refinement.
See the general doc of this class for more information on smoothing upon refinement.
Regarding the coarsening part, flagging and deflagging cells in preparation of the actual coarsening step are done. This includes deleting coarsen flags from cells which may not be deleted (e.g. because one neighbor is more refined than the cell), doing some smoothing, etc.
The effect is that only those cells are flagged for coarsening which will actually be coarsened. This includes the fact that all flagged cells belong to parent cells of which all children are flagged.
The function returns whether some cells' flagging has been changed in the process.
This function uses the user flags, so store them if you still need them afterwards.
Reimplemented in parallel::fullydistributed::Triangulation< dim, spacedim >, and parallel::distributed::Triangulation< dim, spacedim >.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Save the addresses of the cells which are flagged for refinement to out
. For usage, read the general documentation for this class.
|
inherited |
Same as above, but store the flags to a bitvector rather than to a file.
|
inherited |
Read the information stored by save_refine_flags
.
|
inherited |
Read the information stored by save_refine_flags
.
|
inherited |
Analogue to save_refine_flags
.
|
inherited |
Same as above, but store the flags to a bitvector rather than to a file.
|
inherited |
Analogue to load_refine_flags
.
|
inherited |
Analogue to load_refine_flags
.
|
inherited |
Return whether this triangulation has ever undergone anisotropic (as opposed to only isotropic) refinement.
|
inherited |
Clear all user flags. See also GlossUserFlags.
|
inherited |
Save all user flags. See the general documentation for this class and the documentation for the save_refine_flags
for more details. See also GlossUserFlags.
|
inherited |
Same as above, but store the flags to a bitvector rather than to a file. The output vector is resized if necessary. See also GlossUserFlags.
|
inherited |
Read the information stored by save_user_flags
. See also GlossUserFlags.
|
inherited |
Read the information stored by save_user_flags
. See also GlossUserFlags.
|
inherited |
Clear all user flags on lines. See also GlossUserFlags.
|
inherited |
Save the user flags on lines. See also GlossUserFlags.
|
inherited |
Same as above, but store the flags to a bitvector rather than to a file. The output vector is resized if necessary. See also GlossUserFlags.
|
inherited |
Load the user flags located on lines. See also GlossUserFlags.
|
inherited |
Load the user flags located on lines. See also GlossUserFlags.
|
inherited |
Clear all user flags on quads. See also GlossUserFlags.
|
inherited |
Save the user flags on quads. See also GlossUserFlags.
|
inherited |
Same as above, but store the flags to a bitvector rather than to a file. The output vector is resized if necessary. See also GlossUserFlags.
|
inherited |
Load the user flags located on quads. See also GlossUserFlags.
|
inherited |
Load the user flags located on quads. See also GlossUserFlags.
|
inherited |
Clear all user flags on quads. See also GlossUserFlags.
|
inherited |
Save the user flags on hexs. See also GlossUserFlags.
|
inherited |
Same as above, but store the flags to a bitvector rather than to a file. The output vector is resized if necessary. See also GlossUserFlags.
|
inherited |
Load the user flags located on hexs. See also GlossUserFlags.
|
inherited |
Load the user flags located on hexs. See also GlossUserFlags.
|
inherited |
Clear all user pointers and indices and allow the use of both for next access. See also GlossUserData.
|
inherited |
Save all user indices. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Read the information stored by save_user_indices(). See also GlossUserData.
|
inherited |
Save all user pointers. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Read the information stored by save_user_pointers(). See also GlossUserData.
|
inherited |
Save the user indices on lines. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Load the user indices located on lines. See also GlossUserData.
|
inherited |
Save the user indices on quads. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Load the user indices located on quads. See also GlossUserData.
|
inherited |
Save the user indices on hexes. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Load the user indices located on hexs. See also GlossUserData.
|
inherited |
Save the user indices on lines. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Load the user pointers located on lines. See also GlossUserData.
|
inherited |
Save the user pointers on quads. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Load the user pointers located on quads. See also GlossUserData.
|
inherited |
Save the user pointers on hexes. The output vector is resized if necessary. See also GlossUserData.
|
inherited |
Load the user pointers located on hexs. See also GlossUserData.
|
inherited |
Iterator to the first used cell on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
inherited |
Iterator to the first active cell on level level
. If the given level does not contain any active cells (i.e., all cells on this level are further refined, then this function returns end_active(level)
so that loops of the kind
have zero iterations, as may be expected if there are no active cells on this level.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
inherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
|
inherited |
Return an iterator which is the first iterator not on level. If level
is the last level, then this returns end()
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
inherited |
Return an active iterator which is the first active iterator not on the given level. If level
is the last level, then this returns end()
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
inherited |
Return an iterator pointing to the last used cell.
|
inherited |
Return an iterator pointing to the last active cell.
|
inherited |
Return an iterator to a cell of this Triangulation object constructed from an independent CellId object.
If the given argument corresponds to a valid cell in this triangulation, this operation will always succeed for sequential triangulations where the current processor stores all cells that are part of the triangulation. On the other hand, if this is a parallel triangulation, then the current processor may not actually know about this cell. In this case, this operation will succeed for locally relevant cells, but may not for artificial cells that are less refined on the current processor.
|
inherited |
Return an iterator range that contains all cells (active or not) that make up this triangulation. Such a range is useful to initialize range- based for loops as supported by C++11. See the example in the documentation of active_cell_iterators().
|
inherited |
Return an iterator range that contains all active cells that make up this triangulation. Such a range is useful to initialize range-based for loops as supported by C++11, see also C++11 standard.
Range-based for loops are useful in that they require much less code than traditional loops (see here for a discussion of how they work). An example is that without range-based for loops, one often writes code such as the following (assuming for a moment that our goal is setting the user flag on every active cell):
Using C++11's range-based for loops, this is now entirely equivalent to the following:
[this->begin_active(), this->end())
|
inherited |
Return an iterator range that contains all cells (active or not) that make up the given level of this triangulation. Such a range is useful to initialize range-based for loops as supported by C++11. See the example in the documentation of active_cell_iterators().
[in] | level | A given level in the refinement hierarchy of this triangulation. |
[this->begin(level), this->end(level))
|
inherited |
Return an iterator range that contains all active cells that make up the given level of this triangulation. Such a range is useful to initialize range-based for loops as supported by C++11. See the example in the documentation of active_cell_iterators().
[in] | level | A given level in the refinement hierarchy of this triangulation. |
[this->begin_active(level), this->end(level))
|
inherited |
Iterator to the first used face.
|
inherited |
Iterator to the first active face.
|
inherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
|
inherited |
Return an iterator range that contains all active faces that make up this triangulation. This function is the face version of Triangulation::active_cell_iterators(), and allows one to write code like, e.g.,
[this->begin_active_face(), this->end_face())
|
inherited |
Iterator to the first used vertex. This function can only be used if dim is not one.
|
inherited |
Iterator to the first active vertex. Because all vertices are active, begin_vertex() and begin_active_vertex() return the same vertex. This function can only be used if dim is not one.
|
inherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states. This function can only be used if dim is not one.
|
inherited |
In the following, most functions are provided in two versions, with and without an argument describing the level. The versions with this argument are only applicable for objects describing the cells of the present triangulation. For example: in 2D n_lines(level)
cannot be called, only n_lines()
, as lines are faces in 2D and therefore have no level. Return the total number of used lines, active or not.
|
inherited |
Return the total number of used lines, active or not on level level
.
|
inherited |
Return the total number of active lines.
|
inherited |
Return the total number of active lines, on level level
.
|
inherited |
Return the total number of used quads, active or not.
|
inherited |
Return the total number of used quads, active or not on level level
.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Return the total number of active quads, active or not.
|
inherited |
Return the total number of active quads, active or not on level level
.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Return the total number of used hexahedra, active or not.
|
inherited |
Return the total number of used hexahedra, active or not on level level
.
|
inherited |
|
inherited |
|
inherited |
Return the total number of active hexahedra, active or not.
|
inherited |
Return the total number of active hexahedra, active or not on level level
.
|
inherited |
|
inherited |
|
inherited |
Return the total number of used cells, active or not. Maps to n_lines()
in one space dimension and so on.
|
inherited |
Return the total number of used cells, active or not, on level level
. Maps to n_lines(level)
in one space dimension and so on.
|
inherited |
Return the total number of active cells. Maps to n_active_lines()
in one space dimension and so on.
|
inherited |
Return the total number of active cells on level level
. Maps to n_active_lines(level)
in one space dimension and so on.
|
inherited |
|
inherited |
Return the total number of active faces. In 2D, the result equals n_active_lines(), in 3D it equals n_active_quads(), while in 1D it equals the number of used vertices.
|
inherited |
Return the number of levels in this triangulation.
|
virtualinherited |
Return true if the triangulation has hanging nodes.
The function is made virtual since the result can be interpreted in different ways, depending on whether the triangulation lives only on a single processor, or may be distributed as done in the parallel::distributed::Triangulation class (see there for a description of what the function is supposed to do in the parallel context).
Reimplemented in parallel::fullydistributed::Triangulation< dim, spacedim >, and parallel::distributed::Triangulation< dim, spacedim >.
|
inherited |
Return the total number of vertices. Some of them may not be used, which usually happens upon coarsening of a triangulation when some vertices are discarded, but we do not want to renumber the remaining ones, leading to holes in the numbers of used vertices. You can get the number of used vertices using n_used_vertices
function.
|
inherited |
Return a constant reference to all the vertices present in this triangulation. Note that not necessarily all vertices in this array are actually used; for example, if you coarsen a mesh, then some vertices are deleted, but their positions in this array are unchanged as the indices of vertices are only allocated once. You can find out about which vertices are actually used by the function get_used_vertices().
|
inherited |
Return the number of vertices that are presently in use, i.e. belong to at least one used element.
|
inherited |
Return true
if the vertex with this index
is used.
|
inherited |
Return a constant reference to the array of bools
indicating whether an entry in the vertex array is used or not.
|
inherited |
Return the maximum number of cells meeting at a common vertex. Since this number is an invariant under refinement, only the cells on the coarsest level are considered. The operation is thus reasonably fast. The invariance is only true for sufficiently many cells in the coarsest triangulation (e.g. for a single cell one would be returned), so a minimum of four is returned in two dimensions, 8 in three dimensions, etc, which is how many cells meet if the triangulation is refined.
In one space dimension, two is returned.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Return a reference to the current object.
This doesn't seem to be very useful but allows to write code that can access the underlying triangulation for anything that satisfies the MeshType concept (which may not only be a triangulation, but also a DoFHandler, for example).
|
inherited |
Return a reference to the current object. This is the const-version of the previous function.
|
inherited |
Total number of lines, used or unused.
|
inherited |
Number of lines, used or unused, on the given level.
|
inherited |
Total number of quads, used or unused.
|
inherited |
Number of quads, used or unused, on the given level.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Number of hexs, used or unused, on the given level.
|
inherited |
|
inherited |
|
inherited |
|
inherited |
|
inherited |
Number of cells, used or unused, on the given level.
|
inherited |
Return the total number of faces, used or not. In 2d, the result equals n_raw_lines(), in 3d it equals n_raw_quads(), while in 1D it equals the number of vertices.
|
inherited |
Write the data of this object to a stream for the purpose of serialization using the BOOST serialization library.
|
virtualinherited |
Declare the (coarse) face pairs given in the argument of this function as periodic. This way it is possible to obtain neighbors across periodic boundaries.
The vector can be filled by the function GridTools::collect_periodic_faces.
For more information on periodic boundary conditions see GridTools::collect_periodic_faces, DoFTools::make_periodicity_constraints and step-45.
|
inherited |
Return the periodic_face_map.
|
inherited |
Return vector filled with the used reference-cell types of this triangulation.
|
inherited |
Indicate if the triangulation only consists of hypercube-like cells, i.e., lines, quadrilaterals, or hexahedra.
|
inherited |
Write and read the data of this object from a stream for the purpose of serialization. using the BOOST serialization library.
|
staticinherited |
Exception
|
staticinherited |
The function raising this exception can only operate on an empty Triangulation, i.e., a Triangulation without grid cells.
|
staticinherited |
Trying to re-read a grid, an error occurred.
|
staticinherited |
Exception
|
staticinherited |
The triangulation level you accessed is empty.
|
staticinherited |
Exception
|
staticinherited |
Exception
Requested boundary_id not found
|
staticinherited |
Exception
|
staticprotectedinherited |
Write a bool vector to the given stream, writing a pre- and a postfix magic number. The vector is written in an almost binary format, i.e. the bool flags are packed but the data is written as ASCII text.
The flags are stored in a binary format: for each true
, a 1
bit is stored, a 0
bit otherwise. The bits are stored as unsigned char
, thus avoiding endianness. They are written to out
in plain text, thus amounting to 3.6 bits in the output per bits in the input on the average. Other information (magic numbers and number of elements of the input vector) is stored as plain text as well. The format should therefore be interplatform compatible.
|
staticprotectedinherited |
Re-read a vector of bools previously written by write_bool_vector
and compare with the magic numbers.
|
protectedinherited |
Recreate information about periodic neighbors from periodic_face_pairs_level_0.
|
privateinherited |
Iterator to the first cell, used or not, on level level
. If a level has no cells, a past-the-end iterator is returned.
|
privateinherited |
Return a raw iterator which is the first iterator not on level. If level
is the last level, then this returns end()
.
|
privateinherited |
Iterator to the first line, used or not, on level level
. If a level has no lines, a past-the-end iterator is returned. If lines are no cells, i.e. for dim>1
no level
argument must be given. The same applies for all the other functions above, of course.
|
privateinherited |
Iterator to the first used line on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator to the first active line on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
|
privateinherited |
Iterator to the first quad, used or not, on the given level. If a level has no quads, a past-the-end iterator is returned. If quads are no cells, i.e. for \(dim>2\) no level argument must be given.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator to the first used quad on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator to the first active quad on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
|
privateinherited |
Iterator to the first hex, used or not, on level level
. If a level has no hexes, a past-the-end iterator is returned.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator to the first used hex on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator to the first active hex on level level
.
level
argument needs to correspond to a level of the triangulation, i.e., should be less than the value returned by n_levels(). On the other hand, for parallel computations using a parallel::distributed::Triangulation object, it is often convenient to write loops over the cells of all levels of the global mesh, even if the local portion of the triangulation does not actually have cells at one of the higher levels. In those cases, the level
argument is accepted if it is less than what the n_global_levels() function returns. If the given level
is between the values returned by n_levels() and n_global_levels(), then no cells exist in the local portion of the triangulation at this level, and the function simply returns what end() would return.
|
privateinherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
|
privateinherited |
The (public) function clear() will only work when the triangulation is not subscribed to by other users. The clear_despite_subscriptions() function now allows the triangulation being cleared even when there are subscriptions.
Make sure, you know what you do, when calling this function, as its use is reasonable in very rare cases, only. For example, when the subscriptions were for the initially empty Triangulation and the Triangulation object wants to release its memory before throwing an assertion due to input errors (e.g. in the create_triangulation() function).
|
privateinherited |
Reset triangulation policy.
|
privateinherited |
For all cells, set the active cell indices so that active cells know the how many-th active cell they are, and all other cells have an invalid value. This function is called after mesh creation, refinement, and serialization.
|
privateinherited |
Reset cache for the cells' vertex indices.
|
privateinherited |
Refine all cells on all levels which were previously flagged for refinement.
Note, that this function uses the line->user_flags
for dim=2,3
and the quad->user_flags
for dim=3
.
The function returns a list of cells that have produced children that satisfy the criteria of distorted cells if the check_for_distorted_cells
flag was specified upon creation of this object, at
|
privateinherited |
Coarsen all cells which were flagged for coarsening, or rather: delete all children of those cells of which all child cells are flagged for coarsening and several other constraints hold (see the general doc of this class).
|
privateinherited |
Make sure that either all or none of the children of a cell are tagged for coarsening.
|
privatevirtualinherited |
Translate the unique id of a coarse cell to its index. See the glossary entry on coarse cell IDs for more information.
coarse_cell_id | Unique id of the coarse cell. |
Reimplemented in parallel::fullydistributed::Triangulation< dim, spacedim >, parallel::distributed::Triangulation< dim, spacedim >, and parallel::distributed::Triangulation< 1, spacedim >.
|
privatevirtualinherited |
Translate the index of coarse cell to its unique id. See the glossary entry on coarse cell IDs for more information.
coarse_cell_index | Index of the coarse cell. |
Reimplemented in parallel::fullydistributed::Triangulation< dim, spacedim >, parallel::distributed::Triangulation< dim, spacedim >, and parallel::distributed::Triangulation< 1, spacedim >.
|
private |
Settings
Definition at line 364 of file shared_tria.h.
|
private |
A flag to decide whether or not artificial cells are allowed.
Definition at line 369 of file shared_tria.h.
|
private |
A vector containing subdomain IDs of cells obtained by partitioning using either zorder, METIS, or a user-defined partitioning scheme. In case allow_artificial_cells is false, this vector is consistent with IDs stored in cell->subdomain_id() of the triangulation class. When allow_artificial_cells is true, cells which are artificial will have cell->subdomain_id() == numbers::artificial;
The original partition information is stored to allow using sequential DoF distribution and partitioning functions with semi-artificial cells.
Definition at line 390 of file shared_tria.h.
|
private |
A vector containing level subdomain IDs of cells obtained by partitioning each level.
The original partition information is stored to allow using sequential DoF distribution and partitioning functions with semi-artificial cells.
Definition at line 401 of file shared_tria.h.
|
protectedinherited |
MPI communicator to be used for the triangulation. We create a unique communicator for this class, which is a duplicate of the one passed to the constructor.
Definition at line 310 of file tria_base.h.
|
protectedinherited |
The subdomain id to be used for the current processor. This is the MPI rank.
Definition at line 316 of file tria_base.h.
|
protectedinherited |
The total number of subdomains (or the size of the MPI communicator).
Definition at line 321 of file tria_base.h.
|
protectedinherited |
Definition at line 370 of file tria_base.h.
|
staticinherited |
|
staticinherited |
|
mutableinherited |
|
protectedinherited |
|
protectedinherited |
|
privateinherited |
|
privateinherited |
If add_periodicity() is called, this variable stores the given periodic face pairs on level 0 for later access during the identification of ghost cells for the multigrid hierarchy and for setting up the periodic_face_map.
|
privateinherited |
If add_periodicity() is called, this variable stores the active periodic face pairs.
|
privateinherited |
|
privateinherited |
|
privateinherited |
|
privateinherited |
|
privateinherited |
Collection of manifold objects. We store only objects, which are not of type FlatManifold.
|
privateinherited |
|
privateinherited |
|
privateinherited |
A map that relates the number of a boundary vertex to the boundary indicator. This field is only used in 1d. We have this field because we store boundary indicator information with faces in 2d and higher where we have space in the structures that store data for faces, but in 1d there is no such space for faces.
The field is declared as a pointer for a rather mundane reason: all other fields of this class that can be modified by the TriaAccessor hierarchy are pointers, and so these accessor classes store a const pointer to the triangulation. We could no longer do so for TriaAccessor<0,1,spacedim> if this field (that can be modified by TriaAccessor::set_boundary_id) were not a pointer.
|
privateinherited |
A map that relates the number of a boundary vertex to the manifold indicator. This field is only used in 1d. We have this field because we store manifold indicator information with faces in 2d and higher where we have space in the structures that store data for faces, but in 1d there is no such space for faces.
The field is declared as a pointer for a rather mundane reason: all other fields of this class that can be modified by the TriaAccessor hierarchy are pointers, and so these accessor classes store a const pointer to the triangulation. We could no longer do so for TriaAccessor<0,1,spacedim> if this field (that can be modified by TriaAccessor::set_manifold_id) were not a pointer.