From 52954b0f22171786ed172b93ea54bde42e3001d7 Mon Sep 17 00:00:00 2001 From: Wolfgang Bangerth Date: Fri, 15 Jan 2010 18:44:35 +0000 Subject: [PATCH] Get closer to compiling again. git-svn-id: https://svn.dealii.org/trunk@20375 0785d39b-7218-0410-832d-ea1e28bc413d --- tests/multigrid/transfer.cc | 2 +- tests/multigrid/transfer_block.cc | 80 ++++++++++++++++++------ tests/multigrid/transfer_block_select.cc | 74 +++++++++++++++++----- tests/multigrid/transfer_compare_01.cc | 77 ++++++++++++++++++----- 4 files changed, 180 insertions(+), 53 deletions(-) diff --git a/tests/multigrid/transfer.cc b/tests/multigrid/transfer.cc index 749089567c..f940fd6d45 100644 --- a/tests/multigrid/transfer.cc +++ b/tests/multigrid/transfer.cc @@ -54,7 +54,7 @@ void check_simple(const FiniteElement& fe) transfer.build_matrices(mgdof); MGLevelObject > 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 diff --git a/tests/multigrid/transfer_block.cc b/tests/multigrid/transfer_block.cc index 3db78bdf4d..c50e78285c 100644 --- a/tests/multigrid/transfer_block.cc +++ b/tests/multigrid/transfer_block.cc @@ -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 @@ -34,9 +34,50 @@ #include #include #include +#include using namespace std; +template +void +reinit_vector_by_blocks ( + const dealii::MGDoFHandler &mg_dof, + MGLevelObject > &v, + const std::vector &sel, + std::vector >& ndofs) +{ + std::vector 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 > + new_dofs(mg_dof.get_tria().n_levels(), + std::vector(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 void check_block(const FiniteElement& fe, const vector& selected, @@ -47,21 +88,22 @@ void check_block(const FiniteElement& fe, if (selected[i]) deallog << ' ' << i; deallog << std::endl; - + Triangulation tr; GridGenerator::hyper_cube(tr); tr.refine_global(2); - + MGDoFHandler mgdof(tr); DoFHandler& dof=mgdof; mgdof.distribute_dofs(fe); DoFRenumbering::component_wise(mgdof); vector ndofs(fe.n_blocks()); DoFTools::count_dofs_per_block(mgdof, ndofs); - + for (unsigned int l=0;l > mg_ndofs(mgdof.get_tria().n_levels()); + std::vector > mg_ndofs(mgdof.get_tria().n_levels(), + std::vector(fe.n_blocks())); MGTools::count_dofs_per_block(mgdof, mg_ndofs); deallog << "Global dofs:"; @@ -74,8 +116,8 @@ void check_block(const FiniteElement& fe, for (unsigned int i=0;i > mem; MGTransferBlock transfer; transfer.build_matrices(dof, mgdof, selected); @@ -83,8 +125,8 @@ void check_block(const FiniteElement& fe, transfer.initialize(factors, mem); MGLevelObject< BlockVector > 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& fe, for (unsigned int b=0;b& fe, for (unsigned int b=0;b& fe, v.reinit (ndofs); for (unsigned int i=0;i 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 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; diff --git a/tests/multigrid/transfer_block_select.cc b/tests/multigrid/transfer_block_select.cc index 552fbc562a..c39f36c527 100644 --- a/tests/multigrid/transfer_block_select.cc +++ b/tests/multigrid/transfer_block_select.cc @@ -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 @@ -34,26 +34,68 @@ #include #include #include +#include using namespace std; +template +void +reinit_vector_by_blocks ( + const dealii::MGDoFHandler &mg_dof, + MGLevelObject > &v, + const std::vector &sel, + std::vector >& ndofs) +{ + std::vector 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 > + new_dofs(mg_dof.get_tria().n_levels(), + std::vector(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 void check_select(const FiniteElement& fe, unsigned int selected) { deallog << fe.get_name() << " select " << selected << std::endl; - + Triangulation tr; GridGenerator::hyper_cube(tr); tr.refine_global(2); - + MGDoFHandler mgdof(tr); DoFHandler& dof=mgdof; mgdof.distribute_dofs(fe); DoFRenumbering::component_wise(mgdof); vector ndofs(fe.n_blocks()); DoFTools::count_dofs_per_block(mgdof, ndofs); - + for (unsigned int l=0;l > mg_ndofs(mgdof.get_tria().n_levels()); @@ -69,8 +111,8 @@ void check_select(const FiniteElement& fe, unsigned int selected) for (unsigned int i=0;i transfer; transfer.build_matrices(dof, mgdof, selected); @@ -81,8 +123,8 @@ void check_select(const FiniteElement& fe, unsigned int selected) // constant one and the l2-norm is // the number of degrees of freedom. MGLevelObject< Vector > 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& 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& fe, unsigned int selected) v.reinit (ndofs); for (unsigned int i=0;i 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); diff --git a/tests/multigrid/transfer_compare_01.cc b/tests/multigrid/transfer_compare_01.cc index cfa2572c9a..989a04cbe2 100644 --- a/tests/multigrid/transfer_compare_01.cc +++ b/tests/multigrid/transfer_compare_01.cc @@ -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 @@ -36,23 +36,66 @@ #include #include #include +#include using namespace std; + +template +void +reinit_vector_by_blocks ( + const dealii::MGDoFHandler &mg_dof, + MGLevelObject > &v, + const std::vector &sel, + std::vector >& ndofs) +{ + std::vector 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 > + new_dofs(mg_dof.get_tria().n_levels(), + std::vector(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 void check_block(const FiniteElement& fe) { deallog << fe.get_name() << std::endl; std::vector selected(fe.n_blocks(), true); - + Triangulation tr; GridGenerator::hyper_cube(tr); tr.refine_global(2); - + MGDoFHandler mgdof(tr); DoFHandler& dof=mgdof; mgdof.distribute_dofs(fe); - + // Make sure all orderings are the // same Point direction; @@ -71,14 +114,14 @@ void check_block(const FiniteElement& fe) DoFTools::count_dofs_per_block(mgdof, ndofs); std::vector > mg_ndofs(mgdof.get_tria().n_levels()); MGTools::count_dofs_per_block(mgdof, mg_ndofs); - + MGTransferPrebuilt > transfer; MGTransferBlock transfer_block; MGTransferBlockSelect transfer_select; transfer.build_matrices(mgdof); transfer_block.build_matrices(dof, mgdof, selected); transfer_select.build_matrices(dof, mgdof, 0); - + BlockVector u2(mg_ndofs[2]); BlockVector u1(mg_ndofs[1]); BlockVector u0(mg_ndofs[0]); @@ -114,7 +157,7 @@ void check_block(const FiniteElement& 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& fe) deallog << "Select " << v0.block(0).l2_norm() << ' ' << v1.block(0).l2_norm() << std::endl; - - + + // Check copy to mg and back BlockVector u; u.reinit (ndofs); @@ -154,15 +197,15 @@ void check_block(const FiniteElement& 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& 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 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); } -- 2.39.5