gpt4 book ai didi

python - 子例程参数未从 Python 正确传递到 Fortran

转载 作者:行者123 更新时间:2023-11-28 18:52:10 25 4
gpt4 key购买 nike

我正在使用 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

重新运行.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 接口(interface)有关。任何人都可以提供任何关于为什么会发生这种行为的见解吗?

编辑:将 reprun.py 中的 th = 200 替换为 th = 200.0 会产生以下输出:

th - it  1.19472349365371216E-298
th - fd 1.19472349365371216E-298

最佳答案

也将您的 itimes 子例程包装在一个模块中。这是我所做的:

itimes.f90:

module itime

contains

subroutine itimes(th)
use fd
implicit none
real(dp) th

write(*,*) 'th - it',th
call lprsmf(th)
end subroutine itimes

end module

编译&运行:

gfortran -c fd.f90
c:\python27_w32\python.exe c:\python27_w32\scripts\f2py.py -c -m it --compiler=mingw32 fd.f90 itimes.f90

运行重新运行.py:

import it

th = 200
it.itime.itimes(th)

输出:

 th - it   200.00000000000000     
th - fd 200.00000000000000

关于python - 子例程参数未从 Python 正确传递到 Fortran,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com