1、获取lapack源代码linux
wget http://www.netlib.org/lapack/lapack-3.6.1.tgzios
2、解压后编译数组
cd /mybk/lapack-3.6.1函数
cp make.inc.example make.inc学习
make后获得liblapack.a librefblas.a libtmglib.a测试
3、拷贝到系统库路径如/opt/local/libspa
4、测试:.net
tetst.fcode
! gfortran -o test test.f -L/opt/local/lib -llapack -lrefblas
program main
implicit none
real :: a(3,3),b(3)
integer :: v(3),iflag
!external sgesv
a=reshape([2.0,0.0,0.0,0.0,3.0,0.0,0.0,0.0,4.0],[3,3])
b=[998.0,999.0,1000.0]
print *,'a=',a
print *,'b=',b
call sgesv(3,1,a,3,v,b,3,iflag)
print *,'solve=',b
end program main
gfortran -o test test.f -L/opt/local/lib -llapack -lrefblasip
$ ./test
a= 2.00000000 0.00000000 0.00000000 0.00000000 3.00000000 0.00000000 0.00000000 0.00000000 4.00000000
b= 998.000000 999.000000 1000.00000
solve= 499.000000 333.000000 250.000000
test2.s
! gfortran -o test2 test2.f -L/opt/local/lib -llapack -lrefblas
program Console1
external dgesv
integer n, lda, nrhs, ldb
parameter (n=2,lda=2,nrhs=1,ldb=2)
double precision A(lda,n)
double precision b(ldb,nrhs)
character byebye
integer ipiv(n), info, i, j
A(1,1)=1
A(1,2)=2
A(2,1)=3
A(2,2)=4
B(1,1)=5
B(2,1)=6
write(*,*) 'Hello World'
call dgesv(n,nrhs,A,lda,ipiv,b,ldb,info)
write(*,*) 'INFO =', info
write(*,*) ((A(i,j),i=1,lda),j=1,n)
write(*,*) ((B(i,j),i=1,ldb),j=1,nrhs)
write(*,*) "END OF PROGRAM..."
end program Console1
$ gfortran -o test2 test2.f -L/opt/local/lib -llapack -lrefblas
$ ./test2
Hello World
INFO = 0
3.0000000000000000 0.33333333333333331 4.0000000000000000 0.66666666666666674
-3.9999999999999987 4.4999999999999991
或直接安装
sudo apt install libopenblas-base libopenblas-dev liblapacke liblapacke-dev liblapack3 liblapack-dev libtmglib3 libtmglib-dev
编译: gfortran -o test2 test2.f -llapack
5、CLAPACK的安装与简单使用
CLAPACK是没有源的,只能从其主页上下载源码本身编译http://www.netlib.org/clapack/clapack.tgz,解压。在其目录下的INSTALL目录中有make.inc的范本文件,好比在linux下就是make.inc.LINUX,将这个文件拷到CLAPACK目录下并更名为make.inc。
首先编译F2CLIBS,用于将fortran转换为c语言,在CLAPACK目录下,make f2clib,在
CLAPACK/F2CLIBS下就会生成libf2c.a。
编译tmglib,在CLAPACK目录下,make tmglib,会生成CLAPACK/tmglib_LINUX.a。
编译blas,在CLAPACK目录下,make blaslib,会生成CLAPACK/blas_LINUX.a。
最后是编译CLAPACK,make,会生成CLAPACK/lapack_LINUX.a
CLAPACK下的clapack.h就是所须要的头文件,除此以外还须要的一个头文件是F2CLIBS/f2c.h。
为方便使用,将必要的include文件和lib文件集中到一个目录下(如/mybk/CLAPACK):
~/prg/Fortran95/lapack$ tree /mybk/CLAPACK
/mybk/CLAPACK
├── include
│ ├── blaswrap.h
│ ├── clapack.h
│ └── F2CLIBS
│ └── f2c.h
└── lib
├── blas_LINUX.a
├── lapack_LINUX.a
├── libcblaswr.a
├── libf2c.a
└── tmglib_LINUX.a
如今就经过使用CLAPACK中的一个函数sgesv_解线性方程组来学习一下使用的方法。
包括此函数在内的全部函数能够在CLAPACK/SRC下找到源代码,并在代码中有函数参数的说明信息。sgesv_的代码文件就是sgesv.c。
int sgesv_(integer *n, integer *nrhs, real *a, integer *lda, integer *ipiv, real *b, integer *ldb, integer *info)
sgesv_的功能是使用LU分解法解线性方程组AX=B,其中A是一个n*n的方阵。
integer *n, 方程的个数,也就是A的行数和列数
integer *nrhs, B的列数
real *a, 存储矩阵A数据的一维数组,在fortran中,数组是列主序存储,在此a中的二维数据也必须是列主序
integer *lda, 等于n
integer *ipiv, 一个输出数据数组,数组大小是n,具体什么功能不太明白,可是彷佛不影响最后结果,谁明白请告诉我
real *b,存储矩阵B数据的一维数组,在fortran中,数组是列主序存储,在此b中的二维数据也必须是列主序
integer *ldb, 等于n
integer *info,输出参数,若是返回此参数为0,表示函数正常退出,不然表示出错。
代码:
// g++ -o clapackdemo clapackdemo.cpp -I/mybk/CLAPACK/include /mybk/CLAPACK/lib/lapack_LINUX.a /mybk/CLAPACK/lib/blas_LINUX.a /mybk/CLAPACK/lib/tmglib_LINUX.a /mybk/CLAPACK/lib/libf2c.a
#include
#include
using namespace std;
#include
//由于程序是C++,而CLAPACK是C语言写的,因此在此处用extern关键字
extern"C"
{
#include
}
int main(void){
integer M=3;
integer N=1;
real a[9]={4,3,11,2,-1,0,-1,2,3};
real b[3]={2,10,8};
integer lda;
integer ldb;
integer INFO;
lda=M;
ldb=M;
integer ipiv[M];
sgesv_(&M, &N, a, &lda,ipiv, b, &ldb, &INFO);
if(INFO==0)
for(int i=0;i
cout<
else
cout<
return EXIT_SUCCESS;
}
编译运行:
$ g++ -o clapackdemo clapackdemo.cpp -I/mybk/CLAPACK/include /mybk/CLAPACK/lib/lapack_LINUX.a /mybk/CLAPACK/lib/blas_LINUX.a /mybk/CLAPACK/lib/tmglib_LINUX.a /mybk/CLAPACK/lib/libf2c.a
$ ./clapackdemo
-14
56
54