// Copyright (C) 2003-2009 Marc Duruflé
//
// This file is part of the linear-algebra library Seldon,
// http://seldon.sourceforge.net/.
//
// Seldon is free software; you can redistribute it and/or modify it under the
// terms of the GNU Lesser General Public License as published by the Free
// Software Foundation; either version 2.1 of the License, or (at your option)
// any later version.
//
// Seldon is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
// more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with Seldon. If not, see http://www.gnu.org/licenses/.


#ifndef SELDON_FILE_ITERATIVE_HXX

namespace Seldon
{
 
//! Base class for preconditioners
 
class Preconditioner_Base
 
{
 
public :
   
   
Preconditioner_Base();
   
   
// solving M z = r
   
template<class Matrix1, class Vector1>
   
void Solve(const Matrix1& A, const Vector1 & r, Vector1 & z);
   
   
// solving M^t z = r
   
template<class Matrix1, class Vector1>
   
void TransSolve(const Matrix1& A, const Vector1& r, Vector1 & z);
   
 
};
 
 
 
//! Class containing parameters for an iterative resolution
 
/*!
    Titer is the precision (float or double), the solved
    linear system can be real or complex
  */

 
template<class Titer>
 
class Iteration
 
{
 
protected :
   
Titer tolerance; //!< stopping criterion
   
Titer facteur_reste; //!< inverse of norm of first residual
   
int max_iter; //!< maximum number of iterations
   
int nb_iter; //!< number of iterations
   
int error_code; //!< error code returned by iterative solver
   
bool fail_convergence; //!< true if the iterative solver has converged
   
//! print level
   
/*!
      0 -> no display
      1 -> displays residual after each 100 iterations
      6 -> displays residual after each iteration
    */

   
int print_level;
   
bool init_guess_null; //!< true if initial guess is null
   
int type_solver; //!< iterative solver used
   
int parameter_restart; //!< restart parameter (for Gmres and Gcr)
   
int type_preconditioning; //!< preconditioner used
   
 
public :
   
   
Iteration();
   
Iteration(int max_iteration, const Titer& tol);
   
Iteration(const Iteration<Titer>& outer);
   
   
int GetTypeSolver() const;
   
int GetRestart() const;
   
Titer GetFactor() const;
   
Titer GetTolerance() const;
   
int GetNumberIteration() const;
   
   
void SetSolver(int type_resolution, int param_restart, int type_prec);
   
void SetRestart(int m);
   
void SetTolerance(Titer stopping_criterion);
   
void SetMaxNumberIteration(int max_iteration);
   
void SetNumberIteration(int nb);
   
   
void ShowMessages();
   
void ShowFullHistory();
   
void HideMessages();
   
   
template<class Vector1>
   
int Init(const Vector1& r);
   
bool First() const;

   
bool IsInitGuess_Null() const;
   
void SetInitGuess(bool type) { init_guess_null = type; }

   
template<class Vector1>
   
bool Finished(const Vector1& r) const;
   
bool Finished(const Titer& r) const;
   
   
void Fail(int i, const string& s);
   
   
Iteration& operator ++ (void);
   
   
int ErrorCode() const;
   
 
};
 
} // end namespace

#define SELDON_FILE_ITERATIVE_HXX
#endif