From 8a31061316e26885b5765193c65de73d779944bb Mon Sep 17 00:00:00 2001
From: Tomas Oberhuber <tomas.oberhuber@fjfi.cvut.cz>
Date: Thu, 6 Jun 2013 15:30:51 +0200
Subject: [PATCH] Adding max-solver-iterations to tnlSolverStarter.

---
 .../solvers/tnlSolverStarter_impl.h           | 42 ++++++++++++++++---
 src/solvers/tnlSolverStarter.h                |  4 ++
 2 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/src/implementation/solvers/tnlSolverStarter_impl.h b/src/implementation/solvers/tnlSolverStarter_impl.h
index 2ae438bb6b..637e786843 100644
--- a/src/implementation/solvers/tnlSolverStarter_impl.h
+++ b/src/implementation/solvers/tnlSolverStarter_impl.h
@@ -87,6 +87,8 @@ bool tnlSolverStarter :: setDiscreteSolver( Problem& problem,
          solver. setSolverMonitor( odeSolverMonitor );
       else
          solver. setSolverMonitor( * ( tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType >* ) problem. getSolverMonitor() );
+      if( ! setIterativeSolver( solver, parameters ) )
+         return false;
       return setExplicitTimeDiscretisation( problem, parameters, solver );
    }
 
@@ -103,7 +105,8 @@ bool tnlSolverStarter :: setDiscreteSolver( Problem& problem,
          solver. setSolverMonitor( odeSolverMonitor );
       else
          solver. setSolverMonitor( * ( tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType >* ) problem. getSolverMonitor() );
-
+      if( ! setIterativeSolver( solver, parameters ) )
+         return false;
       return setExplicitTimeDiscretisation( problem, parameters, solver );
    }
 
@@ -166,6 +169,17 @@ bool tnlSolverStarter :: setDiscreteSolver( Problem& problem,
    return false;
 }
 
+template< typename IterativeSolver >
+bool tnlSolverStarter :: setIterativeSolver( IterativeSolver& solver,
+                                             const tnlParameterContainer& parameters ) const
+{
+   int maxSolverIterations( 0 );
+   if( parameters.GetParameter< int >( "max-solver-iterations", maxSolverIterations ) )
+      solver. setMaxIterationsNumber( maxSolverIterations );
+   return true;
+}
+
+
 template< typename Problem,
           template < typename > class DiscreteSolver >
 bool tnlSolverStarter :: setExplicitTimeDiscretisation( Problem& problem,
@@ -252,7 +266,8 @@ bool tnlSolverStarter :: runPDESolver( Problem& problem,
    if( verbose )
       writeProlog( cout, parameters, problem );
    tnlString logFileName;
-   if( parameters. GetParameter< tnlString >( "log-file", logFileName ) )
+   bool haveLogFile = parameters. GetParameter< tnlString >( "log-file", logFileName );
+   if( haveLogFile )
    {
       fstream logFile;
       logFile. open( logFileName. getString(), ios :: out );
@@ -285,8 +300,25 @@ bool tnlSolverStarter :: runPDESolver( Problem& problem,
    /****
     * Start the solver
     */
+   bool returnCode( true );
    if( ! solver. solve() )
-      return false;
+   {
+      returnCode = false;
+      if( verbose )
+         cerr << endl << "The solver did not converge. " << endl;
+      fstream logFile;
+      logFile. open( logFileName. getString(), ios :: out | ios :: app );
+      if( ! logFile )
+      {
+         cerr << "Unable to open the log file " << logFileName << "." << endl;
+         return false;
+      }
+      else
+      {
+         logFile << "The solver did not converge. " << endl;
+         logFile. close();
+      }
+   }
 
    /****
     * Stop timers
@@ -301,7 +333,7 @@ bool tnlSolverStarter :: runPDESolver( Problem& problem,
     */
    if( verbose )
       writeEpilog( cout );
-   if( parameters. GetParameter< tnlString >( "log-file", logFileName ) )
+   if( haveLogFile )
    {
       fstream logFile;
       logFile. open( logFileName. getString(), ios :: out | ios :: app );
@@ -316,7 +348,7 @@ bool tnlSolverStarter :: runPDESolver( Problem& problem,
          logFile. close();
       }
    }
-   return true;
+   return returnCode;
 }
 
 bool tnlSolverStarter :: writeEpilog( ostream& str )
diff --git a/src/solvers/tnlSolverStarter.h b/src/solvers/tnlSolverStarter.h
index 477fc166c8..aa2cc9c9fb 100644
--- a/src/solvers/tnlSolverStarter.h
+++ b/src/solvers/tnlSolverStarter.h
@@ -62,6 +62,10 @@ class tnlSolverStarter
 
    protected:
 
+   template< typename IterativeSolver >
+   bool setIterativeSolver( IterativeSolver& solver,
+                            const tnlParameterContainer& parameters ) const;
+
    int verbose;
 
    int logWidth;
-- 
GitLab