]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
add a function to count MGDoFs per block
authorkanschat <kanschat@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 10 Apr 2007 23:14:29 +0000 (23:14 +0000)
committerkanschat <kanschat@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 10 Apr 2007 23:14:29 +0000 (23:14 +0000)
git-svn-id: https://svn.dealii.org/trunk@14623 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/source/multigrid/mg_dof_tools.cc

index ff6badc4abcc415b56416f3272fa0d13e53ef8c7..ec589b7efb412e64802ff020e177ec61c52dc29e 100644 (file)
@@ -1008,6 +1008,78 @@ MGTools::count_dofs_per_component (
 
 
 
+template <int dim>
+void
+MGTools::count_dofs_per_block (
+  const MGDoFHandler<dim> &dof_handler,
+  std::vector<std::vector<unsigned int> > &result,
+  std::vector<unsigned int> target_block)
+{
+  const FiniteElement<dim>& fe = dof_handler.get_fe();
+  const unsigned int n_blocks = fe.n_blocks();
+  const unsigned int nlevels = dof_handler.get_tria().n_levels();
+  
+  Assert (result.size() == nlevels,
+         ExcDimensionMismatch(result.size(), nlevels));
+  
+  if (target_block.size() == 0)
+    {
+      target_block.resize(n_blocks);
+      for (unsigned int i=0;i<n_blocks;++i)
+       target_block[i] = i;
+    }
+  
+  Assert(target_block.size() == n_blocks,
+        ExcDimensionMismatch(target_block.size(), n_blocks));
+  
+  for (unsigned int l=0;l<nlevels;++l)
+    {
+      result[l].resize (n_blocks);
+      std::fill (result[l].begin(),result[l].end(), 0U);
+      
+                                      // special case for only one
+                                      // block. treat this first
+                                      // since it does not require any
+                                      // computations
+      if (n_blocks == 1)
+       result[l][0] = dof_handler.n_dofs(l);
+      else
+       {
+                                          // otherwise determine the number
+                                          // of dofs in each block
+                                          // separately. do so in parallel
+         std::vector<std::vector<bool> >
+           dofs_in_block (n_blocks,
+                          std::vector<bool>(dof_handler.n_dofs(l), false));
+         std::vector<std::vector<bool> >
+           block_select (n_blocks, std::vector<bool>(n_blocks, false));
+         Threads::ThreadGroup<> threads;
+         for (unsigned int i=0; i<n_blocks; ++i)
+           {
+             void (*fun_ptr) (const unsigned int       level,
+                              const MGDoFHandler<dim>    &,
+                              const std::vector<bool>    &,
+                              std::vector<bool>          &,
+                              bool)
+               = &DoFTools::template extract_level_dofs<dim>;
+             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<fe.n_blocks();++block)
+           result[l][target_block[block]]
+             += std::count(dofs_in_block[block].begin(),
+                           dofs_in_block[block].end(),
+                           true);
+       }
+    }
+}
+
+
+
 template <int dim>
 void
 MGTools::count_dofs_per_component (

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.