On Feb 5, 2011, at 6:19 PM, Gaetan Kenway wrote:

> Hello 
> 
> I'm wondering if it is possible to put an external procedure reference in a 
> ctx() in fortran.
> 
>  I'm in the process of writing a Newton--Krylov solver for an aero-structural 
> system. My two different codes are wrapped with python and so each code is 
> called through python for residual and preconditioning operations. Nominally 
> this would be a good use of petsc4py but it doesn't allow for PCShell so it 
> is no use to me. 

  Before making live hard by futzing around with Fortran or C lets make sure 
you really cannot do this in Python. What about using PCPYTHON? My guess is 
that this allows building your PC from pieces just like PCSHELL. 

   Barry

> 
> I then wrote up the solver in Fortran and attempted to use callbacks to 
> python for computing the required information. Using f2py, I can pass my two 
> call back functions cb1 and cb2 fortran. A schematic of the code is below:
> 
> subroutine solver(cb1, cb2)
> 
>    ! cb1 and cb2 are python callbacks set using f2py
>    external cb1,cb2
>    petscFortranAddress ctx(2)
> 
>    ! I would like to do the following, but this doesn't compile
>    ! ctx(1) = cb1
>    ! ctx(2) = cb2
> 
>   call SNESCreate(comm,snes,ierr)
>   call SNESSetFunction(snes,resVec,FormFunction,ctx,ierr)
> 
>   call KSPGetPC(ksp,pc,ierr)
>   call PCSetType(pc,PCSHELL,ierr)
> 
>   call PCShellSetContext(pc,ctx,ierr)
>   call PCShellSetApply(pc,applyaspc_fortran,ierr)
> 
> end subroutine solver
> 
> subroutine applyaspc_fortran(pc,inputVec,outputVec,ierr)
> 
>   PC      pc
>   Vec     inputVec,outputVec
>   PetscFortranAddress ctx(2)
>   external func
>   
>   call PCShellGetContext(pc,ctx,ierr)
>   func = ctx(2)
> 
>   call VecGetArrayF90(inputVec,states_in,ierr)
>   call VecGetArrayF90(outputVec,states_out,ierr)
> 
>   ! Call the callback to python
>   call func(states_in,states_out,shape(states_in))
> 
>   call VecRestoreArrayF90(inputVec,states_in,ierr)
>   call VecRestoreArrayF90(outputVec,states_out,ierr)
> end subroutine applyaspc_fortran
> 
> 
>  In general, in Fortran, is it possible to put an external function reference 
> in a module such that I wouldn't have to try to pass it through the 
> application ctx? I realize this may be impossible to do in Fortran. Would 
> such a procedure be possible in C? I'm only using Fortran since I'm much more 
> familiar with it then with C.
> 
> Sorry there isn't much to go on, but any suggestions would be greatly 
> appreciated.
> 
> Gaetan

Reply via email to