科普简介
Intel核心数学库(Math Kernel Library, MKL)是一种数值函数库,其中就包括基本线性代数子系统库(BLAS, level 1, 2, 3)和线性代数库(LAPACK)等,这里直接安装lapack函数库。
直接使用ifort来编译运行的可以参考中科大的中文教程http://scc.ustc.edu.cn/zlsc/user_doc/html/intel-mkl/intel-mkl.html#id11
-----------------------------------------------2024年1月5日更新------------------------------建议采用openblas-------------------------
下载openblas,解压,把文件夹拷贝到mingw的安装目录,注意不是mingw64,编译选项更加简单-lopenblas
----------------------------------------------以下是2019年写的内容------------------------------------------------------
-----------------以下内容在2024年已经无法成功实现了,原因未知。MinGw, Mingw64,cmake, 全都试验了-----------------------------
在网上找了几个有用的链接,最近发现有用的都转为私密看不了了。其他的都没有真正有用的,以下方案通过两台windows系统的电脑的测试,能成功运行gfortran+lapack。
第一步:下载MinGW并安装Gfortran和MSYS相关环境。
需要勾选:Basic Setup下面的mingw-developer-toolkit, mingw32-base, mingw32-gcc-fortran, msys-base(注意,mingw32-base关系到是否有mingw32-make.exe文件,而勾选了第一个,最后一个也自动勾选了)
将C:/MInGW/bin路径添加进系统PATH环境,C:/MInGW/lib路径添加进系统Lib环境(亲测只添加bin进PATH也不影响)。这里可以测试以下gfortran是否成功安装。
第二步:下载lapack.tar.gz压缩文件,解压。
第三步:在解压的lapack文件夹下,修改make.inc.example文件名为make.inc。接着修改Makefile文件:
找到以下代码
lib: lapacklib tmglib
#lib: blaslib variants lapacklib tmglib
把上面一行用#注释掉,下面一行取消注释。
第四步:在Makefile的所在文件夹,按住shift键,同时鼠标右键,打开powershell或者是cmd或者命令提示符,输入mingw32-make.exe,按下回车键,执行。

我这边执行完会报两个错误,但是目前来看并不影响使用lapack,有大神懂这个的话,可以指点一下,谢谢。
第五步:把生成的三个lib*.a文件拷贝到MinGW/lib下

第六步:代码的测试与运行。(容易忘记,备注)
当库文件都放到了指定目录(比如MinGW/lib),而且这个目录的地址也是系统环境变量的默认库文件链接时,lapack的编译链接命令只需要在常规fortran代码的执行命令基础上加上-llapack -lrefblas即可。比如:
gfortran test.f90 -o test -llapack -lrefblas
如果对于linux下的编译链接需要加上链接地址,比如:
gfortran -o test test.f90 -L/opt/local/lib -llapack -lrefblas
在源代码中不需要使用任何use之类的函数,直接调用所需函数即可。
以下给一个测试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
第八步:矩阵求逆实例
使用module和interface可以把函数封装起来,可以像sin()等内置函数一样,十分简洁地调用函数。并且可以把许多所需的函数都放进去,从而构成一个函数仓库
比如以下示例
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