[petsc-users] KSPGMRES preconditioned with a MATSHELL
Thomas Leissing
thomas.leissing at cstb.fr
Fri Oct 14 06:23:07 CDT 2011
Matt,
Could you send the error message?
Here is the relevant part of the code:
Variables:
solver is my outer solver (KSPFGMRES)
A is the matrix associated with the outer solver (MATSHELL)
b is my RHS vector
x is my solution vector
precond is the outer solver preconditioner (PCKSP)
pcSolver is the inner solver (KSPGMRES)
pA is the matrix associated with the inner solver (preconditioner,
MATSHELL too)
[...]
call KSPCreate(PETSC_COMM_WORLD, solver, pCode)
call KSPGetPC(solver, precond, pCode)
call PCSetType(precond, PCKSP, pCode)
call PCKSPGetKSP(precond, pcSolver, pCode)
call KSPCreate(PETSC_COMM_WORLD, pcSolver, pCode)
call KSPSetType(pcSolver, KSPGMRES, pCode)
call KSPSetOperators(pcSolver, pA, pA, SAME_NONZERO_PATTERN, pcode)
call KSPSetOperators(solver, A, pA, SAME_NONZERO_PATTERN, pcode)
call KSPSetType(solver, KSPFGMRES, pCode)
call KSPSolve(solver, b, x, pCode)
[...]
and the error message is:
[0]PETSC ERROR: --------------------- Error Message
------------------------------------
[0]PETSC ERROR: No support for this operation for this object type!
[0]PETSC ERROR: Matrix format shell does not have a built-in PETSc ILU!
[0]PETSC ERROR:
------------------------------------------------------------------------
[0]PETSC ERROR: Petsc Release Version 3.2.0, Patch 3, Fri Sep 30
10:28:33 CDT 2011
What we normally do is explicitly construct the low-order matrix. Then
you can just pass it as the second Mat argument to
KSPSetOperators(). The PC is built using that Mat, instead of the system
Mat which is a MATSHELL.
Yes, but in my case, and if I understood what you meant, I cannot do
that since my PC Mat is necessarily a MATSHELL...
Thanks,
Thomas
-------- Message initial --------
De: Matthew Knepley <knepley at gmail.com>
Reply-to: PETSc users list <petsc-users at mcs.anl.gov>
À: PETSc users list <petsc-users at mcs.anl.gov>
Sujet: Re: [petsc-users] KSPGMRES preconditioned with a MATSHELL
Date: Fri, 14 Oct 2011 05:26:44 -0500
On Fri, Oct 14, 2011 at 2:42 AM, Thomas Leissing
<thomas.leissing at cstb.fr> wrote:
Dear all,
I need to solve a system of equation Ax = b in which A is a
MatShell object for which I defined a matrix-vector
multiplication routine with MatShellSetOperation. Let's call
this routine MyMatMult. The MyMatMult routine gives me an
approximate matrix vector product, and I'm able to tune the
parameters of MyMatMult so that I can choose a trade-off between
calculation time and accuracy of the product. I successfully
solved this problem with a KSPGMRES solver.
So far so good...
Now I'd like to precondition the system to accelerate the
solving stage. To do this I'd like to use a lower-order (less
accurate but faster) solution of Ax=b.
I tried to do this with a PCKSP type preconditioner, but it
doesn't seem to accept MatShell objects as preconditioning
matrix.
Could you send the error message?
I also tried to use a PCSHELL preconditioner for which the
PCApply routine consists in solving the lower order Ax=b system.
I didn't manage to get this working properly: the outer solver
doesn't converge to the expected rate. Indeed if I use for the
inner loop the same accuracy than for the outer loop, the outer
loop should converge in one iteration, which is not the case...
Is there another way of doing this ?
What we normally do is explicitly construct the low-order matrix. Then
you can just pass it as the second Mat argument to
KSPSetOperators(). The PC is built using that Mat, instead of the system
Mat which is a MATSHELL.
Thanks,
Matt
Any hint ?
Thanks for your help,
Thomas Leissing
--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which
their experiments lead.
-- Norbert Wiener
More information about the petsc-users
mailing list