From 46cce34e36cccbcd51b5622373638980e9bcb989 Mon Sep 17 00:00:00 2001 From: Timo Heister Date: Fri, 28 Sep 2012 21:49:00 +0000 Subject: [PATCH] simplify dublicated code in fe_system git-svn-id: https://svn.dealii.org/trunk@26866 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/include/deal.II/fe/fe_system.h | 64 ++--------- deal.II/source/fe/fe_system.cc | 145 +++++-------------------- 2 files changed, 36 insertions(+), 173 deletions(-) diff --git a/deal.II/include/deal.II/fe/fe_system.h b/deal.II/include/deal.II/fe/fe_system.h index d8df1cf10c..939a63ebe4 100644 --- a/deal.II/include/deal.II/fe/fe_system.h +++ b/deal.II/include/deal.II/fe/fe_system.h @@ -884,62 +884,16 @@ class FESystem : public FiniteElement */ static std::vector compute_restriction_is_additive_flags ( - const FiniteElement &fe, - const unsigned int N); - - /** - * Same as above for mixed elements - * with two 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); - - /** - * Same as above for mixed elements - * with three 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); - - /** - * 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); - - /** - * and with five different sub-elements - */ - static std::vector - compute_restriction_is_additive_flags ( - const FiniteElement &fe1, + 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, - const FiniteElement &fe5, - const unsigned int N5); + const FiniteElement *fe2=NULL, + const unsigned int N2=0, + const FiniteElement *fe3=NULL, + const unsigned int N3=0, + const FiniteElement *fe4=NULL, + const unsigned int N4=0, + const FiniteElement *fe5=NULL, + const unsigned int N5=0); /** * Compute the named flags for a diff --git a/deal.II/source/fe/fe_system.cc b/deal.II/source/fe/fe_system.cc index 707b22f672..fd9d131cee 100644 --- a/deal.II/source/fe/fe_system.cc +++ b/deal.II/source/fe/fe_system.cc @@ -160,7 +160,7 @@ template FESystem::FESystem (const FiniteElement &fe, const unsigned int n_elements) : FiniteElement (multiply_dof_numbers(&fe, n_elements), - compute_restriction_is_additive_flags (fe, n_elements), + compute_restriction_is_additive_flags (&fe, n_elements), compute_nonzero_components(fe, n_elements)), base_elements((n_elements>0)) { @@ -179,8 +179,8 @@ FESystem::FESystem (const FiniteElement &fe1, const FiniteElement &fe2, const unsigned int n2) : FiniteElement (multiply_dof_numbers(&fe1, n1, &fe2, n2), - compute_restriction_is_additive_flags (fe1, n1, - fe2, n2), + compute_restriction_is_additive_flags (&fe1, n1, + &fe2, n2), compute_nonzero_components(fe1, n1, fe2, n2)), base_elements((n1>0)+(n2>0)) @@ -206,9 +206,9 @@ FESystem::FESystem (const FiniteElement &fe1, FiniteElement (multiply_dof_numbers(&fe1, n1, &fe2, n2, &fe3, n3), - compute_restriction_is_additive_flags (fe1, n1, - fe2, n2, - fe3, n3), + compute_restriction_is_additive_flags (&fe1, n1, + &fe2, n2, + &fe3, n3), compute_nonzero_components(fe1, n1, fe2, n2, fe3, n3)), @@ -239,10 +239,10 @@ FESystem::FESystem (const FiniteElement &fe1, &fe2, n2, &fe3, n3, &fe4, n4), - compute_restriction_is_additive_flags (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, @@ -278,11 +278,11 @@ FESystem::FESystem (const FiniteElement &fe1, &fe3, n3, &fe4, n4, &fe5, n5), - compute_restriction_is_additive_flags (fe1, n1, - fe2, n2, - fe3, n3, - fe4, n4, - fe5, n5), + compute_restriction_is_additive_flags (&fe1, n1, + &fe2, n2, + &fe3, n3, + &fe4, n4, + &fe5, n5), compute_nonzero_components(fe1, n1, fe2, n2, fe3, n3, @@ -2719,125 +2719,33 @@ FESystem::multiply_dof_numbers ( template std::vector -FESystem::compute_restriction_is_additive_flags (const FiniteElement &fe, - const unsigned int n_elements) -{ - std::vector*> fe_list; - std::vector multiplicities; - - fe_list.push_back (&fe); - multiplicities.push_back (n_elements); - - return compute_restriction_is_additive_flags (fe_list, multiplicities); -} - - - -template -std::vector -FESystem::compute_restriction_is_additive_flags (const FiniteElement &fe1, - const unsigned int N1, - const FiniteElement &fe2, - const unsigned int N2) -{ - 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); - - return compute_restriction_is_additive_flags (fe_list, multiplicities); -} - - - -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) -{ - 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); - - return compute_restriction_is_additive_flags (fe_list, multiplicities); -} - - -template -std::vector -FESystem::compute_restriction_is_additive_flags (const FiniteElement &fe1, +FESystem::compute_restriction_is_additive_flags (const FiniteElement *fe1, const unsigned int N1, - const FiniteElement &fe2, + const FiniteElement *fe2, const unsigned int N2, - const FiniteElement &fe3, + 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 -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 FiniteElement *fe4, const unsigned int N4, - const FiniteElement &fe5, + const FiniteElement *fe5, const unsigned int N5) { std::vector*> fe_list; std::vector multiplicities; - fe_list.push_back (&fe1); + fe_list.push_back (fe1); multiplicities.push_back (N1); - fe_list.push_back (&fe2); + fe_list.push_back (fe2); multiplicities.push_back (N2); - fe_list.push_back (&fe3); + fe_list.push_back (fe3); multiplicities.push_back (N3); - fe_list.push_back (&fe4); + fe_list.push_back (fe4); multiplicities.push_back (N4); - fe_list.push_back (&fe5); + fe_list.push_back (fe5); multiplicities.push_back (N5); return compute_restriction_is_additive_flags (fe_list, multiplicities); } @@ -2856,7 +2764,8 @@ compute_restriction_is_additive_flags (const std::vectordofs_per_cell * multiplicities[i]; + if (multiplicities[i]>0) // check needed as fe might be NULL + n_shape_functions += fes[i]->dofs_per_cell * multiplicities[i]; // generate the array that will // hold the output -- 2.39.5