From fddf37b8ef49cdaea1b1500a44c20e16981f29a9 Mon Sep 17 00:00:00 2001
From: Norihiro Watanabe <norihiro.watanabe@ufz.de>
Date: Fri, 10 Jul 2015 09:37:20 +0200
Subject: [PATCH] improved error messages

---
 MathLib/LinAlg/Eigen/EigenLinearSolver.cpp | 42 +++++++++++-----------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index 004569349b5..4a38c4c77ee 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -24,30 +24,31 @@ using boost::property_tree::ptree;
 namespace details
 {
 
+/// Template class for Eigen direct linear solvers
 template <class T_SOLVER>
-class EigenDirectSolver : public EigenLinearSolver::IEigenSolver
+class EigenDirectLinearSolver : public EigenLinearSolver::IEigenSolver
 {
 public:
-    EigenDirectSolver(EigenMatrix::RawMatrixType &A) : _A(A)
+    explicit EigenDirectLinearSolver(EigenMatrix::RawMatrixType &A) : _A(A)
     {
-        // fill A and b;
-        // Compute the ordering permutation vector from the structural pattern of A
-        _solver.analyzePattern(A);
-        // Compute the numerical factorization
-        _solver.factorize(A);
+        INFO("-> initialize with the coefficient matrix");
+        _solver.compute(A);
         if(_solver.info()!=Eigen::Success) {
-            ERR("The numerical factorization failed in Eigen");
+            ERR("Failed during Eigen linear solver initialization");
             return;
         }
     }
 
-    virtual ~EigenDirectSolver() {}
+    virtual ~EigenDirectLinearSolver() {}
 
-    void solve(EigenVector::RawVectorType &b, EigenVector::RawVectorType &x, EigenOption &) override
+    void solve(EigenVector::RawVectorType &b, EigenVector::RawVectorType &x, EigenOption &/*opt*/) override
     {
-        //Use the factors to solve the linear system
         INFO("-> solve");
         x = _solver.solve(b);
+        if(_solver.info()!=Eigen::Success) {
+            ERR("Failed during Eigen linear solve");
+            return;
+        }
     }
 
 private:
@@ -55,21 +56,22 @@ private:
     EigenMatrix::RawMatrixType& _A;
 };
 
+/// Template class for Eigen iterative linear solvers
 template <class T_SOLVER>
-class EigenIterativeSolver : public EigenLinearSolver::IEigenSolver
+class EigenIterativeLinearSolver : public EigenLinearSolver::IEigenSolver
 {
 public:
-    EigenIterativeSolver(EigenMatrix::RawMatrixType &A) : _A(A)
+    explicit EigenIterativeLinearSolver(EigenMatrix::RawMatrixType &A) : _A(A)
     {
         INFO("-> initialize with the coefficient matrix");
         _solver.compute(A);
         if(_solver.info()!=Eigen::Success) {
-            INFO("\t failed");
+            ERR("Failed during Eigen linear solver initialization");
             return;
         }
     }
 
-    virtual ~EigenIterativeSolver() {}
+    virtual ~EigenIterativeLinearSolver() {}
 
     void solve(EigenVector::RawVectorType &b, EigenVector::RawVectorType &x, EigenOption &opt) override
     {
@@ -78,8 +80,8 @@ public:
         _solver.setMaxIterations(opt.max_iterations);
         x = _solver.solveWithGuess(b, x);
         if(_solver.info()!=Eigen::Success) {
-            INFO("\t solving failed");
-          return;
+            ERR("Failed during Eigen linear solve");
+            return;
         }
         INFO("\t iteration: %d/%ld", _solver.iterations(), opt.max_iterations);
         INFO("\t residual: %e\n", _solver.error());
@@ -100,13 +102,13 @@ EigenLinearSolver::EigenLinearSolver(EigenMatrix &A, ptree const*const option)
     A.getRawMatrix().makeCompressed();
     if (_option.solver_type==EigenOption::SolverType::SparseLU) {
         typedef Eigen::SparseLU<EigenMatrix::RawMatrixType, Eigen::COLAMDOrdering<int> > SolverType;
-        _solver = new details::EigenDirectSolver<SolverType>(A.getRawMatrix());
+        _solver = new details::EigenDirectLinearSolver<SolverType>(A.getRawMatrix());
     } else if (_option.solver_type==EigenOption::SolverType::BiCGSTAB) {
         typedef Eigen::BiCGSTAB<EigenMatrix::RawMatrixType, Eigen::DiagonalPreconditioner<double>> SolverType;
-        _solver = new details::EigenIterativeSolver<SolverType>(A.getRawMatrix());
+        _solver = new details::EigenIterativeLinearSolver<SolverType>(A.getRawMatrix());
     } else if (_option.solver_type==EigenOption::SolverType::CG) {
         typedef Eigen::ConjugateGradient<EigenMatrix::RawMatrixType, Eigen::Lower, Eigen::DiagonalPreconditioner<double>> SolverType;
-        _solver = new details::EigenIterativeSolver<SolverType>(A.getRawMatrix());
+        _solver = new details::EigenIterativeLinearSolver<SolverType>(A.getRawMatrix());
     }
 }
 
-- 
GitLab