From 1ea24af995a07146432b69c4cc7a1fc28e376e46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= <klinkjak@fjfi.cvut.cz>
Date: Sun, 8 Nov 2015 17:19:42 +0100
Subject: [PATCH] Improved refreshing of iterative solver monitor's state

This will ensure that in verbose mode, the final state of the linear
system solvers is always printed. Previously this was the case only when
refresh rate was equal to 1.
---
 src/solvers/linear/krylov/tnlBICGStabSolver_impl.h | 2 +-
 src/solvers/linear/krylov/tnlCGSolver_impl.h       | 2 +-
 src/solvers/linear/krylov/tnlGMRESSolver_impl.h    | 2 +-
 src/solvers/linear/krylov/tnlTFQMRSolver_impl.h    | 5 +++--
 src/solvers/linear/stationary/tnlSORSolver_impl.h  | 3 ++-
 src/solvers/tnlIterativeSolver.h                   | 2 +-
 src/solvers/tnlIterativeSolverMonitor.h            | 2 +-
 src/solvers/tnlIterativeSolverMonitor_impl.h       | 4 ++--
 src/solvers/tnlIterativeSolver_impl.h              | 4 ++--
 src/solvers/tnlSolverMonitor.h                     | 2 +-
 10 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/src/solvers/linear/krylov/tnlBICGStabSolver_impl.h b/src/solvers/linear/krylov/tnlBICGStabSolver_impl.h
index 4919d56bd6..8532424ef4 100644
--- a/src/solvers/linear/krylov/tnlBICGStabSolver_impl.h
+++ b/src/solvers/linear/krylov/tnlBICGStabSolver_impl.h
@@ -193,7 +193,7 @@ bool tnlBICGStabSolver< Matrix, Preconditioner > :: solve( const Vector& b, Vect
          this->setResidue( ResidueGetter :: getResidue( *matrix, b, x, bNorm ) );
    }
    //this->setResidue( ResidueGetter :: getResidue( *matrix, b, x, bNorm ) );
-   this->refreshSolverMonitor();
+   this->refreshSolverMonitor( true );
    return this->checkConvergence();
 };
 
diff --git a/src/solvers/linear/krylov/tnlCGSolver_impl.h b/src/solvers/linear/krylov/tnlCGSolver_impl.h
index ae599af1bb..86bea9efd2 100644
--- a/src/solvers/linear/krylov/tnlCGSolver_impl.h
+++ b/src/solvers/linear/krylov/tnlCGSolver_impl.h
@@ -142,7 +142,7 @@ solve( const Vector& b, Vector& x )
          this -> setResidue( ResidueGetter :: getResidue( *matrix, b, x, bNorm ) );
    }
    this -> setResidue( ResidueGetter :: getResidue( *matrix, b, x, bNorm ) );
-   this -> refreshSolverMonitor();
+   this -> refreshSolverMonitor( true );
    return this->checkConvergence();
 };
 
diff --git a/src/solvers/linear/krylov/tnlGMRESSolver_impl.h b/src/solvers/linear/krylov/tnlGMRESSolver_impl.h
index 13582c94a8..8d738b1b74 100644
--- a/src/solvers/linear/krylov/tnlGMRESSolver_impl.h
+++ b/src/solvers/linear/krylov/tnlGMRESSolver_impl.h
@@ -289,7 +289,7 @@ bool tnlGMRESSolver< Matrix, Preconditioner > :: solve( const Vector& b, Vector&
       //cout << "residue = " << beta / normb << endl;
 
    }
-   this->refreshSolverMonitor();
+   this->refreshSolverMonitor( true );
    return this->checkConvergence();
 };
 
diff --git a/src/solvers/linear/krylov/tnlTFQMRSolver_impl.h b/src/solvers/linear/krylov/tnlTFQMRSolver_impl.h
index b9f5fefea6..52adc5f30d 100644
--- a/src/solvers/linear/krylov/tnlTFQMRSolver_impl.h
+++ b/src/solvers/linear/krylov/tnlTFQMRSolver_impl.h
@@ -154,8 +154,9 @@ bool tnlTFQMRSolver< Matrix, Preconditioner > :: solve( const Vector& b, Vector&
       this -> refreshSolverMonitor();
    }
    this -> setResidue( ResidueGetter :: getResidue( *matrix, b, x, bNorm ) );
-   this -> refreshSolverMonitor();
-      if( this -> getResidue() > this -> getConvergenceResidue() ) return false;
+   this -> refreshSolverMonitor( true );
+   if( this -> getResidue() > this -> getConvergenceResidue() )
+      return false;
    return true;
 };
 
diff --git a/src/solvers/linear/stationary/tnlSORSolver_impl.h b/src/solvers/linear/stationary/tnlSORSolver_impl.h
index 419e190d55..273bf9e81a 100644
--- a/src/solvers/linear/stationary/tnlSORSolver_impl.h
+++ b/src/solvers/linear/stationary/tnlSORSolver_impl.h
@@ -107,9 +107,10 @@ bool tnlSORSolver< Matrix, Preconditioner > :: solve( const Vector& b,
                                       x,
                                       this->getOmega() );
       this -> setResidue( ResidueGetter :: getResidue( *matrix, x, b, bNorm ) );
+      this -> refreshSolverMonitor();
    }
    this -> setResidue( ResidueGetter :: getResidue( *matrix, x, b, bNorm ) );
-   this -> refreshSolverMonitor();
+   this -> refreshSolverMonitor( true );
    return this->checkConvergence();
 };
 
diff --git a/src/solvers/tnlIterativeSolver.h b/src/solvers/tnlIterativeSolver.h
index d79ab4bd59..8c05287d8d 100644
--- a/src/solvers/tnlIterativeSolver.h
+++ b/src/solvers/tnlIterativeSolver.h
@@ -67,7 +67,7 @@ class tnlIterativeSolver
 
    bool checkConvergence();
 
-   void refreshSolverMonitor();
+   void refreshSolverMonitor( bool force = false );
 
 
    protected:
diff --git a/src/solvers/tnlIterativeSolverMonitor.h b/src/solvers/tnlIterativeSolverMonitor.h
index b4c949ee78..5cca8ed68a 100644
--- a/src/solvers/tnlIterativeSolverMonitor.h
+++ b/src/solvers/tnlIterativeSolverMonitor.h
@@ -44,7 +44,7 @@ class tnlIterativeSolverMonitor : public tnlSolverMonitor< Real, Index >
    
    void setRefreshRate( const IndexType& refreshRate );
 
-   virtual void refresh();
+   virtual void refresh( bool force = false );
 
    void resetTimers();
 
diff --git a/src/solvers/tnlIterativeSolverMonitor_impl.h b/src/solvers/tnlIterativeSolverMonitor_impl.h
index 1db4c8048b..7f65f9e596 100644
--- a/src/solvers/tnlIterativeSolverMonitor_impl.h
+++ b/src/solvers/tnlIterativeSolverMonitor_impl.h
@@ -69,9 +69,9 @@ void tnlIterativeSolverMonitor< Real, Index > :: setRefreshRate( const Index& re
 }
 
 template< typename Real, typename Index>
-void tnlIterativeSolverMonitor< Real, Index > :: refresh()
+void tnlIterativeSolverMonitor< Real, Index > :: refresh( bool force )
 {
-   if( this->verbose > 0 && this->getIterations() % this->refreshRate == 0 )
+   if( this->verbose > 0 && ( force || this->getIterations() % this->refreshRate == 0 ) )
    {
       cout << " ITER:" << setw( 8 ) << this->getIterations()
            << " RES:" << setprecision( 5 ) << setw( 12 ) << this -> getResidue()
diff --git a/src/solvers/tnlIterativeSolver_impl.h b/src/solvers/tnlIterativeSolver_impl.h
index 012a6da171..090998dda3 100644
--- a/src/solvers/tnlIterativeSolver_impl.h
+++ b/src/solvers/tnlIterativeSolver_impl.h
@@ -196,14 +196,14 @@ void tnlIterativeSolver< Real, Index> :: setSolverMonitor( tnlIterativeSolverMon
 }
 
 template< typename Real, typename Index >
-void tnlIterativeSolver< Real, Index> :: refreshSolverMonitor()
+void tnlIterativeSolver< Real, Index> :: refreshSolverMonitor( bool force )
 {
    if( this -> solverMonitor )
    {
       this -> solverMonitor -> setIterations( this -> getIterations() );
       this -> solverMonitor -> setResidue( this -> getResidue() );
       this -> solverMonitor -> setRefreshRate( this-> refreshRate );
-      this -> solverMonitor -> refresh();
+      this -> solverMonitor -> refresh( force );
    }
 }
 
diff --git a/src/solvers/tnlSolverMonitor.h b/src/solvers/tnlSolverMonitor.h
index df946e3643..b6263a27b0 100644
--- a/src/solvers/tnlSolverMonitor.h
+++ b/src/solvers/tnlSolverMonitor.h
@@ -23,7 +23,7 @@ class tnlSolverMonitor
 {
    public:
 
-   virtual void refresh() = 0;
+   virtual void refresh( bool force = false ) = 0;
 
    ~tnlSolverMonitor() {};
       
-- 
GitLab