爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 18667|回复: 23

[经验总结] pgi、gfortran、ifort编译器对于二进制文件直接读取需注意的问题

[复制链接]

新浪微博达人勋

发表于 2013-5-27 19:47:29 | 显示全部楼层 |阅读模式

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

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

x
今天费了好半天才找出了如题问题所在,分享一下,知道的坛友请跳过,对您有用的谢谢支持。(注:本试验是在linux下进行)如下面的程序中
program test
implicit none
real(kind=4) :: sst(144,73),q(144,73)
integer :: i,j,recl1
recl1=144*73*4
sst(:,:)=10.0
q(:,:) =20
open(11,file='out.grd',form='unformatted',access='direct',&
        status='replace',recl=recl1)
write(11,rec=1) ((sst(i,j),i=1,144),j=1,73)
write(11,rec=2) ((q(i,j),i=1,144),j=1,73)
close(11)
end program


      红色部分kind=4表示单精度数据占用4个字节,如果不设置一般默认也是4个字节;recl1=144*73*4表示一条记录的长度字节数,即144*73个格点,一个格点占用4个字节。
      这种写法是我们经常一般写法,在pgi和gfortran编译器下,能够正常编译写入文件,并且生成的二进制文件out.grd大小是84096字节(84096=144*73*4*2),正确的。
    (1)但是,在ifort编译器下,生成的out.grd文件大小是336384=4*84096个字节,所以出现的问题是sst数据写入了文件,而q数据没被写入,这时将recl1=144*73*4改为recl1=144*73后,即可正常了,因此说明不同编译器在读取(写入)二进制文件时有*4或不*4的问题,pgi、gfortran需要,而ifort不需要。
     (2)还需注意的一点是,单双精度的问题,kind=4改为kind=8,表示双精度。那么在后面输出的时候要添加sngl函数转化成单精度输出,否则也要出错,即write(11,rec=1) ((sngl(sst(i,j)),i=1,144),j=1,73)



评分

参与人数 3威望 +2 金钱 +44 贡献 +4 体力 +120 收起 理由
syzz11z + 2 很给力!
godenflame135 + 2 + 22 + 2 + 120 支持总结!
topmad + 20 + 2 赞一个!

查看全部评分

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

新浪微博达人勋

发表于 2013-5-27 22:09:27 | 显示全部楼层
感谢经验分享!!!!!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-6-11 19:38:23 | 显示全部楼层
顶一个哈哦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-2 17:02:28 | 显示全部楼层
感谢啊,最近遇到这个问题,师兄用的PGI编译器,我用的Intel编译器,一直读取不正确的数据,貌似在PGI下不管读取还是写入二进制文件,recl都要*4
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-2 17:25:53 | 显示全部楼层
感谢经验分享,希望可以了解更多ifort和gfortran的不同~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-2 18:36:53 | 显示全部楼层
real(kind=4)  这个定义代码健壮性不够,没有考虑平台可移植性,可以从系统获得,下面的记录长度也应该从系统获得,就不会出现这个问题了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-6 09:13:29 | 显示全部楼层
马~~~~~~~~~~~··
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-12-20 09:40:53 | 显示全部楼层

您的意思是不是要用select_real_kind之类的函数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-6 15:26:55 | 显示全部楼层

我看到楼主在用ifort在编译fortran文件,可不可以麻烦帮我看下我该怎样使用ifort命令http://bbs.06climate.com/forum.php?mod=viewthread&tid=27278万分感谢!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-6 17:33:59 | 显示全部楼层
F平方 发表于 2013-12-20 09:40
您的意思是不是要用select_real_kind之类的函数

恩 貌似用这个可能合适些吧
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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