【发布时间】:2017-03-14 16:31:58
【问题描述】:
我正在尝试了解 F2PY 的工作原理。为此,我编写了一个简单的 Fortran 函数,该函数将数组作为输入并返回数组元素的总和。
我写了三个不同版本的相同函数,我希望得到相同的结果:
function rsum(arr)
real, dimension(:), intent(in) :: arr
real :: rsum
rsum=sum(arr)
end function rsum
function rsum1(arr)
real(8), dimension(:), intent(in) :: arr
real(8) :: rsum1
rsum1=sum(arr)
end function rsum1
function rsum2(arr) result(s)
real, dimension(:), intent(in) :: arr
real :: s
s=sum(arr)
end function rsum2
function rsum3(arr) result(s)
real(8), dimension(:), intent(in) :: arr
real(8) :: s
s=sum(arr)
end function rsum3
我用来测试这些功能的python脚本如下:
from numpy import *
import ftest as f
a=array(range(3))
print(f.rsum(a))
print(f.rsum1(a))
print(f.rsum2(a))
print(f.rsum3(a))
但结果是这样的:
3.0
0.0
3.0
3.0
所有结果都是正确的,除了rsum1 之一,它是0.0。我发现更奇怪的是rsum3,在其中我只是更改了函数结果的名称(或者,至少,我认为我正在这样做),效果很好!
我知道这与Fortran和numpy之间的类型转换有关,但我不明白问题是什么。
PS:我最近才学 Fortran。
【问题讨论】:
-
新手别学
real(8)的坏习惯,人家哪来的?它没有出现在任何好的教科书中。 -
rsum1和rsum3应该完全相同。但也许 f2py 解释了其中一个错误。 -
我可以复制它。当我在从 f2py 调用的 Fortran 子例程中调用它们时,结果是正确的。但即使在 Python 中,
f.*函数的报告签名也是正确的。 -
@VladimirF 关于符号 real(8),有人教给我。为什么这么糟糕?另外,我不明白:您在运行脚本时是否遇到同样的错误?
-
是的,我遇到了同样的错误。 Real(8) 不可移植,它不能用某些编译器编译。见stackoverflow.com/documentation/fortran/939/data-types/4390/… 和stackoverflow.com/a/856243/721644