]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add test for double memory freeing bug in GMRES 886/head
authorfsonner <florian.sonner@iwr.uni-heidelberg.de>
Tue, 28 Apr 2015 07:43:28 +0000 (09:43 +0200)
committerfsonner <florian.sonner@iwr.uni-heidelberg.de>
Tue, 28 Apr 2015 07:43:28 +0000 (09:43 +0200)
include/deal.II/lac/solver_gmres.h
tests/lac/solver_memorytest.cc [moved from tests/lac/solver_leak.cc with 79% similarity]
tests/lac/solver_memorytest.output [moved from tests/lac/solver_leak.output with 75% similarity]

index 994d80dfa60ba3c6a9bd83afbde513c20c649275..93dcfa01a500c9a4be42152f3e6aca2658c52502 100644 (file)
@@ -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;
similarity index 79%
rename from tests/lac/solver_leak.cc
rename to tests/lac/solver_memorytest.cc
index 0fe16c8cdfb015b74303c24dcd5eee70614ee748..4c4998c663db6e4406c8ab9c1ba513eda75419d8 100644 (file)
@@ -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.
 //
 
 
 
-// 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"
 
 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();
     }
 
similarity index 75%
rename from tests/lac/solver_leak.output
rename to tests/lac/solver_memorytest.output
index a2d371dd6b952b1a0f73add834e4b5f7f5828de5..3e315b60fcad8f8c68a590fbeec10795800746e7 100644 (file)
@@ -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

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.