爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 6056|回复: 8

fortran 顺序读取二进制文件出现问题

[复制链接]

新浪微博达人勋

发表于 2015-6-14 16:21:58 | 显示全部楼层 |阅读模式
GrADS
系统平台:
问题截图: -
问题概况: 读的数据是grapes模式转出来的数据postvar2012082212,现在用fortran 顺序读取,出现问题,读出u的第一个值是9.2855641E-40。而u的真正的第一个值跑到了第二个值上,整个数据都往后移了一个值。而且这个9.2855641E-40出现不止一次,这是怎么回事啊 。我用ctl画postvar2012082212这个数据,觉得数据本身是没问题的。下面是我读数据的程序和数据的ctl。怎么会出现9.2855641E-40这个啊。
我看过提问的智慧: 看过
自己思考时长(天): 4

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

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

x
program main

        implicit none
        integer, parameter                         :: mix=502, mjy=330,mgk=26,mt=25
                integer, parameter                         :: nvar=5
        integer                                    :: i,j,it,k,ivar,irec,z
                real(4),dimension(1:mix,1:mjy,1:mgk)               ::  u,v,temprature,h,q
                real, dimension(1:mix,1:mjy,1:mgk)                             ::  temp1
        real, dimension(1:mix,1:mjy)                                   ::  temp,ulev1
                real, dimension(1:mix,1:mjy,1:mgk,1:nvar)                      ::  f1
                real, dimension(1:mix,1:mjy,1:4)                               ::  temp3
                real, parameter                                                ::undef= 9.999E+20
               
        u=0.0;v=0.0;temprature=0.0;h=0.0;q=0.0;f1=0.0
        open(103,convert='big_endian',file='./postvar2012082212',form='binary',status='old')
!------------------------read u--------------------------------------  
        DO it=1,25,1   
                               
                READ(103) u
        READ(103) v
        READ(103) temprature
        READ(103) h
        READ(103) q
               
        READ(103) temp1
            READ(103) temp1
            READ(103) temp1
            READ(103) temp1
            READ(103) temp1
            READ(103) temp1                                  

        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp
        READ(103) temp

       READ(103) temp3
       READ(103) temp3
          print *, u(1,1:5,1)
          print *, v(1,1:5,1)
                                            

  if ( it==1 ) then           !提取第一个时刻的值

   do k=1,26
   do j=1,mjy
   do i=1,mix
    f1(i,j,k,1)=u(i,j,k)
    f1(i,j,k,2)=v(i,j,k)
        f1(i,j,k,3)=temprature(i,j,k)
        f1(i,j,k,4)=h(i,j,k)
        f1(i,j,k,5)=q(i,j,k)
   end do
   end do
   end do
   write(*,*)  "f1"  
write(*,*)  f1(1,1:5,1,1)
       
  end if

  end do                                            ! do it=1,m
  close(103)       
write(*,*)  "f1"  
write(*,*)  f1(1,1:5,1,1)
write(*,*)  f1(1,1:5,1,2)
write(*,*)  f1(1,1:5,1,3)
write(*,*)  f1(1,1:5,1,4)
write(*,*)  f1(1,1:5,1,5)

write(*,*)  "read done"
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


     open(18,file='u.dat',form='binary')  

   do k=1,26
   do j=1,mjy
   do i=1,mix
   write(18) f1(i,j,k,1)
   end do
   end do
   end do

     close(18)  

end
这是Fortran程序。
这是对应的ctl
dset postvar2012082212
options sequential big_endian
title post output from grapes
undef 9.999E+20
xdef   502  linear    70.0000    0.1500
ydef   330  linear    15.0000    0.1500
zdef   26 levels
1000.000000
975.0000000
950.0000000
925.0000000
900.0000000
850.0000000
800.0000000
750.0000000
700.0000000
650.0000000
600.0000000
550.0000000
500.0000000
450.0000000
400.0000000
350.0000000
300.0000000
250.0000000
200.0000000
150.0000000
100.0000000
70.00000000
50.00000000
30.00000000
20.00000000
10.00000000
tdef   25 linear 12z22AUG2012   180mn
vars 29
u 26 0 u_wind
v 26 0 v_wind
t 26 0 temperature
h 26 0 geopotential height
Qv 26 0 Q vapor
Qc 26 0 Q cloud
Qr 26 0 Q rain
Qi 26 0 Q ice
Qs 26 0 Q snow
Qg 26 0 Q grapaul
w 26 0 vertical wind
ps 0 0 surface pressure
psl 0 0 sea level pressure
rainc 0 0 precipitation
rainnc 0 0 precipitation
ts 0 0 surface temperature
glw 0 0 surface long wave radiation flux
gsw 0 0 surface short wave radiation flux
hfx 0 0 surface heat flux
qfx 0 0 surface vapour flux
q2m 0 0 vapour at 2m
t2m 0 0 t at 2m
u10m 0 0 u at 10m
v10m 0 0 v at 10m
lu 0 0 land use
zs 0 0 terrain
tmn 0 0 tmn
tslb  4 0 tslb
mslb  4 0 mslb
endvars



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

新浪微博达人勋

发表于 2015-6-17 18:07:43 | 显示全部楼层
还有,不太建议直接这样定义 real(4),dimension(1:mix,1:mjy,1:mgk),因为这样会占用502*330*26*4/1024/1024=16.43M的内存,你定义了好几个这样的数组,占的内存就100多M了,虽然现在计算机内存很大,但这不是一个好 的写程序的习惯哦
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2015-6-14 16:54:19 | 显示全部楼层
楼主是windows下运行的fortran还是unix?unix里面好像不可以用form=‘binary’
另外,这种数据基本上都是用直接读写的,就是access=‘direct’,windows版本的IVF,在顺序读写中,头和尾都加了点东西,估计9.2855641E-40就是这样
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-14 16:59:07 | 显示全部楼层

ecl

本帖最后由 wheelar 于 2015-6-14 17:00 编辑

你可以试试
open(unit=103,file='./postvar2012082212',access='direct',recl=mix*mjy,status='old')

...........


read(103,rec=idxRec,iostat=intsth) ((u(i,j,k),i=1,mix),j=1,mjy)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-6-14 17:09:35 | 显示全部楼层
wheelar 发表于 2015-6-14 16:54
楼主是windows下运行的fortran还是unix?unix里面好像不可以用form=‘binary’
另外,这种数据基本上都是 ...

我是在Linux下运行的。一开始form=‘unformatted‘,出现error during read ,改成form=‘binary’,程序可以转了。不知道为什么。我刚看了下u的每层前俩个数都是9.2855641E-40,其他变量里也有9.2855641E-40。我再试下直接读取。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-14 17:17:55 | 显示全部楼层
binary不是标准的fortan90语法,但IntelFotran支持,gcc好像就不支持。form=‘unformatted‘,出现error during read ,出现error不是unformatted的错误,是别的地方错误
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-6-14 20:17:29 | 显示全部楼层
wheelar 发表于 2015-6-14 17:17
binary不是标准的fortan90语法,但IntelFotran支持,gcc好像就不支持。form=‘unformatted‘,出现error du ...

直接读取还是会把9.2855641E-40读出来啊,画图也不对。我一直在Linux下运行的,也会加这些东西9.2855641E-40,什么时候加进来的呀?9.2855641E-40也会占数组大小的,他就把数据一部分信息给顶掉了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-6-16 18:04:31 | 显示全部楼层
wheelar 发表于 2015-6-14 16:54
楼主是windows下运行的fortran还是unix?unix里面好像不可以用form=‘binary’
另外,这种数据基本上都是 ...

@wheelar 请问如果出现error dunring read 还有可能是哪的错啊 谢谢啦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-6-17 17:56:37 | 显示全部楼层
本帖最后由 wheelar 于 2015-6-17 18:11 编辑

用postvar2012082212这个数据直接在grads中画图,数据是正确的吗?你可以查看一下postvar2012082212这个文件的大小,到底是多少字节,和ctl文件是否对应的上,这样就知道数据的准确性了,另外,你可以把新的fortran程序贴出来看看
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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