Saya ingin menggunakan f2py
Fortran modern. Secara khusus saya mencoba untuk mendapatkan contoh dasar berikut ini untuk bekerja. Ini adalah contoh berguna terkecil yang bisa saya hasilkan.
! 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
Catatan yang n
disimpulkan dari bentuk parameter input x
. Catatan yang y
dialokasikan dan dialokasikan di dalam tubuh subrutin.
Ketika saya kompilasi ini dengan f2py
f2py -c alloc_test.f90 -m alloc
Dan kemudian jalankan dengan Python
from alloc import f
from numpy import ones
x = ones(5)
print f(x)
Saya mendapatkan kesalahan berikut
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (-1,)
Jadi saya pergi dan membuat dan mengedit pyf
file secara manual
f2py -h alloc_test.pyf -m alloc alloc_test.f90
Asli
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
Diubah
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
Sekarang ini berjalan tetapi nilai-nilai output z
selalu 0
. Beberapa pencetakan debug mengungkapkan bahwa n
memiliki nilai 0
dalam subrutin f
. Saya berasumsi bahwa saya kehilangan beberapa f2py
sihir header untuk mengelola situasi ini dengan benar.
Lebih umum apa cara terbaik untuk menghubungkan subrutin di atas ke Python? Saya lebih suka tidak perlu memodifikasi subrutin itu sendiri.