Windows上安裝lapack函數(shù)庫與gfortran調(diào)用實(shí)例

科普簡介

Intel核心數(shù)學(xué)庫(Math Kernel Library, MKL)是一種數(shù)值函數(shù)庫,其中就包括基本線性代數(shù)子系統(tǒng)庫(BLAS, level 1, 2, 3)和線性代數(shù)庫(LAPACK)等,這里直接安裝lapack函數(shù)庫。

直接使用ifort來編譯運(yùn)行的可以參考中科大的中文教程http://scc.ustc.edu.cn/zlsc/user_doc/html/intel-mkl/intel-mkl.html#id11

-----------------------------------------------2024年1月5日更新------------------------------建議采用openblas-------------------------

下載openblas,解壓,把文件夾拷貝到mingw的安裝目錄,注意不是mingw64,編譯選項(xiàng)更加簡單-lopenblas


----------------------------------------------以下是2019年寫的內(nèi)容------------------------------------------------------

-----------------以下內(nèi)容在2024年已經(jīng)無法成功實(shí)現(xiàn)了,原因未知。MinGw, Mingw64,cmake, 全都試驗(yàn)了-----------------------------

在網(wǎng)上找了幾個(gè)有用的鏈接,最近發(fā)現(xiàn)有用的都轉(zhuǎn)為私密看不了了。其他的都沒有真正有用的,以下方案通過兩臺windows系統(tǒng)的電腦的測試,能成功運(yùn)行g(shù)fortran+lapack。

第一步:下載MinGW并安裝Gfortran和MSYS相關(guān)環(huán)境。

需要勾選:Basic Setup下面的mingw-developer-toolkit, mingw32-base, mingw32-gcc-fortran, msys-base(注意,mingw32-base關(guān)系到是否有mingw32-make.exe文件,而勾選了第一個(gè),最后一個(gè)也自動勾選了)

將C:/MInGW/bin路徑添加進(jìn)系統(tǒng)PATH環(huán)境,C:/MInGW/lib路徑添加進(jìn)系統(tǒng)Lib環(huán)境(親測只添加bin進(jìn)PATH也不影響)。這里可以測試以下gfortran是否成功安裝。

第二步:下載lapack.tar.gz壓縮文件,解壓。

第三步:在解壓的lapack文件夾下,修改make.inc.example文件名為make.inc。接著修改Makefile文件:

找到以下代碼

lib: lapacklib tmglib?

#lib: blaslib variants lapacklib tmglib

把上面一行用#注釋掉,下面一行取消注釋。

第四步:在Makefile的所在文件夾,按住shift鍵,同時(shí)鼠標(biāo)右鍵,打開powershell或者是cmd或者命令提示符,輸入mingw32-make.exe,按下回車鍵,執(zhí)行。

我這邊執(zhí)行完會報(bào)兩個(gè)錯(cuò)誤,但是目前來看并不影響使用lapack,有大神懂這個(gè)的話,可以指點(diǎn)一下,謝謝。

第五步:把生成的三個(gè)lib*.a文件拷貝到MinGW/lib下



第六步:代碼的測試與運(yùn)行。(容易忘記,備注)

當(dāng)庫文件都放到了指定目錄(比如MinGW/lib),而且這個(gè)目錄的地址也是系統(tǒng)環(huán)境變量的默認(rèn)庫文件鏈接時(shí),lapack的編譯鏈接命令只需要在常規(guī)fortran代碼的執(zhí)行命令基礎(chǔ)上加上-llapack -lrefblas即可。比如:

gfortran test.f90 -o test -llapack -lrefblas

如果對于linux下的編譯鏈接需要加上鏈接地址,比如:

gfortran -o test test.f90 -L/opt/local/lib -llapack -lrefblas

在源代碼中不需要使用任何use之類的函數(shù),直接調(diào)用所需函數(shù)即可。

以下給一個(gè)測試test.f90例子

program main

implicit none

real :: a(3,3),b(3)

integer :: v(3),iflag

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

第八步:矩陣求逆實(shí)例

使用module和interface可以把函數(shù)封裝起來,可以像sin()等內(nèi)置函數(shù)一樣,十分簡潔地調(diào)用函數(shù)。并且可以把許多所需的函數(shù)都放進(jìn)去,從而構(gòu)成一個(gè)函數(shù)倉庫


比如以下示例

module?func_module

implicit?none

interface?func

module?procedure?func

end?interface

contains

function?func(m1)?result(m2)

real*8,?intent?(in)?::?m1(:,:)?!?input

real*8??????????????::?m2(size(m1,1),size(m1,2))?!?output

m2?=?m1+1

end?function

end?module?func_module

Program?main

use?func_module

real*8,parameter::??A(0:1,0:1)=reshape((/1,2,3,4/),(/2,2/))

print*,?A

print*,?func(A)

End?Program

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容