2013-11-01 2 views
5

Я представляю, что это стандартная проблема с noob, но, проведя все утро в Интернете, я все равно решил вас обмануть. Я нахожусь в Mac OS 10.9, и я бы хотел вызвать LAPACK для собственной функции из программы Fortran. Мне было приятно познакомиться с Фортраном только вчера, поэтому, пожалуйста, извините любые глупые ошибки.Ссылка на LAPACK в Fortran на Mac OS X

Это минимальный пример, который я хочу, чтобы запустить:

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 

я узнал, что на OS X, 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

Я не уверен, что ракурс Accelerate имеет приятный fortran95 вызов heevd (A, eigs). Ниже я завершаю подпрограмму zheevd lapack (со всеми переменными рабочего пространства), чтобы держать вызов красивым и жестким. Вы можете хранить такое уродство внутри внешнего модуля где-нибудь, который вы можете загрузить в своих программах. Я думаю, что у Intel MKL есть большинство интерфейсов lapack95, и могут быть другие лучшие способы с os x framework. Код ниже компилируется:

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

Эта ссылка показывает, что отсутствует метод является библиотека Intel звоните:

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

Интересно, где его эквивалент жизни на Mac? У вас есть gfortran?

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

Свидетельствует ли нижнее сообщение, что нет 64-разрядной версии доступна?

Извините, больше вопросов, чем ответов.

+0

Отсутствующий метод является одним из LAPACK. heevd вычисляет собственные значения эрмитовой матрицы. Я использую gfortran, как указано в вопросе. У меня нет проблем с компиляцией программ Fortran без вызовов LAPACK. Поскольку OS X 64-разрядная, я не думаю, что проблема в том, что 64-разрядная версия не доступна. – Jonas

+0

Да, документы сделали это ясно. Я думаю, если LAPACK требует, чтобы этот метод был связан, ваша задача - найти библиотеку, в которой она живет, и добавить ее в ваш путь к ссылке. – duffymo

Смежные вопросы