计算化学公社

标题: Fortran数学库求助 [打印本页]

作者
Author:
wxhwbh    时间: 2019-5-27 22:31
标题: Fortran数学库求助
因为是看彭国伦的书学的Fortran,最后一章介绍了IMSL库,看着挺方便的。但我的Intel Visual Fortran并没有这个库,于是自己装了IMSL 7.0,结果发现license文件到期不能用,网上的各种方法也不好使。另一方面,IVF自带的MKL库用起来贼麻烦,比如我想求矩阵特征值,IMSL只需要一个参数,而MKL的函数要定义一大堆参数,而且编译很容易出错(一晚上编译没成功过)。想问问大家Fortran还有没有什么好的数学库吗?或者有人有能用的IMSL license文件吗?非常感谢!

作者
Author:
sobereva    时间: 2019-5-28 06:00
IMSL已经完全过时了,效率也明显不及MKL。
你用MKL方式不对所以误认为麻烦。其实超级简单,只要把“项目”-“属性”-Fortran-Libraries里的Use Intel Math kernel Library开启即可,什么额外的都不需要做。目前的MKL都有对应LAPACK95、BLAS95的界面(需要写use LAPACK95和use BLAS95),参数比原本的LAPACK、BLAS的参数啰啰嗦嗦一堆的界面少太多了,调用极其容易,比如gemm(A,B,C)就是矩阵乘。
作者
Author:
wxhwbh    时间: 2019-5-28 12:15
sobereva 发表于 2019-5-28 06:00
IMSL已经完全过时了,效率也明显不及MKL。
你用MKL方式不对所以误认为麻烦。其实超级简单,只要把“项目” ...

感谢社长,确实是我使用的方式不对。按照您的方法开头写上use LAPACK95没问题了。但调用具体函数时编译出现以下错误:

1>crawdad01.obj : error LNK2019: 无法解析的外部符号 _LA_SYEV,该符号在函数 _MAIN__ 中被引用
1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用

想问问这个是什么原因呢?
作者
Author:
wxhwbh    时间: 2019-5-28 14:57
sobereva 发表于 2019-5-28 06:00
IMSL已经完全过时了,效率也明显不及MKL。
你用MKL方式不对所以误认为麻烦。其实超级简单,只要把“项目” ...

很奇怪,现在就算我注释掉调用MKL的代码(use和call什么的),原本能运行的程序也会编译失败,并报错:

1>LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
1>Debug\Console1.exe : fatal error LNK1120: 1 个无法解析的外部命令

这个又是怎么一回事呢?
作者
Author:
gsbear    时间: 2019-5-28 16:42
wxhwbh 发表于 2019-5-28 14:57
很奇怪,现在就算我注释掉调用MKL的代码(use和call什么的),原本能运行的程序也会编译失败,并报错:
...

从出错信息看,应该是你使用的Visual Studio工程模板不对,_WinMain@16一般是选择成C语言的Windows Application模板了。如果你只是写控制台程序的话使用Windows Console Application的模板
作者
Author:
wxhwbh    时间: 2019-5-28 18:37
gsbear 发表于 2019-5-28 16:42
从出错信息看,应该是你使用的Visual Studio工程模板不对,_WinMain@16一般是选择成C语言的Windows Appli ...

谢谢您。我重新弄了个项目和源代码文件,把源代码粘贴过去才行得通。我其实用的是Windows Console Application,而且之前编译过是可行的,但调用MKL后就各种报错。我猜是按网上的方法折腾了一番可能哪弄出问题来了。
不过现在调用具体函数还是会出问题,报错:

1>Source1.obj : error LNK2019: 无法解析的外部符号 _LA_SYEV,该符号在函数 _MAIN__ 中被引用
1>Debug\Console4.exe : fatal error LNK1120: 1 个无法解析的外部命令

不知道是哪里出了问题。
作者
Author:
gsbear    时间: 2019-5-31 11:47
wxhwbh 发表于 2019-5-28 18:37
谢谢您。我重新弄了个项目和源代码文件,把源代码粘贴过去才行得通。我其实用的是Windows Console Applic ...

这个是链接错误,应该是没有找到LA_SYEV函数,估计是链接过程中没有把MKL的库链接上,估计得自己修改工程配置把相关库的lib文件链接上,或者就是一开始模板没选对。
作者
Author:
wxhwbh    时间: 2019-5-31 14:53
gsbear 发表于 2019-5-31 11:47
这个是链接错误,应该是没有找到LA_SYEV函数,估计是链接过程中没有把MKL的库链接上,估计得自己修改工程 ...

谢谢您。我发现可能我调用的函数有问题。我查阅了MKL的手册,比如对于计算特征值的HSEQR函数,手册上有这么几种可选:

Syntax
call shseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
call dhseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
call chseqr(job, compz, n, ilo, ihi, h, ldh, w, z, ldz, work, lwork, info)
call zhseqr(job, compz, n, ilo, ihi, h, ldh, w, z, ldz, work, lwork, info)
call hseqr(h, wr, wi [,ilo] [,ihi] [,z] [,job] [,compz] [,info])
call hseqr(h, w [,ilo] [,ihi] [,z] [,job] [,compz] [,info])

对于最后一种hseqr,使用的参数最少,而且我只需要特征值而不需要特征向量,因此应该是最好的选择。但调用这个函数会报错:

error #6285: There is no matching specific subroutine for this generic subroutine call.   [HSEQR]

而调用前面的参数多点的函数,比如dhseqr什么的,编译就没问题。您知道这个是什么原因吗?非常感谢。
作者
Author:
gsbear    时间: 2019-6-1 12:02
wxhwbh 发表于 2019-5-31 14:53
谢谢您。我发现可能我调用的函数有问题。我查阅了MKL的手册,比如对于计算特征值的HSEQR函数,手册上有这 ...

hseqr函数的必选参数有两个h,w如果你提供的参数没有这两个信息自然会编译出错,而其他的可选参数是否有规定哪些必须一起出现,你可能要详细看一下MKL库的手册。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3