- 积分
- 16130
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-9-14
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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)
|
评分
-
查看全部评分
|