<html>
<body>
<font face="Courier New, Courier">While using the call-back feature of
f2py I stumbled across what appears<br>
to be a bug and I'm asking the community to look into this.<br><br>
Background: I'm in the middle of converting some legacy fortran to
python.<br>
There is one routine that is particulary thorny that calls more
easily<br>
convertible service routines and my intention is to convert the
latter<br>
and use the callback feature of f2py to execute them within the
fortran<br>
followed by a systematic conversion of what remains.  This seems to
be <br>
doable from what I've read on callback. I have not seen an example<br>
of using callback where the python actually changes parameters that
are<br>
returned to the fortran; this is a requirement for me. While setting
up<br>
an example to illustrate this I came across a syntactically correct <br>
situation(this means it compiles & executes) but gives the wrong
answer.<br>
Here's the code:<br>
In fortran, source foo.f<br>
      subroutine calc(i, j)<br>
Cf2py intent(callback) pycalc<br>
      external pycalc<br>
Cf2py integer intent(in,out,copy):: i<br>
Cf2py integer dimension(1), intent(in,out):: j<br>
      integer pyreturn<br><br>
      integer i, j(1)<br>
      print *, 'in fortran before pycalc
','i=',i, ' j=', j(1)<br>
      pyreturn = pycalc(i, j)<br>
      print *, 'in fortran after pycalc ','i=',
i, ' j=', j(1)<br><br>
      end<br>
      <br>
Standard build: f2py -c -m foo foo.f<br><br>
In python, execute<br>
import foo,numpy<br><br>
def pycalc(i, j):<br>
    print ' in pycalc ', 'i=',i, 'j=', j<br>
    i=10*i<br>
    j = 20*j<br>
    return i, j<br><br>
print foo.calc.__doc__<br>
i=2<br>
j = 1+numpy.array([i])<br>
print foo.calc(i,j, pycalc)<br><br>
Here's the output:<br>
calc - Function signature:<br>
  i,j = calc(i,j,pycalc,[pycalc_extra_args])<br>
Required arguments:<br>
  i : input int<br>
  j : input rank-1 array('i') with bounds (1)<br>
  pycalc : call-back function<br>
Optional arguments:<br>
  pycalc_extra_args := () input tuple<br>
Return objects:<br>
  i : int<br>
  j : rank-1 array('i') with bounds (1)<br>
Call-back functions:<br>
  def pycalc(i,j): return pyreturn,i,j<br>
  Required arguments:<br>
    i : input int<br>
    j : input rank-1 array('i') with bounds (1)<br>
  Return objects:<br>
    pyreturn : int<br>
    i : int<br>
    j : rank-1 array('i') with bounds (1)<br><br>
<br>
 in fortran before pycalc i= 2 j= 3<br>
 in pycalc  i= 2 j= [3]<br>
 in fortran after pycalc i= 60 j= 3<br>
(60, array([3]))<br><br>
The bug: <br>
on return to the fortran why is i=60 & j=3?<br>
shouldn't it be i=10 & j=60<br><br>
While that's what I expect, I might not be defining the<br>
interface properly; but this compiles & executes. If this<br>
is incorrect, what is?  In the fortran, pyreturn appears<br>
to be an address; how do I get the retuned values?<br><br>
I'm running  <br>
Redhat Linux<br>
python version 2.5<br>
f2py version 2_3979<br>
numpy version 1.0.3.1<br>
Thanks<br>
</font><x-sigsep><p></x-sigsep>
Jim McEnerney<br>
Lawrence Livermore National Laboratory<br>
7000 East Ave.<br>
Livermore, Ca. 94550-9234<br><br>
USA<br><br>
925-422-1963</body>
</html>