linux下Fortran編譯Lapack、clapack庫及使用的方法

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 <cstdlib>  
#include <iostream>
using namespace std;

#include<F2CLIBS/f2c.h>
//由於程序是C++,而CLAPACK是C語言寫的,因此在此處用extern關鍵字
extern"C"
{
	#include<clapack.h>
}
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<M;i++) 
			cout<<b[i]<<endl;	
	else
	    cout<<"Failed."<<endl;

	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
相關文章
相關標籤/搜索