Classes | |
class | InternalData |
Public Member Functions | |
FE_RaviartThomas (const unsigned int p) | |
virtual std::string | get_name () const |
virtual bool | has_support_on_face (const unsigned int shape_index, const unsigned int face_index) const |
virtual void | interpolate (std::vector< double > &local_dofs, const std::vector< double > &values) const |
virtual void | interpolate (std::vector< double > &local_dofs, const std::vector< Vector< double > > &values, unsigned int offset=0) const |
virtual void | interpolate (std::vector< double > &local_dofs, const VectorSlice< const std::vector< std::vector< double > > > &values) const |
virtual unsigned int | memory_consumption () const |
virtual FiniteElement< dim > * | clone () const |
Private Member Functions | |
void | initialize_support_points (const unsigned int rt_degree) |
void | initialize_restriction () |
Static Private Member Functions | |
static std::vector< unsigned int > | get_dpo_vector (const unsigned int degree) |
Private Attributes | |
Table< 2, double > | boundary_weights |
Table< 3, double > | interior_weights |
Friends | |
class | FE_RaviartThomas |
Implementation of Raviart-Thomas (RT) elements, conforming with the space Hdiv. These elements generate vector fields with normel components continuous between mesh cells.
We follow the usual definition of the degree of RT elements, which denotes the polynomial degree of the largest complete polynomial subspace contained in the RT space. Then, approciamtion order of the function itself is degree+1, as with usual polynomial spaces.
This class is not implemented for the codimension one case (spacedim != dim
).
The interpolation operators associated with the RT element are constructed such that interpolation and computing the divergence are commuting operations. We require this from interpolating arbitrary functions as well as the restriction matrices. It can be achieved by two interpolation schemes, the simplified one in FE_RaviartThomasNodal and the original one here:
On edges or faces, the node values are the moments of the normal component of the interpolated function with respect to the traces of the RT polynomials. Since the normal trace of the RT space of degree k on an edge/face is the space Qk, the moments are taken with respect to this space.
Higher order RT spaces have interior nodes. These are moments taken with respect to the gradient of functions in Qk on the cell (this space is the matching space for RTk in a mixed formulation).
The node values above rely on integrals, which will be computed by quadrature rules themselves. The generalized support points are a set of points such that this quadrature can be performed with sufficient accuracy. The points needed are thode of QGaussk+1 on each face as well as QGaussk in the interior of the cell (or none for RT0).
FE_RaviartThomas< dim >::FE_RaviartThomas | ( | const unsigned int | p | ) |
Constructor for the Raviart-Thomas element of degree p
.
virtual std::string FE_RaviartThomas< dim >::get_name | ( | ) | const [virtual] |
Return a string that uniquely identifies a finite element. This class returns FE_RaviartThomas<dim>(degree)
, with dim
and degree
replaced by appropriate values.
Implements FiniteElement< dim, dim >.
virtual bool FE_RaviartThomas< dim >::has_support_on_face | ( | const unsigned int | shape_index, | |
const unsigned int | face_index | |||
) | const [virtual] |
Check whether a shape function may be non-zero on a face.
Right now, this is only implemented for RT0 in 1D. Otherwise, returns always true
.
Reimplemented from FiniteElement< dim, dim >.
virtual void FE_RaviartThomas< dim >::interpolate | ( | std::vector< double > & | local_dofs, | |
const std::vector< double > & | values | |||
) | const [virtual] |
Interpolate a set of scalar values, computed in the generalized support points.
Reimplemented from FiniteElement< dim, dim >.
virtual void FE_RaviartThomas< dim >::interpolate | ( | std::vector< double > & | local_dofs, | |
const std::vector< Vector< double > > & | values, | |||
unsigned int | offset = 0 | |||
) | const [virtual] |
Interpolate a set of vector values, computed in the generalized support points.
Since a finite element often only interpolates part of a vector, offset
is used to determine the first component of the vector to be interpolated. Maybe consider changing your data structures to use the next function.
Reimplemented from FiniteElement< dim, dim >.
virtual void FE_RaviartThomas< dim >::interpolate | ( | std::vector< double > & | local_dofs, | |
const VectorSlice< const std::vector< std::vector< double > > > & | values | |||
) | const [virtual] |
Interpolate a set of vector values, computed in the generalized support points.
Reimplemented from FiniteElement< dim, dim >.
virtual unsigned int FE_RaviartThomas< dim >::memory_consumption | ( | ) | const [virtual] |
Determine an estimate for the memory consumption (in bytes) of this object.
This function is made virtual, since finite element objects are usually accessed through pointers to their base class, rather than the class itself.
Reimplemented from FiniteElement< dim, dim >.
virtual FiniteElement<dim>* FE_RaviartThomas< dim >::clone | ( | ) | const [virtual] |
A sort of virtual copy constructor. Some places in the library, for example the constructors of FESystem as well as the hp::FECollection class, need to make copied of finite elements without knowing their exact type. They do so through this function.
Implements FiniteElement< dim, dim >.
static std::vector<unsigned int> FE_RaviartThomas< dim >::get_dpo_vector | ( | const unsigned int | degree | ) | [static, private] |
Only for internal use. Its full name is get_dofs_per_object_vector
function and it creates the dofs_per_object
vector that is needed within the constructor to be passed to the constructor of FiniteElementData
.
void FE_RaviartThomas< dim >::initialize_support_points | ( | const unsigned int | rt_degree | ) | [private] |
Initialize the generalized_support_points
field of the FiniteElement class and fill the tables with interpolation weights (boundary_weights and interior_weights). Called from the constructor.
void FE_RaviartThomas< dim >::initialize_restriction | ( | ) | [private] |
Initialize the interpolation from functions on refined mesh cells onto the father cell. According to the philosophy of the Raviart-Thomas element, this restriction operator preserves the divergence of a function weakly.
friend class FE_RaviartThomas [friend] |
Allow access from other dimensions.
Table<2, double> FE_RaviartThomas< dim >::boundary_weights [private] |
These are the factors multiplied to a function in the generalized_face_support_points when computing the integration. They are organized such that there is one row for each generalized face support point and one column for each degree of freedom on the face.
Table<3, double> FE_RaviartThomas< dim >::interior_weights [private] |
Precomputed factors for interpolation of interior degrees of freedom. The rationale for this Table is the same as for boundary_weights. Only, this table has a third coordinate for the space direction of the component evaluated.