Commit 70623718 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Refactored parameters for linear solvers

Fixes #93
parent fdafec9f
Loading
Loading
Loading
Loading
+28 −18
Original line number Diff line number Diff line
@@ -23,17 +23,20 @@ IterativeSolver< Real, Index, SolverMonitor >::
configSetup( Config::ConfigDescription& config,
             const String& prefix )
{
   if( config.getEntry( prefix + "max-iterations" ) == nullptr )
      config.addEntry< int >   ( prefix + "max-iterations", "Maximal number of iterations the solver may perform.", 1000000000 );
   if( config.getEntry( prefix + "min-iterations" ) == nullptr )
      config.addEntry< int >   ( prefix + "min-iterations", "Minimal number of iterations the solver must perform.", 0 );

   // The default value for the convergence residue MUST be zero since not in all problems we want to stop the solver
   // when we reach a state near a steady state. This can be only temporary if, for example, when the boundary conditions
   // are time dependent (growing velocity at inlet starting from 0).
   config.addEntry< double >( prefix + "convergence-residue", "Convergence occurs when the residue drops bellow this limit.", 0.0 );
   if( config.getEntry( prefix + "convergence-residue" ) == nullptr )
      config.addEntry< double >( prefix + "convergence-residue", "Convergence occurs when the residue drops bellow this limit.", 1e-6 );
   if( config.getEntry( prefix + "divergence-residue" ) == nullptr )
      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)
   if( config.getEntry( prefix + "refresh-rate" ) == nullptr )
      config.addEntry< int >   ( prefix + "refresh-rate", "Number of milliseconds between solver monitor refreshes.", 500 );

   if( config.getEntry( prefix + "residual-history-file" ) == nullptr )
      config.addEntry< String >( prefix + "residual-history-file", "Path to the file where the residual history will be saved.", "" );
}

@@ -43,15 +46,22 @@ IterativeSolver< Real, Index, SolverMonitor >::
setup( const Config::ParameterContainer& parameters,
       const String& prefix )
{
   if( parameters.checkParameter( prefix + "max-iterations" ) )
      this->setMaxIterations( parameters.getParameter< int >( prefix + "max-iterations" ) );
   if( parameters.checkParameter( prefix + "min-iterations" ) )
      this->setMinIterations( parameters.getParameter< int >( prefix + "min-iterations" ) );
   if( parameters.checkParameter( prefix + "convergence-residue" ) )
      this->setConvergenceResidue( parameters.getParameter< double >( prefix + "convergence-residue" ) );
   if( parameters.checkParameter( prefix + "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)
   if( parameters.checkParameter( prefix + "refresh-rate" ) )
      this->setRefreshRate( parameters.getParameter< int >( prefix + "refresh-rate" ) );
   if( parameters.checkParameter( prefix + "residual-history-file" ) ) {
      this->residualHistoryFileName = parameters.getParameter< String >( prefix + "residual-history-file" );
      if( this->residualHistoryFileName )
         this->residualHistoryFile.open( this->residualHistoryFileName.getString() );
   }
   return true;
}

+3 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ BICGStab< Matrix >::
configSetup( Config::ConfigDescription& config,
             const String& prefix )
{
   LinearSolver< Matrix >::configSetup( config, prefix );
   config.addEntry< bool >( prefix + "bicgstab-exact-residue", "Whether the BiCGstab should compute the exact residue in each step (true) or to use a cheap approximation (false).", false );
}

@@ -33,6 +34,7 @@ BICGStab< Matrix >::
setup( const Config::ParameterContainer& parameters,
       const String& prefix )
{
   if( parameters.checkParameter( prefix + "bicgstab-exact-residue" ) )
      exact_residue = parameters.getParameter< bool >( "bicgstab-exact-residue" );
   return LinearSolver< Matrix >::setup( parameters, prefix );
}
+5 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ BICGStabL< Matrix >::
configSetup( Config::ConfigDescription& config,
             const String& prefix )
{
   LinearSolver< Matrix >::configSetup( config, prefix );
   config.addEntry< int >( prefix + "bicgstab-ell", "Number of Bi-CG iterations before the MR part starts.", 1 );
   config.addEntry< bool >( prefix + "bicgstab-exact-residue", "Whether the BiCGstab should compute the exact residue in each step (true) or to use a cheap approximation (false).", false );
}
@@ -36,7 +37,9 @@ BICGStabL< Matrix >::
setup( const Config::ParameterContainer& parameters,
       const String& prefix )
{
   if( parameters.checkParameter( prefix + "bicgstab-ell" ) )
      ell = parameters.getParameter< int >( "bicgstab-ell" );
   if( parameters.checkParameter( prefix + "bicgstab-exact-residue" ) )
      exact_residue = parameters.getParameter< bool >( "bicgstab-exact-residue" );
   return LinearSolver< Matrix >::setup( parameters, prefix );
}
+24 −17
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ GMRES< Matrix >::
configSetup( Config::ConfigDescription& config,
             const String& prefix )
{
   LinearSolver< Matrix >::configSetup( config, prefix );
   config.addEntry< String >( prefix + "gmres-variant", "Minimal number of iterations after which the GMRES restarts.", "CWY" );
      config.addEntryEnum( "CGS" );
      config.addEntryEnum( "CGSR" );
@@ -48,6 +49,7 @@ GMRES< Matrix >::
setup( const Config::ParameterContainer& parameters,
       const String& prefix )
{
   if( parameters.checkParameter( prefix + "gmres-variant" ) ) {
      const String var = parameters.getParameter< String >( prefix + "gmres-variant" );
      if( var == "CGS" )
         variant = Variant::CGS;
@@ -61,10 +63,15 @@ setup( const Config::ParameterContainer& parameters,
         variant = Variant::CWY;
      else
         return false;
   }

   if( parameters.checkParameter( prefix + "gmres-restarting-min" ) )
      restarting_min = parameters.getParameter< int >( prefix + "gmres-restarting-min" );
   if( parameters.checkParameter( prefix + "gmres-restarting-max" ) )
      restarting_max = parameters.getParameter< int >( prefix + "gmres-restarting-max" );
   if( parameters.checkParameter( prefix + "gmres-restarting-step-min" ) )
      restarting_step_min = parameters.getParameter< int >( prefix + "gmres-restarting-step-min" );
   if( parameters.checkParameter( prefix + "gmres-restarting-step-max" ) )
      restarting_step_max = parameters.getParameter< int >( prefix + "gmres-restarting-step-max" );

   return LinearSolver< Matrix >::setup( parameters, prefix );
+3 −1
Original line number Diff line number Diff line
@@ -32,12 +32,14 @@ public:
   static void configSetup( Config::ConfigDescription& config,
                            const String& prefix = "" )
   {
      LinearSolver< Matrix >::configSetup( config, prefix );
      config.addEntry< double >( prefix + "jacobi-omega", "Relaxation parameter of the weighted/damped Jacobi method.", 1.0 );
   }

   bool setup( const Config::ParameterContainer& parameters,
               const String& prefix = "" ) override
   {
      if( parameters.checkParameter( prefix + "jacobi-omega" ) )
         this->setOmega( parameters.getParameter< double >( prefix + "jacobi-omega" ) );
      if( this->omega <= 0.0 || this->omega > 2.0 )
      {
Loading