爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: happyhui

[分享资料] 关于hadley center上的nc数据读取

[复制链接]

新浪微博达人勋

发表于 2012-7-31 17:29:15 | 显示全部楼层
happyhui 发表于 2012-7-31 15:10
恩,请问你的能转化成二进制数据吗?

可以的 我的数据是导师给的。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-7-31 20:06:01 | 显示全部楼层
做个霸气的木头 发表于 2012-7-31 15:50
我下了HadISST1_SST_update.nc.gz数据,先fwrite成二进制,再fortran读取并转换,很成功啊!因为是海温资 ...

ctl和程序都没有错误呀,请问您fwrite是怎么写的?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-7-31 20:12:01 | 显示全部楼层
chaseechoes 发表于 2012-7-31 17:29
可以的 我的数据是导师给的。。

唉我不行了已经。。。 那您瞧我的fwrite写的对不对?   我转成二进制以后无论时图还是fortran 出数,都是0啊。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-7-31 20:23:24 | 显示全部楼层
做个霸气的木头 发表于 2012-7-31 15:50
我下了HadISST1_SST_update.nc.gz数据,先fwrite成二进制,再fortran读取并转换,很成功啊!因为是海温资 ...

唉 真是看不出错误。我也用了那个update试了以下,还是不出数据。给您看我的ctl和fortran 验证程序:
dset f:\sam\areacc\hadleycenter\sst_update.dat
title sst
undef -1e+30
xdef 360 linear -179.5 1
ydef 180 linear -89.5 1
zdef 1 linear 0 1
tdef 1 linear 00z01DEC2011 1mn
vars  1
sst 0 99 monthly 1 degree resolution sst
endvars

program readsst
integer,parameter:: ix=360,iy=180
real sst(ix,iy)

open(9,file='f:\sam\areacc\hadleycenter\sst_update.dat',form='unformatted',access='direct',recl=ix*iy)

read(9,rec=1) ((sst(ix,iy),i=1,ix),j=1,iy)
write(*,*) sst
end

fortran 和grads读出、画出的数据都是0,说明转化成二进制数据的步骤除了问题,所以我才一直怀疑fwrite.
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-7-31 20:33:12 | 显示全部楼层
happyhui 发表于 2012-7-31 20:06
ctl和程序都没有错误呀,请问您fwrite是怎么写的?

我fwrite这样写的
'sdfopen c:\HadISST1_SST_update.nc'
'set gxout fwrite'
'set fwrite c:\s01.dat'
'set x 1 360'
'set y 1 180'
'd sst'
'disable fwrite'
;
fwrite 命令很普通啊!
你要不用我的fortran程序读读你的数据试试呢~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-7-31 21:11:17 | 显示全部楼层
本帖最后由 做个霸气的木头 于 2012-7-31 21:12 编辑
happyhui 发表于 2012-7-31 20:23
唉 真是看不出错误。我也用了那个update试了以下,还是不出数据。给您看我的ctl和fortran 验证程序:
ds ...

二进制顺序数据文件与无格式直接文件存在的本质的区别,你用的后者,grads输出的是前者;无格式直接文件要求每个记录的长度必须一致,不一致的补0,但是grads输出的是二进制顺序文件,数据长度可以不同,我处理的这个二进制文件数据看下图(数据长度不一): 搜狗截图_2012-07-31_20-58-03.png
但是你按照无格式文件的方法读取的画,数据本身的顺序彻底乱掉了
搜狗截图_2012-07-31_20-59-35.png
所以是读取方式的问题。
气象数据的二进制读取,一般选择open的时候只要声明form=‘binary’,read(100)或write(200)时只跟文件号就行,像我的程序那样~

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

新浪微博达人勋

发表于 2012-7-31 21:30:14 | 显示全部楼层
我下了这个月的数据,没有问题的啊
数据都很正常的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-7-31 22:17:26 | 显示全部楼层
happyhui 发表于 2012-7-31 20:12
唉我不行了已经。。。 那您瞧我的fwrite写的对不对?   我转成二进制以后无论时图还是fortran 出数,都是 ...

我看了,我也不知道有什么问题哎。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-7-31 22:20:22 | 显示全部楼层
要不你重新装下grads试试?。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-8-1 14:47:36 | 显示全部楼层
本帖最后由 happyhui 于 2012-8-1 15:33 编辑

声明binary之后果然好啦! 终于找到原因了! 有几个问题想请教您:
1、我们学fortran的时候,二进制文件的声明一般用form=‘unformatted',若是直接文件,则要说明access='direct',没有用过binary,按说他们的目的都是声明文件为二进制,为啥我的声明方法就不成功呢?
2、所谓数据长度不同又是什么意思呢?若是指数据本身有效数字长度不同,我以前处理的也有不一样长的数据呀,为何那些都没有出现这个问题。


现在fortran 可以读出数据了,而且grads的ctl改了undef的值以后也可以出图了,总算解决了这问题。

非常感谢!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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