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