我将使用f2py编译一个数值模块,以供Python脚本使用。我已将代码简化为以下最小示例:
fd.f:
module fd
! Double precision real kind
integer, parameter :: dp = selected_real_kind(15)
contains
subroutine lprsmf(th)
implicit none
real(dp) th
write(*,*) 'th - fd',th
end subroutine lprsmf
end module fd
itimes.f:
subroutine itimes(th)
use fd
implicit none
real(dp) th
write(*,*) 'th - it',th
call lprsmf(th)
end subroutine itimes
reprun.py:
import it
th = 200
it.itimes(th)
编译和运行所使用的命令如下(请注意,我在Windows下使用cmd
):
gfortran -c fd.f
f2py.py -c -m it --compiler=mingw32 fd.o itimes.f
reprun.py
输出结果如下:
th - it 1.50520876326836550E-163
th - fd 1.50520876326836550E-163
我的第一个猜测是
th
在从reprun.py
传递给子例程itimes
时出现了问题。然而,我不理解这种行为,因为代码的完整版本包括其他输入,所有这些输入都被正确传递。当我从Fortran调用itimes时,我无法让它做同样的事情,所以我认为它与Python/Fortran接口有关。有人能提供任何关于为什么会出现这种行为的见解吗?编辑:将reprun.py中的
th = 200
替换为th = 200.0
会产生以下输出:th - it 1.19472349365371216E-298
th - fd 1.19472349365371216E-298