From: fsonner <florian.sonner@iwr.uni-heidelberg.de>
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=813c7c6385312c4551c6cf28b20a5cc93c2caf73;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<VECTOR>::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<class SOLVER, class MATRIX, class VECTOR>
 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<SolverBicgstab<> >(A,u,f);
       check_solve<SolverQMRS<> >(A,u,f);
 
+      // test use_default_residual=false case
+      check_solve<SolverGMRES<> >(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