私はf2pyで遊んでいます。numpyの組み込み型とFortran90型について少し混乱しています。Pythonと対話する場合、Fortran90では単精度実数しか使用できないようです。例を挙げて説明しましょう。
このFortran90モジュールtest.f90をf2pyでコンパイルし、Pythonにインポートするとします。
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
end module
そして私はこのようにコンパイルします:
f2py -c -m test test.f90
次に、Pythonで:
>>> import test
>>> test.test.r_sp
array(1.0, dtype=float32)
>>> test.test.r_dp
array(1.0)
IOW、f2pyは倍精度を受け入れないようです。これは、PythonからFortran90サブルーチンに入力を渡すときにさらに問題になります。モジュールを次のように拡張するとします。
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
contains
subroutine input_sp(val)
real(sp), intent(in) :: val
real(sp) :: x
x = val
write(*,*) x
end subroutine
subroutine input_dp(val)
real(dp), intent(in) :: val
real(dp) :: x
x = val
write(*,*) x
end subroutine
end module
f2py -c -m test test.f90
Python
>>> import test
>>> test.test.input_sp(array(1.0,dtype=float32))
1.0000000
>>> test.test.input_sp(array(1.0,dtype=float64))
1.0000000
>>> test.test.input_dp(array(1.0,dtype=float32))
-1.15948430791165406E+155
>>> test.test.input_dp(array(1.0,dtype=float64))
-1.15948430791165406E + 155
したがって、Pythonから送信される入力変数は、単精度で宣言する必要があるようです。これはf2pyの既知の問題ですか?
また、フォローアップの質問として:spからdpへの変換は、次の意味で機能します。
subroutine input_sp_to_dp(val)
real(sp), intent(in) :: val(2)
real(dp) :: x(2)
x = val
write(*,*) x
end subroutine
しかし、これはコンパイラ固有のものなのだろうか?上記のサブルーチンが、任意のアーキテクチャの任意のコンパイラで正しいことを実行することを期待できますか?テストするとき、私は上記のすべての例でgfortranを使用しました。