Fortran 实用编程 Fortran Coder 研讨团队 http://www.fcode.cn 系列视频教程 我们的网址是 fcode.cn,那里有很多有用的资源,欢迎大家访问我们的网站~ 1
关于 Fortran Coder Fortran Coder 始于2006年,是一个以科学计算编程为主题的非盈利性研讨团体。大多数由各行业高等学府学生,研究人员及生产一线的工作人员组成。 研讨内容涉及:Fortran77/90/95/2003/2008语法规范,各平台32位及64位编译器,IMSL,MKL,Lapack 等数学函数库,MPI,OpenMP,Coarray 并行及高性能计算,winteracter / DisLin / Matfor / GTKFortran 等绘图及界面库。 Fortran Coder最早可以追溯到2006年 是一个以科学计算编程,尤其是以Fortran编程为主题的非营利性专业组织 欢迎大家加入我们的团队中来,为推广Fortran贡献一份力量 2
关于本套视频 本套视频以解决实际问题为主要目的,旨在为您解答课本上较少涉及到的实际问题。通过本套视频,您会更容易了解: 如何查找错误?如何解决错误? 如何学习 Fortran2003 和 Fortran2008 语法? 如何用最通俗易懂的写法解决实际问题? 如何看懂别人的优秀代码并为自己所用?如何让自己的代码更优美、更普适? 本套视频由 Fortran Coder 研讨团队录制,供所有 Fortran 程序员和学习者免费自由的观看,您可随意的传播它。但请保证视频完整性。 我们将会不定期的更新本套视频,请持续关注我们的网站、QQ群! 同时,如果您对 Fortran 相关有自己的见解,并愿意通过录制视频的方式与其他人分享,请联系我们! 停留1秒 3
第三方函数库的使用 第五讲 讲解人:雪球 gao@fcode.cn http://www.fcode.cn 讨论QQ群:2338021 应用篇 第 五 讲 第三方函数库的使用 讲解人:雪球 gao@fcode.cn http://www.fcode.cn 讨论QQ群:2338021 今天是我们基础篇的第11讲,本期我们讲介绍 Fortran 内部文件的使用 我是主讲人 盐光, 这是我的邮箱,如果对本期内容有什么疑问,欢迎给我的邮箱发信咨询 这是我们的网站网址 和 QQ群 希望大家通过这些联系方式与我们产生互动~ 4
1 2 3 4 函数库的通常组成 Linux命令行使用Lapack IVF+VS使用IMSL IVF+VS使用MKL 目 录 目 录 1 函数库的通常组成 2 Linux命令行使用Lapack 3 IVF+VS使用IMSL 4 IVF+VS使用MKL 今天的主要内容 分为以下3个部分 第一部分是 内部文件的简介 第二部分是 write内部文件用法 第三部分是 read内部文件用法 5
函数库的通常组成 重要: 任何函数库的使用方法,都不能完全照抄任何教程,包括本视频!! 原因: 函数库有两种发布方式:源码+工程方式;二进制方式 函数库的二进制方式,又针对不同的操作系统,平台,编译器品牌和版本 还可能有32位,64位的区别 还可能有串行,并行,集群等不同版本 函数库的源码+工程方式:针对不同操作,平台,编译器的编译方式不同 加之,函数库自身的版本亦有不同。
函数库的通常组成 大多数函数库,包含(或部分包含)以下内容: 内容 通常所在的文件夹 开源函数库 闭源函数库 文档 document,docs,help,notes,man 可能提供 提供 源代码 src,source,code 不提供 接口文件 src,source,interface 包含文件 include 库文件 lib 范例代码 test,examples,demo 其他工具 bin,tools 运行时库 redist
函数库的通常组成 要了解函数库使用的原理,而不是仅仅会操作 所有函数库的使用,归纳起来,总是离不开这么五个内容: include (mod) 编译时用到 lib 链接时用到 DLL Runtime Library 运行时用到 路径(在哪儿?) 一般只设置一次 把include的路径 告知编译器 把lib的路径 把运行时库加入 系统目录 或path目录 文件名(哪个?) 一般每个工程都需要设置 把所需的 module告知编译器 把所需的lib文件
1 2 3 4 函数库的通常组成 Linux命令行使用Lapack IVF+VS使用IMSL IVF+VS使用MKL 目 录 目 录 1 函数库的通常组成 2 Linux命令行使用Lapack 3 IVF+VS使用IMSL 4 IVF+VS使用MKL 今天的主要内容 分为以下3个部分 第一部分是 内部文件的简介 第二部分是 write内部文件用法 第三部分是 read内部文件用法 9
Linux命令行使用Lapack Lapack 是一个开源的函数库,主要处理线性代数问题 (各种线性问题的分解,特征值,奇异值,最小二乘等) 由 Univ. of Tennessee; Univ. of California, Berkeley; Univ. of Colorado Denver; and NAG Ltd 开发贡献。 可以在 http://www.netlib.org/lapack/ 查阅信息及下载 它提供 Fortran和 C 接口,在各种编译器和操作系统平台上都可以运行 目前的版本是 3.6.1 它自身包含了 BLAS 这个基础线性代数函数库,而 Intel 的 MKL 函数库又包含了它,并且对其进行了底层优化
Linux命令行使用Lapack 下载 解压缩 编辑 make.inc 文件 编辑 makefile 文件 make 编译 安装 使用
Linux命令行使用Lapack 来看一个示范代码: sgesv 用来求取一个 Ax=b 的线性方程组 我们传入了 A 和 b 及其大小 因此我们用aa保存原来的值 最后,我们用 matmul 来检查计算是否正确。
Linux命令行使用Lapack gfortran test_lapack.f90 -llapack -lrefblas -L ./lapack-3.6.1/ Lapack 在 linux 使用简单 由于是 F77 格式的接口,没有用到 module,也就没有用到 include 包含文件 使用过程中,只是用 -L 增加了lib文件的路径 -llapack -lrefblas 告知了lib文件的文件名 (如果复制lib文件到 /usr/lib 等目录,或添加到 LD_LIBRARY_PATH 环境变量中,则上面的第一步不需要每次都进行)
1 2 3 4 函数库的通常组成 Linux命令行使用Lapack IVF+VS使用IMSL IVF+VS使用MKL 目 录 目 录 1 函数库的通常组成 2 Linux命令行使用Lapack 3 IVF+VS使用IMSL 4 IVF+VS使用MKL 今天的主要内容 分为以下3个部分 第一部分是 内部文件的简介 第二部分是 write内部文件用法 第三部分是 read内部文件用法 14
IVF+VS使用IMSL IMSL 在 Compaq Visual Fortran 的专业版中捆绑销售,安装后自动进行了合理的配置。 CVF中使用的IMSL是4.0版本,其用法简单,use IMSL 就能搞定一切。 现在主流的 IMSL 版本是7.0和6.0,主要支持 IVF。而IVF也只能使用5.0以上版本。 它的使用方法已经和 4.0 截然不同。但是,依然遵循前面说过的五个内容。 注意:IMSL 是闭源库,不提供源代码,而且有 CNL和FNL的区分,也有32位和64位的区分,同时,面向不同编译器的发行也是不同的。 在购买/下载的时候要注意。
IVF+VS使用IMSL 我们附带了一个pdf文档 它显示了 IMSL 的版本 分别支持什么平台 什么操作系统 什么编译器 什么位数 很可惜的是,它几乎不支持 开源的编译器
IVF+VS使用IMSL 关于32/64位数的注意: 有一些 IVF64位编译器 也同时提供了32位编译器 (选择安装) 但是配置和使用时,要注意分别对待。
IVF+VS使用IMSL IMSL的安装非常简单,一路下一步就可以了,可以安装在任何目录。 安装好之后,我们一定要移步到安装目录,看看安装目录里面都有什么东西: 这里 include 和 lib 比较重要 我们需要首先告知编译器,这两个文件夹的位置
IVF+VS使用IMSL 然后,我们要把所需的模块告诉编译器 告诉的方法是,use 某个模块。 IMSL 从 5.0 开始,统一把函数放入 numerical_libraries 模块中 注意: 某些版本的IMSL有bug 在 use numerical_libraries 时会出错
IVF+VS使用IMSL 之后,编译就可以成功了。 但是我们会遇到链接错误,我们还需要告诉编译器,所需的函数在哪里提供? 我们可以用IMSL提供的包含文件,也可以直接添加lib文件到工程里 这些方法是等效的:
IVF+VS使用IMSL 之后,链接就可以成功了。 如果你上一步使用的是 动态链接库 形式,那么可能还会遇到这种问题: 这种情况下,你还需要找到 imsl_dll.dll 的位置 把这个路径添加到环境变量 path 中
IVF+VS使用IMSL 总结一下,IMSL 的五步走: 一定要翻一遍安装目录!!! include (mod) lib 编译时用到 lib 链接时用到 DLL Runtime Library 运行时用到 路径(在哪儿?) 一般只设置一次 把include的路径 告知编译器 把lib的路径 把运行时库加入 系统目录 或path目录 文件名(哪个?) 一般每个工程都需要设置 把所需的 module告知编译器 把所需的lib文件
1 2 3 4 函数库的通常组成 Linux命令行使用Lapack IVF+VS使用IMSL IVF+VS使用MKL 目 录 目 录 1 函数库的通常组成 2 Linux命令行使用Lapack 3 IVF+VS使用IMSL 4 IVF+VS使用MKL 今天的主要内容 分为以下3个部分 第一部分是 内部文件的简介 第二部分是 write内部文件用法 第三部分是 read内部文件用法 23
IVF+VS使用MKL MKL 是 Intel 公司出品的数学函数库,有C和Fortran接口 比如 Lapack,Blas,FFTW 等,都包含在 MKL 当中 (并且为他们设计了 F95 接口) 我们将会用前面linux下调用lapack的代码来示范。 这段代码,可以完全不修改的情况下用ifort编译,并调用MKL链接(F77接口)
IVF+VS使用MKL 对于 F77 接口,不需要指定include Intel 安装时自动指定了 lib 的路径。 因此,我们只要进行一个操作即可:
IVF+VS使用MKL F90 接口相比 F77 接口,更简单,函数参数更少 假定形状避免了传递数组(矩阵)大小 可选参数避免了不关心的输出参数 但是,它需要额外的配置:
IVF+VS使用MKL 在某些情况下 MKL 并不直接提供 include 下的 mod 文件 使用MKL以后,如果使用动态库的形式,也可能遇到找不到 DLL 的问题 此时,我们建议用静态库形式发布。否则,应该同时发布 \redist\ia32\mkl 下的其他 DLL
总结 第三方函数库的使用,总结为 五步走: 告知编译器include路径 告知编译器lib路径 告知编译器所需的module(include) 编译错误:Error in opening the compiled module file. Check INCLUDE paths. [IMSL] 告知编译器所需的lib文件 无法解析的外部符号 _OPERATION_I_mp_SMI,该符号在函数 _MAIN__ 中被引用 unresolved external symbol _OPERATION_I_mp_SMI 告知操作系统运行时库的位置 无法启动此程序,因为计算机中丢失 imsl_dll.dll ,尝试重新安装此应用程序 具体要 use 哪个module? 链接哪个 lib 文件? 参考说明书,或 翻安装目录!不可照抄任何一个教程。
感谢收看! Fortran Coder Group http://www.fcode.cn 下一讲:f90SQL调用数据库 敬请关注 & 期待 还有疑问?请联系我们 Fortran Coder Group http://www.fcode.cn 今天我们的课程就到这里,谢谢大家的观看 下一讲呢,我们会讲IDE高级操作 希望大家继续关注我们,谢谢~ 29