diff --git a/src/implementation/solvers/CMakeLists.txt b/src/implementation/solvers/CMakeLists.txt index 8c7d416dcca2b6565717c1bc2414feba47c9e2a7..4ea65cae1d1e31fac9f6e5738edf58808306da11 100755 --- a/src/implementation/solvers/CMakeLists.txt +++ b/src/implementation/solvers/CMakeLists.txt @@ -2,7 +2,8 @@ ADD_SUBDIRECTORY( linear ) ADD_SUBDIRECTORY( pde ) ADD_SUBDIRECTORY( ode ) -SET( headers tnlSolver_impl.h +SET( headers tnlIterativeSolverMonitor_impl.h + tnlSolver_impl.h tnlSolverStarter_impl.h tnlSolverInitiator_impl.h ) diff --git a/src/implementation/solvers/ode/CMakeLists.txt b/src/implementation/solvers/ode/CMakeLists.txt index b9d6df03dbabfcc79f97220451c0dcc827f5d03d..41f6b8b47c4c6d24d794a51ad4ee7de37a5775ae 100755 --- a/src/implementation/solvers/ode/CMakeLists.txt +++ b/src/implementation/solvers/ode/CMakeLists.txt @@ -1,5 +1,6 @@ SET( headers tnlEulerSolver_impl.h - tnlMersonSolver_impl.h ) + tnlMersonSolver_impl.h + tnlODESolverMonitor_impl.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/implementation/solvers/ode ) diff --git a/src/implementation/solvers/ode/tnlEulerSolver_impl.h b/src/implementation/solvers/ode/tnlEulerSolver_impl.h index 80ce7b9d628866b2b114fcf51cfc32c1dcc25ac0..f1fccd13bf8a1549939766aeac8e929611a0bc3f 100644 --- a/src/implementation/solvers/ode/tnlEulerSolver_impl.h +++ b/src/implementation/solvers/ode/tnlEulerSolver_impl.h @@ -71,11 +71,7 @@ bool tnlEulerSolver< Problem > :: solve( DofVectorType& u ) if( currentTau == 0.0 ) return true; iteration = 0; - /**** - * Do a printout ... - */ - if( this -> verbosity > 0 ) - this -> printOut(); + this -> refreshSolverMonitor(); /**** * Start the main loop @@ -115,11 +111,7 @@ bool tnlEulerSolver< Problem > :: solve( DofVectorType& u ) currentTau = this -> getStopTime() - time; //we don't want to keep such tau else this -> tau = currentTau; - /**** - * Do printouts if verbosity is on - */ - if( this -> verbosity > 1 ) - this -> printOut(); + this -> refreshSolverMonitor(); /**** * Check stop conditions. @@ -127,9 +119,8 @@ bool tnlEulerSolver< Problem > :: solve( DofVectorType& u ) if( time >= this -> getStopTime() || ( this -> getMaxResidue() != 0.0 && residue < this -> getMaxResidue() ) ) { - if( this -> verbosity > 0 ) - this -> printOut(); - return true; + this -> refreshSolverMonitor(); + return true; } if( iteration == this -> getMaxIterationsNumber() ) return false; diff --git a/src/implementation/solvers/ode/tnlMersonSolver_impl.h b/src/implementation/solvers/ode/tnlMersonSolver_impl.h index e16e5ae5ea62ee144c1df93a53678ff8c6c810fa..c117ca08e2d5965d3ab166e9a10890332be7d871 100644 --- a/src/implementation/solvers/ode/tnlMersonSolver_impl.h +++ b/src/implementation/solvers/ode/tnlMersonSolver_impl.h @@ -142,11 +142,7 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u ) if( currentTau == 0.0 ) return true; iteration = 0; - /**** - * Do a printout ... - */ - if( this -> verbosity > 0 ) - this -> printOut(); + this -> refreshSolverMonitor(); /**** * Start the main loop @@ -178,6 +174,7 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u ) if( currentTau + time == this -> stopTime ) residue = lastResidue; time += currentTau; iteration ++; + this -> refreshSolverMonitor(); } /**** @@ -192,11 +189,6 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u ) currentTau = this -> getStopTime() - time; //we don't want to keep such tau else this -> tau = currentTau; - /**** - * Do printouts if verbosity is on - */ - if( this -> verbosity > 1 ) - this -> printOut(); /**** * Check stop conditions. @@ -204,9 +196,8 @@ bool tnlMersonSolver< Problem > :: solve( DofVectorType& u ) if( time >= this -> getStopTime() || ( this -> getMaxResidue() != 0.0 && residue < this -> getMaxResidue() ) ) { - if( this -> verbosity > 0 ) - this -> printOut(); - return true; + this -> refreshSolverMonitor(); + return true; } if( iteration == this -> getMaxIterationsNumber() ) return false; } diff --git a/src/implementation/solvers/ode/tnlODESolverMonitor_impl.h b/src/implementation/solvers/ode/tnlODESolverMonitor_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..9a104aa018c51916e0035cd6daadcce6b2fcfab3 --- /dev/null +++ b/src/implementation/solvers/ode/tnlODESolverMonitor_impl.h @@ -0,0 +1,75 @@ +/*************************************************************************** + tnlODESolverMonitor_impl.h - description + ------------------- + begin : Mar 12, 2013 + copyright : (C) 2013 by Tomas Oberhuber + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TNLODESOLVERMONITOR_IMPL_H_ +#define TNLODESOLVERMONITOR_IMPL_H_ + +template< typename RealType, typename IndexType > +tnlODESolverMonitor< RealType, IndexType> :: tnlODESolverMonitor() +: timeStep( 0.0 ), + time( 0.0 ) +{ +} + +template< typename RealType, typename IndexType > +void tnlODESolverMonitor< RealType, IndexType> :: refresh() +{ + if( this -> verbose > 0 && this -> refreshing % this -> outputPeriod == 0 ) + { + // TODO: add EST + //cout << " EST: " << estimated; + cout << " ITER:" << setw( 8 ) << this -> getIterations() + << " TAU:" << setprecision( 5 ) << setw( 12 ) << this -> getTimeStep() + << " T:" << setprecision( 5 ) << setw( 12 ) << this -> getTime() + << " RES:" << setprecision( 5 ) << setw( 12 ) << this -> getResidue() + << " CPU: " << setw( 8 ) << this -> getCPUTime() + << " ELA: " << setw( 8 ) << this -> getRealTime(); + /*double flops = ( double ) tnl_flops_counter. getFlops(); + if( flops ) + { + cout << " GFLOPS: " << setw( 8 ) << 1.0e-9 * flops / rt_timer -> GetTime(); + }*/ + cout << " \r" << flush; + } + this -> refreshing ++; +} + +template< typename RealType, typename IndexType > +void tnlODESolverMonitor< RealType, IndexType> :: setTimeStep( const RealType& timeStep ) +{ + this -> timeStep = timeStep; +} + +template< typename RealType, typename IndexType > +const RealType& tnlODESolverMonitor< RealType, IndexType> :: getTimeStep() const +{ + return this -> timeStep; +} + +template< typename RealType, typename IndexType > +void tnlODESolverMonitor< RealType, IndexType> :: setTime( const RealType& time ) +{ + this -> time = time; +} + +template< typename RealType, typename IndexType > +const RealType& tnlODESolverMonitor< RealType, IndexType> :: getTime() const +{ + return this -> time; +} + +#endif /* TNLODESOLVERMONITOR_IMPL_H_ */ diff --git a/src/implementation/solvers/tnlIterativeSolverMonitor_impl.h b/src/implementation/solvers/tnlIterativeSolverMonitor_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..1854e56eba2d03807b8958ea234f54569ae0da93 --- /dev/null +++ b/src/implementation/solvers/tnlIterativeSolverMonitor_impl.h @@ -0,0 +1,95 @@ +/*************************************************************************** + tnlIterativeSolverMonitor_impl.h - description + ------------------- + begin : Oct 19, 2012 + copyright : (C) 2012 by Tomas Oberhuber + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TNLITERATIVESOLVERMONITOR_IMPL_H_ +#define TNLITERATIVESOLVERMONITOR_IMPL_H_ + +template< typename Real, typename Index> +tnlIterativeSolverMonitor< Real, Index > :: tnlIterativeSolverMonitor() +: iterations( 0 ), + residue( 0 ), + refreshing( 0 ), + outputPeriod( 1 ), + verbose( 1 ) +{ +} + +template< typename Real, typename Index> +void tnlIterativeSolverMonitor< Real, Index > :: setIterations( const Index& iterations ) +{ + this -> iterations = iterations; +} + +template< typename Real, typename Index> +const Index& tnlIterativeSolverMonitor< Real, Index > :: getIterations() const +{ + return this -> iterations; +} + +template< typename Real, typename Index> +void tnlIterativeSolverMonitor< Real, Index > :: setResidue( const Real& residue ) +{ + this -> residue = residue; +} + +template< typename Real, typename Index> +const Real& tnlIterativeSolverMonitor< Real, Index > :: getResidue() const +{ + return this -> residue; +} + +template< typename Real, typename Index> +void tnlIterativeSolverMonitor< Real, Index > :: setVerbose( const Index& verbose ) +{ + this -> verbose = verbose; +} + +template< typename Real, typename Index> +void tnlIterativeSolverMonitor< Real, Index > :: refresh() +{ + if( this -> verbose > 0 && this -> refreshing % this -> outputPeriod == 0 ) + { + cout << " ITER:" << setw( 8 ) << this -> getIterations() + << " RES:" << setprecision( 5 ) << setw( 12 ) << this -> getResidue() + << " CPU: " << setw( 8 ) << this -> getCPUTime() + << " ELA: " << setw( 8 ) << this -> getRealTime() + << " \r" << flush; + } + this -> refreshing ++; +} + +template< typename Real, typename Index> +void tnlIterativeSolverMonitor< Real, Index > :: resetTimers() +{ + cpuTimer. Reset(); + rtTimer. Reset(); +} + +template< typename Real, typename Index> +double tnlIterativeSolverMonitor< Real, Index > :: getCPUTime() +{ + return cpuTimer. GetTime(); +} + +template< typename Real, typename Index> +double tnlIterativeSolverMonitor< Real, Index > :: getRealTime() +{ + return rtTimer. GetTime(); +} + + +#endif /* TNLITERATIVESOLVERMONITOR_IMPL_H_ */ diff --git a/src/implementation/solvers/tnlSolverStarter_impl.h b/src/implementation/solvers/tnlSolverStarter_impl.h index 093655c69476fe899f47471a0d99f3c66f3c9d2b..1622d4793094756998ef9819938532e24712eaeb 100644 --- a/src/implementation/solvers/tnlSolverStarter_impl.h +++ b/src/implementation/solvers/tnlSolverStarter_impl.h @@ -30,6 +30,8 @@ #include <solvers/linear/krylov/tnlGMRESSolver.h> #include <solvers/pde/tnlExplicitTimeStepper.h> #include <solvers/pde/tnlPDESolver.h> +#include <solvers/tnlIterativeSolverMonitor.h> +#include <solvers/ode/tnlODESolverMonitor.h> tnlSolverStarter :: tnlSolverStarter() : logWidth( 72 ) @@ -40,11 +42,20 @@ template< typename Problem > bool tnlSolverStarter :: run( const tnlParameterContainer& parameters ) { this -> verbose = parameters. GetParameter< int >( "verbose" ); - return setDiscreteSolver< Problem >( parameters ); + + /**** + * Create and set-up the problem + */ + Problem problem; + if( ! problem. init( parameters ) ) + return false; + + return setDiscreteSolver< Problem >( problem, parameters ); } template< typename Problem > -bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& parameters ) +bool tnlSolverStarter :: setDiscreteSolver( Problem& problem, + const tnlParameterContainer& parameters ) { const tnlString& discreteSolver = parameters. GetParameter< tnlString>( "discrete-solver" ); const tnlString& timeDiscretisation = parameters. GetParameter< tnlString>( "time-discretisation" ); @@ -65,13 +76,20 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet return false; } + + if( discreteSolver == "euler" ) { typedef tnlEulerSolver< Problem > DiscreteSolver; DiscreteSolver solver; solver. setName( "euler-solver" ); solver. setVerbose( this -> verbose ); - return setExplicitTimeDiscretisation( parameters, solver ); + tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType > odeSolverMonitor; + if( ! problem. getSolverMonitor() ) + solver. setSolverMonitor( odeSolverMonitor ); + else + solver. setSolverMonitor( * ( tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType >* ) problem. getSolverMonitor() ); + return setExplicitTimeDiscretisation( problem, parameters, solver ); } if( discreteSolver == "merson" ) @@ -82,7 +100,13 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet solver. setName( "merson-solver" ); solver. setAdaptivity( adaptivity ); solver. setVerbose( this -> verbose ); - return setExplicitTimeDiscretisation( parameters, solver ); + tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType > odeSolverMonitor; + if( ! problem. getSolverMonitor() ) + solver. setSolverMonitor( odeSolverMonitor ); + else + solver. setSolverMonitor( * ( tnlODESolverMonitor< typename Problem :: RealType, typename Problem :: IndexType >* ) problem. getSolverMonitor() ); + + return setExplicitTimeDiscretisation( problem, parameters, solver ); } if( ( discreteSolver == "sor" || @@ -105,7 +129,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet solver. setName( "sor-solver" ); solver. setOmega( omega ); //solver. setVerbose( this -> verbose ); - return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver ); + return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver ); } if( discreteSolver == "cg" ) @@ -115,7 +139,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet DiscreteSolver solver; solver. setName( "cg-solver" ); //solver. setVerbose( this -> verbose ); - return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver ); + return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver ); } if( discreteSolver == "bicg-stab" ) @@ -125,7 +149,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet DiscreteSolver solver; solver. setName( "bicg-solver" ); //solver. setVerbose( this -> verbose ); - return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver ); + return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver ); } if( discreteSolver == "gmres" ) @@ -137,7 +161,7 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet solver. setName( "gmres-solver" ); solver. setRestarting( restarting ); //solver. setVerbose( this -> verbose ); - return setSemiImplicitTimeDiscretisation< Problem >( parameters, solver ); + return setSemiImplicitTimeDiscretisation< Problem >( problem, parameters, solver ); } cerr << "Unknown discrete solver " << discreteSolver << "." << endl; @@ -146,19 +170,21 @@ bool tnlSolverStarter :: setDiscreteSolver( const tnlParameterContainer& paramet template< typename Problem, template < typename > class DiscreteSolver > -bool tnlSolverStarter :: setExplicitTimeDiscretisation( const tnlParameterContainer& parameters, +bool tnlSolverStarter :: setExplicitTimeDiscretisation( Problem& problem, + const tnlParameterContainer& parameters, DiscreteSolver< Problem >& discreteSolver ) { typedef tnlExplicitTimeStepper< Problem, DiscreteSolver > TimeStepperType; TimeStepperType timeStepper; timeStepper. setSolver( discreteSolver ); timeStepper. setTau( parameters. GetParameter< double >( "initial-tau" ) ); - return runPDESolver< Problem, TimeStepperType >( parameters, timeStepper ); + return runPDESolver< Problem, TimeStepperType >( problem, parameters, timeStepper ); } template< typename Problem, typename DiscreteSolver > -bool tnlSolverStarter :: setSemiImplicitTimeDiscretisation( const tnlParameterContainer& parameters, +bool tnlSolverStarter :: setSemiImplicitTimeDiscretisation( Problem& problem, + const tnlParameterContainer& parameters, DiscreteSolver& discreteSolver ) { @@ -199,19 +225,13 @@ bool tnlSolverStarter :: writeProlog( ostream& str, template< typename Problem, typename TimeStepper > -bool tnlSolverStarter :: runPDESolver( const tnlParameterContainer& parameters, +bool tnlSolverStarter :: runPDESolver( Problem& problem, + const tnlParameterContainer& parameters, TimeStepper& timeStepper ) { this -> totalCpuTimer. Reset(); this -> totalRtTimer. Reset(); - /**** - * Create and set-up the problem - */ - Problem problem; - if( ! problem. init( parameters ) ) - return false; - /*** * Set-up the initial condition */ diff --git a/src/solvers/CMakeLists.txt b/src/solvers/CMakeLists.txt index 992e604309053c35a1d83db4af70d93697c4ed34..242b76b92783603552ff488a0a8b092d0020f1bb 100755 --- a/src/solvers/CMakeLists.txt +++ b/src/solvers/CMakeLists.txt @@ -8,7 +8,7 @@ SET( headers tnlIterativeSolver.h tnlSolverStarter.h tnlSolverInitiator.h tnlSolverMonitor.h - tnlSimpleIterativeSolverMonitor.h + tnlIterativeSolverMonitor.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/solvers ) diff --git a/src/solvers/ode/CMakeLists.txt b/src/solvers/ode/CMakeLists.txt index 24337693976721f00fdc315d64c4552e9e43e19b..f0ff3dd35ba68e9100363de4c7d81de6181b0d93 100755 --- a/src/solvers/ode/CMakeLists.txt +++ b/src/solvers/ode/CMakeLists.txt @@ -1,6 +1,7 @@ SET( headers tnlEulerSolver.h tnlMersonSolver.h tnlExplicitSolver.h + tnlODESolverMonitor.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/solvers/ode ) \ No newline at end of file diff --git a/src/solvers/ode/tnlExplicitSolver.h b/src/solvers/ode/tnlExplicitSolver.h index a15270a6826578b6ad8b2c5fac4fe86eef846956..2e1f7321d1cf44e12d7504af4efcaa391dc818c7 100644 --- a/src/solvers/ode/tnlExplicitSolver.h +++ b/src/solvers/ode/tnlExplicitSolver.h @@ -23,6 +23,7 @@ #include <core/tnlTimerRT.h> #include <core/tnlFlopsCounter.h> #include <core/tnlObject.h> +#include <solvers/ode/tnlODESolverMonitor.h> template< class Problem > class tnlExplicitSolver : public tnlObject @@ -70,13 +71,17 @@ class tnlExplicitSolver : public tnlObject void setTimerCPU( tnlTimerCPU* timer ); void setTimerRT( tnlTimerRT* timer ); - - void printOut() const; virtual bool solve( DofVectorType& u ) = 0; void setTestingMode( bool testingMode ); + void setRefreshRate( const IndexType& refreshRate ); + + void setSolverMonitor( tnlODESolverMonitor< RealType, IndexType >& solverMonitor ); + + void refreshSolverMonitor(); + protected: //! Current time of the parabolic problem. @@ -113,6 +118,8 @@ protected: bool testingMode; Problem* problem; + + tnlODESolverMonitor< RealType, IndexType >* solverMonitor; }; template< class Problem > @@ -236,29 +243,27 @@ void tnlExplicitSolver < Problem > :: setTimerRT( tnlTimerRT* timer ) }; template< class Problem > -void tnlExplicitSolver < Problem > :: printOut() const +void tnlExplicitSolver < Problem > :: setRefreshRate( const IndexType& refreshRate ) +{ + this -> refreshRate = refreshRate; +} + +template< class Problem > +void tnlExplicitSolver < Problem > :: setSolverMonitor( tnlODESolverMonitor< RealType, IndexType >& solverMonitor ) +{ + this -> solverMonitor = &solverMonitor; +} + +template< class Problem > +void tnlExplicitSolver < Problem > :: refreshSolverMonitor() { - if( verbosity > 0 ) + if( this -> solverMonitor ) { - IndexType cpu_time = 0; - if( cpu_timer ) cpu_time = cpu_timer -> GetTime( 0, solver_comm ); - if( MPIGetRank() != 0 ) return; - // TODO: add EST - //cout << " EST: " << estimated; - cout << " ITER:" << setw( 8 ) << getIterationsNumber() - << " TAU:" << setprecision( 5 ) << setw( 12 ) << getTau() - << " T:" << setprecision( 5 ) << setw( 12 ) << getTime() - << " RES:" << setprecision( 5 ) << setw( 12 ) << getResidue(); - if( cpu_timer ) - cout << " CPU: " << setw( 8 ) << cpu_time; - if( rt_timer ) - cout << " ELA: " << setw( 8 ) << rt_timer -> GetTime(); - double flops = ( double ) tnl_flops_counter. getFlops(); - if( flops ) - { - cout << " GFLOPS: " << setw( 8 ) << 1.0e-9 * flops / rt_timer -> GetTime(); - } - cout << " \r" << flush; + this -> solverMonitor -> setIterations( this -> getIterationsNumber() ); + this -> solverMonitor -> setResidue( this -> getResidue() ); + this -> solverMonitor -> setTimeStep( this -> getTau() ); + this -> solverMonitor -> setTime( this -> getTime() ); + this -> solverMonitor -> refresh(); } } diff --git a/src/solvers/ode/tnlODESolverMonitor.h b/src/solvers/ode/tnlODESolverMonitor.h new file mode 100644 index 0000000000000000000000000000000000000000..6a98b565e61e05eb6b1b6b488b656bce78d93498 --- /dev/null +++ b/src/solvers/ode/tnlODESolverMonitor.h @@ -0,0 +1,53 @@ +/*************************************************************************** + tnlODESolverMonitor.h - description + ------------------- + begin : Mar 12, 2013 + copyright : (C) 2013 by Tomas Oberhuber + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TNLODESOLVERMONITOR_H_ +#define TNLODESOLVERMONITOR_H_ + +#include <solvers/tnlIterativeSolverMonitor.h> + +template< typename Real, typename Index> +class tnlODESolverMonitor : public tnlIterativeSolverMonitor< Real, Index > +{ + public: + + typedef Real RealType; + typedef Index IndexType; + + tnlODESolverMonitor(); + + void refresh(); + + void setTimeStep( const RealType& timeStep ); + + const RealType& getTimeStep() const; + + void setTime( const RealType& time ); + + const RealType& getTime() const; + + protected: + + RealType timeStep; + + RealType time; + +}; + +#include <implementation/solvers/ode/tnlODESolverMonitor_impl.h> + +#endif /* TNLODESOLVERMONITOR_H_ */ diff --git a/src/solvers/pde/tnlExplicitTimeStepper.h b/src/solvers/pde/tnlExplicitTimeStepper.h index f15e3fcc32e2edbbba9d7951ebf0656097e63f13..772b8916d024c82af00d9d090fe678c52349c7ba 100644 --- a/src/solvers/pde/tnlExplicitTimeStepper.h +++ b/src/solvers/pde/tnlExplicitTimeStepper.h @@ -18,6 +18,8 @@ #ifndef TNLEXPLICITTIMESTEPPER_H_ #define TNLEXPLICITTIMESTEPPER_H_ +#include <solvers/ode/tnlODESolverMonitor.h> + template< typename Problem, template < typename OdeProblem > class OdeSolver > class tnlExplicitTimeStepper diff --git a/src/solvers/pde/tnlPDESolver.h b/src/solvers/pde/tnlPDESolver.h index 82473b4be5492c0363f6c58b29e300fb363b4b45..9d16d2f213da606881b2eb990db4e8432905e67e 100644 --- a/src/solvers/pde/tnlPDESolver.h +++ b/src/solvers/pde/tnlPDESolver.h @@ -19,6 +19,7 @@ #define TNLPDESOLVER_H_ #include <core/tnlObject.h> +#include <solvers/tnlSolverMonitor.h> template< typename Problem, typename TimeStepper > diff --git a/src/solvers/tnlIterativeSolver.h b/src/solvers/tnlIterativeSolver.h index a6e2f3daf6e1dc2d6e3f7218751a7b4135c0750f..e768fb427153ea7f523155a21694b09be9e9c701 100644 --- a/src/solvers/tnlIterativeSolver.h +++ b/src/solvers/tnlIterativeSolver.h @@ -171,13 +171,18 @@ template< typename Real, typename Index > void tnlIterativeSolver< Real, Index> :: setSolverMonitor( tnlSolverMonitor< Real, Index >& solverMonitor ) { this -> solverMonitor = &solverMonitor; + solverMonitor. setSolver( this ); } template< typename Real, typename Index > void tnlIterativeSolver< Real, Index> :: refreshSolverMonitor() { if( this -> solverMonitor ) + { + this -> solverMonitor() -> setIterations( this -> getIterations() ); + this -> solverMonitor() -> setResidue( this -> getResidue() ); this -> solverMonitor -> refresh(); + } } #endif /* TNLITERATIVESOLVER_H_ */ diff --git a/src/solvers/tnlIterativeSolverMonitor.h b/src/solvers/tnlIterativeSolverMonitor.h new file mode 100644 index 0000000000000000000000000000000000000000..f604177d953029ca97edf8557dadf409ae301214 --- /dev/null +++ b/src/solvers/tnlIterativeSolverMonitor.h @@ -0,0 +1,73 @@ +/*************************************************************************** + tnlIterativeSolverMonitor.h - description + ------------------- + begin : Oct 19, 2012 + copyright : (C) 2012 by Tomas Oberhuber + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TNLITERATIVESOLVERMONITOR_H_ +#define TNLITERATIVESOLVERMONITOR_H_ + +#include <solvers/tnlSolverMonitor.h> +#include <solvers/tnlIterativeSolver.h> +#include <core/tnlTimerCPU.h> +#include <core/tnlTimerRT.h> + +template< typename Real, typename Index> +class tnlIterativeSolverMonitor : public tnlSolverMonitor< Real, Index > +{ + public: + + typedef Index IndexType; + typedef Real RealType; + + tnlIterativeSolverMonitor(); + + void setIterations( const IndexType& iterations ); + + const IndexType& getIterations() const; + + void setResidue( const RealType& residue ); + + const RealType& getResidue() const; + + void setVerbose( const Index& verbose ); + + virtual void refresh(); + + void resetTimers(); + + double getCPUTime(); + + double getRealTime(); + + protected: + + IndexType iterations; + + RealType residue; + + IndexType refreshing; + + IndexType outputPeriod; + + IndexType verbose; + + tnlTimerCPU cpuTimer; + + tnlTimerRT rtTimer; +}; + +#include <implementation/solvers/tnlIterativeSolverMonitor_impl.h> + +#endif /* TNLITERATIVESOLVERMONITOR_H_ */ diff --git a/src/solvers/tnlSimpleIterativeSolverMonitor.h b/src/solvers/tnlSimpleIterativeSolverMonitor.h deleted file mode 100644 index d81914300d8ff1cd35663ed5647ba905901b52be..0000000000000000000000000000000000000000 --- a/src/solvers/tnlSimpleIterativeSolverMonitor.h +++ /dev/null @@ -1,117 +0,0 @@ -/*************************************************************************** - tnlSimpleIterativeSolverMonitor.h - description - ------------------- - begin : Oct 19, 2012 - copyright : (C) 2012 by Tomas Oberhuber - email : tomas.oberhuber@fjfi.cvut.cz - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ - -#ifndef TNLSIMPLEITERATIVESOLVERMONITOR_H_ -#define TNLSIMPLEITERATIVESOLVERMONITOR_H_ - -#include <solvers/tnlSolverMonitor.h> -#include <solvers/tnlIterativeSolver.h> -#include <core/tnlTimerCPU.h> -#include <core/tnlTimerRT.h> - -template< typename Real, typename Index> -class tnlSimpleIterativeSolverMonitor : public tnlSolverMonitor< Real, Index > -{ - public: - - tnlSimpleIterativeSolverMonitor(); - - void setSolver( const tnlIterativeSolver< Real, Index >& solver ); - - void setVerbose( const Index& verbose ); - - void refresh(); - - void resetTimers(); - - double getCPUTime(); - - double getRealTime(); - - protected: - - Index refreshing; - - Index outputPeriod; - - Index verbose; - - const tnlIterativeSolver< Real, Index >* solver; - - tnlTimerCPU cpuTimer; - - tnlTimerRT rtTimer; -}; - -template< typename Real, typename Index> -tnlSimpleIterativeSolverMonitor< Real, Index > :: tnlSimpleIterativeSolverMonitor() -: refreshing( 0 ), - outputPeriod( 1 ), - verbose( 1 ), - solver( 0 ) -{ -} - -template< typename Real, typename Index> -void tnlSimpleIterativeSolverMonitor< Real, Index > :: setSolver( const tnlIterativeSolver< Real, Index >& solver ) -{ - this -> solver = &solver; -} - -template< typename Real, typename Index> -void tnlSimpleIterativeSolverMonitor< Real, Index > :: setVerbose( const Index& verbose ) -{ - this -> verbose = &verbose; -} - -template< typename Real, typename Index> -void tnlSimpleIterativeSolverMonitor< Real, Index > :: refresh() -{ - if( ! solver ) - return; - this -> refreshing ++; - if( this -> verbose > 0 ) - { - cout << " ITER:" << setw( 8 ) << solver -> getIterations() - << " RES:" << setprecision( 5 ) << setw( 12 ) << solver -> getResidue() - << " CPU: " << setw( 8 ) << this -> getCPUTime() - << " ELA: " << setw( 8 ) << this -> getRealTime() - << " \r" << flush; - } -} - -template< typename Real, typename Index> -void tnlSimpleIterativeSolverMonitor< Real, Index > :: resetTimers() -{ - cpuTimer. Reset(); - rtTimer. Reset(); -} - -template< typename Real, typename Index> -double tnlSimpleIterativeSolverMonitor< Real, Index > :: getCPUTime() -{ - return cpuTimer. GetTime(); -} - -template< typename Real, typename Index> -double tnlSimpleIterativeSolverMonitor< Real, Index > :: getRealTime() -{ - return rtTimer. GetTime(); -} - - -#endif /* TNLSIMPLEITERATIVESOLVERMONITOR_H_ */ diff --git a/src/solvers/tnlSolverStarter.h b/src/solvers/tnlSolverStarter.h index daf60027a25c5f16a9836223beab91741d6af2db..477fc166c87ecd4e96f9f1be0b63676df81f7344 100644 --- a/src/solvers/tnlSolverStarter.h +++ b/src/solvers/tnlSolverStarter.h @@ -33,16 +33,19 @@ class tnlSolverStarter bool run( const tnlParameterContainer& parameters ); template< typename Problem > - bool setDiscreteSolver( const tnlParameterContainer& parameters ); + bool setDiscreteSolver( Problem& problem, + const tnlParameterContainer& parameters ); template< typename Problem, template < typename > class DiscreteSolver > - bool setExplicitTimeDiscretisation( const tnlParameterContainer& parameters, + bool setExplicitTimeDiscretisation( Problem& problem, + const tnlParameterContainer& parameters, DiscreteSolver< Problem >& solver ); template< typename Problem, typename DiscreteSolver > - bool setSemiImplicitTimeDiscretisation( const tnlParameterContainer& parameters, + bool setSemiImplicitTimeDiscretisation( Problem& problem, + const tnlParameterContainer& parameters, DiscreteSolver& solver); template< typename Problem > @@ -51,7 +54,8 @@ class tnlSolverStarter const Problem& problem ); template< typename Problem, typename TimeStepper > - bool runPDESolver( const tnlParameterContainer& parameters, + bool runPDESolver( Problem& problem, + const tnlParameterContainer& parameters, TimeStepper& timeStepper ); bool writeEpilog( ostream& str ); diff --git a/tests/benchmarks/matrix-solvers-benchmark.h b/tests/benchmarks/matrix-solvers-benchmark.h index 44c8819e16120e5c708debaf611572c38853b7e9..7eeb9d8dec7c91a37ebf10efd2b37492b0fae25f 100644 --- a/tests/benchmarks/matrix-solvers-benchmark.h +++ b/tests/benchmarks/matrix-solvers-benchmark.h @@ -24,7 +24,7 @@ #include <config/tnlConfigDescription.h> #include <config/tnlParameterContainer.h> #include <matrix/tnlCSRMatrix.h> -#include <solvers/tnlSimpleIterativeSolverMonitor.h> +#include <solvers/tnlIterativeSolverMonitor.h> #include <solvers/linear/stationary/tnlSORSolver.h> #include <solvers/linear/krylov/tnlCGSolver.h> #include <solvers/linear/krylov/tnlBICGStabSolver.h> @@ -79,8 +79,7 @@ bool benchmarkSolver( const tnlParameterContainer& parameters, solver. setMaxIterations( maxIterations ); solver. setMaxResidue( maxResidue ); solver. setMinResidue( 1.0e9 ); - tnlSimpleIterativeSolverMonitor< RealType, IndexType > solverMonitor; - solverMonitor. setSolver( solver ); + tnlIterativeSolverMonitor< RealType, IndexType > solverMonitor; solver. setSolverMonitor( solverMonitor ); solver. setRefreshRate( 10 ); solverMonitor. resetTimers();