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

标签 python fortran f2py

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

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

f2py 编译后,我转到 python 并执行以下操作:

>>> import sum2
>>> x = 1.0
>>> y = 2.0
>>> z = 0.0
>>> sum2.sum2(x,y,z)
sum is 3
>>> z
0.0

因此,即使 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

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

>>> import arr
>>> x = [1]
>>> arr.arr(x)
x[0] = 2.000000000
>>> x
[1]

因此,即使我现在使用可变类型的数据,我仍然遇到同样的问题 - 我无法在 pythonfortran 代码之间传递变量(或者最好说,我只有一条路)。

最佳答案

为了在 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)
>>>

关于python - 无法在 Fortran 子例程 + 笔记本中更改和返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26474933/

相关文章:

python - Reticulate - 在不分配给变量的情况下获取 Python 结果

for-loop - 重新启动 do 循环

floating-point - 如何将复数的虚部设置为零?

python - 将 f2py 与 distutils 混合

python - 移植旧的fortran程序以与python + numpy一起使用

python - 在 Django 模板中循环字典的字典只需 1 行代码

python - 如何将 Matplotlib 图转换为 PIL 图像对象(不保存图像)

python - 如何定义类对象的新属性

fortran - 在 Fortran 95 中将任意浮点字符串转换为实数

python - 将 f2py 与从模块内部调用的 LAPACK 一起使用