Federico,

    Sorry for the delay in responding. I think the problem is due to setting 
the monitor from Fortran but having the monitor written in C.

   To make your life simpler I think you should be able to write the 
ShellKSPMonitor in Fortran. (no C code at all)

    If that fails please send us a complete (trivial) code that we can build 
that exhibits the problem and we'll see what is going on.

   Barry

> On May 2, 2016, at 7:48 AM, Miorelli, Federico <[email protected]> 
> wrote:
> 
> Dear All,
>  
> I am having some issues upgrading to PETSc 3.7 due to some changes in the 
> KSPMonitor routines.
> I need to configure my KSP solver to output its convergence log to an 
> existing ASCII viewer through a custom monitor, printing only one every 10 
> iterations.
> The calling code is Fortran, we wrote a small C code that just calls the 
> default monitor every 10 iterations, passing the viewer as last argument. If 
> I understood correctly it is now necessary to set up a PetscViewerAndFormat 
> structure and pass that as last argument to the monitor routine.
>  
> I tried to create one with PetscViewerAndFormatCreate but I'm getting a 
> runtime error (see below).
> Could you please help me understand what I did wrong?
>  
> Thanks in advance,
>  
> Federico
>  
>  
>  
> Error:
>  
> [1]PETSC ERROR: #1 PetscViewerPushFormat() line 149 in 
> /PETSc/petsc-3.7.0/src/sys/classes/viewer/interface/viewa.c
> Error Message --------------------------------------------------------------
> [8]PETSC ERROR: Argument out of range
> [8]PETSC ERROR: Too many PetscViewerPushFormat(), perhaps you forgot 
> PetscViewerPopFormat()?
>  
>  
> Fortran code:
>  
>   PetscViewer :: viewer
>   PetscViewerAndFormat :: vf
>   external ShellKSPMonitor
> ...
>   call PetscViewerAndFormatCreate(viewer, PETSC_VIEWER_DEFAULT, vf,ierr)
>   call KSPMonitorSet(ksp, ShellKSPMonitor, vf, PetscViewerAndFormatDestroy, 
> ierr)
>  
>  
>  
> C code:
> PetscErrorCode  shellkspmonitor_(KSP *ksp, PetscInt *n, PetscReal *rnorm, 
> void *ptr)
> {
>     PetscErrorCode ierr=0;
>     if (*n % 10 == 0) {
>        ierr = 
> KSPMonitorTrueResidualNorm(*ksp,*n,*rnorm,(PetscViewerAndFormat*)ptr);CHKERRQ(ierr);
>     }
>     return ierr;
> }
>  
>  
>  
>  
> ______ ______ ______
> Federico Miorelli
> Senior R&D Geophysicist
> Subsurface Imaging - General Geophysics Italy
>  
>  
>  
> This email and any accompanying attachments are confidential. If you received 
> this email by mistake, please delete
> it from your system. Any review, disclosure, copying, distribution, or use of 
> the email by others is strictly prohibited.

Reply via email to