2013-11-01 9 views
5

पर फोरट्रान में LAPACK को लिंक करना मुझे लगता है कि यह एक मानक नोब समस्या है, लेकिन पूरे दिन वेब पर खोज करने के बाद, मैंने आपको बग का फैसला किया। मैं मैक ओएस 10.9 पर हूं और मैं एक फोरट्रान प्रोग्राम से एक लैपैक ईजेनवेल्यू रूटीन कॉल करना चाहता हूं। मुझे कल फोर्ट्रान से पेश होने का आनंद मिला, इसलिए कृपया किसी भी मूर्ख गलतियों से क्षमा करें।मैक ओएस एक्स

यह कम से कम उदाहरण मैं चलाने के लिए प्राप्त करने के लिए चाहते हैं:

program eigtest 
    complex A(3,3) 
    real eigs(3) 
    A(1,1) = cmplx(1,0) 
    A(1,2) = cmplx(0,2) 
    A(1,3) = cmplx(3,0) 
    A(2,1) = cmplx(0,-2) 
    A(2,2) = cmplx(5,0) 
    A(2,3) = cmplx(1,-1) 
    A(3,1) = cmplx(3,0) 
    A(3,2) = cmplx(1,1) 
    A(3,3) = cmplx(7,0) 
    call heevd(A, eigs) 
    write(*,*) eigs 
end 

मुझे पता चला कि ओएस एक्स पर, LAPACK ढांचे में तेजी लाने का हिस्सा है, इसलिए मैं जैसी चीजों की कोशिश की:

gfortran -o eigtest -framework accelerate eigtest.f95 

लेकिन लिंकर की शिकायत:

Undefined symbols for architecture x86_64: 
    "_heevd_", referenced from: 
     _MAIN__ in ccleuVFO.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

उत्तर

4

मुझे यकीन नहीं है कि त्वरित ढांचे में हेवीड (ए, ईग्स) के लिए अच्छा fortran95 कॉल है। नीचे, मैं कॉल को अच्छे और तंग रखने के लिए ज़ेवेड लैपैक सबराउटिन (इसके सभी वर्कस्पेस चर के साथ) को लपेटता हूं। आप कहीं भी बाहरी मॉड्यूल के अंदर ऐसी कुरूपता स्टोर कर सकते हैं जिसे आप अपने कार्यक्रमों में लोड कर सकते हैं। मुझे लगता है कि इंटेल एमकेएल में अधिकांश लैपैक 95 इंटरफेस हैं, और ओएस एक्स फ्रेमवर्क के साथ अन्य बेहतर तरीके हो सकते हैं। नीचे दिया गया कोड संकलित करता है:

gfortran -o eigtest -framework Accelerate eigtest.f95  

program eigtest 
    complex(kind=8),allocatable :: A(:,:), eigs(:), vecs(:,:) 
    integer      :: ierr 

    allocate(A(3,3),stat=ierr) 
    if (ierr /= 0) STOP "*** not enough memory ***" 

    A(1,1) = cmplx(1,0) 
    A(1,2) = cmplx(0,2) 
    A(1,3) = cmplx(3,0) 
    A(2,1) = cmplx(0,-2) 
    A(2,2) = cmplx(5,0) 
    A(2,3) = cmplx(1,-1) 
    A(3,1) = cmplx(3,0) 
    A(3,2) = cmplx(1,1) 
    A(3,3) = cmplx(7,0) 
    !call heevd(A, eigs) 
    call wrapped_zheevd(A, eigs,vecs) 
    write(*,*) eigs 

    contains 

subroutine wrapped_zheevd (matin, & 
         zvals,zvecs) 
    integer         :: ndim 
    complex(kind=8),intent(in), allocatable :: matin(:,:) 
    complex(kind=8),intent(out), allocatable :: zvals(:),zvecs(:,:) 
    character*1        :: jobz='V',uplo='U' 
    integer         :: info,lda,liwork,lrwork,lwork,n 
    integer,      allocatable :: iwork(:) 
    real(kind=8),    allocatable :: rwork(:), w(:) 
    complex(kind=8),    allocatable :: A(:,:), work(:) 
    integer         :: ierr 

    ndim=size(matin(1,:)) 

    if (allocated(zvecs)) deallocate(zvecs) 
    if (allocated(zvals)) deallocate(zvals) 
    allocate(zvecs(ndim,ndim),zvals(ndim),stat=ierr) 
    if (ierr /= 0) STOP "*** not enough memory ***" 

    n=ndim 
    lda=n 

    lwork = 2*n+n**2 
    lrwork = 1+5*n+2*n**2 
    liwork = 3+5*n 

    allocate(a(ndim,ndim),w(ndim),work(lwork),& 
      rwork(lrwork),iwork(liwork),stat=ierr) 
    if (ierr /= 0) STOP "*** not enough memory ***" 

    a=matin 

    call zheevd(jobz,uplo,n,a,lda,w,work,lwork,rwork,lrwork,iwork,liwork,info) 

    zvals=w 
    zvecs=a 

    deallocate(a,w,rwork,iwork,work) 

end subroutine 

end 
0

यह लिंक पता चलता है कि लापता विधि एक इंटेल पुस्तकालय सीए है डालूँगा:

http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/index.htm#GUID-9AD3B5B7-DC35-4DF7-A126-9A8730FE98CA.htm

मैं मैक पर आश्चर्य जहां इसके समकक्ष जीवन? क्या आपको गोरफ्रान है?

http://gcc.gnu.org/wiki/GFortranBinaries

नीचे संदेश का सुझाव वहाँ कोई 64 बिट संस्करण है कि उपलब्ध है?

क्षमा करें - उत्तर से अधिक प्रश्न।

+0

लापता विधि LAPACK से एक है। हेवेड एक हेर्मेटियन मैट्रिक्स के eigenvalues ​​की गणना करता है। मैं _do_ प्रश्न में संकेत के रूप में gfortran का उपयोग करें। मुझे LAPACK को कॉल किए बिना फोरट्रान कार्यक्रमों को संकलित करने में कोई समस्या नहीं है। चूंकि ओएस एक्स 64 बिट के माध्यम से और उसके माध्यम से है, मुझे नहीं लगता कि समस्या यह है कि कोई 64 बिट संस्करण उपलब्ध नहीं है। – Jonas

+0

हां, दस्तावेज़ों ने स्पष्ट किया। मुझे लगता है कि अगर LAPACK को उस विधि को जोड़ने की आवश्यकता है, तो आपका कार्य उस लाइब्रेरी को ढूंढना है जहां यह रहता है और इसे अपने लिंक पथ में जोड़ना है। – duffymo