爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 26171|回复: 12

[经验总结] Fortran中binary和unformatted,以及要回避的坑

[复制链接]

新浪微博达人勋

发表于 2019-8-8 17:41:23 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 ljh110011 于 2019-8-8 18:25 编辑

这个帖子中心思想,是简单描述碰到的form=‘binary’form=‘unformatted’的差异和编程中需要回避的坑。最近由于开发模式时debug需要,只好重新使用超久没碰的Fortran语言。。。


编译运行Fortran程序,就要用到编译器了。2005年末发布的Compaq Visual Fortran(简称CVF)就太老旧了,已经是在淘汰边缘的产物,当然不予考虑了。之前一直在用的Intel Visual Fortran(简称IVF)软件体积又太庞大,在新设备上面重新安装一遍也挺费劲,就选用配置起来比较简单的GNU Fortran(简称GF)做编译器。
那么这时候,问题就出现在这里:
以前使用Fortran读写的时候,写二进制(GrADS用的无格式二进制)就是用form=‘binary’。用CVFIVF都能编译,然而用GF竟然编译不过。


通过调研发现,本论坛和某度等搜索引擎,都很容易搜到大量关于FORTRAN语言读写无格式二进制文件时,form=‘binary’和form=‘unformatted’的问题和争论。
参考了一些帖子,有研究提出binary和unformatted格式存在4倍关系等观点。如下:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=27204&extra=&page=1
http://bbs.06climate.com/forum.php?mod=viewthread&tid=27220
http://bbs.06climate.com/forum.php?mod=viewthread&tid=30071&highlight=Fortran%2Bbinary%2Bunformatted

当然,两者都是二进制格式,4倍这么个说法有一定的道理,因为如果设置的access='direct',form=‘unformatted’输出时,就会包含数据和记录的边界;而access='direct',form=‘binary’输出时,只包含数据;所以这种情况下,用unformatted输出的结果就会比binary的文件要大,因为它包含了数据记录的边界。那么这样写文件,当然会有区别的,但是,是否为4倍呢,这个就要实际情况实际分析。


但这两种格式本身就是不一样的,是不能简单地将两者直接进行对比的。


1. form=‘binary’ 不是Fortran标准下的,不过是某些Fortran编译器提供识别和支持,所以也很多人一直在使用,也有某些编译器如GF不支持这种设置;


2. form=‘unformatted’是符合Fortran标准的用法,而且用form=‘unformatted’,也能达到form=‘binary’ 的输出效果(指文件内容,文件大小和文件格式完全相同),即设置成流文件输出,access='stream',form=‘unformatted’

那此时输出的文件就和用form=‘binary’输出的效果相同,而且符合Fortran的标准。此时两者输出的文件就完全相同了,就不纯在什么4倍的关系了。至于其他形式的输出是否是4倍关系还是多少倍关系,就不再深究了。


3. 需要注意的是,access='stream'用法,是Fortran2003的标准中包含的,现在新的Fortran编译器都支持,而老旧的CVF是不支持的


4. 在编程中,建议不要用不符合标准的form=‘binary’的用法,尽量统一使用 form=‘unformatted’ 的用法,使程序符合Fortran标准,方便日后程序的移植。


最后贴上简单测试用的代码:

  1. <font size="3">program test
  2. implicit none
  3.         real(8) :: aa(10000)=9.99
  4.         integer :: i

  5.         open(10,file="binary.bin",form="binary",status="replace")
  6.         open(11,file="unformatted.bin",access="stream",form="unformatted",status="replace")

  7.         do i=1,10000,1
  8.                 write(10) aa(i)
  9.                 write(11) aa(i)
  10.         
  11.         end do
  12. end program test</font>
复制代码


试验一:

该代码直接用IVF编译运行,输出的binary.bin和unformatted.bin的文件内容,文件大小和文件格式完全相同。


试验二:

由于CVF不支持access='stream',form=‘unformatted’的用法,而GF不支持form=‘binary’的用法,因此设计试验二。

注释程序的7和11行,用CVF编译输出binary.bin;

注释程序的6和10行,用GF编译输出unformatted.bin。

对比两者结果,文件内容,文件大小和文件格式完全相同。


如图:


                               
登录/注册后可看大图



                               
登录/注册后可看大图





1.png
2.png

评分

参与人数 1威望 +5 金钱 +30 贡献 +2 收起 理由
topmad + 5 + 30 + 2 赞一个!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2019-8-9 16:12:29 | 显示全部楼层
4倍的关系,还和编译器有关,我用过intel Fortran,PGI Fortran,还有IBM的xlf,即使是access='stream',form=‘unformatted’的情况下,也是不一样的,要看各个编译器对于数据块的定义,有没有包含数据位的信息
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-8 18:30:54 | 显示全部楼层
请问,开发什么模式?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-8-9 10:09:36 | 显示全部楼层
werewolf 发表于 2019-8-8 18:30
请问,开发什么模式?

这不是这个帖子的重点_(:з」∠)_
{:eb342:} {:eb342:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-9 10:38:16 | 显示全部楼层
确实是大坑,遇到过
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-9 11:05:17 | 显示全部楼层
ljh110011 发表于 2019-8-9 10:09
这不是这个帖子的重点_(:з」∠)_

想了解一下嘛,这个问题其实很好解决,用stream就可以了。cvf这种东西赶紧扔掉。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-9 14:56:07 | 显示全部楼层
感谢,清楚多了,前几天还在纠结binary和unformatted的问题,看很多帖子上争论得还比较激烈。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-8-12 11:30:55 | 显示全部楼层
werewolf 发表于 2019-8-9 11:05
想了解一下嘛,这个问题其实很好解决,用stream就可以了。cvf这种东西赶紧扔掉。

哈哈哈,先尝试学着编个浅水方程模式
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-12 13:55:47 | 显示全部楼层
ljh110011 发表于 2019-8-12 11:30
哈哈哈,先尝试学着编个浅水方程模式

正压模式本科数值预报实习课必写的吧,哈哈。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-8-14 10:37:24 | 显示全部楼层
谢谢楼主分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表