From 20a18de8f95d17c61fbcf9df342b426af4130ed9 Mon Sep 17 00:00:00 2001
From: Wenqing Wang <wenqing.wang@ufz.de>
Date: Tue, 13 May 2014 10:50:32 +0200
Subject: [PATCH] Added a matrix member for PETScLinearSolver

---
 MathLib/LinAlg/PETSc/PETScLinearSolver.cpp | 12 +++++------
 MathLib/LinAlg/PETSc/PETScLinearSolver.h   |  8 +++++--
 Tests/MathLib/TestLinearSolver.cpp         | 25 +---------------------
 3 files changed, 12 insertions(+), 33 deletions(-)

diff --git a/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp b/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp
index b14050661ef..cf3a8cee715 100644
--- a/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp
+++ b/MathLib/LinAlg/PETSc/PETScLinearSolver.cpp
@@ -18,19 +18,15 @@
 
 namespace MathLib
 {
-PETScLinearSolver::PETScLinearSolver(PETScMatrix &A, const std::string prefix)
+PETScLinearSolver::PETScLinearSolver(PETScMatrix &A, const std::string &prefix) : _A(A)
 {
     KSPCreate(PETSC_COMM_WORLD, &_solver);
-    KSPSetOperators(_solver, A.getRawMatrix(), A.getRawMatrix(), DIFFERENT_NONZERO_PATTERN);
+
+    KSPGetPC(_solver, &_pc);
 
     //
     KSPSetOptionsPrefix(_solver, prefix.c_str());    
     KSPSetFromOptions(_solver);  // set running time option
-    
-    KSPGetPC(_solver, &_pc);
-     
-    PCSetOptionsPrefix(_pc, prefix.c_str());    
-    PCSetFromOptions(_pc);  // set running time option
 }
 
 void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x)
@@ -41,6 +37,8 @@ void PETScLinearSolver::solve(const PETScVector &b, PETScVector &x)
     PetscMemoryGetCurrentUsage(&mem1);
 #endif
 
+    KSPSetOperators(_solver, _A.getRawMatrix(), _A.getRawMatrix(), DIFFERENT_NONZERO_PATTERN);
+
     KSPSolve(_solver, b.getData(), x.getData());
 
     KSPConvergedReason reason;
diff --git a/MathLib/LinAlg/PETSc/PETScLinearSolver.h b/MathLib/LinAlg/PETSc/PETScLinearSolver.h
index 10e7c93bb02..430374c5bc3 100644
--- a/MathLib/LinAlg/PETSc/PETScLinearSolver.h
+++ b/MathLib/LinAlg/PETSc/PETScLinearSolver.h
@@ -43,7 +43,7 @@ class PETScLinearSolver
                            line for this solver. It can be the name of the PDE
                            that owns an instance of this class.
         */
-        PETScLinearSolver(PETScMatrix &A, const std::string prefix);
+        PETScLinearSolver(PETScMatrix &A, const std::string &prefix="");
 
         ~PETScLinearSolver()
         {
@@ -58,8 +58,12 @@ class PETScLinearSolver
         void solve(const PETScVector &b, PETScVector &x);
 
     private:
+        /// Matrix, kept as a member only for solving successive linear equation
+        /// that preconditioner matrix may vary.    
+        PETScMatrix &_A;  
+    
         KSP _solver; ///< Slover type.
-        PC _pc;      ///< Preconditioner type.
+        PC _pc;      ///< Preconditioner type.        
 };
 
 } // end namespace
diff --git a/Tests/MathLib/TestLinearSolver.cpp b/Tests/MathLib/TestLinearSolver.cpp
index e119dcfce6f..4efb05e27c8 100644
--- a/Tests/MathLib/TestLinearSolver.cpp
+++ b/Tests/MathLib/TestLinearSolver.cpp
@@ -127,7 +127,7 @@ void checkLinearSolverInterface(T_MATRIX &A, boost::property_tree::ptree &ls_opt
 
 #ifdef USE_PETSC
 template <class T_MATRIX, class T_VECTOR, class T_LINEAR_SOVLER>
-void checkLinearSolverInterface(T_MATRIX &A, T_VECTOR &b, const std::string prefix_name)
+void checkLinearSolverInterface(T_MATRIX &A, T_VECTOR &b, const std::string &prefix_name)
 {
     int mrank;
     MPI_Comm_rank(PETSC_COMM_WORLD, &mrank);
@@ -292,29 +292,6 @@ TEST(Math, CheckInterface_PETSc_Linear_Solver_gmres_amg)
                                MathLib::PETScLinearSolver>(A, b, "ptest3_");
 }
 
-TEST(Math, CheckInterface_PETSc_Linear_Solver_cg_asm)
-{
-    MathLib::PETScMatrixOption opt;
-    opt.d_nz = 2;
-    opt.o_nz = 0;
-    opt.is_global_size = false;
-    opt.n_local_cols = 2;
-    MathLib::PETScMatrix A(2, opt);
-
-    const bool is_gloabal_size = false;
-    MathLib::PETScVector b(2, is_gloabal_size);
-
-    PetscOptionsSetValue("-ptest4_ksp_type", "cg");
-    PetscOptionsSetValue("-ptest4_ksp_rtol", "1.e-8");
-
-    PetscOptionsSetValue("-ptest4_pc_type", "gasm");
-    PetscOptionsSetValue("-ptest4_pc_gasm_type", "interpolate");
-
-    checkLinearSolverInterface<MathLib::PETScMatrix, MathLib::PETScVector,
-                               MathLib::PETScLinearSolver>(A, b, "ptest4_");
-
-}
-
 #endif
 
 
-- 
GitLab