]> https://gitweb.dealii.org/ - dealii.git/commitdiff
new function tensor_degree in FiniteElementData
authorGuido Kanschat <dr.guido.kanschat@gmail.com>
Fri, 28 Nov 2003 11:52:35 +0000 (11:52 +0000)
committerGuido Kanschat <dr.guido.kanschat@gmail.com>
Fri, 28 Nov 2003 11:52:35 +0000 (11:52 +0000)
git-svn-id: https://svn.dealii.org/trunk@8207 0785d39b-7218-0410-832d-ea1e28bc413d

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_dgq.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_system.cc
deal.II/doc/news/c-4-0.html
tests/fe/fe_data_test.cc

index b3561e90b72c18771057f50a7e773263b124d608..e3e6c43a76028daba7d5ffce59ffebeff47c9662 100644 (file)
@@ -45,7 +45,7 @@ template<int dim> class FESystem;
  * @ref{FiniteElementBase} should be private base classes of
  * @ref{FiniteElement}.
  *
- * @author Wolfgang Bangerth, Guido Kanschat, 1998, 1999, 2000, 2001
+ * @author Wolfgang Bangerth, Guido Kanschat, 1998, 1999, 2000, 2001, 2003
  */
 template<int dim>
 class FiniteElementData
@@ -137,6 +137,13 @@ class FiniteElementData
                                      */
     const unsigned int components;
 
+                                    /**
+                                     * Maximal polynomial degree of a
+                                     * shape function in a single
+                                     * coordinate direction.
+                                     */
+    const unsigned int degree;
+    
                                     /**
                                      * Default
                                      * constructor. Constructs an
@@ -162,9 +169,17 @@ class FiniteElementData
                                      *
                                      * Hence this constructor requires
                                      * @p{dofs_per_object.size()==dim+1}.
+                                     *
+                                     * @param n_components Number of
+                                     * vector components of the
+                                     * element.
+                                     * @param degree
+                                     * Maximal polynomial degree in a
+                                     * single direction.
                                      */
     FiniteElementData (const std::vector<unsigned int> &dofs_per_object,
-                      const unsigned int n_components);
+                      const unsigned int n_components,
+                      const unsigned int degree = deal_II_numbers::invalid_unsigned_int);
 
                                     /**
                                      * Return the @p{dofs_per_vertex}.
@@ -201,6 +216,17 @@ class FiniteElementData
                                      */
     unsigned int n_components () const;
 
+                                    /**
+                                     * Maximal polynomial degree of a
+                                     * shape function in a single
+                                     * coordinate direction.
+                                     *
+                                     * This function can be used to
+                                     * determine the optimal
+                                     * quadrature rule.
+                                     */
+    unsigned int tensor_degree () const;
+    
                                     /**
                                      * Comparison operator.
                                      */
@@ -1778,6 +1804,16 @@ FiniteElementData<dim>::n_components () const
 
 
 
+template <int dim>
+inline
+unsigned int 
+FiniteElementData<dim>::tensor_degree () const
+{
+  return degree;
+}
+
+
+
 template <int dim>  
 inline
 std::pair<unsigned int,unsigned int>
index bd13f0ee2585cc60783ccd836fcf80703eea00ac..6ecadf0b5aa8543c39e3902f47eb61c3490eadfa 100644 (file)
@@ -18,7 +18,8 @@
 
 template <int dim>
 FiniteElementData<dim>::FiniteElementData (const std::vector<unsigned int> &dofs_per_object,
-                                          const unsigned int n_components) :
+                                          const unsigned int n_components,
+                                          const unsigned int degree) :
                dofs_per_vertex(dofs_per_object[0]),
                dofs_per_line(dofs_per_object[1]),
                dofs_per_quad(dim>1? dofs_per_object[2]:0),
@@ -45,7 +46,8 @@ FiniteElementData<dim>::FiniteElementData (const std::vector<unsigned int> &dofs
                               GeometryInfo<dim>::lines_per_cell * dofs_per_line +
                               GeometryInfo<dim>::quads_per_cell * dofs_per_quad +
                               GeometryInfo<dim>::hexes_per_cell * dofs_per_hex),
-               components(n_components)
+               components(n_components),
+               degree(degree)
 {
   Assert(dofs_per_object.size()==dim+1, ExcDimensionMismatch(dofs_per_object.size()-1,dim));
 }
index 90d06302b15b1809e69359cf6c931365d5ff3290..9230f796cf5dbe0dfbafc5d0d1433d5a93d0f157 100644 (file)
@@ -30,9 +30,9 @@
 template <int dim>
 FE_DGP<dim>::FE_DGP (const unsigned int degree)
                :
-               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1),
-                                   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,
+               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree), 1, degree),
+                                   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))),
                 degree(degree),
                 polynomial_space (Polynomials::Legendre::generate_complete_basis(degree))
index 7e1d50b4c4717ff66e70d7f47aea531131ae205f..f1286405567010692ef6fb28866f216a1b0e08f0 100644 (file)
@@ -45,7 +45,7 @@ namespace
                                   // given an integer N, compute its
                                   // integer square root (if it
                                   // exists, otherwise give up)
-  unsigned int int_sqrt (const unsigned int N)
+  inline unsigned int int_sqrt (const unsigned int N)
   {
     for (unsigned int i=0; i<=N; ++i)
       if (i*i == N)
@@ -58,7 +58,7 @@ namespace
                                   // given an integer N, compute its
                                   // integer cube root (if it
                                   // exists, otherwise give up)
-  unsigned int int_cuberoot (const unsigned int N)
+  inline unsigned int int_cuberoot (const unsigned int N)
   {
     for (unsigned int i=0; i<=N; ++i)
       if (i*i*i == N)
@@ -71,7 +71,7 @@ namespace
                                   // given N, generate i=0...N-1
                                   // equidistant points in the
                                   // interior of the interval [0,1]
-  Point<1>
+  inline Point<1>
   generate_unit_point (const unsigned int i,
                       const unsigned int N,
                       const int2type<1>  )
@@ -90,7 +90,7 @@ namespace
                                   // given N, generate i=0...N-1
                                   // equidistant points in the domain
                                   // [0,1]^2
-  Point<2>
+  inline Point<2>
   generate_unit_point (const unsigned int i,
                       const unsigned int N,
                       const int2type<2>  )
@@ -116,7 +116,7 @@ namespace
                                   // given N, generate i=0...N-1
                                   // equidistant points in the domain
                                   // [0,1]^3
-  Point<3>
+  inline Point<3>
   generate_unit_point (const unsigned int i,
                       const unsigned int N,
                       const int2type<3>  )
@@ -144,10 +144,10 @@ namespace
 template <int dim>
 FE_DGQ<dim>::FE_DGQ (const unsigned int degree)
                :
-               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1),
-                                   std::vector<bool>(FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,
+               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree), 1, degree),
+                                   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).dofs_per_cell,
+                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell,
                                                                    std::vector<bool>(1,true))),
                 degree(degree),
                 polynomial_space (Polynomials::LagrangeEquidistant::generate_complete_basis(degree))
index db4bfa1b1c58015344ba34db4586bbdd592564d1..53e7be3370854b3bc20f4ce0e98a8369a95a35b6 100644 (file)
@@ -431,10 +431,10 @@ namespace FE_Q_Helper
 template <int dim>
 FE_Q<dim>::FE_Q (const unsigned int degree)
                :
-               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1),
-                                   std::vector<bool> (FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,
+               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1, degree),
+                                   std::vector<bool> (FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell,
                                                        false),
-                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,
+                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell,
                                                                    std::vector<bool>(1,true))),
                 degree(degree),
                 renumber(lexicographic_to_hierarchic_numbering (*this, degree)),
index 7a3413c53ac75aff4a6ae8ef83ecd591bfa4ad3c..edf384f4091e782b0fe5e31c2637165d7f0c2c8f 100644 (file)
@@ -47,10 +47,10 @@ namespace
 template <int dim>
 FE_Q_Hierarchical<dim>::FE_Q_Hierarchical (const unsigned int degree)
                :
-               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1),
-                                   std::vector<bool> (FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,
+               FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),1, degree),
+                                   std::vector<bool> (FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell,
                                                        false),
-                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),1).dofs_per_cell,
+                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),1, degree).dofs_per_cell,
                                                                    std::vector<bool>(1,true))),
                degree(degree),
                renumber(lexicographic_to_hierarchic_numbering (*this, degree)),
index b63f5b854b2d40922a2097157035fdae2a115dd7..ddcc7c65d93de1484a9be4d0cd3e4ed6c5527da2 100644 (file)
@@ -128,9 +128,9 @@ template <int dim>
 FE_RaviartThomas<dim>::FE_RaviartThomas (const unsigned int degree)
                :
                FiniteElement<dim> (FiniteElementData<dim>(get_dpo_vector(degree),
-                                                          dim),
+                                                          dim, degree+1),
                                    get_ria_vector (degree),
-                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),dim).dofs_per_cell,
+                                   std::vector<std::vector<bool> >(FiniteElementData<dim>(get_dpo_vector(degree),dim,degree+1).dofs_per_cell,
                                                                    std::vector<bool>(dim,true))),
                degree(degree),
                 polynomials (create_polynomials(degree)),
index 6aac1b39ff3c5b83c871b71580b64385d0ea2cac..9ae5a5cbb06d494cc89b58c9487e47b1a7baf4c0 100644 (file)
@@ -20,7 +20,7 @@
 #include <fe/mapping.h>
 #include <fe/fe_system.h>
 #include <fe/fe_values.h>
-
+#include <iostream>
 #ifdef HAVE_STD_STRINGSTREAM
 #  include <sstream>
 #else
@@ -1732,7 +1732,7 @@ 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);
+  return FiniteElementData<dim> (dpo, fe_data.n_components() * N, fe_data.tensor_degree());
 }
 
 
@@ -1843,10 +1843,17 @@ FESystem<dim>::multiply_dof_numbers (const FiniteElementData<dim> &fe1,
   dpo.push_back(fe1.dofs_per_line * N1 + fe2.dofs_per_line * N2);
   if (dim>1) dpo.push_back(fe1.dofs_per_quad * N1 + fe2.dofs_per_quad * N2);
   if (dim>2) dpo.push_back(fe1.dofs_per_hex * N1 + fe2.dofs_per_hex * N2);
-  
+
+                                  // degree is the maximal degree of
+                                  // the components.  max also makes
+                                  // sure that one unknown degree
+                                  // makes the degree of the system
+                                  // unknown.
+  unsigned int degree = std::max(fe1.tensor_degree(), fe2.tensor_degree());
   return FiniteElementData<dim> (dpo,
                                 fe1.n_components() * N1 +
-                                fe2.n_components() * N2);
+                                fe2.n_components() * N2,
+                                degree);
 }
 
 
@@ -1873,11 +1880,13 @@ FESystem<dim>::multiply_dof_numbers (const FiniteElementData<dim> &fe1,
   if (dim>2) dpo.push_back(fe1.dofs_per_hex * N1 +
                           fe2.dofs_per_hex * N2 +
                           fe3.dofs_per_hex * N3);
-  
+                                  // degree is the maximal degree of the components
+  unsigned int degree = std::max(fe1.tensor_degree(), fe2.tensor_degree());
+  degree = std::max(degree, fe3.tensor_degree());
   return FiniteElementData<dim> (dpo,
                                 fe1.n_components() * N1 +
                                 fe2.n_components() * N2 +
-                                fe3.n_components() * N3);
+                                fe3.n_components() * N3, degree);
 }
 
 
index 7de7e4217578385caaf5af20c821a67ba66ef525..22a5c5f8b9a5baee1181e43a9fb29034e371cf6b 100644 (file)
@@ -303,10 +303,19 @@ contributor's names are abbreviated by WB (Wolfgang Bangerth), GK
 <h3>deal.II</h3>
 
 <ol>
+
+  <li> <p>
+  Improved: <code class="class">FiniteElementData</code> has a function
+  <class="member">tensor_degree()</code>, returning the degree of the
+  polynomial space suitable for choosing a tensor product quadrature formula.
+  <br>
+  (GK 2003/11/28)
+  </p>
+
   <li> <p>
        New: Long requested but never implemented before in the
        library: there is now a function <code
-       <class="member">GridTool::find_active_cell_around_point</code>
+       <class="class">GridTool</code>::<class="member">find_active_cell_around_point</code>
        that, given a point, finds the active cell in which this point
        lies.
        <br>
index 04240d56eaa21e9ae0052dfe2c82e6f937e87cf3..e542e044a0ebeb8bfa2d97a2c1dcabe6b3b32de2 100644 (file)
@@ -95,7 +95,8 @@ void test_fe_datas()
       deallog << "first_face_quad_index=" << fe_data->first_face_quad_index << std::endl;
       deallog << "dofs_per_face=" << fe_data->dofs_per_face << std::endl;
       deallog << "dofs_per_cell=" << fe_data->dofs_per_cell << std::endl;
-      deallog << "components=" << fe_data->components << std::endl;
+      deallog << "components=" << fe_data->components << std::endl
+             << "degree=" << fe_data->tensor_degree() << std::endl;
 
       for (unsigned int f=0;f<GeometryInfo<dim>::faces_per_cell;++f)
        {
@@ -105,6 +106,7 @@ void test_fe_datas()
              deallog << '\t' << s;
          deallog << std::endl;
        }
+      deallog << std::endl;
     }
 
                                   // delete all FiniteElementDatas

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.