当前位置: 首页 > 工具软件 > LAPACK > 使用案例 >

linux编译lapack,linux下Fortran编译Lapack、clapack库及使用的方法

卜勇
2023-12-01

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

 类似资料: