]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
additional information conforming_space in FiniteElementData
authorguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 28 Jun 2005 22:42:24 +0000 (22:42 +0000)
committerguido <guido@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 28 Jun 2005 22:42:24 +0000 (22:42 +0000)
git-svn-id: https://svn.dealii.org/trunk@10962 0785d39b-7218-0410-832d-ea1e28bc413d

12 files changed:
deal.II/deal.II/include/fe/fe_base.h
deal.II/deal.II/source/fe/fe_data.cc
deal.II/deal.II/source/fe/fe_dgp.cc
deal.II/deal.II/source/fe/fe_dgp_monomial.cc
deal.II/deal.II/source/fe/fe_dgp_nonparametric.cc
deal.II/deal.II/source/fe/fe_dgq.cc
deal.II/deal.II/source/fe/fe_nedelec.cc
deal.II/deal.II/source/fe/fe_q.cc
deal.II/deal.II/source/fe/fe_q_hierarchical.cc
deal.II/deal.II/source/fe/fe_raviart_thomas.cc
deal.II/deal.II/source/fe/fe_raviart_thomas_nodal.cc
deal.II/deal.II/source/fe/fe_system.cc

index 17822d6128e7fe9f20c4eb88573953aa7ab7f242..9f39c089233ab0d2f13609c4470fe5f1485f4dd1 100644 (file)
@@ -45,10 +45,78 @@ template<int dim> class FESystem;
  *
  * @author Wolfgang Bangerth, Guido Kanschat, 1998, 1999, 2000, 2001, 2003, 2005
  */
-template<int dim>
+template <int dim>
 class FiniteElementData
 {
   public:
+                                    /**
+                                     * Enumerator for the different
+                                     * types of continuity a finite
+                                     * element may have. Continuity
+                                     * is measured by the Sobolev
+                                     * space containing the
+                                     * constructed finite element
+                                     * space and also called this way.
+                                     *
+                                     * Note that certain continuities
+                                     * may imply others. For
+                                     * instance, a function in
+                                     * <i>H<sup>1</sup></i> is in
+                                     * <i>H<sup>curl</sup></i> and
+                                     * <i>H<sup>div</sup></i> as
+                                     * well.
+                                     *
+                                     * If you are interested in
+                                     * continuity in the classical
+                                     * sense, then the following
+                                     * relations hold:
+                                     *
+                                     * <ol>
+                                     *
+                                     * <li> <i>H<sup>1</sup></i>
+                                     * implies that the function is
+                                     * continuous over cell
+                                     * boundaries.
+                                     *
+                                     * <li> <i>H<sup>2</sup></i>
+                                     * implies that the function is
+                                     * continuously differentiable
+                                     * over cell boundaries.
+                                     *
+                                     * The value <i>L<sup>2</sup></i>
+                                     * indicates that the element is
+                                     * discontinuous. Since
+                                     * discontinuous elements have no
+                                     * topological couplings between
+                                     * grid cells and code may
+                                     * actually depend on this
+                                     * property, <i>L<sup>2</sup></i>
+                                     * conformity is handled in a
+                                     * special way in the sense that
+                                     * it is <b>not</b> implied by
+                                     * any higher conformity.
+                                     *
+                                     * In order to test if a finite
+                                     * element conforms to a certain
+                                     * space, use
+                                     * FiniteElementData<dim>::conforms().
+                                     */
+    enum Conformity
+    {
+/// Indicates incompatible continuities of a system.
+         unknown = 0x00,
+/// Discontinuous elements. See above!
+         L2 = 0x01,
+/// Conformity with the space <i>H<sup>curl</sup></i> (continuous tangential component of a vector field)
+         Hcurl = 0x02,
+/// Conformity with the space <i>H<sup>div</sup></i> (continuous normal component of a vector field)
+         Hdiv = 0x04,
+/// Conformity with the space <i>H<sup>1</sup></i> (continuous)
+         H1 = 0x06,
+/// Conformity with the space <i>H<sup>2</sup></i> (continuously differentiable)
+         H2 = 0x0e
+    };
+    
                                     /**
                                      * Number of degrees of freedom on
                                      * a vertex.
@@ -153,6 +221,11 @@ class FiniteElementData
                                      * coordinate direction.
                                      */
     const unsigned int degree;
+
+                                    /**
+                                     * Indicate the space this element conforms to.
+                                     */
+    const Conformity conforming_space;
     
                                     /**
                                      * Default
@@ -186,7 +259,8 @@ class FiniteElementData
                                      */
     FiniteElementData (const std::vector<unsigned int> &dofs_per_object,
                       const unsigned int n_components,
-                      const unsigned int degree = deal_II_numbers::invalid_unsigned_int);
+                      const unsigned int degree = deal_II_numbers::invalid_unsigned_int,
+                      const Conformity conformity = unknown);
 
                                     /**
                                      * Number of dofs per vertex.
@@ -245,11 +319,24 @@ class FiniteElementData
                                      * quadrature rule.
                                      */
     unsigned int tensor_degree () const;
+
+                                    /**
+                                     * Test whether a finite element
+                                     * space conforms to a certain
+                                     * Sobolev space.
+                                     *
+                                     * @note This function will
+                                     * return a true value even if
+                                     * the finite element space has
+                                     * higher regularity than asked
+                                     * for.
+                                     */
+    bool conforms (const Conformity) const;
     
                                     /**
                                      * Comparison operator.
                                      */
-    bool operator == (const FiniteElementData<dim> &) const;
+    bool operator == (const FiniteElementData &) const;
 };
 
 
@@ -1869,6 +1956,15 @@ FiniteElementData<dim>::tensor_degree () const
 }
 
 
+template <int dim>
+inline
+bool
+FiniteElementData<dim>::conforms (Conformity space) const
+{
+  return ((space & conforming_space) != 0);
+}
+
+//----------------------------------------------------------------------//
 
 template <int dim>  
 inline
index 7a13a1b9dfacc606f88a49621111aa02503b8d76..06c21aa2846d23d0a361868ab26fafd7fddcb52b 100644 (file)
@@ -16,7 +16,7 @@
 #include <fe/fe.h>
 
 
-template <int dim>
+template<int dim>
 FiniteElementData<dim>::FiniteElementData ()
                 :
                dofs_per_vertex(0),
@@ -31,7 +31,8 @@ FiniteElementData<dim>::FiniteElementData ()
                dofs_per_face(0),
                dofs_per_cell (0),
                components(0),
-               degree(0)
+               degree(0),
+               conforming_space(unknown)
 {}
 
 
@@ -40,7 +41,8 @@ template <int dim>
 FiniteElementData<dim>::
 FiniteElementData (const std::vector<unsigned int> &dofs_per_object,
                    const unsigned int n_components,
-                   const unsigned int degree)
+                   const unsigned int degree,
+                  const Conformity conformity)
                 :
                dofs_per_vertex(dofs_per_object[0]),
                dofs_per_line(dofs_per_object[1]),
@@ -71,7 +73,8 @@ FiniteElementData (const std::vector<unsigned int> &dofs_per_object,
                               GeometryInfo<dim>::quads_per_cell * dofs_per_quad +
                               GeometryInfo<dim>::hexes_per_cell * dofs_per_hex),
                components(n_components),
-               degree(degree)
+               degree(degree),
+               conforming_space(conformity)
 {
   Assert(dofs_per_object.size()==dim+1, ExcDimensionMismatch(dofs_per_object.size()-1,dim));
 }
@@ -85,7 +88,9 @@ bool FiniteElementData<dim>::operator== (const FiniteElementData<dim> &f) const
          (dofs_per_line == f.dofs_per_line) &&
          (dofs_per_quad == f.dofs_per_quad) &&
          (dofs_per_hex == f.dofs_per_hex) &&
-         (components == f.components));
+         (components == f.components) &&
+         (degree == f.degree) &&
+         (conforming_space == f.conforming_space));
 }
 
 
index 9fa9881d02d4f7d76d3c186b18213c6f400a0e52..70d5ec43563000f1987ec7fb9ba04b055bf56569 100644 (file)
@@ -26,7 +26,7 @@ FE_DGP<dim>::FE_DGP (const unsigned int degree)
                :
                FE_Poly<PolynomialSpace<dim>, dim> (
                  PolynomialSpace<dim>(Polynomials::Legendre::generate_complete_basis(degree)),
-                 FiniteElementData<dim>(get_dpo_vector(degree), 1, degree),
+                 FiniteElementData<dim>(get_dpo_vector(degree), 1, degree, FiniteElementData<dim>::L2),
                  std::vector<bool>(FiniteElementData<dim>(get_dpo_vector(degree), 1, degree).dofs_per_cell,true),
                  std::vector<std::vector<bool> >(FiniteElementData<dim>(
                    get_dpo_vector(degree), 1, degree).dofs_per_cell, std::vector<bool>(1,true)))
index 89ebb597a27493c9825ad06a22658b823a7725fd..d5ed0b1ff7cec1b4888a8e8981dfd42510098326 100644 (file)
@@ -113,7 +113,7 @@ FE_DGPMonomial<dim>::FE_DGPMonomial (const unsigned int degree)
                :
                FE_Poly<PolynomialsP<dim>, dim> (
                  PolynomialsP<dim>(degree),
-                 FiniteElementData<dim>(get_dpo_vector(degree), 1, degree),
+                 FiniteElementData<dim>(get_dpo_vector(degree), 1, degree, FiniteElementData<dim>::L2),
                  std::vector<bool>(FiniteElementData<dim>(get_dpo_vector(degree), 1, degree).dofs_per_cell,true),
                  std::vector<std::vector<bool> >(FiniteElementData<dim>(
                    get_dpo_vector(degree), 1, degree).dofs_per_cell, std::vector<bool>(1,true)))
index 43af89dcf05944035bf80869386ddbd0d6a280e2..b7c1ff6fb25690b5883dd9ede085904a229ac65e 100644 (file)
@@ -30,7 +30,7 @@
 template <int dim>
 FE_DGPNonparametric<dim>::FE_DGPNonparametric (const unsigned int degree)
                :
-               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1),
+               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1, FiniteElementData<dim>::L2),
                                    std::vector<bool>(FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,true),
                                    std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,
                                                                    std::vector<bool>(1,true))),
index 9423cc1b2b9b27fd771869fb36f83e3844f30cfb..189c15f206e9ffdbdc338c84f22571cb3cb14e50 100644 (file)
@@ -139,7 +139,7 @@ FE_DGQ<dim>::FE_DGQ (const unsigned int degree)
                :
                FE_Poly<TensorProductPolynomials<dim>, dim> (
                  TensorProductPolynomials<dim>(Polynomials::LagrangeEquidistant::generate_complete_basis(degree)),
-                 FiniteElementData<dim>(get_dpo_vector(degree), 1, degree),
+                 FiniteElementData<dim>(get_dpo_vector(degree), 1, degree, FiniteElementData<dim>::L2),
                  std::vector<bool>(FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell, true),
                  std::vector<std::vector<bool> >(FiniteElementData<dim>(
                    get_dpo_vector(degree),1, degree).dofs_per_cell, std::vector<bool>(1,true)))
index 42b4a64299f8b01187b1f19cef36841a715922b8..32a98161eec480bfc6fe162e94647e200146b6fb 100644 (file)
 #endif
 
 
+
+//TODO: Remove doubled degrees
 template <int dim>
 FE_Nedelec<dim>::FE_Nedelec (const unsigned int degree)
                :
-               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),
-                                                          dim),
+               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree), dim, degree+1, FiniteElementData<dim>::Hcurl),
                                    std::vector<bool> (FiniteElementData<dim>(get_dpo_vector(degree),dim).dofs_per_cell,false),
                                    std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),dim).dofs_per_cell,
                                                                    std::vector<bool>(dim,true))),
index 06ef2603eb78034f7b3872266fc6eb54d8056730..5045dcf58fe1f989786149199c012bb1a9b98eec 100644 (file)
@@ -185,7 +185,7 @@ FE_Q<dim>::FE_Q (const unsigned int degree)
                :
                FE_Poly<TensorProductPolynomials<dim>, dim> (
                  TensorProductPolynomials<dim>(Polynomials::LagrangeEquidistant::generate_complete_basis(degree)),
-                 FiniteElementData<dim>(get_dpo_vector(degree),1, degree),
+                 FiniteElementData<dim>(get_dpo_vector(degree),1, degree, FiniteElementData<dim>::H1),
                  std::vector<bool> (FiniteElementData<dim>(
                    get_dpo_vector(degree),1, degree).dofs_per_cell, false),
                  std::vector<std::vector<bool> >(FiniteElementData<dim>(
index ab218ccaf82ee9bee2723c2d92da65d4c27dc8fe..bb6c9145e6d18ab604132004b19f39f0202deea9 100644 (file)
@@ -41,7 +41,7 @@ FE_Q_Hierarchical<dim>::FE_Q_Hierarchical (const unsigned int degree)
                :
                FE_Poly<TensorProductPolynomials<dim>, dim> (
                  Polynomials::Hierarchical::generate_complete_basis(degree),
-                 FiniteElementData<dim>(get_dpo_vector(degree),1, degree),
+                 FiniteElementData<dim>(get_dpo_vector(degree),1, degree, FiniteElementData<dim>::H1),
                  std::vector<bool> (FiniteElementData<dim>(
                    get_dpo_vector(degree),1, degree).dofs_per_cell, false),
                  std::vector<std::vector<bool> >(FiniteElementData<dim>(
index 9e26669149ded6e81b0557b3f596cee63d5ca0ba..de29a04b6a985076f3de948c5371c4639e0c1022 100644 (file)
@@ -132,7 +132,7 @@ template <int dim>
 FE_RaviartThomas<dim>::FE_RaviartThomas (const unsigned int rt_order)
                :
                FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(rt_order),
-                                                          dim, rt_order+1),
+                                                          dim, rt_order+1, FiniteElementData<dim>::Hdiv),
                                    get_ria_vector (rt_order),
                                    std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(rt_order),dim,rt_order+1).dofs_per_cell,
                                                                    std::vector<bool>(dim,true))),
index c62543f26602e3b5b573ec00429628557fa4e0bf..e22c31beb40f614f377e2ce7bd259b4e3bbf1410 100644 (file)
@@ -37,7 +37,7 @@ FE_RaviartThomasNodal<dim>::FE_RaviartThomasNodal (const unsigned int deg)
                FE_PolyTensor<PolynomialsRaviartThomas<dim>, dim> (
                  deg,
                  FiniteElementData<dim>(get_dpo_vector(deg),
-                                        dim, deg+1),
+                                        dim, deg+1, FiniteElementData<dim>::Hdiv),
                  get_ria_vector (deg),
                  std::vector<std::vector<bool> >(
                    FiniteElementData<dim>(get_dpo_vector(deg),
@@ -277,7 +277,6 @@ FE_RaviartThomasNodal<dim>::initialize_node_matrix ()
          N(current,i) = this->shape_value_component(
            i, this->unit_support_points[current],
            GeometryInfo< dim >::unit_normal_direction[face]);
-//                      * GeometryInfo< dim >::unit_normal_orientation[face];
        ++current;
       }
                                   // Interior degrees of freedom in each direction
index 3f84168c4cd1057e4946cb77beb9524475b3f138..63bc6ba83ca6956b2d8862a29fc97b4e0260f2cd 100644 (file)
@@ -1730,7 +1730,8 @@ FESystem<dim>::multiply_dof_numbers (const FiniteElementData<dim> &fe_data,
   if (dim>1) dpo.push_back(fe_data.dofs_per_quad * N);
   if (dim>2) dpo.push_back(fe_data.dofs_per_hex * N);
   
-  return FiniteElementData<dim> (dpo, fe_data.n_components() * N, fe_data.tensor_degree());
+  return FiniteElementData<dim> (dpo, fe_data.n_components() * N, fe_data.tensor_degree(),
+                                fe_data.conforming_space);
 }
 
 
@@ -1851,7 +1852,9 @@ FESystem<dim>::multiply_dof_numbers (const FiniteElementData<dim> &fe1,
   return FiniteElementData<dim> (dpo,
                                 fe1.n_components() * N1 +
                                 fe2.n_components() * N2,
-                                degree);
+                                degree,
+                                FiniteElementData<dim>::Conformity(fe1.conforming_space
+                                                                   & fe2.conforming_space));
 }
 
 
@@ -1884,7 +1887,10 @@ FESystem<dim>::multiply_dof_numbers (const FiniteElementData<dim> &fe1,
   return FiniteElementData<dim> (dpo,
                                 fe1.n_components() * N1 +
                                 fe2.n_components() * N2 +
-                                fe3.n_components() * N3, degree);
+                                fe3.n_components() * N3, degree,
+                                FiniteElementData<dim>::Conformity(fe1.conforming_space
+                                                                   & fe2.conforming_space
+                                                                   & fe3.conforming_space));
 }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.