科普簡介
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