2013-11-01 21 views
5

Immagino che questo sia un problema di noob standard ma dopo aver passato tutta la mattinata a cercare sul Web, ho deciso di infastidirti comunque. Sono su Mac OS 10.9 e mi piacerebbe chiamare una routine autovalore LAPACK da un programma Fortran. Ho avuto il piacere di essere stato presentato a Fortran proprio ieri, quindi scusami per eventuali errori folli.Collegamento di LAPACK in Fortran su Mac OS X

Questo è l'esempio minimo voglio arrivare a correre:

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 

ho imparato che su OS X, LAPACK è parte del quadro Accelerate, così ho provato cose come:

gfortran -o eigtest -framework accelerate eigtest.f95 

ma il linker si lamenta:

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 

risposta

4

Non sono sicuro che il framework Accelerate abbia quella bella chiamata fortran95 a heevd (A, eigs). Di seguito, riassumo la subroutine zheevd lapack (con tutte le sue variabili di workspace) per mantenere la chiamata bella e stretta. È possibile memorizzare tale bruttezza all'interno di un modulo esterno da qualche parte che è possibile caricare nei programmi. Penso che Intel MKL abbia la maggior parte delle interfacce di lapack95 e che ci possano essere altri modi migliori con il framework os x. Il codice seguente viene compilato con:

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

Questo collegamento suggerisce che il metodo mancante è una libreria ca Intel ll:

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

Mi chiedo dove le sue vite equivalenti su Mac? Hai gfortran?

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

significa il messaggio di fondo suggeriscono che non c'è nessuna versione a 64 bit disponibili?

Ci scusiamo: più domande che risposte.

+0

Il metodo mancante è quello di LAPACK. heevd calcola gli autovalori di una matrice hermitiana. Io _do_ uso gfortran come indicato nella domanda. Non ho problemi a compilare i programmi Fortran senza chiamate a LAPACK. Poiché OS X è a 64 bit, non penso che il problema sia che non è disponibile una versione a 64 bit. – Jonas

+0

Sì, i documenti lo hanno chiarito. Penso che se LAPACK richiede che il metodo sia collegato, il tuo compito è trovare la libreria in cui vive e aggiungerla al tuo percorso di collegamento. – duffymo