From 4a2910be6218755322bf0f86fdfad40a6d5d47cf Mon Sep 17 00:00:00 2001 From: Matthias Maier Date: Tue, 12 Jul 2016 11:33:23 -0500 Subject: [PATCH] Tests: Fix petsc/solver_(01|02) to test for convergence --- tests/petsc/solver_01.cc | 62 +++++++++------------------------ tests/petsc/solver_01.output | 6 +--- tests/petsc/solver_02.cc | 67 ++++++++++-------------------------- tests/petsc/solver_02.output | 4 +-- 4 files changed, 37 insertions(+), 102 deletions(-) diff --git a/tests/petsc/solver_01.cc b/tests/petsc/solver_01.cc index bd393536d3..9efe7af4a2 100644 --- a/tests/petsc/solver_01.cc +++ b/tests/petsc/solver_01.cc @@ -1,6 +1,6 @@ // --------------------------------------------------------------------- // -// Copyright (C) 2004 - 2015 by the deal.II authors +// Copyright (C) 2004 - 2016 by the deal.II authors // // This file is part of the deal.II library. // @@ -13,62 +13,22 @@ // // --------------------------------------------------------------------- - // test the PETSc Richardson solver - #include "../tests.h" #include "../lac/testmatrix.h" -#include -#include -#include -#include -#include + #include #include #include #include -#include -#include - -template -void -check_solve(SolverType &solver, - const SolverControl &solver_control, - const MatrixType &A, - VectorType &u, - VectorType &f, - const PRECONDITION &P) -{ - deallog << "Solver type: " << typeid(solver).name() << std::endl; - - u = 0.; - f = 1.; - try - { - solver.solve(A,u,f,P); - } - catch (dealii::SolverControl::NoConvergence &e) - { - deallog << "Exception: " << e.get_exc_name() << std::endl; - } - - deallog << "Solver stopped after " << solver_control.last_step() - << " iterations" << std::endl; -} - int main(int argc, char **argv) { - std::ofstream logfile("output"); - deallog.attach(logfile); - deallog << std::setprecision(4); - deallog.threshold_double(1.e-10); + initlog(); Utilities::MPI::MPI_InitFinalize mpi_initialization (argc, argv, 1); { - SolverControl control(100, 1.e-3); - const unsigned int size = 32; unsigned int dim = (size-1)*(size-1); @@ -81,12 +41,24 @@ int main(int argc, char **argv) PETScWrappers::Vector f(dim); PETScWrappers::Vector u(dim); + f = 1.; + u = 0.; + A.compress (VectorOperation::insert); + f.compress (VectorOperation::insert); + u.compress (VectorOperation::insert); + + // Richardson is a tricky smoother for the kind of FD matrix we use in + // this test. So, simply test that we're able to reduce the residual to + // a reasonably small value of 1.e-4. + SolverControl control(2500, 1.e-4); PETScWrappers::SolverRichardson solver(control); PETScWrappers::PreconditionJacobi preconditioner(A); - check_solve (solver, control, A,u,f, preconditioner); - } + check_solver_within_range( + solver.solve(A,u,f, preconditioner), + control.last_step(), 2295, 2300); + } } diff --git a/tests/petsc/solver_01.output b/tests/petsc/solver_01.output index dbab15846c..60a06149f0 100644 --- a/tests/petsc/solver_01.output +++ b/tests/petsc/solver_01.output @@ -1,7 +1,3 @@ DEAL::Size 32 Unknowns 961 -DEAL::Solver type: N6dealii13PETScWrappers16SolverRichardsonE -DEAL::Starting value 7.750 -DEAL::Failure step 100 value 4.004 -DEAL::Exception: SolverControl::NoConvergence (solver_control.last_step(), solver_control.last_value()) -DEAL::Solver stopped after 100 iterations +DEAL::Solver stopped within 2295 - 2300 iterations diff --git a/tests/petsc/solver_02.cc b/tests/petsc/solver_02.cc index 9a3566ad65..a016d736d3 100644 --- a/tests/petsc/solver_02.cc +++ b/tests/petsc/solver_02.cc @@ -1,6 +1,6 @@ // --------------------------------------------------------------------- // -// Copyright (C) 2004 - 2015 by the deal.II authors +// Copyright (C) 2004 - 2016 by the deal.II authors // // This file is part of the deal.II library. // @@ -13,65 +13,22 @@ // // --------------------------------------------------------------------- - // test the PETSc Chebychev solver - #include "../tests.h" #include "../lac/testmatrix.h" -#include -#include -#include -#include -#include + #include #include #include #include -#include -#include - -template -void -check_solve(SolverType &solver, - const SolverControl &solver_control, - const MatrixType &A, - VectorType &u, - VectorType &f, - const PRECONDITION &P) -{ - deallog << "Solver type: " << typeid(solver).name() << std::endl; - - u = 0.; - f = 1.; - try - { - deallog.depth_file(0); - solver.solve(A,u,f,P); - deallog.depth_file(3); - } - catch (dealii::SolverControl::NoConvergence &e) - { - deallog.depth_file(3); - deallog << "Exception: " << e.get_exc_name() << std::endl; - } - - deallog << "Solver stopped after " << solver_control.last_step() - << " iterations" << std::endl; -} - int main(int argc, char **argv) { - std::ofstream logfile("output"); - deallog.attach(logfile); - deallog << std::setprecision(4); - deallog.threshold_double(1.e-10); + initlog(); - Utilities::MPI::MPI_InitFinalize mpi_initialization (argc, argv, 1); + Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv, 1); { - SolverControl control(100, 1.e-3); - const unsigned int size = 32; unsigned int dim = (size-1)*(size-1); @@ -84,12 +41,24 @@ int main(int argc, char **argv) PETScWrappers::Vector f(dim); PETScWrappers::Vector u(dim); + f = 1.; + u = 0.; + A.compress (VectorOperation::insert); + f.compress (VectorOperation::insert); + u.compress (VectorOperation::insert); + + // Chebychev is a tricky smoother for the kind of FD matrix we use in + // this test. So, simply test that we're able to reduce the residual to + // a reasonably small value of 1.e-3. + SolverControl control(2500, 1.e-3); PETScWrappers::SolverChebychev solver(control); PETScWrappers::PreconditionJacobi preconditioner(A); - check_solve (solver, control, A,u,f, preconditioner); - } + check_solver_within_range( + solver.solve(A,u,f, preconditioner), + control.last_step(), 1120, 1125); + } } diff --git a/tests/petsc/solver_02.output b/tests/petsc/solver_02.output index 1c90dd386c..8e5ffc6089 100644 --- a/tests/petsc/solver_02.output +++ b/tests/petsc/solver_02.output @@ -1,5 +1,3 @@ DEAL::Size 32 Unknowns 961 -DEAL::Solver type: N6dealii13PETScWrappers15SolverChebychevE -DEAL::Exception: SolverControl::NoConvergence (solver_control.last_step(), solver_control.last_value()) -DEAL::Solver stopped after 100 iterations +DEAL::Solver stopped within 1120 - 1125 iterations -- 2.39.5