回 帖 发 新 帖 刷新版面

主题:用grads把grib转成二进制后

我手上有一个用grads把grib转成的二进制资料,221*256的格点,共120个时次,只有一个变量。
我用的是gfortran
分别用以下两段语句都能读出数据

    open(1,file=fn,form='unformatted')
    
    do t = 1, 120
        read(1)((u(i,j,t),i=1,221),j=1,256)
    enddo

-----------------------------------------------

    open(1,file=fn,access='direct',recl=221*256*4)   

    do t = 1, 120
        read(1,rec=t)((u(i,j,t),i=1,221),j=1,256)
    enddo

但两组数据有差异,t=1的时候,两组数据的第一个值分别是-9.99E+008(缺省值),3.17E-040,然后下面的数全部错位。t=2的时候,第二段程序读出的数据出现了两个3.17E-040,下面的数错位更厉害。

另外就是想问一下,是不是sequential写入的二进制文件可以direct读出,但是direct写入的不能sequential读出?因为我感觉那个二进制像是顺序写入的,但为什么读出来不会出错只是值有点儿问题呢?
希望谁能帮助一下,谢谢

回复列表 (共15个回复)

11 楼


两位似乎越讨论,越离题。

12 楼

我就不上传二进制资料了,重新用一种更规范一点的方法转了一次grib,现在读取资料就没有问题了。上面两位大哥真得讨论得越来越离题了,不过还是非常感谢

13 楼

呵呵,我現在暫時對WIN版本的flto持保留態度,不用那個編譯選項速度還湊合,用了那個整整可以慢一半兒。。。
相比之下,intel的跨文件編譯及函數inline編譯則非常成熟!其實這個并不是intel的專利,早在cvf時便已經做到這點了。。。intel做的只是加速了編譯速度及增加了一些intel的新指令集。
如果GFORTRAN能把自己做到CVF那等級,那基本超越INTEL就有指望了。

14 楼

[quote]我就不上传二进制资料了,重新用一种更规范一点的方法转了一次grib,现在读取资料就没有问题了。上面两位大哥真得讨论得越来越离题了,不过还是非常感谢[/quote]

我一直就怀疑你的二进制文件本身的问题,而不是程序的问题,不过最终怎么解决的?楼主愿意分享么?让吾辈也学习一下。

15 楼

我也不敢很确定,但应该是用grads转化grib也存在一个格式问题。是别人转的,用的是lats4d,这个貌似存在一个‘stream’和‘sequential’格式,用stream格式转出来的用fortran直接读取就不存在问题了。我正在学NCL,也试着用它转了一下,感觉语句更为清晰一点儿,和fortran本身的读写能很好的联系起来。

我来回复

您尚未登录,请登录后再回复。点此登录或注册