Steven,

    Could you please send your test code. It is possible there is a bug in our 
Fortran interface since we do not test it for this functionality. 

  Barry


> On Nov 4, 2022, at 10:50 AM, Steven Dargaville <dargaville.ste...@gmail.com> 
> wrote:
> 
> Hi all
> 
> I have a quick question regarding the use of PCMGSetResidual within fortran 
> code. I'm calling PCMGSetResidual from within fortran: 
> 
> call PCMGSetResidual(pc_mg, petsc_level, mg_residual, coarse_matrix ierr) 
> 
> and just for testing purposes I've written a trivial residual evaluation 
> routine:
> 
>     subroutine mg_residual(mat, b, x, r, ierr)
>       !!< Compute the residual
> 
>       ! ~~~~~~
>       type(tMat) :: mat
>       type(tVec) :: b, x, r
>       PetscErrorCode :: ierr
>       ! ~~~~~~
> 
>       print *, "inside residual evaluation"
>       call MatResidual(mat, b, x, r, ierr)
>       
>    end subroutine
> 
> The problem I am having is that this segfaults when the residual routine is 
> called. Valgrind shows that it is failing in the fortran interface in 
> ftn-custom/zmgfuncf.c, with the message:
> 
> ==24742== Invalid read of size 8
> ==24742==    at 0x5B7CBC0: ourresidualfunction (in 
> /home/projects/dependencies/petsc_main/arch-linux-c-opt/lib/libpetsc.so.3.015.0)
> ==24742==    by 0x5B6D804: PCMGMCycle_Private (in 
> /home/projects/dependencies/petsc_main/arch-linux-c-opt/lib/libpetsc.so.3.015.0)
> 
> ==24742== Process terminating with default action of signal 11 (SIGSEGV)
> ==24742==  Access not within mapped region at address 0x0
> ==24742==    at 0x5B7CBC0: ourresidualfunction (in 
> /home/sdargavi/projects/dependencies/petsc_main/arch-linux-c-opt/lib/libpetsc.so.3.015.0)
> ==24742==    by 0x5B6D804: PCMGMCycle_Private (in 
> /home/sdargavi/projects/dependencies/petsc_main/arch-linux-c-opt/lib/libpetsc.so.3.015.0)
> 
> I'm guessing this is because the fortran_func_pointers isn't pointing to the 
> mg_residual routine, but I am not sure why. I noticed that in the C code of 
> PCMGSetResidual that it calls MatDestroy on the A matrix in mg_levels and 
> replaces it with the mat passed in:
> 
> if (mat) PetscObjectReference((PetscObject)mat);
> MatDestroy(&mglevels[l]->A);
> mglevels[l]->A = mat
> 
> so I modified my code to call PCMGSetResidual either before the operators are 
> set, or after but passing in an extra copy, but this doesn't seem to help.
> 
> I'm guessing I'm doing something silly, but just wondering if anyone had any 
> ideas? Thanks for your help
> Steven

Reply via email to