From: fsonner Date: Tue, 28 Apr 2015 07:43:28 +0000 (+0200) Subject: Add test for double memory freeing bug in GMRES X-Git-Tag: v8.3.0-rc1~206^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F886%2Fhead;p=dealii.git Add test for double memory freeing bug in GMRES --- diff --git a/include/deal.II/lac/solver_gmres.h b/include/deal.II/lac/solver_gmres.h index 994d80dfa6..93dcfa01a5 100644 --- a/include/deal.II/lac/solver_gmres.h +++ b/include/deal.II/lac/solver_gmres.h @@ -714,9 +714,7 @@ SolverGMRES::solve (const MATRIX &A, iteration_state = this->iteration_status (accumulated_iterations, res, x); if (iteration_state != SolverControl::iterate) - { - break; - } + break; } gamma(0) = rho; diff --git a/tests/lac/solver_leak.cc b/tests/lac/solver_memorytest.cc similarity index 79% rename from tests/lac/solver_leak.cc rename to tests/lac/solver_memorytest.cc index 0fe16c8cdf..4c4998c663 100644 --- a/tests/lac/solver_leak.cc +++ b/tests/lac/solver_memorytest.cc @@ -1,6 +1,6 @@ // --------------------------------------------------------------------- // -// Copyright (C) 1998 - 2014 by the deal.II authors +// Copyright (C) 1998 - 2015 by the deal.II authors // // This file is part of the deal.II library. // @@ -15,8 +15,10 @@ -// test all solver with a start value that is already a solution (i.e. 0 -// iterations). This caused a memory leak in FGMRES. +// Test all solver with a start value that is already a solution (i.e. 0 +// iterations). This caused a memory leak in FGMRES. In the same situation +// test GMRES without using the default residual, which caused a double +// memory freeing (see issue #886). #include "../tests.h" @@ -39,12 +41,12 @@ template void -check_solve( const MATRIX &A, - VECTOR &u, VECTOR &f) +check_solve( const MATRIX &A, VECTOR &u, VECTOR &f, + const typename SOLVER::AdditionalData &additional_data = typename SOLVER::AdditionalData() ) { GrowingVectorMemory<> mem; SolverControl control(100, 1.e-3); - SOLVER solver(control, mem); + SOLVER solver(control, mem, additional_data); PreconditionIdentity prec_no; u = 0.; f = 0.; @@ -93,6 +95,9 @@ int main() check_solve >(A,u,f); check_solve >(A,u,f); + // test use_default_residual=false case + check_solve >(A,u,f, typename SolverGMRES<>::AdditionalData(30, false, false)); + deallog.pop(); } diff --git a/tests/lac/solver_leak.output b/tests/lac/solver_memorytest.output similarity index 75% rename from tests/lac/solver_leak.output rename to tests/lac/solver_memorytest.output index a2d371dd6b..3e315b60fc 100644 --- a/tests/lac/solver_leak.output +++ b/tests/lac/solver_memorytest.output @@ -8,6 +8,9 @@ DEAL:alreadydone:Bicgstab::Starting value 0 DEAL:alreadydone:Bicgstab::Convergence step 0 value 0 DEAL:alreadydone:QMRS::Starting value 0 DEAL:alreadydone:QMRS::Convergence step 0 value 0 +DEAL:alreadydone:GMRES::default_res=0 +DEAL:alreadydone:GMRES::Starting value 0 +DEAL:alreadydone:GMRES::Convergence step 0 value 0 DEAL::Size 12 Unknowns 121 DEAL:alreadydone:cg::Starting value 0 DEAL:alreadydone:cg::Convergence step 0 value 0 @@ -17,3 +20,6 @@ DEAL:alreadydone:Bicgstab::Starting value 0 DEAL:alreadydone:Bicgstab::Convergence step 0 value 0 DEAL:alreadydone:QMRS::Starting value 0 DEAL:alreadydone:QMRS::Convergence step 0 value 0 +DEAL:alreadydone:GMRES::default_res=0 +DEAL:alreadydone:GMRES::Starting value 0 +DEAL:alreadydone:GMRES::Convergence step 0 value 0