* implemented in the #DoFHandler# class as of now.
* \end{itemize}
*
- * On a more general note, a concrete finite element class, derived from
- * the #FiniteElement# class needs to fulfill at least the following criteria:
- * \begin{itemize}
- * \item Overload and define all pure virtual functions;
- * \item If a finite element is to be used as part of a composed finite
- * element, such as the #FESystem# of the #FEMixed# classes, it has
- * to provide a \textit{static} function namend #get_fe_data#, which
- * returns the data which also is stored in the #FiniteElementData# object
- * at the bottom of the class hierarchy. This function needs to be static,
- * since its output is needed at the time of construction of the composed
- * finite element, at which time the subobjects denoting the parts of the
- * composed element are not yet constructed. You need to make sure that
- * each element has such a function; the composed elements have no way
- * to make sure that the function is not inherited from a base class.
- * You may only use an inherited such function, if the result would be
- * the same.
- *
- * It is also a good idea to use the output of this function to construct
- * the base class #FiniteElement# of a concrete element.
- * \end{itemize}
- *
* @author Wolfgang Bangerth, 1998
*/
template <int dim>
* Constructor
*/
FECrissCross ();
-
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
/**
* Return the value of the #i#th shape
* transforms from the unit cell to the real cell.
* @author Ralf Hartmann, 1998
*/
-
template <int dim>
class FEDGConstant : public FELinearMapping<dim> {
public:
- /**
- * Constructor
- */
- FEDGConstant ();
-
/**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
+ * Constructor
*/
- static const FiniteElementData<dim> get_fe_data ();
-
+ FEDGConstant ();
+
/**
- * Return the value of the #i#th shape
- * function at point #p# on the unit cell.
- */
+ * Return the value of the #i#th shape
+ * function at point #p# on the unit cell.
+ */
virtual double shape_value(const unsigned int i,
const Point<dim>& p) const;
-
- /**
- * Return the gradient of the #i#th shape
- * function at point #p# on the unit cell.
- */
+
+ /**
+ * Return the gradient of the #i#th shape
+ * function at point #p# on the unit cell.
+ */
virtual Tensor<1,dim> shape_grad(const unsigned int i,
const Point<dim>& p) const;
- /**
- * Return the tensor of second derivatives
- * of the #i#th shape function at
- * point #p# on the unit cell.
- *
- * For linear elements, all second
- * derivatives on the unit cell are zero.
- */
+ /**
+ * Return the tensor of second derivatives
+ * of the #i#th shape function at
+ * point #p# on the unit cell.
+ *
+ * For linear elements, all second
+ * derivatives on the unit cell are zero.
+ */
virtual Tensor<2,dim> shape_grad_grad (const unsigned int i,
const Point<dim> &p) const;
- /**
- * Refer to the base class for detailed
- * information on this function.
- */
+ /**
+ * Refer to the base class for detailed
+ * information on this function.
+ */
virtual void get_unit_support_points (vector<Point<dim> > &support_points) const;
- /**
- * Refer to the base class for detailed
- * information on this function.
- */
+ /**
+ * Refer to the base class for detailed
+ * information on this function.
+ */
virtual void get_support_points (const DoFHandler<dim>::cell_iterator &cell,
- const Boundary<dim> &boundary,
- vector<Point<dim> > &support_points) const;
+ const Boundary<dim> &boundary,
+ vector<Point<dim> > &support_points) const;
/**
* Refer to the base class for detailed
* information on this function.
*/
virtual void get_face_support_points (const DoFHandler<dim>::face_iterator &face,
- const Boundary<dim> &boundary,
- vector<Point<dim> > &support_points) const;
+ const Boundary<dim> &boundary,
+ vector<Point<dim> > &support_points) const;
/**
* Refer to the base class for detailed
const Boundary<dim> &boundary,
dFMatrix &local_mass_matrix) const;
- /**
- * Return a readonly reference to the
- * matrix which describes the transfer of a
- * child with the given number to the
- * mother cell. See the #restriction# array
- * for more information.
- *
- * This function returns an error since the
- * correct use of the restriction
- * matrices is not yet finally decided
- * about.
- */
+ /**
+ * Return a readonly reference to the
+ * matrix which describes the transfer of a
+ * child with the given number to the
+ * mother cell. See the #restriction# array
+ * for more information.
+ *
+ * This function returns an error since the
+ * correct use of the restriction
+ * matrices is not yet finally decided
+ * about.
+ */
const dFMatrix & restrict (const unsigned int) const;
- /**
- * Exception
- */
+ /**
+ * Exception
+ */
DeclException0 (ExcNotImplemented);
};
*/
FEDGLinear();
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* This function returns an error since the
* correct use of the restriction
*/
FEDGQuadraticSub();
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* This function returns an error since the
* correct use of the restriction
*/
FEDGCubicSub();
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* This function returns an error since the
* correct use of the restriction
*/
FEDGQuarticSub();
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* This function returns an error since the
* correct use of the restriction
* For more detail see class #FEDGLinear#.
*/
FELinear (const int);
- public:
-
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
+ public:
/**
* Return the value of the #i#th shape
* function at point #p# on the unit cell.
FEQuadraticSub (const int);
public:
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* Return the value of the #i#th shape
* function at point #p# on the unit cell.
FECubicSub (const int);
public:
-
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* Return the value of the #i#th shape
* function at point #p# on the unit cell.
FEQuarticSub (const int);
public:
-
- /**
- * Declare a static function which returns
- * the number of degrees of freedom per
- * vertex, line, face, etc. This function
- * is used by the constructors, but is
- * mainly needed for the composed finite
- * elements, which assemble a FE object
- * from several other FEs. See the
- * documentation for the #FiniteElement#
- * class for more information on this
- * subject.
- */
- static const FiniteElementData<dim> get_fe_data ();
-
/**
* Return the value of the #i#th shape
* function at point #p# on the unit cell.
* In fact, the object #fe# is not used,
* apart from getting the number of dofs
* per vertex, line, etc for that finite
- * element class. For this, it would have
- * been possible to use the #get_fe_data#
- * function that each element has to
- * provide. The correct way to write
- * this constructor would therefore have
- * been to specify it without the first
- * argument and let the user specify the
- * desired finite element by an explicit
- * template argument list, like this:
- * #AnyClass::f<int>()#. However, #C++#
- * does not allow this call sequence for
- * constructors, so we have to use the
- * way as shown here, to let the compiler
- * deduce the template argument itself.
+ * element class. The objects creates its
+ * own copy of the finite element object
+ * at construction time (but after
+ * the initialization of the base class
+ * #FiniteElement#, which is why we need
+ * a valid finite element object passed
+ * to the constructor).
*
* Obviously, the template finite element
* class needs to be of the same dimension
#if deal_II_dimension == 1
-// declare explicit instantiation
-template <>
-const FiniteElementData<1> FECrissCross<1>::get_fe_data ();
-
-
template <>
FECrissCross<1>::FECrissCross () :
- FiniteElement<1> (get_fe_data ())
+ // set more or less invalid data
+ FiniteElement<1> (FiniteElementData<1> (0,0,0))
{
Assert (false, ExcNotUseful());
};
-template <>
-const FiniteElementData<1>
-FECrissCross<1>::get_fe_data () {
- // return more or less invalid data
- return FiniteElementData<1> (0,0,0);
-};
-
-
-
template <>
double FECrissCross<1>::shape_value (const unsigned int, const Point<1> &) const {
Assert (false, ExcNotUseful());
#if deal_II_dimension == 2
-// declare explicit instantiation
-template <>
-const FiniteElementData<2> FECrissCross<2>::get_fe_data ();
-
template <>
FECrissCross<2>::FECrissCross () :
- FiniteElement<2> (get_fe_data ())
+ FiniteElement<2> (FiniteElementData<2> (1,0,1,5))
{
interface_constraints(0,0) = 1./2.;
interface_constraints(0,1) = 1./2.;
-template <>
-const FiniteElementData<2>
-FECrissCross<2>::get_fe_data () {
- return FiniteElementData<2> (1,0,1,5);
-};
-
-
-
template <>
inline
-template <>
-const FiniteElementData<1>
-FECubicSub<1>::get_fe_data () {
- return FiniteElementData<1> (1, 2, GeometryInfo<1>::vertices_per_cell);
-};
-
-
-
template <>
void FECubicSub<1>::initialize_matrices () {
-template <>
-const FiniteElementData<2>
-FECubicSub<2>::get_fe_data () {
- return FiniteElementData<2> (1, 2, 4, GeometryInfo<2>::vertices_per_cell);
-};
-
-
-
template <>
void FECubicSub<2>::initialize_matrices () {
prolongation[0](0,0) = 1.0;
-#if deal_II_dimension == 1
-
-template <>
-const FiniteElementData<1>
-FEDGLinear<1>::get_fe_data () {
- // no dofs at the vertices, all in the
- // interior of the line
- return FiniteElementData<1> (0,
- FELinear<1>::get_fe_data().total_dofs,
- FELinear<1>::get_fe_data().n_transform_functions);
-};
-
-
-template <>
-const FiniteElementData<1>
-FEDGQuadraticSub<1>::get_fe_data () {
- // no dofs at the vertices, all in the
- // interior of the line
- return FiniteElementData<1> (0,
- FEQuadraticSub<1>::get_fe_data().total_dofs,
- FEQuadraticSub<1>::get_fe_data().n_transform_functions);
-};
-
-
-template <>
-const FiniteElementData<1>
-FEDGCubicSub<1>::get_fe_data () {
- // no dofs at the vertices, all in the
- // interior of the line
- return FiniteElementData<1> (0,
- FECubicSub<1>::get_fe_data().total_dofs,
- FECubicSub<1>::get_fe_data().n_transform_functions);
-};
-
-
-template <>
-const FiniteElementData<1>
-FEDGQuarticSub<1>::get_fe_data () {
- // no dofs at the vertices, all in the
- // interior of the line
- return FiniteElementData<1> (0,
- FEQuarticSub<1>::get_fe_data().total_dofs,
- FEQuarticSub<1>::get_fe_data().n_transform_functions);
-};
-
-#endif
-
-
-
-#if deal_II_dimension == 2
-
-template <>
-const FiniteElementData<2>
-FEDGLinear<2>::get_fe_data () {
- // no dofs at the vertices or lines, all in the
- // interior of the line
- return FiniteElementData<2> (0, 0,
- FELinear<2>::get_fe_data().total_dofs,
- FELinear<2>::get_fe_data().n_transform_functions);
-};
-
-
-template <>
-const FiniteElementData<2>
-FEDGQuadraticSub<2>::get_fe_data () {
- // no dofs at the vertices or lines, all in the
- // interior of the line
- return FiniteElementData<2> (0, 0,
- FEQuadraticSub<2>::get_fe_data().total_dofs,
- FEQuadraticSub<2>::get_fe_data().n_transform_functions);
-};
-
-
-template <>
-const FiniteElementData<2>
-FEDGCubicSub<2>::get_fe_data () {
- // no dofs at the vertices or lines, all in the
- // interior of the line
- return FiniteElementData<2> (0, 0,
- FECubicSub<2>::get_fe_data().total_dofs,
- FECubicSub<2>::get_fe_data().n_transform_functions);
-};
-
-
-template <>
-const FiniteElementData<2>
-FEDGQuarticSub<2>::get_fe_data () {
- // no dofs at the vertices or lines, all in the
- // interior of the line
- return FiniteElementData<2> (0, 0,
- FEQuarticSub<2>::get_fe_data().total_dofs,
- FEQuarticSub<2>::get_fe_data().n_transform_functions);
-};
-
-#endif
-
-
-
template <int dim>
const dFMatrix &
FEDGLinear<dim>::restrict (const unsigned int child) const {
};
-template <>
-const FiniteElementData<1>
-FEDGConstant<1>::get_fe_data () {
- return FiniteElementData<1> (0, 1, GeometryInfo<1>::vertices_per_cell);
-};
-
-
template <>
void FEDGConstant<1>::get_face_support_points (const typename DoFHandler<1>::face_iterator &,
-template <>
-const FiniteElementData<2>
-FEDGConstant<2>::get_fe_data () {
- return FiniteElementData<2> (0, 0, 1, GeometryInfo<2>::vertices_per_cell);
-};
-
-
-
-
#endif
-template <>
-const FiniteElementData<1>
-FELinear<1>::get_fe_data () {
- return FiniteElementData<1> (1, 0, GeometryInfo<1>::vertices_per_cell);
-};
-
-
-
template <>
void FELinear<1>::initialize_matrices () {
-template <>
-const FiniteElementData<2>
-FELinear<2>::get_fe_data () {
- return FiniteElementData<2> (1, 0, 0, GeometryInfo<2>::vertices_per_cell);
-};
-
-
-
template <>
void FELinear<2>::initialize_matrices () {
restriction[0](0,0) = 1.0;
-template <>
-const FiniteElementData<1>
-FEQuadraticSub<1>::get_fe_data () {
- return FiniteElementData<1> (1, 1, GeometryInfo<1>::vertices_per_cell);
-};
-
-
-
template <>
void FEQuadraticSub<1>::initialize_matrices () {
/*
-template <>
-const FiniteElementData<2>
-FEQuadraticSub<2>::get_fe_data () {
- return FiniteElementData<2> (1, 1, 1, GeometryInfo<2>::vertices_per_cell);
-};
-
-
-
template <>
void FEQuadraticSub<2>::initialize_matrices () {
/*
-template <>
-const FiniteElementData<1>
-FEQuarticSub<1>::get_fe_data () {
- return FiniteElementData<1> (1, 3, GeometryInfo<1>::vertices_per_cell);
-};
-
-
template <>
void FEQuarticSub<1>::initialize_matrices () {
-template <>
-const FiniteElementData<2>
-FEQuarticSub<2>::get_fe_data () {
- return FiniteElementData<2> (1, 3, 9, GeometryInfo<2>::vertices_per_cell);
-};
-
-
-
template <>
void FEQuarticSub<2>::initialize_matrices () {
prolongation[0](0,0) = 1.0;