layout: post title: 【转】Fortran的奇淫技巧 categories:
原文: Fortran Cookbook:收集Fortran的奇淫技巧
本人准备写一本关于Fortran语言技巧的资料, 草稿提纲如下:
数组
变量声明
文件操作
打印、格式化
命令行参数
多进程、多线程
常用内置函数
浮点计算
字符串
C函数之间互调
调试
特色控制语句
程序结构
浮点和整数之间的转换: 取整, 截断函数
几个数学函数
数组置零:
数组切片置零:
数组Copy:
数组运算
IO读写:
说明
如果用过Matlab的话, 就比较容易理解Fortran中多维数组的语法, 两者不同点是, 对切片语法的定义Matlab是 start_index:step:end_index, Fortran是start_index:end_index:step
程序中应该尽可能的使用数组整体操作, 代码行数会较少, 性能上也可能会带来好处
Fortran中很多内置函数都能直接用在数组上
implicit none.
Fortran默认情况下变量是不需要声明, 调试程序的时候多数人会遇见因为拼写错误, 获得一些异常结果, 将变量声明打开, 编译时会检查出这类错误.
namelist.
名字列表在调试期间和测试期间比较有用, 它可以将多个变量捆成一组, 进行集中输出和输入.
有些情况下可以用namelist代替命令行参数传入:将需要的参数以namelist的方式传入程序, 避免了繁琐的参数解析过程!
namelist确实很方便, 比如对于数组A(3,2), 可以使用类似
A(1:3,2) = 5,3,4
A(1:3,1) = 2,0,9
或者A = 2,0,9,5,3,4
这样的方式来输入namelist在调试和测试中使用是非常不错的!举个例子:
program main implicit none integer ::a real(4)::x real(8)::y namelist /debug1/ a namelist /debug2/ x, y namelist /debug3/ a, x, y a=100 x=1.1111_4 y=2.2222_8 write(*, nml=debug1) write(*, nml=debug2) write(*, nml=debug3) end program main
Preprocess.
Fortran支持类C的预处理, fpp, 在调试程序时较有用处.
Emacs.
Emacs内置Fortran语言支持, 编码和调试都可在Emacs下进行.
understand for fortran 是阅读代码不错的工具软件, 类似SourceInsight
understand for fortran是要钱的, 破解找起来比较烦. 建议使用Doxygen生成HTML文档, 所有的调用/被调用, 引用关系全部能够生成. 在浏览器里面点点就知道程序的结构了.
linux工具:gdb, ddd, nm, ldd, od.
gdb+ddd通用调试工具; nm可以看目标文件的符号等信息, 可以帮助诊断连接中的问题, 比如找不到符号;
ldd能用来看程序需要的共享库信息; od能直接看二进制文件内容.
创建临时文件: open(unit=11, status='scratch',...)
查看IO操作状态
流文件(二进制文件)
异步IO
第三方库
浮点运算异常
浮点数运算