[英]Linking LAPACK in Fortran on Mac OS X
我認為這是一個標准的菜鳥問題,但在整個上午搜索網絡后,我決定不管怎么說。 我在Mac OS 10.9上,我想從Fortran程序中調用LAPACK特征值例程。 我有幸在昨天被介紹給Fortran,所以請原諒任何愚蠢的錯誤。
這是我想要運行的最小例子:
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是Accelerate框架的一部分,所以我嘗試了類似的東西:
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
我不確定Accelerate框架是否有對heevd(A,eigs)的好的fortran95調用。 下面,我將zheevd lapack子例程(包含其所有工作空間變量)包裝起來,以保持調用的良好和緊密。 您可以將這樣的丑陋存儲在可以在程序中加載的某個外部模塊中。 我認為intel MKL具有大多數lapack95接口,並且os x框架可能還有其他更好的方法。 下面的代碼匯編為:
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
此鏈接表明缺少的方法是英特爾庫調用:
我想知道它在Mac上的等效產品在哪里? 你有gfortran嗎?
http://gcc.gnu.org/wiki/GFortranBinaries
底部消息是否表明沒有64位版本可用?
對不起 - 問題多於答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.