[petsc-users] [petsc-3.2] LSQR new convergence test
Barry Smith
bsmith at mcs.anl.gov
Thu Sep 22 08:26:56 CDT 2011
On Sep 22, 2011, at 7:54 AM, Satish Balay wrote:
> Loks like Barry sent you the wrong file. zitfuncf90.c belongs to
> src/ksp/ksp/interface/f90-custom [and is unchanged]
Yes, sorry that was my fault.
Barry
>
> Try the attached patch
>
> cd petsc-3.2-p2
> patch -Np1 < ksp-conv.patch
>
> Satish
>
> On Thu, 22 Sep 2011, Alexander Grayver wrote:
>
>> Barry,
>>
>> Unfortunately, the problem is still there. Even though I put zitfuncf90.c into
>> src/ksp/ksp/interface/ftn-custom, modified makefile there and made
>> configure/make from scratch.
>> When are you going to release new patch?
>>
>> Regards,
>> Alexander
>>
>> On 21.09.2011 21:58, Barry Smith wrote:
>>> Alexander,
>>>
>>> Yes, a problem with trying to handle C pointers on the Fortran side. It
>>> will be fixed in the next patch release. You can drop the attached file into
>>> src/ksp/ksp/interface/ftn-custom run make in that directory and then relink
>>> your program and it should work.
>>>
>>> Barry
>>> [see attached file: zitfuncf90.c]
>>> On Sep 21, 2011, at 11:00 AM, Alexander Grayver wrote:
>>>
>>>> Barry,
>>>>
>>>> I think the error is related to this
>>>>
>>>> PetscFortranAddr cctx
>>>>
>>>> definition. Speaking in terms of C++ notation, it seems that PETSc
>>>> takes&cctx as KSPDefaultConvergedCtx, however real KSPDefaultConvergedCtx
>>>> is *cctx.
>>>> Not sure if I'm clear now, but it's easy to see if you trace code like
>>>> that:
>>>>
>>>> PetscFortranAddr cctx
>>>> KSP ksp
>>>>
>>>> call KSPCreate(MPI_COMM_WORLD,ksp,ierr)
>>>> call KSPSetType(ksp,KSPLSQR,ierr)
>>>> call KSPDefaultConvergedCreate(cctx,ierr)
>>>> call
>>>> KSPSetConvergenceTest(ksp,KSPDefaultConverged,cctx,PETSC_NULL_FUNCTION,ierr)
>>>> call KSPDestroy(ksp,ierr)
>>>>
>>>> I guess the error should be reproducible from the code above.
>>>>
>>>> Regards,
>>>> Alexander
>>>>
>>>> On 21.09.2011 17:17, Alexander Grayver wrote:
>>>>> Thanks Barry, I added your code and solver works well now, but when I
>>>>> call KSPDestroy afterward it crashes:
>>>>>
>>>>> [8]PETSC ERROR: --------------------- Error Message
>>>>> ------------------------------------
>>>>> [8]PETSC ERROR: Invalid argument!
>>>>> [8]PETSC ERROR: Wrong type of object: Parameter # 1!
>>>>> [8]PETSC ERROR:
>>>>> ------------------------------------------------------------------------
>>>>> [8]PETSC ERROR: Petsc Release Version 3.2.0, Patch 2, Fri Sep 16
>>>>> 10:10:45 CDT 2011
>>>>> [8]PETSC ERROR: See docs/changes/index.html for recent updates.
>>>>> [8]PETSC ERROR: See docs/faq.html for hints about trouble shooting.
>>>>> [8]PETSC ERROR: See docs/index.html for manual pages.
>>>>> [8]PETSC ERROR:
>>>>> ------------------------------------------------------------------------
>>>>> [8]PETSC ERROR: /home/test on a openmpi-i named node226 by user Wed Sep
>>>>> 21 17:01:23 2011
>>>>> [8]PETSC ERROR: Libraries linked from
>>>>> /home/lib/petsc-3.2-p2/openmpi-intel-complex-debug-f/lib
>>>>> [8]PETSC ERROR: Configure run at Tue Sep 20 09:28:29 2011
>>>>> [8]PETSC ERROR: Configure options
>>>>> --with-petsc-arch=openmpi-intel-complex-debug-f
>>>>> --with-fortran-interfaces=1 --with-mpi-dir=/opt/mpi/intel/openmpi-1.4.2
>>>>> --with-scalar-type=complex
>>>>> --with-blas-lapack-dir=/opt/intel/Compiler/11.1/072/mkl/lib/em64t
>>>>> --with-precision=double --with-x=0
>>>>> [8]PETSC ERROR:
>>>>> ------------------------------------------------------------------------
>>>>> [8]PETSC ERROR: VecDestroy() line 566 in
>>>>> /home/lib/petsc-3.2-p2/src/vec/vec/interface/vector.c
>>>>> [8]PETSC ERROR: KSPDefaultConvergedDestroy() line 669 in
>>>>> /home/lib/petsc-3.2-p2/src/ksp/ksp/interface/iterativ.c
>>>>> [8]PETSC ERROR: KSPDestroy() line 758 in
>>>>> /home/lib/petsc-3.2-p2/src/ksp/ksp/interface/itfunc.c
>>>>>
>>>>> Is it my fault?
>>>>>
>>>>> Regards,
>>>>> Alexander
>>>>>
>>>>> On 21.09.2011 15:36, Barry Smith wrote:
>>>>>> On Sep 21, 2011, at 2:39 AM, Alexander Grayver wrote:
>>>>>>
>>>>>>> Hong, Barry,
>>>>>>>
>>>>>>> Thanks! Sorry for not to be clear, but Barry right, my question was
>>>>>>> how to get back to DefaultConvergenceTest in case of LSQR solver.
>>>>>>>
>>>>>>> Barry, yes, both versions give the same two norms.
>>>>>>>
>>>>>>> Can you clarify please how to implement that in Fortran:
>>>>>>> void *cctx;
>>>>>>> KSPDefaultConvergedCreate(&cctx);
>>>>>>> KSPSetConvergenceTest(ksp,KSPDefaultConverged,cctx);
>>>>>> It should be almost the same
>>>>>>
>>>>>> PetscFortranAddr cctx
>>>>>>
>>>>>> call KSPDefaultConvergedCreate(cctx,ierr)
>>>>>> call
>>>>>> KSPSetConvergenceTest(ksp,KSPDefaultConverged,cctx,PETSC_NULL_FUNCTION,ierr)
>>>>>>
>>>>>> Barry
>>>>>>
>>>>>>
>>>>>>> I'm a little bit confused about cctx parameter.
>>>>>>>
>>>>>>> Regards,
>>>>>>> Alexander
>>>>>>>
>>>>>>>
>>>>>>> On 21.09.2011 01:10, Barry Smith wrote:
>>>>>>>> It has its own monitor that provides additional information
>>>>>>>> -ksp_monitor_lsqr
>>>>>>>>
>>>>>>>> You can also remove the new convergence test and get back the old
>>>>>>>> one with code like
>>>>>>>>
>>>>>>>> void *cctx;
>>>>>>>> KSPDefaultConvergedCreate(&cctx);
>>>>>>>> KSPSetConvergenceTest(ksp,KSPDefaultConverged,cctx);
>>>>>>>>
>>>>>>>> after the KSPType is set to LSQR. So if you are happy with the old
>>>>>>>> test.
>>>>>>>>
>>>>>>>>
>>>>>>>> Do both versions give the same first two norms?
>>>>>>>>
>>>>>>>>> 0 KSP Residual norm 9.386670021557e-17
>>>>>>>>> 1 KSP Residual norm 8.258308650175e-17
>>>>>>>> Barry
>>>>>>>>
>>>>>>>>
>>>>>>>> On Sep 20, 2011, at 4:40 AM, Alexander Grayver wrote:
>>>>>>>>
>>>>>>>>> Hello,
>>>>>>>>>
>>>>>>>>> In comparison with petsc-3.1-p7 in the latest petsc LSQR solver
>>>>>>>>> behaves differently.
>>>>>>>>>
>>>>>>>>> In petsc31 I had:
>>>>>>>>>
>>>>>>>>> 0 KSP Residual norm 9.386670021557e-17
>>>>>>>>> ...
>>>>>>>>> 95 KSP Residual norm 9.341367317075e-18
>>>>>>>>> Linear solve converged due to CONVERGED_RTOL iterations 95
>>>>>>>>> KSP Object:
>>>>>>>>> type: lsqr
>>>>>>>>> maximum iterations=200, initial guess is zero
>>>>>>>>> tolerances: relative=0.1, absolute=1e-50, divergence=10000
>>>>>>>>> left preconditioning
>>>>>>>>> using PRECONDITIONED norm type for convergence test
>>>>>>>>> PC Object:
>>>>>>>>> type: none
>>>>>>>>> linear system matrix = precond matrix:
>>>>>>>>> Matrix Object:
>>>>>>>>> type=shell, rows=19584, cols=19584
>>>>>>>>>
>>>>>>>>> relative residual norm = 0.9951737192872134E-01
>>>>>>>>>
>>>>>>>>> Now, with petsc32 I have:
>>>>>>>>>
>>>>>>>>> 0 KSP Residual norm 9.386670021557e-17
>>>>>>>>> 1 KSP Residual norm 8.258308650175e-17
>>>>>>>>> Linear solve converged due to CONVERGED_RTOL_NORMAL iterations 1
>>>>>>>>> KSP Object: 12 MPI processes
>>>>>>>>> type: lsqr
>>>>>>>>> maximum iterations=200, initial guess is zero
>>>>>>>>> tolerances: relative=0.1, absolute=1e-50, divergence=10000
>>>>>>>>> left preconditioning
>>>>>>>>> using UNPRECONDITIONED norm type for convergence test
>>>>>>>>> PC Object: 12 MPI processes
>>>>>>>>> type: none
>>>>>>>>> linear system matrix = precond matrix:
>>>>>>>>> Matrix Object: 12 MPI processes
>>>>>>>>> type: shell
>>>>>>>>> rows=19584, cols=19584
>>>>>>>>> relative residual norm = 0.8797910900468064E+00
>>>>>>>>>
>>>>>>>>> So I found new convergence test here which sets
>>>>>>>>> CONVERGED_RTOL_NORMAL:
>>>>>>>>> http://www.mcs.anl.gov/petsc/petsc-as/snapshots/petsc-current/docs/manualpages/KSP/KSPLSQRDefaultConverged.html
>>>>>>>>>
>>>>>>>>> The question is, how to interpret this new test and make it
>>>>>>>>> works properly for me?
>>>>>>>>> Thanks in advance.
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Alexander
>>
>>
> <ksp-conv.patch>
More information about the petsc-users
mailing list