无法在Fortran子例程+笔记本中更改和返回值

Jac*_*ian 1 python fortran f2py

我有一个简单的fortran子程序(仅用于测试python-fortran接口).它看起来像这样:

subroutine sum2(x,y,z)
 real(kind=8),intent(in)::x,y
 real(kind=8),intent(inout)::z
 z = x + y
 print *, "sum is ", z
end subroutine sum2
Run Code Online (Sandbox Code Playgroud)

编译后f2py我去python并执行以下操作:

>>> import sum2
>>> x = 1.0
>>> y = 2.0
>>> z = 0.0
>>> sum2.sum2(x,y,z)
sum is 3
>>> z
0.0
Run Code Online (Sandbox Code Playgroud)

因此,即使z指定为inout,其值也不会被函数更改.我需要知道原因.另一个问题涉及notebook.如果我sum2在那里导入并运行sum2.sum2(x,y,z)我甚至看不到消息sum is ....那么,问题是,如果可以在笔记本中调用fortran子程序吗?

编辑

有一个合理的评论,在我的例子中,我使用了不可变的数据类型.所以,我决定改变它,但我仍然有同样的问题.所以,我的新fortran子程序看起来像这样:

subroutine arr(x)
    real(kind=8),dimension(1)::x
    x(1) = 2 ! new value
    print *, "x[0] = ", x(1)
end subroutine arr
Run Code Online (Sandbox Code Playgroud)

再次,我编译它f2py并转到python:

>>> import arr
>>> x = [1]
>>> arr.arr(x)
x[0] = 2.000000000
>>> x
[1]
Run Code Online (Sandbox Code Playgroud)

所以,尽管我现在用一个可变类型的数据,我仍然有同样的问题-我不能绕过变量之间pythonfortran代码(或者不如说,我有一个单行道).

小智 6

为了在Fortran和Python之间正确连接,围绕Fortran的C包装器需要numpy数组.

根据f2py入门教程(http://docs.scipy.org/doc/numpy-dev/f2py/getting-started.html#the-quick-way)中的注释,你可以最好地传递一个numpy数组具有兼容的数据类型.对于real(kind = 8),这是np.float64.

对于sum2子例程,以下代码对我有用:

>>> import sum2
>>> import numpy as np
>>> x=np.array(1.0,dtype=np.float64)
>>> y=np.array(2.0,dtype=np.float64)
>>> z=np.array(0.0,dtype=np.float64)
>>> sum2.sum2(x,y,z)
 sum is    3.0000000000000000
>>> z
array(3.0)
>>>
Run Code Online (Sandbox Code Playgroud)