From 8921a9e3379d4dd2ca4498467477ed53245b648c Mon Sep 17 00:00:00 2001 From: heister Date: Tue, 12 Oct 2010 18:57:50 +0000 Subject: [PATCH] Add test for SolverSelector with a custom SolverControl. git-svn-id: https://svn.dealii.org/trunk@22313 0785d39b-7218-0410-832d-ea1e28bc413d --- tests/lac/solver_selector_02.cc | 100 +++++++++++++++++++++++ tests/lac/solver_selector_02/cmp/generic | 26 ++++++ 2 files changed, 126 insertions(+) create mode 100644 tests/lac/solver_selector_02.cc create mode 100644 tests/lac/solver_selector_02/cmp/generic diff --git a/tests/lac/solver_selector_02.cc b/tests/lac/solver_selector_02.cc new file mode 100644 index 0000000000..241ae7877d --- /dev/null +++ b/tests/lac/solver_selector_02.cc @@ -0,0 +1,100 @@ +//---------------------------------------------------------------------- +// $Id: solver_selector_01.cc 21777 2010-08-29 17:36:27Z bangerth $ +// +// Copyright (C) 2010 by the deal.II authors +// +// This file is subject to QPL and may not be distributed +// without copyright and license information. Please refer +// to the file deal.II/doc/license.html for the text and +// further information on this license. +// +//---------------------------------------------------------------------- + +// Test a bug in the SolverSelector when using a custom SolverControl. At one +// point the SolverControl got "sliced". + +#include "../tests.h" +#include "testmatrix.h" +#include +#include +#include +#include +#include + +#include + +class MySolverControl: + public SolverControl +{ + public: + virtual State check(const unsigned int step,const double check_value) + { + deallog << "MySolverControl " << step << std::endl; + return SolverControl::check(step, 0); + } +}; + + + + +template +void +check(const MATRIX& A, const VECTOR& f) +{ + std::vector names; + names.push_back("cg"); + names.push_back("bicgstab"); + names.push_back("gmres"); + names.push_back("fgmres"); + + MySolverControl mycont; + SolverSelector solver; + PreconditionSSOR > pre; + pre.initialize(A); + + VECTOR u; + u.reinit(f); + + std::vector::const_iterator name; + + solver.set_control(mycont); + for (name = names.begin(); name != names.end();++name) + { + solver.select(*name); + u = 0.; + solver.solve(A, u, f, pre); + } + + //test deprecated constructor too: + GrowingVectorMemory mem; + SolverSelector solver2("gmres", mycont, mem); + u = 0.; + solver2.solve(A, u, f, pre); +} + + +int main() +{ + std::ofstream logfile("solver_selector_02/output"); + deallog << std::setprecision(4); + deallog.attach(logfile); + deallog.depth_console(0); + deallog.threshold_double(1.e-10); + + unsigned int size=37; + 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); + f = 1.; + + check(A, f); +} diff --git a/tests/lac/solver_selector_02/cmp/generic b/tests/lac/solver_selector_02/cmp/generic new file mode 100644 index 0000000000..983fde2641 --- /dev/null +++ b/tests/lac/solver_selector_02/cmp/generic @@ -0,0 +1,26 @@ + +DEAL::Size 37 Unknowns 1296 +DEAL:cg::Starting value 36.00 +DEAL:cg::Convergence step 14 value 0.2102 +DEAL:Bicgstab::Starting value 36.00 +DEAL:Bicgstab::Convergence step 5 value 0.2814 +DEAL:GMRES::Starting value 34.45 +DEAL:GMRES::Convergence step 13 value 0.1890 +DEAL:FGMRES::Starting value 36.00 +DEAL:FGMRES::Convergence step 13 value 0.2928 +DEAL:cg::Starting value 36.00 +DEAL:cg::Convergence step 21 value 0.003095 +DEAL:Bicgstab::Starting value 36.00 +DEAL:Bicgstab::Convergence step 10 value 0.003158 +DEAL:GMRES::Starting value 34.45 +DEAL:GMRES::Convergence step 21 value 0.001416 +DEAL:FGMRES::Starting value 36.00 +DEAL:FGMRES::Convergence step 21 value 0.002535 +DEAL:cg::Starting value 36.00 +DEAL:cg::Convergence step 39 value 7.335e-08 +DEAL:Bicgstab::Starting value 36.00 +DEAL:Bicgstab::Convergence step 27 value 1.148e-08 +DEAL:GMRES::Starting value 34.45 +DEAL:GMRES::Convergence step 39 value 6.627e-08 +DEAL:FGMRES::Starting value 36.00 +DEAL:FGMRES::Convergence step 39 value 7.890e-08 -- 2.39.5