[petsc-users] Call KSPConvergedDefault from Fortran

Natacha BEREUX natacha.bereux at gmail.com
Thu Oct 22 04:24:48 CDT 2015


Thanks a lot Barry : it works perfectly for me !
Best regards
Natacha


On Tue, Oct 20, 2015 at 8:25 PM, Barry Smith <bsmith at mcs.anl.gov> wrote:

>
>    It will be very similar to usage from C. You should be able to do
> something like
>
>    PetscFortranAddress ctx
>
>    call KSPConvergedDefaultCreate(ctx,ierr)
>
>    call KSPMonitorSet(ksp,
> MyKSPConverged,ctx,kspconvergeddefaultdestroy,ierr)
>
>    then in your MyKSPConverged pass the argument called "dummy" to the
> default monitor.
>
>   Barry
>
>
>
>
>
> > On Oct 20, 2015, at 3:36 AM, Natacha BEREUX <natacha.bereux at gmail.com>
> wrote:
> >
> > Dear PETSc users,
> >
> >
> > I am using PETSc  Fortran API.
> > I try to solve a linear system, and would like to define my own
> convergence test.
> > More precisely, my convergence test calls the default convergence test
> > and then checks the true residual norm :
> >      subroutine MyKSPConverged(ksp,n,rnorm,flag,dummy,ierr)
> >
> >       implicit none
> >
> > #include <petsc/finclude/petscsys.h>
> > #include <petsc/finclude/petscvec.h>
> > #include <petsc/finclude/petscksp.h>
> >
> >       KSP              ksp
> >       PetscErrorCode ierr
> >       PetscInt n,dummy
> >       KSPConvergedReason flag
> >       PetscReal rnorm, true_rnorm
> >       Vec true_res
> >       !
> >       call KSPConvergedDefault(ksp,n,rnorm,flag,PETSC_NULL_OBJECT,ierr)
> >       !
> >       ! If convergence test succeeds
> >        if ( (flag == KSP_CONVERGED_ATOL) .or.                           &
> >      &  (flag == KSP_CONVERGED_RTOL)) then
> >         ! Compute true residual
> >         call KSPBuildResidual( ksp , PETSC_NULL_OBJECT,                 &
> >      & PETSC_NULL_OBJECT, true_res, ierr )
> >         ! Compute true residual norm
> >         call VecNorm(true_res,NORM_2,true_rnorm,ierr)
> >         ! And check again convergence with respect to the true residual
> norm
> >         call KSPConvergedDefault(ksp,n,true_rnorm,flag,                 &
> >      & PETSC_NULL_OBJECT, ierr)
> >         ! Free memory
> >         call VecDestroy(true_res, ierr)
> >       endif
> >       !
> >       ierr = 0
> >
> >       end
> >
> > I get the following error message
> >
> > [0]PETSC ERROR: --------------------- Error Message
> --------------------------------------------------------------
> > [0]PETSC ERROR: Null argument, when expecting valid pointer
> > [0]PETSC ERROR: Convergence context must have been created with
> KSPConvergedDefaultCreate()
> > [0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html
> for trouble shooting.
> > [0]PETSC ERROR: Petsc Release Version 3.6.2, Oct, 02, 2015
> >
> > I understand that I should have  call KSPConvergedDefaultCreate() before
> calling KSConvergedDefault( ....)
> >
> > Am I right ?
> >
> > If so what is the Fortran calling sequence for
> KSPConvergedDefaultCreate ? It is supposed to return a valid pointer and I
> don't succeed in doing so from Fortran.
> >
> > If you have any idea, I'd greatly appreciate it
> > Thank you!
> > Natacha
> >
> >
> > PS I have attached my code (it's a slightly modified version of ex2f.F
> showing  the convergence test code )
> > <ex2f.F>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20151022/644787c0/attachment-0001.html>


More information about the petsc-users mailing list