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)
コンパイルと実行に使用されるコマンドは次のとおりです ( 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
私の最初の推測は、それがどういうわけかsubroutine にth
正しく渡されていないということです。ただし、コードの完全なバージョンには他の入力が含まれており、それらはすべて正しく渡されるため、この動作がわかりません。Fortran から itimes を呼び出したときに同じことを行うことができなかったので、Python/Fortran インターフェースと関係があると思います。この動作が発生する理由について、誰かが洞察を提供できますか?reprun.py
itimes
編集:th = 200
reprun.py を置き換えるth = 200.0
と、次の出力が得られます。
th - it 1.19472349365371216E-298
th - fd 1.19472349365371216E-298