]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Get closer to compiling again.
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 15 Jan 2010 18:44:35 +0000 (18:44 +0000)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Fri, 15 Jan 2010 18:44:35 +0000 (18:44 +0000)
git-svn-id: https://svn.dealii.org/trunk@20375 0785d39b-7218-0410-832d-ea1e28bc413d

tests/multigrid/transfer.cc
tests/multigrid/transfer_block.cc
tests/multigrid/transfer_block_select.cc
tests/multigrid/transfer_compare_01.cc

index 749089567c0cdd7dcba95c4758541ceedc96b4d0..f940fd6d4525814ab1b42b81937783f7688a9943 100644 (file)
@@ -54,7 +54,7 @@ void check_simple(const FiniteElement<dim>& fe)
   transfer.build_matrices(mgdof);
 
   MGLevelObject<Vector<double> > u(0, tr.n_levels()-1);
-  MGTools::reinit_vector(mgdof, u);
+  reinit_vector(mgdof, u);
                                   // First prolongate the constant
                                   // vector.  For Lagrange elements,
                                   // the values are just the number
index 3db78bdf4d8693a03f625b7e6e6e131d925cbeb2..c50e78285cc20aebb3cfe032f1c52fae4ce30c61 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 2000 - 2007 by the deal.II authors
+//    Copyright (C) 2000 - 2007, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
 #include <iomanip>
 #include <iomanip>
 #include <algorithm>
+#include <numeric>
 
 using namespace std;
 
+template <int dim, typename number, int spacedim>
+void
+reinit_vector_by_blocks (
+  const dealii::MGDoFHandler<dim,spacedim> &mg_dof,
+  MGLevelObject<BlockVector<number> > &v,
+  const std::vector<bool> &sel,
+  std::vector<std::vector<unsigned int> >& ndofs)
+{
+  std::vector<bool> selected=sel;
+                                  // Compute the number of blocks needed
+  const unsigned int n_selected
+    = std::accumulate(selected.begin(),
+                     selected.end(),
+                     0U);
+
+  if (ndofs.size() == 0)
+    {
+      std::vector<std::vector<unsigned int> >
+       new_dofs(mg_dof.get_tria().n_levels(),
+                std::vector<unsigned int>(selected.size()));
+      std::swap(ndofs, new_dofs);
+      MGTools::count_dofs_per_block (mg_dof, ndofs);
+    }
+
+  for (unsigned int level=v.get_minlevel();
+       level<=v.get_maxlevel();++level)
+    {
+      v[level].reinit(n_selected, 0);
+      unsigned int k=0;
+      for (unsigned int i=0;i<selected.size() && (k<v[level].n_blocks());++i)
+       {
+         if (selected[i])
+           {
+             v[level].block(k++).reinit(ndofs[level][i]);
+           }
+         v[level].collect_sizes();
+       }
+    }
+}
+
 template <int dim>
 void check_block(const FiniteElement<dim>& fe,
                 const vector<bool>& selected,
@@ -47,21 +88,22 @@ void check_block(const FiniteElement<dim>& fe,
     if (selected[i])
       deallog << ' ' << i;
   deallog << std::endl;
-  
+
   Triangulation<dim> tr;
   GridGenerator::hyper_cube(tr);
   tr.refine_global(2);
-  
+
   MGDoFHandler<dim> mgdof(tr);
   DoFHandler<dim>& dof=mgdof;
   mgdof.distribute_dofs(fe);
   DoFRenumbering::component_wise(mgdof);
   vector<unsigned int> ndofs(fe.n_blocks());
   DoFTools::count_dofs_per_block(mgdof, ndofs);
-  
+
   for (unsigned int l=0;l<tr.n_levels();++l)
     DoFRenumbering::component_wise(mgdof, l);
-  std::vector<std::vector<unsigned int> > mg_ndofs(mgdof.get_tria().n_levels());
+  std::vector<std::vector<unsigned int> > mg_ndofs(mgdof.get_tria().n_levels(),
+                                                  std::vector<unsigned int>(fe.n_blocks()));
   MGTools::count_dofs_per_block(mgdof, mg_ndofs);
 
   deallog << "Global  dofs:";
@@ -74,8 +116,8 @@ void check_block(const FiniteElement<dim>& fe,
       for (unsigned int i=0;i<mg_ndofs[l].size();++i)
        deallog << ' ' << mg_ndofs[l][i];
       deallog << std::endl;
-    }  
-  
+    }
+
   PrimitiveVectorMemory<Vector<double> > mem;
   MGTransferBlock<double> transfer;
   transfer.build_matrices(dof, mgdof, selected);
@@ -83,8 +125,8 @@ void check_block(const FiniteElement<dim>& fe,
     transfer.initialize(factors, mem);
 
   MGLevelObject< BlockVector<double> > u(0, tr.n_levels()-1);
-  
-  MGTools::reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
+
+  reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
 
                                   // Prolongate a constant function
                                   // twice
@@ -103,7 +145,7 @@ void check_block(const FiniteElement<dim>& fe,
   for (unsigned int b=0;b<u[2].n_blocks();++b)
     deallog << '\t' << (int) (u[2].block(b)*u[2].block(b)+.4);
   deallog << std::endl;
-  
+
   u[1] = 0.;
   u[0] = 0.;
   transfer.restrict_and_add(2,u[1],u[2]);
@@ -117,7 +159,7 @@ void check_block(const FiniteElement<dim>& fe,
   for (unsigned int b=0;b<u[0].n_blocks();++b)
     deallog << '\t' << (int) (u[0].block(b)*u[0].block(b)+.5);
   deallog << std::endl;
-  
+
                                   // Check copy to mg and back
                                   // Fill a global vector by counting
                                   // from one up
@@ -125,11 +167,11 @@ void check_block(const FiniteElement<dim>& fe,
   v.reinit (ndofs);
   for (unsigned int i=0;i<v.size();++i)
     v(i) = i+1;
-  
+
                                   // See what part gets copied to mg
   u.resize(0, tr.n_levels()-1);
-  MGTools::reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
-  
+  reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
+
   transfer.copy_to_mg(mgdof, u, v);
   for (unsigned int i=0; i<u[2].size();++i)
     deallog << ' ' << (int) u[2](i);
@@ -158,25 +200,25 @@ int main()
   deallog.attach(logfile);
   deallog.depth_console(0);
   deallog.threshold_double(1.e-10);
-  
+
   std::vector<double> factors;
 
   FE_DGQ<2> q0(0);
   FE_DGQ<2> q1(1);
   FE_RaviartThomasNodal<2> rt0(0);
   FE_RaviartThomasNodal<2> rt1(1);
-  
+
   FESystem<2> fe0(rt1, 1, q1, 1);
   FESystem<2> fe1(rt0, 2, q0, 2);
-  
+
   vector<bool> s1(2, true);
   deallog << "All" << std::endl;
   check_block(fe0, s1, factors);
+
   s1[1] = false;
   deallog << "Velocity" << std::endl;
   check_block(fe0, s1, factors);
-  
+
   s1[1] = true;
   s1[0] = false;
   deallog << "Pressure" << std::endl;
index 552fbc562aa81926a431f4f1cbfefe03044ce73e..c39f36c527d5e2c6f985e3c8be820e7679368be9 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 2000 - 2007 by the deal.II authors
+//    Copyright (C) 2000 - 2007, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
 #include <iomanip>
 #include <iomanip>
 #include <algorithm>
+#include <numeric>
 
 using namespace std;
 
+template <int dim, typename number, int spacedim>
+void
+reinit_vector_by_blocks (
+  const dealii::MGDoFHandler<dim,spacedim> &mg_dof,
+  MGLevelObject<BlockVector<number> > &v,
+  const std::vector<bool> &sel,
+  std::vector<std::vector<unsigned int> >& ndofs)
+{
+  std::vector<bool> selected=sel;
+                                  // Compute the number of blocks needed
+  const unsigned int n_selected
+    = std::accumulate(selected.begin(),
+                     selected.end(),
+                     0U);
+
+  if (ndofs.size() == 0)
+    {
+      std::vector<std::vector<unsigned int> >
+       new_dofs(mg_dof.get_tria().n_levels(),
+                std::vector<unsigned int>(selected.size()));
+      std::swap(ndofs, new_dofs);
+      MGTools::count_dofs_per_block (mg_dof, ndofs);
+    }
+
+  for (unsigned int level=v.get_minlevel();
+       level<=v.get_maxlevel();++level)
+    {
+      v[level].reinit(n_selected, 0);
+      unsigned int k=0;
+      for (unsigned int i=0;i<selected.size() && (k<v[level].n_blocks());++i)
+       {
+         if (selected[i])
+           {
+             v[level].block(k++).reinit(ndofs[level][i]);
+           }
+         v[level].collect_sizes();
+       }
+    }
+}
+
+
 template <int dim>
 void check_select(const FiniteElement<dim>& fe, unsigned int selected)
 {
   deallog << fe.get_name()
          << " select " << selected << std::endl;
-  
+
   Triangulation<dim> tr;
   GridGenerator::hyper_cube(tr);
   tr.refine_global(2);
-  
+
   MGDoFHandler<dim> mgdof(tr);
   DoFHandler<dim>& dof=mgdof;
   mgdof.distribute_dofs(fe);
   DoFRenumbering::component_wise(mgdof);
   vector<unsigned int> ndofs(fe.n_blocks());
   DoFTools::count_dofs_per_block(mgdof, ndofs);
-  
+
   for (unsigned int l=0;l<tr.n_levels();++l)
     DoFRenumbering::component_wise(mgdof, l);
   std::vector<std::vector<unsigned int> > mg_ndofs(mgdof.get_tria().n_levels());
@@ -69,8 +111,8 @@ void check_select(const FiniteElement<dim>& fe, unsigned int selected)
       for (unsigned int i=0;i<mg_ndofs[l].size();++i)
        deallog << ' ' << mg_ndofs[l][i];
       deallog << std::endl;
-    }  
-  
+    }
+
   MGTransferBlockSelect<double> transfer;
   transfer.build_matrices(dof, mgdof, selected);
 
@@ -81,8 +123,8 @@ void check_select(const FiniteElement<dim>& fe, unsigned int selected)
                                   // constant one and the l2-norm is
                                   // the number of degrees of freedom.
   MGLevelObject< Vector<double> > u(0, tr.n_levels()-1);
-  
-  MGTools::reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
+
+  reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
 
   u[0] = 1;
   transfer.prolongate(1,u[1],u[0]);
@@ -97,7 +139,7 @@ void check_select(const FiniteElement<dim>& fe, unsigned int selected)
   transfer.restrict_and_add(1,u[0],u[1]);
   deallog << "u1\t" << (int) (u[1]*u[1]+.5) << std::endl
          << "u0\t" << (int) (u[0]*u[0]+.5) << std::endl;
-  
+
                                   // Check copy to mg and back
                                   // Fill a global vector by counting
                                   // from one up
@@ -105,11 +147,11 @@ void check_select(const FiniteElement<dim>& fe, unsigned int selected)
   v.reinit (ndofs);
   for (unsigned int i=0;i<v.size();++i)
     v(i) = i+1;
-  
+
                                   // See what part gets copied to mg
   u.resize(0, tr.n_levels()-1);
-  MGTools::reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
-  
+  reinit_vector_by_blocks(mgdof, u, selected, mg_ndofs);
+
   transfer.copy_to_mg(mgdof, u, v);
   for (unsigned int i=0; i<u[2].size();++i)
     deallog << ' ' << (int) u[2](i);
@@ -138,18 +180,18 @@ int main()
   deallog.attach(logfile);
   deallog.depth_console(0);
   deallog.threshold_double(1.e-10);
-  
+
   FE_DGQ<2> q0(0);
   FE_DGQ<2> q1(1);
   FE_RaviartThomasNodal<2> rt0(0);
   FE_RaviartThomasNodal<2> rt1(1);
-  
+
   FESystem<2> fe0(rt1, 1, q1, 1);
   FESystem<2> fe1(rt0, 2, q0, 2);
-  
+
   check_select(fe0, 0);
   check_select(fe0, 1);
-  
+
   check_select(fe1, 0);
   check_select(fe1, 1);
   check_select(fe1, 2);
index cfa2572c9a7543eab960478456e452a7a555e028..989a04cbe259cebc1b92ea7003fc69f934326b55 100644 (file)
@@ -2,7 +2,7 @@
 //    $Id$
 //    Version: $Name$
 //
-//    Copyright (C) 2000 - 2007 by the deal.II authors
+//    Copyright (C) 2000 - 2007, 2010 by the deal.II authors
 //
 //    This file is subject to QPL and may not be  distributed
 //    without copyright and license information. Please refer
 #include <iomanip>
 #include <iomanip>
 #include <algorithm>
+#include <numeric>
 
 using namespace std;
 
+
+template <int dim, typename number, int spacedim>
+void
+reinit_vector_by_blocks (
+  const dealii::MGDoFHandler<dim,spacedim> &mg_dof,
+  MGLevelObject<BlockVector<number> > &v,
+  const std::vector<bool> &sel,
+  std::vector<std::vector<unsigned int> >& ndofs)
+{
+  std::vector<bool> selected=sel;
+                                  // Compute the number of blocks needed
+  const unsigned int n_selected
+    = std::accumulate(selected.begin(),
+                     selected.end(),
+                     0U);
+
+  if (ndofs.size() == 0)
+    {
+      std::vector<std::vector<unsigned int> >
+       new_dofs(mg_dof.get_tria().n_levels(),
+                std::vector<unsigned int>(selected.size()));
+      std::swap(ndofs, new_dofs);
+      MGTools::count_dofs_per_block (mg_dof, ndofs);
+    }
+
+  for (unsigned int level=v.get_minlevel();
+       level<=v.get_maxlevel();++level)
+    {
+      v[level].reinit(n_selected, 0);
+      unsigned int k=0;
+      for (unsigned int i=0;i<selected.size() && (k<v[level].n_blocks());++i)
+       {
+         if (selected[i])
+           {
+             v[level].block(k++).reinit(ndofs[level][i]);
+           }
+         v[level].collect_sizes();
+       }
+    }
+}
+
+
 template <int dim>
 void check_block(const FiniteElement<dim>& fe)
 {
   deallog << fe.get_name() << std::endl;
   std::vector<bool> selected(fe.n_blocks(), true);
-  
+
   Triangulation<dim> tr;
   GridGenerator::hyper_cube(tr);
   tr.refine_global(2);
-  
+
   MGDoFHandler<dim> mgdof(tr);
   DoFHandler<dim>& dof=mgdof;
   mgdof.distribute_dofs(fe);
-  
+
                                   // Make sure all orderings are the
                                   // same
   Point<dim> direction;
@@ -71,14 +114,14 @@ void check_block(const FiniteElement<dim>& fe)
   DoFTools::count_dofs_per_block(mgdof, ndofs);
   std::vector<std::vector<unsigned int> > mg_ndofs(mgdof.get_tria().n_levels());
   MGTools::count_dofs_per_block(mgdof, mg_ndofs);
-  
+
   MGTransferPrebuilt<BlockVector<double> > transfer;
   MGTransferBlock<double> transfer_block;
   MGTransferBlockSelect<double> transfer_select;
   transfer.build_matrices(mgdof);
   transfer_block.build_matrices(dof, mgdof, selected);
   transfer_select.build_matrices(dof, mgdof, 0);
-  
+
   BlockVector<double> u2(mg_ndofs[2]);
   BlockVector<double> u1(mg_ndofs[1]);
   BlockVector<double> u0(mg_ndofs[0]);
@@ -114,7 +157,7 @@ void check_block(const FiniteElement<dim>& fe)
          << ' ' << v1.block(0).l2_norm()
          << ' ' << v2.block(0).l2_norm()
          << std::endl;
-  
+
   v2 = u2;
   u1 = 0.;
   u0 = 0.;
@@ -139,8 +182,8 @@ void check_block(const FiniteElement<dim>& fe)
   deallog << "Select   " << v0.block(0).l2_norm()
          << ' ' << v1.block(0).l2_norm()
          << std::endl;
-  
-  
+
+
                                   // Check copy to mg and back
   BlockVector<double> u;
   u.reinit (ndofs);
@@ -154,15 +197,15 @@ void check_block(const FiniteElement<dim>& fe)
   v.resize(0, tr.n_levels()-1);
   wb.resize(0, tr.n_levels()-1);
   ws.resize(0, tr.n_levels()-1);
-  MGTools::reinit_vector_by_blocks(mgdof, v, selected, cached_sizes);
-  MGTools::reinit_vector_by_blocks(mgdof, wb, selected, cached_sizes);
-  MGTools::reinit_vector_by_blocks(mgdof, ws, 0, cached_sizes);
+  reinit_vector_by_blocks(mgdof, v, selected, cached_sizes);
+  reinit_vector_by_blocks(mgdof, wb, selected, cached_sizes);
+  reinit_vector_by_blocks(mgdof, ws, 0, cached_sizes);
 
   deallog << "copy to mg";
   transfer.copy_to_mg(mgdof, v, u);
   transfer_block.copy_to_mg(mgdof, wb, u);
   transfer_select.copy_to_mg(mgdof, ws, u);
-  
+
   for (unsigned int l=0; l<tr.n_levels();++l)
     {
       wb[l].add(-1., v[l]);
@@ -188,7 +231,7 @@ void check_block(const FiniteElement<dim>& fe)
   transfer_block.copy_from_mg_add(mgdof, uu, v);
   u.add(-1., uu);
   deallog << u.l2_norm() << std::endl;
-  
+
 }
 
 
@@ -199,7 +242,7 @@ int main()
   deallog.attach(logfile);
   deallog.depth_console(0);
   deallog.threshold_double(1.e-10);
-  
+
   std::vector<double> factors;
 
   FE_DGQ<2> q0(0);
@@ -207,14 +250,14 @@ int main()
   FE_Q<2> cq1(1);
   FE_RaviartThomasNodal<2> rt0(0);
   FE_RaviartThomasNodal<2> rt1(1);
-  
+
   FESystem<2> fe0(rt1, 1, q1, 1);
   FESystem<2> fe1(rt0, 2, q0, 2);
 
   check_block(q0);
   check_block(cq1);
   check_block(rt1);
-  
+
   check_block(fe0);
   check_block(fe1);
 }

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.