Re: [f2py] f2py-users Digest, Vol 72, Issue 1

Gaetan Kenway <kenway-kBRAJjP0/PtSpjfjxSPG1fd9D2ou9A/[email protected]> Sun, 6 Feb 2011 11:37:43 -0500
Newsgroups gmane.comp.python.f2py.user
Message-ID <[email protected]>
Hi Pearu

Thanks a lot for the (very!) speedy response. I managed to get it working
exactly the way I intended.  The function I use to pass the python function
in, (sub1 from original email below), I also have to pass two additional
arguments. I was having an issue with seg faults, but I've determined this
is the correct syntax for the pyf file (I explicitly manage my own pyf file)

    subroutine solver(states,nstates)
       use solver__user__routines
       real*8 dimension(nstates) :: states
       integer
optional,intent(in),check(len(states)>=nstates),depend(states) ::
nstates=len(states)
       intent(callback) getasres
       external getasres
       intent(callback) applyaspc
       external applyaspc
     end subroutine solver

Is there a reason why the callbacks getasres and applyaspc are not in the
argument list from solver? Also I seemed to find the callbacks have to be at
the END of the calling sequence. Is this the case in general? The above
function is called from python as:
module.solver(states,callback1,callback2), where states is a numpy array.

However, If you rearrange the pyf file (and .f90 file) to give

    subroutine solver(getasres,applyaspc,states,nstates)
       use solver__user__routines
       intent(callback) getasres
       external getasres
       intent(callback) applyaspc
       external applyaspc
       real*8 dimension(nstates) :: states
       integer
optional,intent(in),check(len(states)>=nstates),depend(states) ::
nstates=len(states)
     end subroutine solver

and call from python module.solver(callback1,callback2,states) it
seg-faults.

This isn't a huge issue, but it may be something to be aware of.

Thanks again!

Gaetan


On Sun, Feb 6, 2011 at 5:00 AM, <f2py-users-request-Y4l6ocDipWCuvFJfX82//[email protected]> wrote:

> Send f2py-users mailing list submissions to
>        f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
>
> To subscribe or unsubscribe via the World Wide Web, visit
>        http://cens.ioc.ee/mailman/listinfo/f2py-users
> or, via email, send a message with subject or body 'help' to
>        f2py-users-request-Y4l6ocDipWCuvFJfX82//[email protected]
>
> You can reach the person managing the list at
>        f2py-users-owner-Y4l6ocDipWCuvFJfX82//[email protected]
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of f2py-users digest..."
>
>
> Today's Topics:
>
>   1. Python Call Back in Fortran (Gaetan Kenway)
>   2. Re: Python Call Back in Fortran (Pearu Peterson)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Sat, 5 Feb 2011 18:11:05 -0500
> From: Gaetan Kenway <kenway-kBRAJjP0/PtSpjfjxSPG1fd9D2ou9A/[email protected]>
> Subject: [f2py] Python Call Back in Fortran
> To: f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
> Message-ID:
>        <AANLkTi=tsNTZOFJzx2t1ZPRO2tu4R_2f7eQkv5QCjnM3-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hello
>
> I have a question about python callbacks in Fortran. I've been able to
> setup
> simple python call backs with no issue. The problem I'm having is I need a
> way to "store" the call back function handle in Fortran. I need to call the
> python callback from a Fortran function that I can't explicitly pass the
> python function handle to .  I need to have something like below.
> Subroutine
> sub1 is wrapped and sub2 has a fixed form that is actually called from and
> internal PETSc function and I can't change the sequence of arguments.
>
> subroutine sub1(python_callback)
>
>    external python_callback
>
> end subroutine sub1
>
> subroutine sub2(arg1,arg2,arg3)
>
> external python_callback
> ! I want to call python_callback here
>    call python_callback(arg1,arg2,arg3)
>
> end subroutine sub2
>
> It would be nice if you could just put the callback into a module and make
> that available in sub2. Is this possible in fortran? The code as above
> compiles, but when you try to import it into Python, python complains that
> python_callback is not defined. Is there a way to trick the compiler into
> using the callback defined in the pyf file?  Is there some way of telling
> f2py with an intent(callback) that the external python_callback in sub2 is
> actually defined as python callback?
>
> If anyone has any suggestions or know this is entirely impossible in
> fortran
> it would be greatly appreciated.
>
> Gaetan Kenway
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL:
> http://cens.ioc.ee/pipermail/f2py-users/attachments/20110205/e733ea5d/attachment-0001.html
>
> ------------------------------
>
> Message: 2
> Date: Sun, 6 Feb 2011 08:26:07 +0200
> From: Pearu Peterson <[email protected]>
> Subject: Re: [f2py] Python Call Back in Fortran
> To: For users of the f2py program <f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]>
> Message-ID:
>        <AANLkTikUxHOr0C8EnDpXXuS1ZEaNBrowDwO_0CcQKSDW-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hi,
>
> Here follows an example that illustrates how to handle this usage case:
>
> !foo.f90:
> subroutine sub1(python_callback)
>
>  !f2py intent(callback) python_callback
>  external python_callback
>
>  !f2py call python_callback(0,0,0) !define python_callback signature
>  call sub2(1,2,3)
>
> end subroutine sub1
>
> subroutine sub2(arg1,arg2,arg3)
>  integer arg1, arg2, arg3
>  external python_callback
>  call python_callback(arg1,arg2,arg3)
>
> end subroutine sub2
> !eof
>
> f2py -c -m ex foo.f90
>
> >>> def cb(arg1, arg2, arg3):
> ...     print 'calling python cb(%s, %s, %s)' % (arg1, arg2, arg3)
> ...
> ...
> >>> import ex
> >>> ex.sub1(cb)
> calling python cb(1, 2, 3)
>
> HTH,
> Pearu
>
> On Sun, Feb 6, 2011 at 1:11 AM, Gaetan Kenway <kenway-kBRAJjP0/PtSpjfjxSPG1fd9D2ou9A/[email protected]
> >wrote:
>
> > Hello
> >
> > I have a question about python callbacks in Fortran. I've been able to
> > setup simple python call backs with no issue. The problem I'm having is I
> > need a way to "store" the call back function handle in Fortran. I need to
> > call the python callback from a Fortran function that I can't explicitly
> > pass the python function handle to .  I need to have something like
> below.
> > Subroutine sub1 is wrapped and sub2 has a fixed form that is actually
> called
> > from and internal PETSc function and I can't change the sequence of
> > arguments.
> >
> > subroutine sub1(python_callback)
> >
> >     external python_callback
> >
> > end subroutine sub1
> >
> > subroutine sub2(arg1,arg2,arg3)
> >
> > external python_callback
> > ! I want to call python_callback here
> >     call python_callback(arg1,arg2,arg3)
> >
> > end subroutine sub2
> >
> > It would be nice if you could just put the callback into a module and
> make
> > that available in sub2. Is this possible in fortran? The code as above
> > compiles, but when you try to import it into Python, python complains
> that
> > python_callback is not defined. Is there a way to trick the compiler into
> > using the callback defined in the pyf file?  Is there some way of telling
> > f2py with an intent(callback) that the external python_callback in sub2
> is
> > actually defined as python callback?
> >
> > If anyone has any suggestions or know this is entirely impossible in
> > fortran it would be greatly appreciated.
> >
> > Gaetan Kenway
> >
> > _______________________________________________
> > f2py-users mailing list
> > f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
> > http://cens.ioc.ee/mailman/listinfo/f2py-users
> >
> >
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL:
> http://cens.ioc.ee/pipermail/f2py-users/attachments/20110206/c832f7f2/attachment-0001.htm
>
> ------------------------------
>
> _______________________________________________
> f2py-users mailing list
> f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
> http://cens.ioc.ee/mailman/listinfo/f2py-users
>
>
> End of f2py-users Digest, Vol 72, Issue 1
> *****************************************
>
>

_______________________________________________
f2py-users mailing list
f2py-users-Y4l6ocDipWCuvFJfX82//[email protected]
http://cens.ioc.ee/mailman/listinfo/f2py-users