Chciałbym używać f2pyz nowoczesnym Fortranem. W szczególności próbuję uzyskać następujący podstawowy przykład do działania. To jest najmniejszy użyteczny przykład, jaki mogłem wygenerować.
! 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
Zauważ, że nwynika to z kształtu parametru wejściowego x. Należy pamiętać, że yjest on przydzielany i zwalniany w treści podprogramu.
Kiedy to skompiluję f2py
f2py -c alloc_test.f90 -m alloc
A następnie uruchom w Pythonie
from alloc import f
from numpy import ones
x = ones(5)
print f(x)
Pojawia się następujący błąd
ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (-1,)
Więc idę pyfręcznie tworzyć i edytować plik
f2py -h alloc_test.pyf -m alloc alloc_test.f90
Oryginalny
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
Zmodyfikowano
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
Teraz działa, ale wartości wyjściowe zsą zawsze 0. Niektóre drukowanie debugowania ujawnia, że nma wartość 0w podprogramie f. Zakładam, że brakuje mi f2pymagii nagłówka, aby właściwie zarządzać tą sytuacją.
Mówiąc bardziej ogólnie, jaki jest najlepszy sposób połączenia powyższego podprogramu z Pythonem? Zdecydowanie wolałbym nie modyfikować samego podprogramu.