From e5d85e40e9bcf35b4657e96a23ae7d13549c9a39 Mon Sep 17 00:00:00 2001 From: wolf Date: Tue, 19 Jan 1999 12:21:51 +0000 Subject: [PATCH] Revert some of the structural changes of last week to the state before. Basically, the functionality of the get_fe_data static functions introduced into the finite element classes was not needed finally for the implementation of composed finite elements. I therefore retro-deleted these functions to avoid unnecessary complexity problems. git-svn-id: https://svn.dealii.org/trunk@737 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/include/fe/fe.h | 21 --- .../deal.II/include/fe/fe_lib.criss_cross.h | 14 -- deal.II/deal.II/include/fe/fe_lib.dg.h | 163 +++++------------- deal.II/deal.II/include/fe/fe_lib.lagrange.h | 60 +------ deal.II/deal.II/include/fe/fe_system.h | 21 +-- .../deal.II/source/fe/fe_lib.criss_cross.cc | 31 +--- deal.II/deal.II/source/fe/fe_lib.cubic.cc | 16 -- deal.II/deal.II/source/fe/fe_lib.dg.cc | 98 ----------- .../deal.II/source/fe/fe_lib.dg.constant.cc | 16 -- deal.II/deal.II/source/fe/fe_lib.linear.cc | 16 -- deal.II/deal.II/source/fe/fe_lib.quadratic.cc | 16 -- deal.II/deal.II/source/fe/fe_lib.quartic.cc | 15 -- 12 files changed, 57 insertions(+), 430 deletions(-) diff --git a/deal.II/deal.II/include/fe/fe.h b/deal.II/deal.II/include/fe/fe.h index cf482fe16f..9833e96bfd 100644 --- a/deal.II/deal.II/include/fe/fe.h +++ b/deal.II/deal.II/include/fe/fe.h @@ -567,27 +567,6 @@ struct FiniteElementBase : * 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 diff --git a/deal.II/deal.II/include/fe/fe_lib.criss_cross.h b/deal.II/deal.II/include/fe/fe_lib.criss_cross.h index 1ffb9a07dc..bda4a68a04 100644 --- a/deal.II/deal.II/include/fe/fe_lib.criss_cross.h +++ b/deal.II/deal.II/include/fe/fe_lib.criss_cross.h @@ -169,20 +169,6 @@ class FECrissCross : public FiniteElement { * 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 get_fe_data (); /** * Return the value of the #i#th shape diff --git a/deal.II/deal.II/include/fe/fe_lib.dg.h b/deal.II/deal.II/include/fe/fe_lib.dg.h index c1e38e6e27..ce5e8c2f14 100644 --- a/deal.II/deal.II/include/fe/fe_lib.dg.h +++ b/deal.II/deal.II/include/fe/fe_lib.dg.h @@ -15,75 +15,60 @@ * transforms from the unit cell to the real cell. * @author Ralf Hartmann, 1998 */ - template class FEDGConstant : public FELinearMapping { 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 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& 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& 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 &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 > &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::cell_iterator &cell, - const Boundary &boundary, - vector > &support_points) const; + const Boundary &boundary, + vector > &support_points) const; /** * Refer to the base class for detailed * information on this function. */ virtual void get_face_support_points (const DoFHandler::face_iterator &face, - const Boundary &boundary, - vector > &support_points) const; + const Boundary &boundary, + vector > &support_points) const; /** * Refer to the base class for detailed @@ -93,23 +78,23 @@ class FEDGConstant : public FELinearMapping { const Boundary &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); }; @@ -145,20 +130,6 @@ class FEDGLinear : public FELinear{ */ 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 get_fe_data (); - /** * This function returns an error since the * correct use of the restriction @@ -199,20 +170,6 @@ class FEDGQuadraticSub : public FEQuadraticSub{ */ 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 get_fe_data (); - /** * This function returns an error since the * correct use of the restriction @@ -254,20 +211,6 @@ class FEDGCubicSub : public FECubicSub{ */ 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 get_fe_data (); - /** * This function returns an error since the * correct use of the restriction @@ -308,20 +251,6 @@ class FEDGQuarticSub : public FEQuarticSub{ */ 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 get_fe_data (); - /** * This function returns an error since the * correct use of the restriction diff --git a/deal.II/deal.II/include/fe/fe_lib.lagrange.h b/deal.II/deal.II/include/fe/fe_lib.lagrange.h index 60b5abac82..8eff486657 100644 --- a/deal.II/deal.II/include/fe/fe_lib.lagrange.h +++ b/deal.II/deal.II/include/fe/fe_lib.lagrange.h @@ -44,22 +44,8 @@ class FELinear : public FELinearMapping { * 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 get_fe_data (); + public: /** * Return the value of the #i#th shape * function at point #p# on the unit cell. @@ -160,20 +146,6 @@ class FEQuadraticSub : public FELinearMapping { 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 get_fe_data (); - /** * Return the value of the #i#th shape * function at point #p# on the unit cell. @@ -290,21 +262,6 @@ class FECubicSub : public FELinearMapping { 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 get_fe_data (); - /** * Return the value of the #i#th shape * function at point #p# on the unit cell. @@ -422,21 +379,6 @@ class FEQuarticSub : public FELinearMapping { 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 get_fe_data (); - /** * Return the value of the #i#th shape * function at point #p# on the unit cell. diff --git a/deal.II/deal.II/include/fe/fe_system.h b/deal.II/deal.II/include/fe/fe_system.h index 506561ac1a..3f83f4df39 100644 --- a/deal.II/deal.II/include/fe/fe_system.h +++ b/deal.II/deal.II/include/fe/fe_system.h @@ -77,20 +77,13 @@ class FESystem : public FiniteElement { * 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()#. 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 diff --git a/deal.II/deal.II/source/fe/fe_lib.criss_cross.cc b/deal.II/deal.II/source/fe/fe_lib.criss_cross.cc index adb3e7e29b..7262f3bf3e 100644 --- a/deal.II/deal.II/source/fe/fe_lib.criss_cross.cc +++ b/deal.II/deal.II/source/fe/fe_lib.criss_cross.cc @@ -305,30 +305,17 @@ #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()); @@ -471,14 +458,10 @@ void FECrissCross<1>::fill_fe_values (const DoFHandler<1>::cell_iterator &, #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.; @@ -528,14 +511,6 @@ FECrissCross<2>::FECrissCross () : -template <> -const FiniteElementData<2> -FECrissCross<2>::get_fe_data () { - return FiniteElementData<2> (1,0,1,5); -}; - - - template <> inline diff --git a/deal.II/deal.II/source/fe/fe_lib.cubic.cc b/deal.II/deal.II/source/fe/fe_lib.cubic.cc index 0384f217f6..ad15a4653d 100644 --- a/deal.II/deal.II/source/fe/fe_lib.cubic.cc +++ b/deal.II/deal.II/source/fe/fe_lib.cubic.cc @@ -36,14 +36,6 @@ FECubicSub<1>::FECubicSub (const int) : -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 () { @@ -282,14 +274,6 @@ FECubicSub<2>::FECubicSub (const int) : -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; diff --git a/deal.II/deal.II/source/fe/fe_lib.dg.cc b/deal.II/deal.II/source/fe/fe_lib.dg.cc index 0b8eb817c0..bf0d9454d1 100644 --- a/deal.II/deal.II/source/fe/fe_lib.dg.cc +++ b/deal.II/deal.II/source/fe/fe_lib.dg.cc @@ -26,104 +26,6 @@ FEDGQuarticSub::FEDGQuarticSub(): -#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 const dFMatrix & FEDGLinear::restrict (const unsigned int child) const { diff --git a/deal.II/deal.II/source/fe/fe_lib.dg.constant.cc b/deal.II/deal.II/source/fe/fe_lib.dg.constant.cc index aab9dcf5a3..1a4e9e7835 100644 --- a/deal.II/deal.II/source/fe/fe_lib.dg.constant.cc +++ b/deal.II/deal.II/source/fe/fe_lib.dg.constant.cc @@ -42,13 +42,6 @@ FEDGConstant<1>::FEDGConstant () : }; -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 &, @@ -89,15 +82,6 @@ FEDGConstant<2>::FEDGConstant () : -template <> -const FiniteElementData<2> -FEDGConstant<2>::get_fe_data () { - return FiniteElementData<2> (0, 0, 1, GeometryInfo<2>::vertices_per_cell); -}; - - - - #endif diff --git a/deal.II/deal.II/source/fe/fe_lib.linear.cc b/deal.II/deal.II/source/fe/fe_lib.linear.cc index 374efcce55..c0ad349751 100644 --- a/deal.II/deal.II/source/fe/fe_lib.linear.cc +++ b/deal.II/deal.II/source/fe/fe_lib.linear.cc @@ -37,14 +37,6 @@ FELinear<1>::FELinear (const int) : -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 () { @@ -195,14 +187,6 @@ FELinear<2>::FELinear (const int) : -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; diff --git a/deal.II/deal.II/source/fe/fe_lib.quadratic.cc b/deal.II/deal.II/source/fe/fe_lib.quadratic.cc index 3a982635d8..89a40fc343 100644 --- a/deal.II/deal.II/source/fe/fe_lib.quadratic.cc +++ b/deal.II/deal.II/source/fe/fe_lib.quadratic.cc @@ -33,14 +33,6 @@ FEQuadraticSub<1>::FEQuadraticSub (const int) : -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 () { /* @@ -267,14 +259,6 @@ FEQuadraticSub<2>::FEQuadraticSub (const int) : -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 () { /* diff --git a/deal.II/deal.II/source/fe/fe_lib.quartic.cc b/deal.II/deal.II/source/fe/fe_lib.quartic.cc index d084d0f618..3d3c27be8c 100644 --- a/deal.II/deal.II/source/fe/fe_lib.quartic.cc +++ b/deal.II/deal.II/source/fe/fe_lib.quartic.cc @@ -32,13 +32,6 @@ FEQuarticSub<1>::FEQuarticSub (const int) : -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 () { @@ -268,14 +261,6 @@ FEQuarticSub<2>::FEQuarticSub (const int) : -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; -- 2.39.5