Skip to content
Snippets Groups Projects
Commit f6c17b65 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Added option to save the residual history in IterativeSolver

parent c380eb13
No related branches found
No related tags found
1 merge request!47Linear solvers
...@@ -88,6 +88,10 @@ protected: ...@@ -88,6 +88,10 @@ protected:
SolverMonitor* solverMonitor = nullptr; SolverMonitor* solverMonitor = nullptr;
Index refreshRate = 1; Index refreshRate = 1;
String residualHistoryFileName = "";
std::ofstream residualHistoryFile;
}; };
} // namespace Solvers } // namespace Solvers
......
...@@ -33,6 +33,8 @@ configSetup( Config::ConfigDescription& config, ...@@ -33,6 +33,8 @@ configSetup( Config::ConfigDescription& config,
config.addEntry< double >( prefix + "divergence-residue", "Divergence occurs when the residue exceeds given limit.", std::numeric_limits< float >::max() ); config.addEntry< double >( prefix + "divergence-residue", "Divergence occurs when the residue exceeds given limit.", std::numeric_limits< float >::max() );
// TODO: setting refresh rate should be done in SolverStarter::setup (it's not a parameter of the IterativeSolver) // TODO: setting refresh rate should be done in SolverStarter::setup (it's not a parameter of the IterativeSolver)
config.addEntry< int > ( prefix + "refresh-rate", "Number of iterations between solver monitor refreshes.", 1 ); config.addEntry< int > ( prefix + "refresh-rate", "Number of iterations between solver monitor refreshes.", 1 );
config.addEntry< String >( prefix + "residual-history-file", "Path to the file where the residual history will be saved.", "" );
} }
template< typename Real, typename Index, typename SolverMonitor > template< typename Real, typename Index, typename SolverMonitor >
...@@ -41,12 +43,15 @@ IterativeSolver< Real, Index, SolverMonitor >:: ...@@ -41,12 +43,15 @@ IterativeSolver< Real, Index, SolverMonitor >::
setup( const Config::ParameterContainer& parameters, setup( const Config::ParameterContainer& parameters,
const String& prefix ) const String& prefix )
{ {
this->setMaxIterations( parameters.getParameter< int >( "max-iterations" ) ); this->setMaxIterations( parameters.getParameter< int >( prefix + "max-iterations" ) );
this->setMinIterations( parameters.getParameter< int >( "min-iterations" ) ); this->setMinIterations( parameters.getParameter< int >( prefix + "min-iterations" ) );
this->setConvergenceResidue( parameters.getParameter< double >( "convergence-residue" ) ); this->setConvergenceResidue( parameters.getParameter< double >( prefix + "convergence-residue" ) );
this->setDivergenceResidue( parameters.getParameter< double >( "divergence-residue" ) ); this->setDivergenceResidue( parameters.getParameter< double >( prefix + "divergence-residue" ) );
// TODO: setting refresh rate should be done in SolverStarter::setup (it's not a parameter of the IterativeSolver) // TODO: setting refresh rate should be done in SolverStarter::setup (it's not a parameter of the IterativeSolver)
this->setRefreshRate( parameters.getParameter< int >( "refresh-rate" ) ); this->setRefreshRate( parameters.getParameter< int >( prefix + "refresh-rate" ) );
this->residualHistoryFileName = parameters.getParameter< String >( prefix + "residual-history-file" );
if( this->residualHistoryFileName )
this->residualHistoryFile.open( this->residualHistoryFileName.getString() );
return true; return true;
} }
...@@ -199,6 +204,11 @@ setResidue( const Real& residue ) ...@@ -199,6 +204,11 @@ setResidue( const Real& residue )
this->currentResidue = residue; this->currentResidue = residue;
if( this->solverMonitor ) if( this->solverMonitor )
this->solverMonitor->setResidue( this->getResidue() ); this->solverMonitor->setResidue( this->getResidue() );
if( this->residualHistoryFile ) {
if( this->getIterations() == 0 )
this->residualHistoryFile << "\n";
this->residualHistoryFile << this->getIterations() << "\t" << std::scientific << residue << std::endl;
}
} }
template< typename Real, typename Index, typename SolverMonitor > template< typename Real, typename Index, typename SolverMonitor >
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment