Lapack: Linux下的编译和使用

LAPACK在实际应用中的例子还有待挖掘,持续更新。首先,在lapack网站下载最新的lapack-3.4.2压缩包,解压。在解压后的lapack-3.4.2目录下面有一个make.inc.example文件,将其改为make.inc(如果是gfortran的编译器,则基本不需要修改这个文件)。接着把makefile文件中的:

lib: lapacklib tmglib
#lib: blaslib variants lapacklib tmglib

改为:

#lib: lapacklib tmglib
lib: blaslib variants lapacklib tmglib

然后打开终端,切换到当前目录,输入:sudo make 即可(这个过程还是蛮长的♥)。

编译完成后文件夹下出现liblapack.a,librefblas.a,libtmglib.a 三个库文件,把librefblas.a重命名为libblas.a,然后一起拷贝到/usr/lib(或者其它你方便使用的文件目录内,在使用的时候把路径写对就行)。

下面给出一个完整的测试程序(包含两个文件:main.f90和makefile):

① main.f90中的内容(红色部分为函数调用语句):

program test
implicit none

integer,parameter::n=2,lda=2,nrhs=1,ldb=2
real*8::A(lda,n),b(n,nrhs)
integer::ipiv(n), info, i, j
A=reshape((/1,3,2,-4/),(/2,2/))
b=reshape((/3,-1/),(/2,1/))

write(*,*)'The linear system is:'
write(*,*)'A:'
write(*,'(2F13.7)') ((A(i,j),j=1,lda),i=1,n)
write(*,*)'b:'
write(*,'(2f13.7)') ((B(i,j),i=1,ldb),j=1,nrhs)

call dgesv(n,nrhs,A,lda,ipiv,b,ldb,info)

write(*,*) 'INFO =', info
write(*,*)'The solution x is:'
write(*,'(2f13.7)') ((B(i,j),i=1,ldb),j=1,nrhs)
write(*,*)

end program test

② makefile中的内容:

# This is a makefile for test for FORTRAN program

LIB = -L /usr/lib/
LIBB = -llapack -lblas

OBJS = main.o
EXECNAME = main

$(EXECNAME) : $(OBJS)
gfortran -o $(EXECNAME) $(OBJS) $(LIB) $(LIBB)

main.o : main.f90
gfortran -c main.f90

.PHONY : clean exe
exe :
./$(EXECNAME)
clean :
rm -f $(OBJS);
rm -f $(EXECNAME)
rm -f *~

进入两文件所在目录,终端输入:make
不出错的话,在当前目录得到:a.out文件, 接着输入:make exe或者./main
输出结果为:

The linear system is:
A:
1.0000000 2.0000000
3.0000000 -4.0000000
b:
3.0000000 -1.0000000
INFO = 0
The solution x is:
1.0000000 1.0000000