From a33493180a4315fbb133aa644c7ff412aeb4f22e Mon Sep 17 00:00:00 2001 From: Guido Kanschat Date: Fri, 17 Jun 2005 10:37:50 +0000 Subject: [PATCH] improved version of DoFTools::count_dofs_per_component for non primitives tests for Raviart-Thomas-Elements added git-svn-id: https://svn.dealii.org/trunk@10878 0785d39b-7218-0410-832d-ea1e28bc413d --- deal.II/deal.II/include/dofs/dof_tools.h | 12 ++++++ deal.II/deal.II/source/dofs/dof_tools.cc | 38 ++++++++++++++----- .../source/multigrid/mg_transfer_block.cc | 2 +- tests/bits/dof_tools_00a.cc | 26 ++++++++++++- tests/bits/dof_tools_common.cc | 13 ++++++- tests/multigrid/transfer.cc | 2 +- 6 files changed, 79 insertions(+), 14 deletions(-) diff --git a/deal.II/deal.II/include/dofs/dof_tools.h b/deal.II/deal.II/include/dofs/dof_tools.h index 4bb5181299..1d678a2849 100644 --- a/deal.II/deal.II/include/dofs/dof_tools.h +++ b/deal.II/deal.II/include/dofs/dof_tools.h @@ -906,6 +906,17 @@ class DoFTools * than the total number of * degrees of freedom. * + * This behavior can be switched + * off by the optional parameter + * vector_valued_once. If + * this is true, the + * number of components of a + * nonprimitive vector valued + * element is collected only in + * the first component. All other + * components will have a count + * of zero. + * * The additional optional * argument @p target_component * allows for a re-sorting and @@ -934,6 +945,7 @@ class DoFTools static void count_dofs_per_component (const DoFHandler& dof_handler, std::vector& dofs_per_component, + const bool vector_valued_once = false, std::vector target_component =std::vector()); diff --git a/deal.II/deal.II/source/dofs/dof_tools.cc b/deal.II/deal.II/source/dofs/dof_tools.cc index 9728a3d8f5..0ecf810e94 100644 --- a/deal.II/deal.II/source/dofs/dof_tools.cc +++ b/deal.II/deal.II/source/dofs/dof_tools.cc @@ -1723,9 +1723,11 @@ void DoFTools::count_dofs_per_component ( const DoFHandler& dof_handler, std::vector& dofs_per_component, + bool only_once, std::vector target_component) { - const unsigned int n_components = dof_handler.get_fe().n_components(); + const FiniteElement& fe = dof_handler.get_fe(); + const unsigned int n_components = fe.n_components(); dofs_per_component.resize (n_components); std::fill (dofs_per_component.begin(), dofs_per_component.end(), 0U); @@ -1750,8 +1752,9 @@ DoFTools::count_dofs_per_component ( { dofs_per_component[0] = dof_handler.n_dofs(); return; - }; - + } + + // otherwise determine the number // of dofs in each component // separately. do so in parallel @@ -1775,12 +1778,27 @@ DoFTools::count_dofs_per_component ( threads.join_all (); // next count what we got - for (unsigned int i=0; i& base = fe.base_element(b); + // Dimension of base element + unsigned int d = base.n_components(); + + for (unsigned int m=0;m ( const DoFHandler&, - std::vector&, std::vector); + std::vector&, bool, std::vector); template void diff --git a/deal.II/deal.II/source/multigrid/mg_transfer_block.cc b/deal.II/deal.II/source/multigrid/mg_transfer_block.cc index 5a74928df1..c7d9aac3f4 100644 --- a/deal.II/deal.II/source/multigrid/mg_transfer_block.cc +++ b/deal.II/deal.II/source/multigrid/mg_transfer_block.cc @@ -113,7 +113,7 @@ void MGTransferBlockBase::build_matrices ( component_start.resize(target_component.size()); DoFTools:: count_dofs_per_component (static_cast&>(mg_dof), - component_start, target_component); + component_start, true, target_component); unsigned int k=0; for (unsigned int i=0;i &dof_handler) deallog << ' ' << dofs_per_component[i]; deallog << std::endl; + DoFTools::count_dofs_per_component (dof_handler, + dofs_per_component, true); + + for (unsigned int i=0;i1) { std::vector target_component(n_components,0U); DoFTools::count_dofs_per_component (dof_handler, dofs_per_component, + false, + target_component); + for (unsigned int i=0;i &dof_handler) DoFTools::count_dofs_per_component (dof_handler, dofs_per_component, + false, + target_component); + for (unsigned int i=0;i #include #include +#include #include #include @@ -158,8 +159,18 @@ main() CHECK(Nedelec, 1, 2); CHECK(Nedelec, 1, 3); - + CHECK(RaviartThomas, 0, 2); + CHECK(RaviartThomas, 1, 2); + CHECK(RaviartThomas, 2, 2); + + CHECK(RaviartThomasNodal, 0, 2); + CHECK(RaviartThomasNodal, 1, 2); + CHECK(RaviartThomasNodal, 2, 2); + CHECK(RaviartThomasNodal, 0, 3); + CHECK(RaviartThomasNodal, 1, 3); + CHECK(RaviartThomasNodal, 2, 3); + CHECK_SYS1(FE_Q<1>(1), 3,1); CHECK_SYS1(FE_DGQ<1>(2),2,1); CHECK_SYS1(FE_DGP<1>(3),1,1); diff --git a/tests/multigrid/transfer.cc b/tests/multigrid/transfer.cc index f33bb32790..b82ca5370e 100644 --- a/tests/multigrid/transfer.cc +++ b/tests/multigrid/transfer.cc @@ -90,7 +90,7 @@ void check_select(const FiniteElement& fe, mgdof.distribute_dofs(fe); DoFRenumbering::component_wise(mgdof, target_component); vector ndofs(fe.n_components()); - DoFTools::count_dofs_per_component(mgdof, ndofs, target_component); + DoFTools::count_dofs_per_component(mgdof, ndofs, true, target_component); for (unsigned int l=0;l