[petsc-users] Fortran application context, passing a module

Barry Smith bsmith at mcs.anl.gov
Fri Mar 17 00:15:50 CDT 2017


  It looks to me that you are trying to pass a Fortran 90 derived type as one entry in an array of addresses as an application context (perhaps from some PETSc example). This will not work as written because Fortran doesn't know that PetscFortranAddr is an array of addresses. 

  The conventional way to do this is to pass a derived type directly as the context. So you would just have

   type(mgrid) mygrid

    then when you call SNESSetComputeFunction() or whatever routine you are calling that requires a context

    SNESSetComputeFunction(snes,v,computefunction,mygrid,ierr)

    and inside your computefunction the ctx argument is declared as type(grid) mygrid

    See, for example, src/snes/examples/tutorials/ex5f90.F90


  Barry

> type(mgrid)

   
> On Mar 17, 2017, at 12:02 AM, Praveen C <cpraveen at gmail.com> wrote:
> 
> Dear all
> 
> I want to pass my own module as an application context in fortran. So I am trying something like this
> 
> type(mgrid),target :: g
> PetscFortranAddr :: ctx(6)
> ctx(1) => g
> 
> But this gives an error
> Error: Non-POINTER in pointer association context (pointer assignment) at (1)
> 
> Could you tell me how I can make this work ?
> 
> Thanks
> praveen



More information about the petsc-users mailing list