मैं f2py के साथ खेल रहा हूं। मैं numpy आंतरिक प्रकार बनाम fortran 90 प्रकार के बारे में थोड़ा उलझन में हूँ। ऐसा लगता है जैसे मैं अजगर के साथ बातचीत करते समय, फोर्टन 90 में केवल एक परिशुद्धता वास्तविकता का उपयोग कर सकता हूं।f2py: अजगर के साथ इंटरफेसिंग करते समय फोर्टन में वास्तविक परिशुद्धता निर्दिष्ट करना?
मैं इस fortran 90 मॉड्यूल, test.f90 है, f2py साथ संकलित और अजगर में आयात करने के लिए कहते हैं::
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
end module
और मैं इस तरह संकलन: मुझे एक उदाहरण के साथ वर्णन करते
f2py -c -m परीक्षण test.f90
फिर, अजगर में:
>>> import test
>>> test.test.r_sp
array(1.0, dtype=float32)
>>> test.test.r_dp
array(1.0)
IOW, ऐसा लगता है कि f2py डबल परिशुद्धता स्वीकार नहीं करता है। पाइथन से एक फॉरेन 90 सबराउटिन में इनपुट पास करते समय यह और भी समस्याग्रस्त हो जाता है। मैं अपने मॉड्यूल का विस्तार कहते हैं:
module test
implicit none
integer, parameter :: sp = selected_real_kind(6,37) ! single precision
integer, parameter :: dp = selected_real_kind(15,307) ! double precision
real(sp) :: r_sp = 1.0
real(dp) :: r_dp = 1.0_dp
contains
subroutine input_sp(val)
real(sp), intent(in) :: val
real(sp) :: x
x = val
write(*,*) x
end subroutine
subroutine input_dp(val)
real(dp), intent(in) :: val
real(dp) :: x
x = val
write(*,*) x
end subroutine
end module
f2py -m -c परीक्षण test.f90
अजगर
>>> import test
>>> test.test.input_sp(array(1.0,dtype=float32))
1.0000000
>>> test.test.input_sp(array(1.0,dtype=float64))
1.0000000
>>> test.test.input_dp(array(1.0,dtype=float32))
-1.15948430791165406E+155
>>> test.test.input_dp(array(1.0,dtype=float64))
-1.15948430791165406E + 155
इसलिए, यह किसी भी तरह लगता है पाइथन से भेजे जाने वाले इनपुट चर को एकल परिशुद्धता घोषित किया जाना चाहिए। क्या यह f2py के साथ एक ज्ञात मुद्दा है?
इसके अलावा, एक अनुवर्ती प्रश्न के रूप में: एसपी से परिवर्तित काम करता है डीपी को निम्नलिखित अर्थ में,:
subroutine input_sp_to_dp(val)
real(sp), intent(in) :: val(2)
real(dp) :: x(2)
x = val
write(*,*) x
end subroutine
लेकिन मुझे आश्चर्य है कि अगर यह संकलक विशिष्ट बिल्कुल है? क्या मैं उपर्युक्त उपरोक्त किसी भी वास्तुकला पर किसी भी कंपाइलर के साथ सही काम करने की उम्मीद कर सकता हूं? परीक्षण करते समय, मैंने उपर्युक्त उदाहरणों के लिए gfortran का उपयोग किया।
आपके उत्तर के लिए धन्यवाद। मैंने पहली बार विधि 2 की, और यह ठीक काम किया। लेकिन फिर मैंने इसे लिखने वाले वास्तविक कार्यक्रम में इसे लागू करने का प्रयास किया, जो setup.py फ़ाइल के माध्यम से संकलन करने के लिए distutils का उपयोग करता है और इसी तरह। मैंने तब पाया कि सिर्फ एक .f2py_cmap फ़ाइल होने के लिए पर्याप्त नहीं था, भले ही यह पता चला कि निर्माण के दौरान .f2py_cmap से सफलतापूर्वक परिवर्तन लागू किए गए हैं। इसलिए मुझे विधि 3 का उपयोग करना पड़ा। दरअसल, मैं पहले से ही सटीक चर की परिभाषाओं के लिए एक अलग मॉड्यूल का उपयोग कर रहा था, लेकिन मेरे पास मॉड्यूल के शीर्ष का 'उपयोग प्रकार' कथन था जो व्यक्तिगत उपरोक्त के अंदर नहीं था। – arne