Windows上安装lapack函数库与gfortran调用实例

科普简介

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容