From fac3109c42be41b18ad355890f86e8acc65edde3 Mon Sep 17 00:00:00 2001 From: Jean-Paul Pelteret Date: Sun, 29 Jan 2017 11:20:09 +0100 Subject: [PATCH] Add tests checking result of SolverControl classes with deal.II solver --- tests/lac/solver_control_01.cc | 110 +++++++++++++++++++++++++++ tests/lac/solver_control_01.output | 8 ++ tests/lac/solver_control_02.cc | 118 +++++++++++++++++++++++++++++ tests/lac/solver_control_02.output | 11 +++ tests/lac/solver_control_03.cc | 111 +++++++++++++++++++++++++++ tests/lac/solver_control_03.output | 8 ++ 6 files changed, 366 insertions(+) create mode 100644 tests/lac/solver_control_01.cc create mode 100644 tests/lac/solver_control_01.output create mode 100644 tests/lac/solver_control_02.cc create mode 100644 tests/lac/solver_control_02.output create mode 100644 tests/lac/solver_control_03.cc create mode 100644 tests/lac/solver_control_03.output diff --git a/tests/lac/solver_control_01.cc b/tests/lac/solver_control_01.cc new file mode 100644 index 0000000000..42f765fac8 --- /dev/null +++ b/tests/lac/solver_control_01.cc @@ -0,0 +1,110 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2017 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// test SolverControl +// This test is adapted from tests/trilinos/solver_03.cc + + +#include "../tests.h" +#include +#include "../testmatrix.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template +void +check_solve (SolverControl &solver_control, + const MatrixType &A, + VectorType &u, + VectorType &f, + const PRECONDITION &P, + const bool expected_result) +{ + SolverCG solver(solver_control); + + u = 0.; + f = 1.; + bool success = false; + try + { + solver.solve(A,u,f,P); + deallog << "Success. "; + success = true; + } + catch (std::exception &e) + { + deallog << "Failure. "; + } + + deallog << "Solver stopped after " << solver_control.last_step() + << " iterations" << std::endl; + Assert(success == expected_result, ExcMessage("Incorrect result.")); +} + + +int main(int argc, char **argv) +{ + std::ofstream logfile("output"); + logfile.precision(4); + deallog.attach(logfile); + deallog.threshold_double(1.e-10); + + { + const unsigned int size = 32; + unsigned int dim = (size-1)*(size-1); + + deallog << "Size " << size << " Unknowns " << dim << std::endl; + + // Make matrix + FDMatrix testproblem(size, size); + SparsityPattern structure(dim, dim, 5); + testproblem.five_point_structure(structure); + structure.compress(); + SparseMatrix A(structure); + testproblem.five_point(A); + + Vector f(dim); + Vector u(dim); + f = 1.; + + PreconditionJacobi<> preconditioner; + preconditioner.initialize(A); + + deallog.push("Abs tol"); + { + // Expects success + SolverControl solver_control(2000, 1.e-3); + check_solve (solver_control, A,u,f, preconditioner, true); + } + deallog.pop(); + deallog.push("Iterations"); + { + // Expects failure + SolverControl solver_control(20, 1.e-3); + check_solve (solver_control, A,u,f, preconditioner, false); + } + deallog.pop(); + } +} diff --git a/tests/lac/solver_control_01.output b/tests/lac/solver_control_01.output new file mode 100644 index 0000000000..800f90b674 --- /dev/null +++ b/tests/lac/solver_control_01.output @@ -0,0 +1,8 @@ + +DEAL::Size 32 Unknowns 961 +DEAL:Abs tol:cg::Starting value 31.0000 +DEAL:Abs tol:cg::Convergence step 43 value 0.000818932 +DEAL:Abs tol::Success. Solver stopped after 43 iterations +DEAL:Iterations:cg::Starting value 31.0000 +DEAL:Iterations:cg::Failure step 20 value 6.00198 +DEAL:Iterations::Failure. Solver stopped after 20 iterations diff --git a/tests/lac/solver_control_02.cc b/tests/lac/solver_control_02.cc new file mode 100644 index 0000000000..9686acfb77 --- /dev/null +++ b/tests/lac/solver_control_02.cc @@ -0,0 +1,118 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2017 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// test ReductionControl +// This test is adapted from tests/trilinos/solver_03.cc + + +#include "../tests.h" +#include +#include "../testmatrix.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template +void +check_solve (SolverControl &solver_control, + const MatrixType &A, + VectorType &u, + VectorType &f, + const PRECONDITION &P, + const bool expected_result) +{ + SolverCG solver(solver_control); + + u = 0.; + f = 1.; + bool success = false; + try + { + solver.solve(A,u,f,P); + deallog << "Success. "; + success = true; + } + catch (std::exception &e) + { + deallog << "Failure. "; + } + + deallog << "Solver stopped after " << solver_control.last_step() + << " iterations" << std::endl; + Assert(success == expected_result, ExcMessage("Incorrect result.")); +} + + +int main(int argc, char **argv) +{ + std::ofstream logfile("output"); + logfile.precision(4); + deallog.attach(logfile); + deallog.threshold_double(1.e-10); + + + { + const unsigned int size = 32; + unsigned int dim = (size-1)*(size-1); + + deallog << "Size " << size << " Unknowns " << dim << std::endl; + + // Make matrix + FDMatrix testproblem(size, size); + SparsityPattern structure(dim, dim, 5); + testproblem.five_point_structure(structure); + structure.compress(); + SparseMatrix A(structure); + testproblem.five_point(A); + + Vector f(dim); + Vector u(dim); + f = 1.; + + PreconditionJacobi<> preconditioner; + preconditioner.initialize(A); + + deallog.push("Rel tol"); + { + // Expects success + ReductionControl solver_control(2000, 1.e-30, 1e-6); + check_solve (solver_control, A,u,f, preconditioner, true); + } + deallog.pop(); + deallog.push("Abs tol"); + { + // Expects success + ReductionControl solver_control(2000, 1.e-3, 1e-9); + check_solve (solver_control, A,u,f, preconditioner, true); + } + deallog.pop(); + deallog.push("Iterations"); + { + // Expects failure + ReductionControl solver_control(20, 1.e-30, 1e-6); + check_solve (solver_control, A,u,f, preconditioner, false); + } + deallog.pop(); + } +} diff --git a/tests/lac/solver_control_02.output b/tests/lac/solver_control_02.output new file mode 100644 index 0000000000..4ddd995402 --- /dev/null +++ b/tests/lac/solver_control_02.output @@ -0,0 +1,11 @@ + +DEAL::Size 32 Unknowns 961 +DEAL:Rel tol:cg::Starting value 31.0000 +DEAL:Rel tol:cg::Convergence step 50 value 2.11364e-05 +DEAL:Rel tol::Success. Solver stopped after 50 iterations +DEAL:Abs tol:cg::Starting value 31.0000 +DEAL:Abs tol:cg::Convergence step 43 value 0.000818932 +DEAL:Abs tol::Success. Solver stopped after 43 iterations +DEAL:Iterations:cg::Starting value 31.0000 +DEAL:Iterations:cg::Failure step 20 value 6.00198 +DEAL:Iterations::Failure. Solver stopped after 20 iterations diff --git a/tests/lac/solver_control_03.cc b/tests/lac/solver_control_03.cc new file mode 100644 index 0000000000..85cb45dda0 --- /dev/null +++ b/tests/lac/solver_control_03.cc @@ -0,0 +1,111 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2017 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + +// test IterationNumberControl +// This test is adapted from tests/trilinos/solver_03.cc + + +#include "../tests.h" +#include +#include "../testmatrix.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +template +void +check_solve (SolverControl &solver_control, + const MatrixType &A, + VectorType &u, + VectorType &f, + const PRECONDITION &P, + const bool expected_result) +{ + SolverCG solver(solver_control); + + u = 0.; + f = 1.; + bool success = false; + try + { + solver.solve(A,u,f,P); + deallog << "Success. "; + success = true; + } + catch (std::exception &e) + { + deallog << "Failure. "; + } + + deallog << "Solver stopped after " << solver_control.last_step() + << " iterations" << std::endl; + Assert(success == expected_result, ExcMessage("Incorrect result.")); +} + + +int main(int argc, char **argv) +{ + std::ofstream logfile("output"); + logfile.precision(4); + deallog.attach(logfile); + deallog.threshold_double(1.e-10); + + + { + const unsigned int size = 32; + unsigned int dim = (size-1)*(size-1); + + deallog << "Size " << size << " Unknowns " << dim << std::endl; + + // Make matrix + FDMatrix testproblem(size, size); + SparsityPattern structure(dim, dim, 5); + testproblem.five_point_structure(structure); + structure.compress(); + SparseMatrix A(structure); + testproblem.five_point(A); + + Vector f(dim); + Vector u(dim); + f = 1.; + + PreconditionJacobi<> preconditioner; + preconditioner.initialize(A); + + deallog.push("Abs tol"); + { + // Expects success + IterationNumberControl solver_control(2000, 1.e-3); + check_solve (solver_control, A,u,f, preconditioner, true); + } + deallog.pop(); + deallog.push("Iterations"); + { + // Expects success + IterationNumberControl solver_control(20, 1.e-3); + check_solve (solver_control, A,u,f, preconditioner, true); + } + deallog.pop(); + } +} diff --git a/tests/lac/solver_control_03.output b/tests/lac/solver_control_03.output new file mode 100644 index 0000000000..eb675dbc65 --- /dev/null +++ b/tests/lac/solver_control_03.output @@ -0,0 +1,8 @@ + +DEAL::Size 32 Unknowns 961 +DEAL:Abs tol:cg::Starting value 31.0000 +DEAL:Abs tol:cg::Convergence step 43 value 0.000818932 +DEAL:Abs tol::Success. Solver stopped after 43 iterations +DEAL:Iterations:cg::Starting value 31.0000 +DEAL:Iterations:cg::Convergence step 20 value 6.00198 +DEAL:Iterations::Success. Solver stopped after 20 iterations -- 2.39.5