[petsc-users] matrix-free preconditionning of FGMRES

Barry Smith bsmith at mcs.anl.gov
Sun Jan 16 19:23:59 CST 2011


  -ksp_type fgmres -pc_type ksp -ksp_ksp_type gmres -ksp_pc_type none 

   But this is just nesting unpreconditioned GMRES inside FGMRES. It is trivial to do but I doubt that it buys you anything over just

 -ksp_type gmres -pc_type none

  Barry


On Jan 16, 2011, at 7:05 PM, Darcoux Christine wrote:

> 2011/1/16 Barry Smith <bsmith at mcs.anl.gov>
> 
> On Jan 16, 2011, at 5:59 PM, Darcoux Christine wrote:
> 
> > I am new to PETSc and I am interested to use the nonlinear solver in a CFD code for low speed compressible fluid.
> >
> > According to some papers, it seems that GMRES (or any other Krylov method) could be used to precondition FGMRES in a way that is completely matrix-free. Is it something possible with the fgmres implementation provided by PETSc ?
> 
>   Yes, but like anything with "matrix-free" is the question how you provide a decent preconditioner without forming any matrices. If you can do that then you are all set.
> 
>  KSPSetOperators(ksp,A,B,...)   or SNESSetJacobian(snes,A,B, ....)  where A is a a MATSHELL that does matrix vector products or use MatCreateMFFD()
> 
> -ksp_type fgmres -pc_type ksp -ksp_ksp_type gmres  -ksp_view
> 
>  If B is some approximate representation of A then B will be used to construct the preconditioner, if you never have a matrix-representation but have a function/subroutine that is supposedly a good preconditioner then you would use PCSHELL to provide it. So there are several possibilities depending on what you have and what you want to do.
> 
>  Barry
> 
> > Christine
> >
> 
> 
> Thank you for the detailled explanations. My idea is to simply precondition fGMRES with GMRES to avoid creating a B that is an approximate representation of A. If A is represented by a mat-vec routine, I think that the preconditionner M (approximation of the inverse of A) could be defined by the action of GMRES. Here's a code pseudo-code showing how I would like to define such an M. 
> 
> 1. Define matrix A as a mat-vec operation (matrix free), right-hand-side b and x0 a zero vector 
> 2. The tricky part is now to define M by a mat-vec function like this
> 
> function precon_matvec(x) { 
>     //Basically, GMRES approximates inverse(A) with a polynomial 
>     // P(A) so that x = x0 + P(A)*r, where r is the residual.  Thus in the 
>     // call to GMRES, x0 is a zero vector and the right-hand-side is x. 
>     return gmres(A, x, x0, tolerance=gmres_tol, maxiter=10) 
> }
> 
> M = CreateMatrixFreePreconditionne
> r (precon_matvec)
> 
> 3. Now call fGMRES with the above M preconditionner
> 
> Is it possible to acheive something like this with PETSc ?
> 
> Cheers,
> 
> Christine
> 



More information about the petsc-users mailing list