私はf2pyで遊んでいます。私は、ナンキンな内在型対fortran 90型について少し混乱しています。 Fortran 90では、Pythonとやり取りするときにのみ単精度実数を使うことができるようです。私は例で説明しましょう:f2py:pythonとインターフェースするときにfortranで本当の精度を指定する?
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
と、私は次のようにコンパイルします:
は、私はpythonでf2pyしてコンパイルしてインポートするには、このFORTRAN 90モジュール、test.f90を、持っていると言う
f2py -c -mテストtest.f90
その後、Pythonで:
>>> import test
>>> test.test.r_sp
array(1.0, dtype=float32)
>>> test.test.r_dp
array(1.0)
IOW、 f2pyは倍精度を受け入れないようです。これは、pythonからfortran 90サブルーチンに入力を渡すときに、さらに問題になります。私は私のモジュールを拡張言う:だから-1.15948430791165406E + 155
>>> 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))
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.f90
のpython、それがどのように思えますPythonから送信される入力変数は、単精度で宣言する必要があります。これはf2pyの既知の問題ですか?
また、フォローアップの質問のように、次の意味で、作品をDPするSPからの変換:
subroutine input_sp_to_dp(val)
real(sp), intent(in) :: val(2)
real(dp) :: x(2)
x = val
write(*,*) x
end subroutine
しかし、これがすべてでは特定のコンパイラでありますかしら?上記のサブルーチンは、任意のアーキテクチャ上の任意のコンパイラで適切な処理を行うことができますか?テストの際には、上記の例をすべて使用しました。
あなたの答えをありがとう。私はまず方法2を行い、それはうまくいった。しかし、私はこれを実際のプログラムに適用しようとしました。これは、distutilsを使ってsetup.pyファイルなどを使ってコンパイルを行います。私はその後、.f2py_cmapファイルを持っているだけでは、ビルド中に.f2py_cmapからの変更をうまく適用しても、十分ではないことがわかりました。実際には、私はすでに精度変数の定義に別のモジュールを使用していましたが、個々のサブルーチン内ではなく、モジュールを使用したモジュールのトップの 'use types'ステートメントがありました。 – arne