![]() |
Reference documentation for deal.II version Git 47f49d5886 2021-01-15 21:58:01 +0100
|
#include <deal.II/hp/dof_handler.h>
Public Types | |
using | cell_accessor = typename ActiveSelector::CellAccessor |
using | face_accessor = typename ActiveSelector::FaceAccessor |
using | line_iterator = typename ActiveSelector::line_iterator |
using | active_line_iterator = typename ActiveSelector::active_line_iterator |
using | quad_iterator = typename ActiveSelector::quad_iterator |
using | active_quad_iterator = typename ActiveSelector::active_quad_iterator |
using | hex_iterator = typename ActiveSelector::hex_iterator |
using | active_hex_iterator = typename ActiveSelector::active_hex_iterator |
using | active_cell_iterator = typename ActiveSelector::active_cell_iterator |
using | cell_iterator = typename ActiveSelector::cell_iterator |
using | face_iterator = typename ActiveSelector::face_iterator |
using | active_face_iterator = typename ActiveSelector::active_face_iterator |
using | level_cell_accessor = typename LevelSelector::CellAccessor |
using | level_face_accessor = typename LevelSelector::FaceAccessor |
using | level_cell_iterator = typename LevelSelector::cell_iterator |
using | level_face_iterator = typename LevelSelector::face_iterator |
using | active_fe_index_type = unsigned short int |
using | offset_type = unsigned int |
Public Member Functions | |
void | initialize (const Triangulation< dim, spacedim > &tria, const FiniteElement< dim, spacedim > &fe) |
void | initialize (const Triangulation< dim, spacedim > &tria, const hp::FECollection< dim, spacedim > &fe) |
void | set_fe (const FiniteElement< dim, spacedim > &fe) |
void | set_fe (const hp::FECollection< dim, spacedim > &fe) |
void | set_active_fe_indices (const std::vector< unsigned int > &active_fe_indices) |
void | get_active_fe_indices (std::vector< unsigned int > &active_fe_indices) const |
void | reinit (const Triangulation< dim, spacedim > &tria) |
void | distribute_dofs (const FiniteElement< dim, spacedim > &fe) |
void | distribute_dofs (const hp::FECollection< dim, spacedim > &fe) |
void | distribute_mg_dofs () |
bool | has_hp_capabilities () const |
bool | has_level_dofs () const |
bool | has_active_dofs () const |
void | initialize_local_block_info () |
void | clear () |
void | renumber_dofs (const std::vector< types::global_dof_index > &new_numbers) |
void | renumber_dofs (const unsigned int level, const std::vector< types::global_dof_index > &new_numbers) |
unsigned int | max_couplings_between_dofs () const |
unsigned int | max_couplings_between_boundary_dofs () const |
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 |
level_cell_iterator | begin_mg (const unsigned int level=0) const |
level_cell_iterator | end_mg (const unsigned int level) const |
level_cell_iterator | end_mg () const |
Subscriptor functionality | |
Classes derived from Subscriptor provide a facility to subscribe to this object. This is mostly used by the SmartPointer class. | |
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 |
Static Public Member Functions | |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
Static Public Attributes | |
static const unsigned int | dimension = dim |
static const unsigned int | space_dimension = spacedim |
static const unsigned int | default_fe_index = 0 |
static const unsigned int | invalid_fe_index = numbers::invalid_unsigned_int |
static const active_fe_index_type | invalid_active_fe_index |
Manage the distribution and numbering of the degrees of freedom for hp- FEM algorithms. This class satisfies the MeshType concept requirements.
The purpose of this class is to allow for an enumeration of degrees of freedom in the same way as the DoFHandler class, but it allows to use a different finite element on every cell. To this end, one assigns an active_fe_index
to every cell that indicates which element within a collection of finite elements (represented by an object of type hp::FECollection) is the one that lives on this cell. The class then enumerates the degree of freedom associated with these finite elements on each cell of a triangulation and, if possible, identifies degrees of freedom at the interfaces of cells if they match. If neighboring cells have degrees of freedom along the common interface that do not immediate match (for example, if you have \(Q_2\) and \(Q_3\) elements meeting at a common face), then one needs to compute constraints to ensure that the resulting finite element space on the mesh remains conforming.
The whole process of working with objects of this type is explained in step-27. Many of the algorithms this class implements are described in the hp-paper.
The typical workflow for using this class is to create a mesh, assign an active FE index to every active cell, calls hp::DoFHandler::distribute_dofs(), and then assemble a linear system and solve a problem on this finite element space. However, one can skip assigning active FE indices upon mesh refinement in certain circumstances. In particular, the following rules apply:
When this class is used with either a parallel::shared::Triangulation or a parallel::distributed::Triangulation, you can only set active FE indices on cells that are locally owned, using a call such as cell->set_active_fe_index(...)
. On the other hand, setting the active FE index on ghost or artificial cells is not allowed.
Ghost cells do acquire the information what element is active on them, however: whenever you call hp::DoFHandler::distribute_dofs(), all processors that participate in the parallel mesh exchange information in such a way that the active FE index on ghost cells equals the active FE index that was set on that processor that owned that particular ghost cell. Consequently, one can query the active_fe_index
on ghost cells, just not set it by hand.
On artificial cells, no information is available about the active_fe_index
used there. That's because we don't even know whether these cells exist at all, and even if they did, the current processor does not know anything specific about them. See the glossary entry on artificial cells for more information.
During refinement and coarsening, information about the active_fe_index
of each cell will be automatically transferred.
However, using a parallel::distributed::Triangulation with an hp::DoFHandler requires additional attention during serialization, since no information on active FE indices will be automatically transferred. This has to be done manually using the prepare_for_serialization_of_active_fe_indices() and deserialize_active_fe_indices() functions. The former has to be called before parallel::distributed::Triangulation::save() is invoked, and the latter needs to be run after parallel::distributed::Triangulation::load(). If further data will be attached to the triangulation via the parallel::distributed::CellDataTransfer, parallel::distributed::SolutionTransfer, or Particles::ParticleHandler classes, all corresponding preparation and deserialization function calls need to happen in the same order. Consult the documentation of parallel::distributed::SolutionTransfer for more information.
Definition at line 125 of file dof_handler.h.
|
inherited |
Definition at line 499 of file dof_handler.h.
|
inherited |
Definition at line 500 of file dof_handler.h.
|
inherited |
Definition at line 502 of file dof_handler.h.
|
inherited |
Definition at line 503 of file dof_handler.h.
|
inherited |
The type in which we store the active FE index.
Definition at line 529 of file dof_handler.h.
|
inherited |
The type in which we store the offsets in the CRS data structures.
Definition at line 534 of file dof_handler.h.
|
inherited |
Assign a Triangulation and a FiniteElement to the DoFHandler and compute the distribution of degrees of freedom over the mesh.
Definition at line 2024 of file dof_handler.cc.
|
inherited |
Same as above but taking an hp::FECollection object.
Definition at line 2034 of file dof_handler.cc.
|
inherited |
Assign a FiniteElement fe
to this object.
Definition at line 2402 of file dof_handler.cc.
|
inherited |
Same as above but taking an hp::FECollection object.
Definition at line 2411 of file dof_handler.cc.
|
inherited |
Go through the triangulation and set the active FE indices of all active cells to the values given in active_fe_indices
.
Definition at line 3004 of file dof_handler.cc.
|
inherited |
Go through the triangulation and store the active FE indices of all active cells to the vector active_fe_indices
. This vector is resized, if necessary.
Definition at line 3025 of file dof_handler.cc.
|
inherited |
Assign a Triangulation to the DoFHandler.
Remove all associations with the previous Triangulation object and establish connections with the new one. All information about previous degrees of freedom will be removed. Activates hp-mode.
Definition at line 2045 of file dof_handler.cc.
|
inherited |
Go through the triangulation and "distribute" the degrees of freedom needed for the given finite element. "Distributing" degrees of freedom involves allocating memory to store the indices on all entities on which degrees of freedom can be located (e.g., vertices, edges, faces, etc.) and to then enumerate all degrees of freedom. In other words, while the mesh and the finite element object by themselves simply define a finite element space \(V_h\), the process of distributing degrees of freedom makes sure that there is a basis for this space and that the shape functions of this basis are enumerated in an indexable, predictable way.
The exact order in which degrees of freedom on a mesh are ordered, i.e., the order in which basis functions of the finite element space are enumerated, is something that deal.II treats as an implementation detail. By and large, degrees of freedom are enumerated in the same order in which we traverse cells, but you should not rely on any specific numbering. In contrast, if you want a particular ordering, use the functions in namespace DoFRenumbering.
This function is first discussed in the introduction to the step-2 tutorial program.
Definition at line 2476 of file dof_handler.cc.
|
inherited |
Same as above but taking an hp::FECollection object.
Definition at line 2486 of file dof_handler.cc.
|
inherited |
Distribute level degrees of freedom on each level for geometric multigrid. The active DoFs need to be distributed using distribute_dofs() before calling this function.
Definition at line 2632 of file dof_handler.cc.
|
inherited |
Returns whether this DoFHandler has hp-capabilities.
|
inherited |
This function returns whether this DoFHandler has DoFs distributed on each multigrid level or in other words if distribute_mg_dofs() has been called.
|
inherited |
This function returns whether this DoFHandler has active DoFs. This is equivalent to asking whether (i) distribute_dofs() has been called and (ii) the finite element for which degrees of freedom have been distributed actually has degrees of freedom (which is not the case for FE_Nothing, for example).
If this object is based on a parallel::distributed::Triangulation, then the current function returns true if any partition of the parallel DoFHandler object has any degrees of freedom. In other words, the function returns true even if the Triangulation does not own any active cells on the current MPI process, but at least one process owns cells and at least this one process has any degrees of freedom associated with it.
|
inherited |
After distribute_dofs() with an FESystem element, the block structure of global and level vectors is stored in a BlockInfo object accessible with block_info(). This function initializes the local block structure on each cell in the same object.
Definition at line 2664 of file dof_handler.cc.
|
inherited |
Clear all data of this object.
Definition at line 2698 of file dof_handler.cc.
|
inherited |
Renumber degrees of freedom based on a list of new DoF indices for each of the degrees of freedom.
This function is called by the functions in DoFRenumbering function after computing a new ordering of the degree of freedom indices. However, it can of course also be called from user code.
i
is currently locally owned, then new_numbers[locally_owned_dofs().index_within_set(i)]
returns the new global DoF index of i
. Since the IndexSet of locally_owned_dofs() is complete in the sequential case, the latter convention for the content of the array reduces to the former in the case that only one processor participates in the mesh.true
) are of course affected by the exact renumbering performed here. For example, while the initial numbering of DoF indices done in distribute_dofs() yields a contiguous numbering, the renumbering performed by DoFRenumbering::component_wise() will, in general, not yield contiguous locally owned DoF indices. Definition at line 2745 of file dof_handler.cc.
|
inherited |
The same function as above, but renumber the degrees of freedom of a single level of a multigrid hierarchy.
Definition at line 2857 of file dof_handler.cc.
|
inherited |
Return the maximum number of degrees of freedom a degree of freedom in the given triangulation with the given finite element may couple with. This is the maximum number of entries per line in the system matrix; this information can therefore be used upon construction of the SparsityPattern object.
The returned number is not really the maximum number but an estimate based on the finite element and the maximum number of cells meeting at a vertex. The number holds for the constrained matrix as well.
The determination of the number of couplings can be done by simple picture drawing. An example can be found in the implementation of this function.
Definition at line 2934 of file dof_handler.cc.
|
inherited |
Return the number of degrees of freedom located on the boundary another dof on the boundary can couple with.
The number is the same as for max_couplings_between_dofs() in one dimension less.
Definition at line 2900 of file dof_handler.cc.
|
inherited |
Iterator to the first used cell on level level
.
Definition at line 2081 of file dof_handler.cc.
|
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.
Definition at line 2094 of file dof_handler.cc.
|
inherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
Definition at line 2110 of file dof_handler.cc.
|
inherited |
Return an iterator which is the first iterator not on the given level. If level
is the last level, then this returns end()
.
Definition at line 2119 of file dof_handler.cc.
|
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()
.
Definition at line 2132 of file dof_handler.cc.
|
inherited |
Iterator to the first used cell on level level
. This returns a level_cell_iterator that returns level dofs when dof_indices() is called.
Definition at line 2145 of file dof_handler.cc.
|
inherited |
Iterator past the last cell on level level
. This returns a level_cell_iterator that returns level dofs when dof_indices() is called.
Definition at line 2161 of file dof_handler.cc.
|
inherited |
Iterator past the end; this iterator serves for comparisons of iterators with past-the-end or before-the-beginning states.
Definition at line 2177 of file dof_handler.cc.
|
inherited |
Subscribes a user of the object by storing the pointer validity
. The subscriber may be identified by text supplied as identifier
.
Definition at line 136 of file subscriptor.cc.
|
inherited |
Unsubscribes a user from the object.
identifier
and the validity
pointer must be the same as the one supplied to subscribe(). Definition at line 156 of file subscriptor.cc.
|
inlineinherited |
Return the present number of subscriptions to this object. This allows to use this class for reference counted lifetime determination where the last one to unsubscribe also deletes the object.
Definition at line 301 of file subscriptor.h.
|
inlineinherited |
List the subscribers to the input stream
.
Definition at line 318 of file subscriptor.h.
|
inherited |
List the subscribers to deallog
.
Definition at line 204 of file subscriptor.cc.
|
staticinherited |
Make the dimension available in function templates.
Definition at line 509 of file dof_handler.h.
|
staticinherited |
Make the space dimension available in function templates.
Definition at line 514 of file dof_handler.h.
|
staticinherited |
The default index of the finite element to be used on a given cell.
Definition at line 519 of file dof_handler.h.
|
staticinherited |
Invalid index of the finite element to be used on a given cell.
Definition at line 524 of file dof_handler.h.
|
staticinherited |
Invalid active FE index which will be used as a default value to determine whether a future FE index has been set or not.
Definition at line 540 of file dof_handler.h.