3

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

次.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)

用于编译运行的命令如下(注意我是cmd在windows下使用的):

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.pyto subroutine传递itimes。但是,我不理解这种行为,因为代码的完整版本包括其他输入,所有这些都正确传递。从 Fortran 调用 itime 时,我无法让它做同样的事情,所以我假设它与 Python/Fortran 接口有关。谁能提供有关为什么会发生这种行为的任何见解?

编辑:th = 200用reprun.py 替换产生th = 200.0以下输出:

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

1 回答 1

1

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

次.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     
于 2012-06-07T21:58:35.420 回答