[petsc-users] understanding gmres output

Matthew Knepley knepley at gmail.com
Tue May 1 07:13:22 CDT 2018


On Tue, May 1, 2018 at 7:15 AM, Ganesh Diwan <gcdiwan at gmail.com> wrote:

> You may/likely won't get the same convergence with Matlab not due to GMRES
>> but due to differences in the ILU in Matlab and PETSc. Better to run with
>> Jacobi or no preconditioner if you wish to get consistent results.
>
>
> Not sure how to specify 'no' preconditioner
>

-pc_type none


> but I tried ksp.setOperators(A,Id) where Id is the nxn identity matrix and
> this gave me consistent results with Matlab.
>
> I am working on the Helmholtz problems with finite elements
>

Notoriously difficult. For example
https://www.unige.ch/~gander/Preprints/HelmholtzReview.pdf


> and I use a preconditioning matrix which is supposed to help with the
> GMRES convergence. From the options set in the code in my previous post, I
> believe PETSc will compute the norm of preconditioned residual (default for
> left preconditioning) and use it as the stopping criterion. From the
> Matlab documentation, I understand that it will use the norm of the
> preconditioned residual (same as PETSc). Despite using the same
> parameters (number of restarts, maximum iterations, tolerance and the same
> preconditioning matrix), I see PETSc and Matlab diverge in terms of the
> GMRES iterations as I refine my finite element mesh (I get consistent
> results only up to a certain mesh refinement level). Could you comment?
>

The problem becomes more ill-conditioned as you refine, and thus more
sensitive to small numerical errors such
as round-off. This sensitivity results in different answers when equivalent
computations are done in a different order.
Moreover, its possible that PETSc and Matlab for using different
orthogonalization routines. Classical Gram-Schmidt,
modified Gram-Schmidt, and Householder will likely give different answers.

  Thanks,

     Matt


>
>  Thank you, Ganesh
>
> On Thu, Apr 26, 2018 at 7:24 PM, Smith, Barry F. <bsmith at mcs.anl.gov>
> wrote:
>
>>
>> *  You may/likely won't get the same convergence with Matlab not due to
>> GMRES but due to differences in the ILU in Matlab and PETSc. Better to run
>> with Jacobi or no preconditioner if you wish to get consistent results.
>>
>> *   Check carefully if Matlab using left or right preconditioning for
>> GMRES (PETSc uses left by default).
>>
>> > I see that the residual < norm(b)*rtol for the 4th iteration itself, I
>> am not sure then why GMRES continues for one more iteration.
>>
>> * Since PETSc is using left preconditioning it is norm(B*b)*rtol that
>> determines the convergence, not norm(b)*rtol. Where B is application of
>> preconditioner.
>>
>> * The residual history for GMRES includes everything through any restarts
>> so if it takes 90 total iterations (and the restart is 30) the residual
>> history should have 90 values.
>>
>> > In the above specific example, it took GMRES a total of 5 iterations to
>> converge. Does it mean the convergence was achieved without having to
>> restart?
>>
>>   In most cases if you need to restart then you need a better
>> preconditioner.
>>
>>
>>    Barry
>>
>>
>>
>>
>> > On Apr 26, 2018, at 9:46 AM, Ganesh Diwan <gcdiwan at gmail.com> wrote:
>> >
>> > Dear Petsc developers,
>> >
>> > I am trying to learn to use PETSc GMRES with petsc4py and also trying
>> to follow the codes in petsc/src/ksp/ksp/examples/tutorials. Here is the
>> Python code I use to read a linear system and solve it with GMRES in PETSc
>> (petsc4py)
>> >
>> > # gmrestest.py
>> > # usual imports
>> > import numpy as np
>> > import scipy.io as sio
>> > import scipy
>> > from sys import getrefcount
>> > from petsc4py import PETSc
>> >
>> > # read the matrix data
>> > mat_contents = sio.loadmat('data.mat')
>> > mat_A = mat_contents['A']
>> > vec_b = mat_contents['b']
>> > n = mat_contents['n']
>> > vec_x = mat_contents['x']
>> > mat_nnzA = mat_contents['nnzA']
>> >
>> > # form the petsc matrices
>> > x = PETSc.Vec().createWithArray(vec_x)
>> > b = PETSc.Vec().createWithArray(vec_b)
>> > p1=mat_A.indptr
>> > p2=mat_A.indices
>> > p3=mat_A.data
>> > A = PETSc.Mat().createAIJ(size=mat_A.shape,csr=(p1,p2,p3))
>> > A = scipy.transpose(A) # transpose the csr format as my matrix is
>> column major originally
>> > A.assemblyBegin()
>> > A.assemblyEnd()
>> >
>> > # solve
>> > ksp = PETSc.KSP()
>> > ksp.create(PETSc.COMM_WORLD)
>> > ksp.setType('gmres')
>> > ksp.setOperators(A)
>> > ksp.setFromOptions()
>> > rtol = 1e-4
>> > ksp.setTolerances(rtol, 1e-5, 10000., 10000)
>> > ksp.view()
>> > ksp.setConvergenceHistory()
>> > ksp.solve(b, x)
>> >
>> > # print
>> > print 'iterations = ', ksp.getIterationNumber()
>> > print 'residual = ', '{:.2e}'.format(ksp.getResidualNorm())#  %.2E
>> ksp.getResidualNorm()
>> > print 'norm(b)*rtol =  ', '{:.2e}'.format(PETSc.Vec.norm(b)*rtol)#
>> %.2E PETSc.Vec.norm(b)*rtol
>> > print 'converge reason# = ', ksp.getConvergedReason()
>> > print 'residuals at each iter = ', ksp.getConvergenceHistory()
>> > #
>> >
>> > Here is the output from the above code for a linear system of dimension
>> 100 by 100.
>> >
>> >
>> > KSP Object: 1 MPI processes
>> >   type: gmres
>> >     restart=30, using Classical (unmodified) Gram-Schmidt
>> Orthogonalization with no iterative refinement
>> >     happy breakdown tolerance 1e-30
>> >   maximum iterations=10000, initial guess is zero
>> >   tolerances:  relative=0.0001, absolute=1e-05, divergence=10000.
>> >   left preconditioning
>> >   using DEFAULT norm type for convergence test
>> > PC Object: 1 MPI processes
>> >   type: ilu
>> >   PC has not been set up so information may be incomplete
>> >     out-of-place factorization
>> >     0 levels of fill
>> >     tolerance for zero pivot 2.22045e-14
>> >     matrix ordering: natural
>> >   linear system matrix = precond matrix:
>> >   Mat Object: 1 MPI processes
>> >     type: seqaij
>> >     rows=100, cols=100
>> >     total: nonzeros=2704, allocated nonzeros=2704
>> >     total number of mallocs used during MatSetValues calls =0
>> >       using I-node routines: found 25 nodes, limit used is 5
>> > iterations =  5
>> > residual =  1.38e-03
>> > norm(b)*rtol =   1.99e-01
>> > converge reason# =  2
>> > residuals at each iter =  [  2.05677686e+01   4.97916031e+00
>>  4.82888782e-01   1.16849581e-01
>> >    8.87159777e-03   1.37992327e-03]
>> >
>> > Sorry if this sounds stupid, but I am trying to understand the output
>> from PETSc by contrasting it with Matlab GMRES.
>> > I see that the residual < norm(b)*rtol for the 4th iteration itself, I
>> am not sure then why GMRES continues for one more iteration. Secondly, how
>> does one get total number of iterations? For eg. let's say if it takes 3
>> outer iterations each with the default restart of 30, then one would expect
>> the length of residual vector to be 150. In the above specific example, it
>> took GMRES a total of 5 iterations to converge. Does it mean the
>> convergence was achieved without having to restart?
>> >
>> > Thank you, Ganesh
>>
>>
>


-- 
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

https://www.cse.buffalo.edu/~knepley/ <http://www.caam.rice.edu/~mk51/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180501/ecf4a824/attachment-0001.html>


More information about the petsc-users mailing list