科普簡介
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)為私密看不了了。其他的都沒有真正有用的葡缰,以下方案通過兩臺(tái)windows系統(tǒng)的電腦的測(cè)試,能成功運(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è)也自動(dòng)勾選了)
將C:/MInGW/bin路徑添加進(jìn)系統(tǒng)PATH環(huán)境,C:/MInGW/lib路徑添加進(jìn)系統(tǒng)Lib環(huán)境(親測(cè)只添加bin進(jìn)PATH也不影響)注竿。這里可以測(cè)試以下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í)行完會(huì)報(bào)兩個(gè)錯(cuò)誤侥祭,但是目前來看并不影響使用lapack叁执,有大神懂這個(gè)的話茄厘,可以指點(diǎn)一下,謝謝徒恋。
第五步:把生成的三個(gè)lib*.a文件拷貝到MinGW/lib下
第六步:代碼的測(cè)試與運(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
如果對(duì)于linux下的編譯鏈接需要加上鏈接地址径筏,比如:
gfortran -o test test.f90 -L/opt/local/lib -llapack -lrefblas
在源代碼中不需要使用任何use之類的函數(shù)葛假,直接調(diào)用所需函數(shù)即可。
以下給一個(gè)測(cè)試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