আমি 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
subroutine এর শরীরের মধ্যে বরাদ্দ এবং deallocated হয়।
আমি যখন এটি সংকলন করি 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
এই পরিস্থিতিটি সঠিকভাবে পরিচালনা করতে আমি কিছু শিরোনাম জাদুটি অনুপস্থিত ।
উপরোক্ত সাবরোটিনকে পাইথনের সাথে যুক্ত করার সর্বোত্তম উপায় কী? আমি দৃ strongly়ভাবে সাবউটাইন নিজেই পরিবর্তন না করতে পছন্দ করব।