diff --git a/src/implementation/solvers/tnlSolverStarter_impl.h b/src/implementation/solvers/tnlSolverStarter_impl.h index 2ae438bb6b3a2f4e6a18903a00223beefbf084dc..637e78684313c5ebe4ab236991329baaa2d4f899 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 477fc166c87ecd4e96f9f1be0b63676df81f7344..aa2cc9c9fbb91717c212e5c352f128598464909e 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;