मैं f2pyआधुनिक फोरट्रान के साथ उपयोग करना चाहूंगा । विशेष रूप से मैं काम करने के लिए निम्नलिखित मूल उदाहरण प्राप्त करने की कोशिश कर रहा हूं। यह सबसे छोटा उपयोगी उदाहरण है जिसे मैं उत्पन्न कर सकता हूं।
! 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
और फिर पायथन में चला
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मूल्य है । मुझे लगता है कि मुझे इस स्थिति को ठीक से प्रबंधित करने के लिए कुछ हेडर जादू याद आ रहे हैं । 0ff2py
अधिक आम तौर पर पायथन में उपरोक्त सबरूटीन को जोड़ने का सबसे अच्छा तरीका क्या है? मैं दृढ़ता से पसंद करूँगा कि सबरूटीन को स्वयं संशोधित न करें।