【发布时间】:2018-11-05 09:35:42
【问题描述】:
基于此minimal example,我想使用 Python 和 Fortran 子例程操作 Fortran 模块的变量。请看下面的例子:
vars.f90
module vars
implicit none
real(kind=selected_real_kind(p=15)) :: fk(10)
end module vars
sub.f90
subroutine sub
use vars
print *, "sub: fk(1) = ", fk(1)
print *, "adding 1 to fk(1)"
fk(1) = fk(1) + 1
print *, "fk(1) = ", fk(1)
end
mytest.f90
include "vars.f90"
include "sub.f90"
使用以下命令和 gfortran 完成编译:
f2py -c -m mytest mytest.f90
最后,这是在 Python 3.6.5 控制台中重现问题的测试用例:
>>> import mytest
>>> mytest.vars.fk[1]
0.0
>>> mytest.vars.fk[1]=1.5000
>>> mytest.vars.fk[1]
1.5
>>> mytest.sub()
sub: fk(1) = 0.12500000000000000
adding 1 to fk(1)
fk(1) = 1.1250000000000000
>>> mytest.vars.fk[1]
1.890625
>>>
在我看来,fk(1) 最终应该是 2.5。但不幸的是,尽管通过 python 控制台直接访问变量显示了正确的值,但 Fortran 错误地读取了子例程中的变量。修改变量后,python控制台也会显示错误的数字。
有任何建议或建议来解决/解释这种行为吗?我很感激任何帮助!谢谢!
P.S.:首先我认为这取决于 Python 和 Fortran 处理数组的方式不同(Python 从索引 0 开始,Fortran 从索引 1 开始),但这不是错误。 mytest.vars.fk[0] 在调用子程序后不被修改(初始值为 0.0)。
【问题讨论】:
-
f2py 将
fk视为单精度。阅读@PierredeBuyl 评论中的链接。