template<typename Matrix>
class TNL::Solvers::Linear::Preconditioners::Preconditioner< Matrix >
Base class for preconditioners of of iterative solvers of linear systems. 
- Template Parameters
 - 
  
    | Matrix | is type of matrix describing the linear system. | 
  
   
The following example shows how to setup an iterative solver of linear systems with preconditioning:
    1#include <iostream>
    2#include <memory>
    3#include <TNL/Matrices/SparseMatrix.h>
    4#include <TNL/Devices/Host.h>
    5#include <TNL/Devices/Cuda.h>
    6#include <TNL/Solvers/Linear/TFQMR.h>
    7#include <TNL/Solvers/Linear/Preconditioners/Diagonal.h>
    8 
    9template< typename Device >
   10void
   11iterativeLinearSolverExample()
   12{
   13
   14
   15
   16
   17
   18
   19
   20
   21
   24   const int size( 5 );
   26   matrix_ptr->setDimensions( size, size );
   27   matrix_ptr->setRowCapacities( Vector( { 2, 3, 3, 3, 2 } ) );
   28 
   30   {
   31      const int rowIdx = row.getRowIndex();
   32      if( rowIdx == 0 ) {
   33         row.setElement( 0, rowIdx, 2.5 );     
   34         row.setElement( 1, rowIdx + 1, -1 );  
   35      }
   36      else if( rowIdx == size - 1 ) {
   37         row.setElement( 0, rowIdx - 1, -1.0 );  
   38         row.setElement( 1, rowIdx, 2.5 );       
   39      }
   40      else {
   41         row.setElement( 0, rowIdx - 1, -1.0 );  
   42         row.setElement( 1, rowIdx, 2.5 );       
   43         row.setElement( 2, rowIdx + 1, -1.0 );  
   44      }
   45   };
   46 
   47
   48
   49
   50   matrix_ptr->forAllRows( f );
   52 
   53
   54
   55
   56   Vector x( size, 1.0 );
   57   Vector b( size );
   58   matrix_ptr->vectorProduct( x, b );
   59   x = 0.0;
   61 
   62
   63
   64
   68   preconditioner_ptr->update( matrix_ptr );
   69   LinearSolver solver;
   70   solver.setMatrix( matrix_ptr );
   71   solver.setPreconditioner( preconditioner_ptr );
   72   solver.setConvergenceResidue( 1.0e-6 );
   73   solver.solve( b, x );
   75}
   76 
   77int
   78main( int argc, char* argv[] )
   79{
   81   iterativeLinearSolverExample< TNL::Devices::Sequential >();
   82 
   83#ifdef __CUDACC__
   85   iterativeLinearSolverExample< TNL::Devices::Cuda >();
   86#endif
   87}
#define __cuda_callable__
Definition Macros.h:49
 
Vector extends Array with algebraic operations.
Definition Vector.h:36
 
Implementation of sparse matrix, i.e. matrix storing only non-zero elements.
Definition SparseMatrix.h:55
 
Diagonal (Jacobi) preconditioner for iterative solvers of linear systems.
Definition Diagonal.h:21
 
Matrix MatrixType
Type of the matrix representing the linear system.
Definition Preconditioner.h:62
 
Iterative solver of linear systems based on the Transpose-free quasi-minimal residual (TFQMR) method.
Definition TFQMR.h:21
 
The result looks as follows:
Solving linear system on host: 
Row: 0 ->     0:2.5     1:-1  
Row: 1 ->     0:-1      1:2.5     2:-1  
Row: 2 ->     1:-1      2:2.5     3:-1  
Row: 3 ->     2:-1      3:2.5     4:-1  
Row: 4 ->     3:-1      4:2.5 
 
Vector b = [ 1.5, 0.5, 0.5, 0.5, 1.5 ]
Vector x = [ 1, 1, 1, 1, 1 ]
Solving linear system on CUDA device: 
Row: 0 ->     0:2.5     1:-1  
Row: 1 ->     0:-1      1:2.5     2:-1  
Row: 2 ->     1:-1      2:2.5     3:-1  
Row: 3 ->     2:-1      3:2.5     4:-1  
Row: 4 ->     3:-1      4:2.5 
 
Vector b = [ 1.5, 0.5, 0.5, 0.5, 1.5 ]
Vector x = [ 1, 1, 1, 1, 1 ]