From: wick Date: Fri, 8 Jan 2010 12:41:20 +0000 (+0000) Subject: add constructor for FESystem with four base elements X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a5dc1fa9a8d0d88c9e2a6b3b76b352680de078b;p=dealii-svn.git add constructor for FESystem with four base elements git-svn-id: https://svn.dealii.org/trunk@20333 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/deal.II/include/fe/fe_system.h b/deal.II/deal.II/include/fe/fe_system.h index 8339b49fef..4e12dc02ba 100644 --- a/deal.II/deal.II/include/fe/fe_system.h +++ b/deal.II/deal.II/include/fe/fe_system.h @@ -129,6 +129,18 @@ class FESystem : public FiniteElement const FiniteElement &fe2, const unsigned int n2, const FiniteElement &fe3, const unsigned int n3); + /** + * Constructor for mixed + * discretizations with four + * base elements. + * + * See the other constructor. + */ + FESystem (const FiniteElement &fe1, const unsigned int n1, + const FiniteElement &fe2, const unsigned int n2, + const FiniteElement &fe3, const unsigned int n3, + const FiniteElement &fe4, const unsigned int n4); + /** * Destructor. */ @@ -783,6 +795,19 @@ class FESystem : public FiniteElement const FiniteElementData &fe3, const unsigned int N3); + /** + * with 4 different sub-elements + */ + static FiniteElementData + multiply_dof_numbers (const FiniteElementData &fe1, + const unsigned int N1, + const FiniteElementData &fe2, + const unsigned int N2, + const FiniteElementData &fe3, + const unsigned int N3, + const FiniteElementData &fe4, + const unsigned int N4); + /** * Helper function used in the @@ -821,6 +846,19 @@ class FESystem : public FiniteElement const FiniteElement &fe3, const unsigned int N3); + /** + * with four different sub-elements + */ + static std::vector + compute_restriction_is_additive_flags (const FiniteElement &fe1, + const unsigned int N1, + const FiniteElement &fe2, + const unsigned int N2, + const FiniteElement &fe3, + const unsigned int N3, + const FiniteElement &fe4, + const unsigned int N4); + /** * Compute the named flags for a * list of finite elements with @@ -828,7 +866,7 @@ class FESystem : public FiniteElement * second argument. This function * is called from all the above * functions. - */ + */ static std::vector compute_restriction_is_additive_flags (const std::vector*> &fes, const std::vector &multiplicities); @@ -867,6 +905,21 @@ class FESystem : public FiniteElement const FiniteElement &fe3, const unsigned int N3); + /** + * Compute the non-zero vector + * components of a composed + * finite element. + */ + static std::vector > + compute_nonzero_components (const FiniteElement &fe1, + const unsigned int N1, + const FiniteElement &fe2, + const unsigned int N2, + const FiniteElement &fe3, + const unsigned int N3, + const FiniteElement &fe4, + const unsigned int N4); + /** * Compute the nonzero components * of a list of finite elements diff --git a/deal.II/deal.II/source/fe/fe_system.cc b/deal.II/deal.II/source/fe/fe_system.cc index 71bc760692..98063d6721 100644 --- a/deal.II/deal.II/source/fe/fe_system.cc +++ b/deal.II/deal.II/source/fe/fe_system.cc @@ -211,6 +211,44 @@ FESystem::FESystem (const FiniteElement &fe1, } +template +FESystem::FESystem (const FiniteElement &fe1, + const unsigned int n1, + const FiniteElement &fe2, + const unsigned int n2, + const FiniteElement &fe3, + const unsigned int n3, + const FiniteElement &fe4, + const unsigned int n4) : + FiniteElement (multiply_dof_numbers(fe1, n1, + fe2, n2, + fe3, n3, + fe4, n4), + compute_restriction_is_additive_flags (fe1, n1, + fe2, n2, + fe3, n3, + fe4, n4), + compute_nonzero_components(fe1, n1, + fe2, n2, + fe3, n3, + fe4 ,n4)), + base_elements(4) +{ + base_elements[0] = ElementPair(fe1.clone(), n1); + base_elements[0].first->subscribe (typeid(*this).name()); + base_elements[1] = ElementPair(fe2.clone(), n2); + base_elements[1].first->subscribe (typeid(*this).name()); + base_elements[2] = ElementPair(fe3.clone(), n3); + base_elements[2].first->subscribe (typeid(*this).name()); + base_elements[3] = ElementPair(fe4.clone(), n4); + base_elements[3].first->subscribe (typeid(*this).name()); + this->first_block_of_base_table.push_back(n1); + this->first_block_of_base_table.push_back(n1+n2); + this->first_block_of_base_table.push_back(n1+n2+n3); + initialize (); +} + + template FESystem::~FESystem () @@ -262,23 +300,32 @@ FESystem::clone() const { switch (n_base_elements()) { - case 1: - return new FESystem(base_element(0), - element_multiplicity(0)); - case 2: - return new FESystem(base_element(0), - element_multiplicity(0), - base_element(1), - element_multiplicity(1)); - case 3: - return new FESystem(base_element(0), - element_multiplicity(0), - base_element(1), - element_multiplicity(1), - base_element(2), - element_multiplicity(2)); + case 1: + return new FESystem(base_element(0), + element_multiplicity(0)); + case 2: + return new FESystem(base_element(0), + element_multiplicity(0), + base_element(1), + element_multiplicity(1)); + case 3: + return new FESystem(base_element(0), + element_multiplicity(0), + base_element(1), + element_multiplicity(1), + base_element(2), + element_multiplicity(2)); + case 4: + return new FESystem(base_element(0), + element_multiplicity(0), + base_element(1), + element_multiplicity(1), + base_element(2), + element_multiplicity(2), + base_element(3), + element_multiplicity(3)); default: - Assert(false, ExcNotImplemented()); + Assert(false, ExcNotImplemented()); } return 0; } @@ -2522,6 +2569,52 @@ FESystem::multiply_dof_numbers (const FiniteElementData &fe1, +template +FiniteElementData +FESystem::multiply_dof_numbers (const FiniteElementData &fe1, + const unsigned int N1, + const FiniteElementData &fe2, + const unsigned int N2, + const FiniteElementData &fe3, + const unsigned int N3, + const FiniteElementData &fe4, + const unsigned int N4) +{ + std::vector dpo; + dpo.push_back(fe1.dofs_per_vertex * N1 + + fe2.dofs_per_vertex * N2 + + fe3.dofs_per_vertex * N3 + + fe4.dofs_per_vertex * N4); + dpo.push_back(fe1.dofs_per_line * N1 + + fe2.dofs_per_line * N2 + + fe3.dofs_per_line * N3 + + fe4.dofs_per_line * N4); + if (dim>1) dpo.push_back(fe1.dofs_per_quad * N1 + + fe2.dofs_per_quad * N2 + + fe3.dofs_per_quad * N3 + + fe4.dofs_per_quad * N4); + if (dim>2) dpo.push_back(fe1.dofs_per_hex * N1 + + fe2.dofs_per_hex * N2 + + fe3.dofs_per_hex * N3 + + fe4.dofs_per_hex * N4); + // degree is the maximal degree of the components + const unsigned int + degree = std::max(std::max (std::max(fe1.tensor_degree(),fe2.tensor_degree()),fe3.tensor_degree()), fe4.tensor_degree()); + + return FiniteElementData ( + dpo, + fe1.n_components() * N1 + fe2.n_components() * N2 + fe3.n_components() * N3 + + fe4.n_components() * N4, + degree, + typename FiniteElementData::Conformity(fe1.conforming_space + & fe2.conforming_space + & fe3.conforming_space + & fe4.conforming_space), + N1 + N2 + N3 + N4); +} + + + template std::vector FESystem::compute_restriction_is_additive_flags (const FiniteElement &fe, @@ -2584,6 +2677,36 @@ FESystem::compute_restriction_is_additive_flags (const FiniteEleme } +template +std::vector +FESystem::compute_restriction_is_additive_flags (const FiniteElement &fe1, + const unsigned int N1, + const FiniteElement &fe2, + const unsigned int N2, + const FiniteElement &fe3, + const unsigned int N3, + const FiniteElement &fe4, + const unsigned int N4) +{ + std::vector*> fe_list; + std::vector multiplicities; + + fe_list.push_back (&fe1); + multiplicities.push_back (N1); + + fe_list.push_back (&fe2); + multiplicities.push_back (N2); + + fe_list.push_back (&fe3); + multiplicities.push_back (N3); + + fe_list.push_back (&fe4); + multiplicities.push_back (N4); + + return compute_restriction_is_additive_flags (fe_list, multiplicities); +} + + template std::vector @@ -2780,6 +2903,37 @@ FESystem::compute_nonzero_components (const FiniteElement +std::vector > +FESystem::compute_nonzero_components (const FiniteElement &fe1, + const unsigned int N1, + const FiniteElement &fe2, + const unsigned int N2, + const FiniteElement &fe3, + const unsigned int N3, + const FiniteElement &fe4, + const unsigned int N4) +{ + std::vector*> fe_list; + std::vector multiplicities; + + fe_list.push_back (&fe1); + multiplicities.push_back (N1); + + fe_list.push_back (&fe2); + multiplicities.push_back (N2); + + fe_list.push_back (&fe3); + multiplicities.push_back (N3); + + fe_list.push_back (&fe4); + multiplicities.push_back (N4); + + return compute_nonzero_components (fe_list, multiplicities); +} + + + template std::vector > FESystem:: diff --git a/deal.II/doc/news/changes.h b/deal.II/doc/news/changes.h index 446b0ef498..d29ada68aa 100644 --- a/deal.II/doc/news/changes.h +++ b/deal.II/doc/news/changes.h @@ -569,6 +569,14 @@ inconvenience this causes.

deal.II

    +
  1. +

    + New: Constructor of FESystem now also exists for four base elements. +
    + (Thomas Wick 2010/01/08) +

    +
  2. +
  3. New: The functions in namespace DoFRenumbering::boost are now also compiled for