[Numpy-discussion] f2py callback bug?

Pearu Peterson pearu.peterson at gmail.com
Wed Nov 25 14:42:12 EST 2009


Hi James,

To answer the second question, use:

   j = 1+numpy.array([2], numpy.int32)

The answer to the first question is that
the type of 1+numpy.array([2]) is
numpy.int64 but Fortran function expects
an array of type numpy.int32 and hence
the wrapper makes a copy of the input
array (which is also returned by the wrapper)
before passing it to Fortran.

Regards,
Pearu

James McEnerney wrote:
> Pearu,
> Thanks. a follow question.
> Using fortran
> 
>       subroutine calc(j)
> Cf2py intent(callback) pycalc
>       external pycalc
> Cf2py integer dimension(1), intent(in,out):: j
> 
>       integer j(1)
>       print *, 'in fortran before pycalc ', 'j=', j(1)
>       call pycalc(j)
>       print *, 'in fortran after pycalc ', ' j=', j(1)
>       end
> 
> in python
> 
> import foo,numpy
> def pycalc(j):
>    
>     print ' in pycalc ', 'j=', j
>     j[:] = 20*j
>     return
> 
> print foo.calc.__doc__
> j = 1+numpy.array([2])
> print foo.calc(j, pycalc)
> print j
> 
> the output is
> 
> calc - Function signature:
>   j = calc(j,pycalc,[pycalc_extra_args])
> Required arguments:
>   j : input rank-1 array('i') with bounds (1)
>   pycalc : call-back function
> Optional arguments:
>   pycalc_extra_args := () input tuple
> Return objects:
>   j : rank-1 array('i') with bounds (1)
> Call-back functions:
>   def pycalc(j): return j
>   Required arguments:
>     j : input rank-1 array('i') with bounds (1)
>   Return objects:
>     j : rank-1 array('i') with bounds (1)
> 
>  in fortran before pycalc j=           3
>  in pycalc  j= [3]
>  in fortran after pycalc  j=          60
> [60]
> [3]
> 
> Why is the return from foo.calc different from j?
> How do I make them the same?
> "return j" in pycalc doesn't change things.
> 
> Thanks again!
> 
> At 12:06 AM 11/25/2009, you wrote:
> 
> 
>> Pearu Peterson wrote:
>>
>> > Hmm, regarding `intent(in, out) j`, this should work. I'll check what
>> > is going on..
>>
>> The `intent(in, out) j` works when pycalc is defined as subroutine:
>>
>>    call pycalc(i, j)
>>
>> instead of
>>
>>    pyreturn = pycalc(i, j)
>>
>> Pearu
>> _______________________________________________
>> NumPy-Discussion mailing list
>> NumPy-Discussion at scipy.org
>> http://*mail.scipy.org/mailman/listinfo/numpy-discussion
> 
> Jim McEnerney
> Lawrence Livermore National Laboratory
> 7000 East Ave.
> Livermore, Ca. 94550-9234
> 
> USA
> 
> 925-422-1963
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion



More information about the NumPy-Discussion mailing list