From 95deb51bab00ca6d0c0f0a897197369f175da8a3 Mon Sep 17 00:00:00 2001 From: guido Date: Tue, 28 Jun 2005 22:42:24 +0000 Subject: [PATCH] additional information conforming_space in FiniteElementData git-svn-id: https://svn.dealii.org/trunk@10962 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/include/fe/fe_base.h | 102 +++++++++++++++++- deal.II/deal.II/source/fe/fe_data.cc | 15 ++- deal.II/deal.II/source/fe/fe_dgp.cc | 2 +- deal.II/deal.II/source/fe/fe_dgp_monomial.cc | 2 +- .../deal.II/source/fe/fe_dgp_nonparametric.cc | 2 +- deal.II/deal.II/source/fe/fe_dgq.cc | 2 +- deal.II/deal.II/source/fe/fe_nedelec.cc | 5 +- deal.II/deal.II/source/fe/fe_q.cc | 2 +- .../deal.II/source/fe/fe_q_hierarchical.cc | 2 +- .../deal.II/source/fe/fe_raviart_thomas.cc | 2 +- .../source/fe/fe_raviart_thomas_nodal.cc | 3 +- deal.II/deal.II/source/fe/fe_system.cc | 12 ++- 12 files changed, 129 insertions(+), 22 deletions(-) diff --git a/deal.II/deal.II/include/fe/fe_base.h b/deal.II/deal.II/include/fe/fe_base.h index 17822d6128..9f39c08923 100644 --- a/deal.II/deal.II/include/fe/fe_base.h +++ b/deal.II/deal.II/include/fe/fe_base.h @@ -45,10 +45,78 @@ template class FESystem; * * @author Wolfgang Bangerth, Guido Kanschat, 1998, 1999, 2000, 2001, 2003, 2005 */ -template +template 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 + * H1 is in + * Hcurl and + * Hdiv as + * well. + * + * If you are interested in + * continuity in the classical + * sense, then the following + * relations hold: + * + *
    + * + *
  1. H1 + * implies that the function is + * continuous over cell + * boundaries. + * + *
  2. H2 + * implies that the function is + * continuously differentiable + * over cell boundaries. + * + * The value L2 + * indicates that the element is + * discontinuous. Since + * discontinuous elements have no + * topological couplings between + * grid cells and code may + * actually depend on this + * property, L2 + * conformity is handled in a + * special way in the sense that + * it is not implied by + * any higher conformity. + * + * In order to test if a finite + * element conforms to a certain + * space, use + * FiniteElementData::conforms(). + */ + enum Conformity + { +/// Indicates incompatible continuities of a system. + unknown = 0x00, +/// Discontinuous elements. See above! + L2 = 0x01, +/// Conformity with the space Hcurl (continuous tangential component of a vector field) + Hcurl = 0x02, +/// Conformity with the space Hdiv (continuous normal component of a vector field) + Hdiv = 0x04, +/// Conformity with the space H1 (continuous) + H1 = 0x06, +/// Conformity with the space H2 (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 &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 &) const; + bool operator == (const FiniteElementData &) const; }; @@ -1869,6 +1956,15 @@ FiniteElementData::tensor_degree () const } +template +inline +bool +FiniteElementData::conforms (Conformity space) const +{ + return ((space & conforming_space) != 0); +} + +//----------------------------------------------------------------------// template inline diff --git a/deal.II/deal.II/source/fe/fe_data.cc b/deal.II/deal.II/source/fe/fe_data.cc index 7a13a1b9df..06c21aa284 100644 --- a/deal.II/deal.II/source/fe/fe_data.cc +++ b/deal.II/deal.II/source/fe/fe_data.cc @@ -16,7 +16,7 @@ #include -template +template FiniteElementData::FiniteElementData () : dofs_per_vertex(0), @@ -31,7 +31,8 @@ FiniteElementData::FiniteElementData () dofs_per_face(0), dofs_per_cell (0), components(0), - degree(0) + degree(0), + conforming_space(unknown) {} @@ -40,7 +41,8 @@ template FiniteElementData:: FiniteElementData (const std::vector &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 &dofs_per_object, GeometryInfo::quads_per_cell * dofs_per_quad + GeometryInfo::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::operator== (const FiniteElementData &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)); } diff --git a/deal.II/deal.II/source/fe/fe_dgp.cc b/deal.II/deal.II/source/fe/fe_dgp.cc index 9fa9881d02..70d5ec4356 100644 --- a/deal.II/deal.II/source/fe/fe_dgp.cc +++ b/deal.II/deal.II/source/fe/fe_dgp.cc @@ -26,7 +26,7 @@ FE_DGP::FE_DGP (const unsigned int degree) : FE_Poly, dim> ( PolynomialSpace(Polynomials::Legendre::generate_complete_basis(degree)), - FiniteElementData(get_dpo_vector(degree), 1, degree), + FiniteElementData(get_dpo_vector(degree), 1, degree, FiniteElementData::L2), std::vector(FiniteElementData(get_dpo_vector(degree), 1, degree).dofs_per_cell,true), std::vector >(FiniteElementData( get_dpo_vector(degree), 1, degree).dofs_per_cell, std::vector(1,true))) diff --git a/deal.II/deal.II/source/fe/fe_dgp_monomial.cc b/deal.II/deal.II/source/fe/fe_dgp_monomial.cc index 89ebb597a2..d5ed0b1ff7 100644 --- a/deal.II/deal.II/source/fe/fe_dgp_monomial.cc +++ b/deal.II/deal.II/source/fe/fe_dgp_monomial.cc @@ -113,7 +113,7 @@ FE_DGPMonomial::FE_DGPMonomial (const unsigned int degree) : FE_Poly, dim> ( PolynomialsP(degree), - FiniteElementData(get_dpo_vector(degree), 1, degree), + FiniteElementData(get_dpo_vector(degree), 1, degree, FiniteElementData::L2), std::vector(FiniteElementData(get_dpo_vector(degree), 1, degree).dofs_per_cell,true), std::vector >(FiniteElementData( get_dpo_vector(degree), 1, degree).dofs_per_cell, std::vector(1,true))) diff --git a/deal.II/deal.II/source/fe/fe_dgp_nonparametric.cc b/deal.II/deal.II/source/fe/fe_dgp_nonparametric.cc index 43af89dcf0..b7c1ff6fb2 100644 --- a/deal.II/deal.II/source/fe/fe_dgp_nonparametric.cc +++ b/deal.II/deal.II/source/fe/fe_dgp_nonparametric.cc @@ -30,7 +30,7 @@ template FE_DGPNonparametric::FE_DGPNonparametric (const unsigned int degree) : - FiniteElement (FiniteElementData(get_dpo_vector(degree),1), + FiniteElement (FiniteElementData(get_dpo_vector(degree),1, FiniteElementData::L2), std::vector(FiniteElementData(get_dpo_vector(degree),1).dofs_per_cell,true), std::vector >(FiniteElementData(get_dpo_vector(degree),1).dofs_per_cell, std::vector(1,true))), diff --git a/deal.II/deal.II/source/fe/fe_dgq.cc b/deal.II/deal.II/source/fe/fe_dgq.cc index 9423cc1b2b..189c15f206 100644 --- a/deal.II/deal.II/source/fe/fe_dgq.cc +++ b/deal.II/deal.II/source/fe/fe_dgq.cc @@ -139,7 +139,7 @@ FE_DGQ::FE_DGQ (const unsigned int degree) : FE_Poly, dim> ( TensorProductPolynomials(Polynomials::LagrangeEquidistant::generate_complete_basis(degree)), - FiniteElementData(get_dpo_vector(degree), 1, degree), + FiniteElementData(get_dpo_vector(degree), 1, degree, FiniteElementData::L2), std::vector(FiniteElementData(get_dpo_vector(degree),1, degree).dofs_per_cell, true), std::vector >(FiniteElementData( get_dpo_vector(degree),1, degree).dofs_per_cell, std::vector(1,true))) diff --git a/deal.II/deal.II/source/fe/fe_nedelec.cc b/deal.II/deal.II/source/fe/fe_nedelec.cc index 42b4a64299..32a98161ee 100644 --- a/deal.II/deal.II/source/fe/fe_nedelec.cc +++ b/deal.II/deal.II/source/fe/fe_nedelec.cc @@ -29,11 +29,12 @@ #endif + +//TODO: Remove doubled degrees template FE_Nedelec::FE_Nedelec (const unsigned int degree) : - FiniteElement (FiniteElementData(get_dpo_vector(degree), - dim), + FiniteElement (FiniteElementData(get_dpo_vector(degree), dim, degree+1, FiniteElementData::Hcurl), std::vector (FiniteElementData(get_dpo_vector(degree),dim).dofs_per_cell,false), std::vector >(FiniteElementData(get_dpo_vector(degree),dim).dofs_per_cell, std::vector(dim,true))), diff --git a/deal.II/deal.II/source/fe/fe_q.cc b/deal.II/deal.II/source/fe/fe_q.cc index 06ef2603eb..5045dcf58f 100644 --- a/deal.II/deal.II/source/fe/fe_q.cc +++ b/deal.II/deal.II/source/fe/fe_q.cc @@ -185,7 +185,7 @@ FE_Q::FE_Q (const unsigned int degree) : FE_Poly, dim> ( TensorProductPolynomials(Polynomials::LagrangeEquidistant::generate_complete_basis(degree)), - FiniteElementData(get_dpo_vector(degree),1, degree), + FiniteElementData(get_dpo_vector(degree),1, degree, FiniteElementData::H1), std::vector (FiniteElementData( get_dpo_vector(degree),1, degree).dofs_per_cell, false), std::vector >(FiniteElementData( diff --git a/deal.II/deal.II/source/fe/fe_q_hierarchical.cc b/deal.II/deal.II/source/fe/fe_q_hierarchical.cc index ab218ccaf8..bb6c9145e6 100644 --- a/deal.II/deal.II/source/fe/fe_q_hierarchical.cc +++ b/deal.II/deal.II/source/fe/fe_q_hierarchical.cc @@ -41,7 +41,7 @@ FE_Q_Hierarchical::FE_Q_Hierarchical (const unsigned int degree) : FE_Poly, dim> ( Polynomials::Hierarchical::generate_complete_basis(degree), - FiniteElementData(get_dpo_vector(degree),1, degree), + FiniteElementData(get_dpo_vector(degree),1, degree, FiniteElementData::H1), std::vector (FiniteElementData( get_dpo_vector(degree),1, degree).dofs_per_cell, false), std::vector >(FiniteElementData( diff --git a/deal.II/deal.II/source/fe/fe_raviart_thomas.cc b/deal.II/deal.II/source/fe/fe_raviart_thomas.cc index 9e26669149..de29a04b6a 100644 --- a/deal.II/deal.II/source/fe/fe_raviart_thomas.cc +++ b/deal.II/deal.II/source/fe/fe_raviart_thomas.cc @@ -132,7 +132,7 @@ template FE_RaviartThomas::FE_RaviartThomas (const unsigned int rt_order) : FiniteElement (FiniteElementData(get_dpo_vector(rt_order), - dim, rt_order+1), + dim, rt_order+1, FiniteElementData::Hdiv), get_ria_vector (rt_order), std::vector >(FiniteElementData(get_dpo_vector(rt_order),dim,rt_order+1).dofs_per_cell, std::vector(dim,true))), diff --git a/deal.II/deal.II/source/fe/fe_raviart_thomas_nodal.cc b/deal.II/deal.II/source/fe/fe_raviart_thomas_nodal.cc index c62543f266..e22c31beb4 100644 --- a/deal.II/deal.II/source/fe/fe_raviart_thomas_nodal.cc +++ b/deal.II/deal.II/source/fe/fe_raviart_thomas_nodal.cc @@ -37,7 +37,7 @@ FE_RaviartThomasNodal::FE_RaviartThomasNodal (const unsigned int deg) FE_PolyTensor, dim> ( deg, FiniteElementData(get_dpo_vector(deg), - dim, deg+1), + dim, deg+1, FiniteElementData::Hdiv), get_ria_vector (deg), std::vector >( FiniteElementData(get_dpo_vector(deg), @@ -277,7 +277,6 @@ FE_RaviartThomasNodal::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 diff --git a/deal.II/deal.II/source/fe/fe_system.cc b/deal.II/deal.II/source/fe/fe_system.cc index 3f84168c4c..63bc6ba83c 100644 --- a/deal.II/deal.II/source/fe/fe_system.cc +++ b/deal.II/deal.II/source/fe/fe_system.cc @@ -1730,7 +1730,8 @@ FESystem::multiply_dof_numbers (const FiniteElementData &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 (dpo, fe_data.n_components() * N, fe_data.tensor_degree()); + return FiniteElementData (dpo, fe_data.n_components() * N, fe_data.tensor_degree(), + fe_data.conforming_space); } @@ -1851,7 +1852,9 @@ FESystem::multiply_dof_numbers (const FiniteElementData &fe1, return FiniteElementData (dpo, fe1.n_components() * N1 + fe2.n_components() * N2, - degree); + degree, + FiniteElementData::Conformity(fe1.conforming_space + & fe2.conforming_space)); } @@ -1884,7 +1887,10 @@ FESystem::multiply_dof_numbers (const FiniteElementData &fe1, return FiniteElementData (dpo, fe1.n_components() * N1 + fe2.n_components() * N2 + - fe3.n_components() * N3, degree); + fe3.n_components() * N3, degree, + FiniteElementData::Conformity(fe1.conforming_space + & fe2.conforming_space + & fe3.conforming_space)); } -- 2.39.5