f2py
最新のFortranで使用したいと思います。特に、次の基本的な例を動作させようとしています。これは、私が生成できる最小の有用な例です。
! alloc_test.f90
subroutine f(x, z)
implicit none
! Argument Declarations !
real*8, intent(in) :: x(:)
real*8, intent(out) :: z(:)
! Variable Declarations !
real*8, allocatable :: y(:)
integer :: n
! Variable Initializations !
n = size(x)
allocate(y(n))
! Statements !
y(:) = 1.0
z = x + y
deallocate(y)
return
end subroutine f
n
は、入力パラメータの形状から推測されることに注意してくださいx
。y
は、サブルーチンの本体内で割り当ておよび割り当て解除されることに注意してください。
これをコンパイルすると f2py
f2py -c alloc_test.f90 -m alloc
そして、Pythonで実行します
from alloc import f
from numpy import ones
x = ones(5)
print f(x)
次のエラーが表示されます
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (-1,)
そこで、pyf
手動でファイルを作成および編集します
f2py -h alloc_test.pyf -m alloc alloc_test.f90
元の
python module alloc ! in
interface ! in :alloc
subroutine f(x,z) ! in :alloc:alloc_test.f90
real*8 dimension(:),intent(in) :: x
real*8 dimension(:),intent(out) :: z
end subroutine f
end interface
end python module alloc
修正済み
python module alloc ! in
interface ! in :alloc
subroutine f(x,z,n) ! in :alloc:alloc_test.f90
integer, intent(in) :: n
real*8 dimension(n),intent(in) :: x
real*8 dimension(n),intent(out) :: z
end subroutine f
end interface
end python module alloc
現在は実行されていますが、出力の値z
は常に0
です。一部のデバッグ印刷では、サブルーチン内にn
値があることがわかります。この状況を適切に管理するためのヘッダーマジックが欠けていると思います。 0
f
f2py
より一般的には、上記のサブルーチンをPythonにリンクする最良の方法は何ですか?サブルーチン自体を変更する必要がないことを強く望みます。