Barry Smith bsmith at
Wed Mar 18 12:27:35 CDT 2009

    The shift nonzero causes a c*I to be added to the matrix, so  
rather than solving A x = b it solves (A + c*I) z = b so, of course, z  
is not generally going to be the same as x.
If you use a shift you do not want to use preonly as the KSP method  
you should use something like GMRES. Also to get an accurate answer  
use something like -ksp_rtol 1.e-12

     Matlab and Lapack are doing column pivoting in the factorization  
to avoid the zero pivot. PETSc's sparse factorization does not have  
this functionality which is why it generated a zero pivot.


On Mar 18, 2009, at 11:32 AM, Waad Subber wrote:

> Hi,
> I am trying to do LU factorization to an ill-conditioned system.  
> PETSc gives me "Detected zero pivot in LU factorization". The  
> problem is solved when I use PCFactorSetShiftNonzero.
> Just to be sure, I used Matlab and Lapack(DGETRF) to do the  
> factorization. They did it without any complain and they gave me the  
> same answer. However, the answer I got from PETSc is completely  
> different.
> In PETSc I did the following:
>       call KSPCreate(PETSC_COMM_SELF,ksp1,ierr)
>       call  
>       call KSPSetType(ksp1,KSPPREONLY,ierr)
>       call KSPGetPC(ksp1,prec1,ierr)
>       call PCSetType(prec1,PCLU,ierr)
>       call PCFactorSetShiftNonzero(prec1,PETSC_DECIDE,IERR)
>       call KSPSetFromOptions(ksp1,ierr)
>       call KSPSetUp(ksp1,ierr)
> Any idea why PETSc gives different answer than Matlab and Lapack  
> routine (DGETRF).
> Thanks
> Waad

More information about the petsc-users mailing list