From d7238eaf5b7e3e68b57027fc43194706d1916f30 Mon Sep 17 00:00:00 2001 From: kanschat Date: Sat, 27 Jan 2007 03:45:06 +0000 Subject: [PATCH] implement count dofs per block for multigrid git-svn-id: https://svn.dealii.org/trunk@14388 0785d39b-7218-0410-832d-ea1e28bc413d --- .../deal.II/source/multigrid/mg_dof_tools.cc | 78 ++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc index 8e9faf5764..ff6badc4ab 100644 --- a/deal.II/deal.II/source/multigrid/mg_dof_tools.cc +++ b/deal.II/deal.II/source/multigrid/mg_dof_tools.cc @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 by the deal.II authors +// Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -1019,6 +1019,78 @@ MGTools::count_dofs_per_component ( } +template +void +MGTools::count_dofs_per_block ( + const MGDoFHandler& dof_handler, + std::vector >& dofs_per_block, + std::vector target_block) +{ + const FiniteElement& fe = dof_handler.get_fe(); + const unsigned int n_blocks = fe.n_blocks(); + const unsigned int n_levels = dof_handler.get_tria().n_levels(); + + dofs_per_block.resize (n_levels, std::vector(n_blocks)); + for (unsigned int l=0;l > + dofs_in_block (n_blocks, std::vector(dof_handler.n_dofs(l), false)); + std::vector > + block_select (n_blocks, std::vector(n_blocks, false)); + Threads::ThreadGroup<> threads; + for (unsigned int i=0; i&, + const std::vector&, + std::vector&, + bool) + = &DoFTools::template extract_level_dofs; + block_select[i][i] = true; + threads += Threads::spawn (fun_ptr)(l, dof_handler, block_select[i], + dofs_in_block[i], true); + }; + threads.join_all (); + + // next count what we got + for (unsigned int block=0;block @@ -1421,6 +1493,10 @@ template void MGTools::count_dofs_per_component ( const MGDoFHandler&, std::vector >&, std::vector); +template void MGTools::count_dofs_per_block ( + const MGDoFHandler&, + std::vector >&, + std::vector); template void MGTools::make_boundary_list( const MGDoFHandler&, -- 2.39.5