Detailed Description

Definition of a finite element with zero degrees of freedom. This class is useful (in the context of an hp method) to represent empty cells in the triangulation on which no degrees of freedom should be allocated, or to describe a field that is extended by zero to a part of the domain where we don't need it. Thus a triangulation may be divided into two regions: an active region where normal elements are used, and an inactive region where FE_Nothing elements are used. The hp::DoFHandler will therefore assign no degrees of freedom to the FE_Nothing cells, and this subregion is therefore implicitly deleted from the computation. step-46 shows a use case for this element. An interesting application for this element is also presented in the paper A. Cangiani, J. Chapman, E. Georgoulis, M. Jensen: Implementation of the Continuous-Discontinuous Galerkin Finite Element Method, arXiv:1201.2878v1 [math.NA], 2012 (see http://arxiv.org/abs/1201.2878).

Note that some care must be taken that the resulting mesh topology continues to make sense when FE_Nothing elements are introduced. This is particularly true when dealing with hanging node constraints, because the library makes some basic assumptions about the nature of those constraints. The following geometries are acceptable:

+---------+----+----+

| | 0 | |

| 1 +----+----+

| | 0 | |

+---------+----+----+

+---------+----+----+

| | 1 | |

| 0 +----+----+

| | 1 | |

+---------+----+----+

Here, 0 denotes an FE_Nothing cell, and 1 denotes some other element type. The library has no difficulty computing the necessary hanging node constraints in these cases (i.e. no constraint). However, the following geometry is NOT acceptable (at least in the current implementation):

+---------+----+----+

| | 0 | |

| 1 +----+----+

| | 1 | |

+---------+----+----+

The distinction lies in the mixed nature of the child faces, a case we have not implemented as of yet.

Constructor & Destructor Documentation

Constructor. First argument denotes the number of components to give this finite element (default = 1).

Second argument decides whether FE_Nothing will dominate any other FE in compare_for_face_domination() (default = false). Therefore at interfaces where, for example, a Q1 meets an FE_Nothing, we will force the traces of the two functions to be the same. Because the FE_Nothing encodes a space that is zero everywhere, this means that the Q1 field will be forced to become zero at this interface.

Member Function Documentation

A sort of virtual copy constructor, this function returns a copy of the finite element object. Derived classes need to override the function here in this base class and return an object of the same type as the derived class.

Some places in the library, for example the constructors of FESystem as well as the hp::FECollection class, need to make copies of finite elements without knowing their exact type. They do so through this function.

Given a set of update flags, compute which other quantities also need to be computed in order to satisfy the request by the given flags. Then return the combination of the original set of flags and those just computed.

As an example, if update_flags contains update_gradients a finite element class will typically require the computation of the inverse of the Jacobian matrix in order to rotate the gradient of shape functions on the reference cell to the real cell. It would then return not just update_gradients, but also update_covariant_transformation, the flag that makes the mapping class produce the inverse of the Jacobian matrix.

Return the value of the ith shape function at the point p. p is a point on the reference element. Because the current element has no degrees of freedom, this function should obviously not be called in practice. All this function really does, therefore, is trigger an exception.

Prepare internal data structures and fill in values independent of the cell. Returns a pointer to an object of which the caller of this function then has to assume ownership (which includes destruction when it is no more needed).

In the current case, this function just returns a default pointer, since no meaningful data exists for this element.

In the current case, this element is assumed to dominate if the second argument in the constructor dominate is true. When this argument is false and fe_other is also of type FE_Nothing(), either element can dominate. Otherwise there are no_requirements.

If, on a vertex, several finite elements are active, the hp code first assigns the degrees of freedom of each of these FEs different global indices. It then calls this function to find out which of them should get identical values, and consequently can receive the same global DoF index. This function therefore returns a list of identities between DoFs of the present finite element object with the DoFs of fe_other, which is a reference to a finite element object representing one of the other finite elements active on this particular vertex. The function computes which of the degrees of freedom of the two finite element objects are equivalent, both numbered between zero and the corresponding value of dofs_per_vertex of the two finite elements. The first index of each pair denotes one of the vertex dofs of the present element, whereas the second is the corresponding index of the other finite element.

Return whether this element implements its hanging node constraints in the new way, which has to be used to make elements "hp compatible". That means, the element properly implements the get_face_interpolation_matrix and get_subface_interpolation_matrix methods. Therefore the return value also indicates whether a call to the get_face_interpolation_matrix() method and the get_subface_interpolation_matrix() method will generate an error or not.

Currently the main purpose of this function is to allow the make_hanging_node_constraints method to decide whether the new procedures, which are supposed to work in the hp framework can be used, or if the old well verified but not hp capable functions should be used. Once the transition to the new scheme for computing the interface constraints is complete, this function will be superfluous and will probably go away.

Derived classes should implement this function accordingly. The default assumption is that a finite element does not provide hp capable face interpolation, and the default implementation therefore returns false.