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

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)

コンパイルと実行に使用されるコマンドは次のとおりです ( cmdWindows で使用していることに注意してください)。

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

私の最初の推測は、それがどういうわけかsubroutine にth正しく渡されていないということです。ただし、コードの完全なバージョンには他の入力が含まれており、それらはすべて正しく渡されるため、この動作がわかりません。Fortran から itimes を呼び出したときに同じことを行うことができなかったので、Python/Fortran インターフェースと関係があると思います。この動作が発生する理由について、誰かが洞察を提供できますか?reprun.pyitimes

編集:th = 200 reprun.py を置き換えるth = 200.0と、次の出力が得られます。

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

1 に答える 1

1

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

reprun.py を実行します。

import it

th = 200
it.itime.itimes(th)

出力:

 th - it   200.00000000000000     
 th - fd   200.00000000000000     
于 2012-06-07T21:58:35.420 に答える