爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 128946|回复: 184

[分享资料] grads提取nc数据及进一步编程常见问题及解决方法

  [复制链接]

新浪微博达人勋

发表于 2012-8-11 13:26:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 做个霸气的木头 于 2012-9-11 15:09 编辑

论坛里常常有人对nc这种内置ctl的文件数据处理 提出问题,这里总结下常见的一些问题及对策。
nc数据是一类内置ctl的文件,也就说没有独立的ctl文件,那么打开命令也不是常见的open,而是sdfopen命令,那么要处理这类数据就得知道变量名、变量层次分布等信息,用q ctlinfo命令就可以查看全部的ctl了。
为什么提查看ctl 呢,很多人在处理这类数据的时候会想当然的认定一个变量名,缺省值、甚至精度都会不注意,那么无论怎么提取,出来的图都不会对的。
下面总结下容易出的问题:
1、从nc文件提取出二进制数据(fwrite)设定
需要注意经纬度,层次,时间是否是你需要的部分,尤其是用循环提取数据的朋友,尤其要注意。有的时候设定经纬度(set lat 0 359.8)出了问题,可是尝试定义x y格点(set x 1 180)的方法试试,实在不行,可以用循环来输出不同的经纬度的数值。
2、注意提取数据的grads命令
'set gxout fwrite'
'set fwrite c:\ss00.grd'
.
.
.
.
'disablefwrite'
最后一行的这个命令,如果忘了加就容易数据不正常,还有的朋友,一个gs文件提取了两个数据文件,两组这类命令中间那个disable fwrite丢掉了,数据就彻底乱套了。
3、提取的数据,写ctl,需要注意与nc的ctl对应,包括缺测值,精度,这个问题只要照着nc的ctl写,层次格点什么的写成你数据对应的就好了。
4、数据提取了,ctl写好了,画画图看是不是与nc的一致,设定的时间、层次,图是不是不一样,因为用循环出数据的朋友容易犯 写了好几个时间点,数据是一样的错误。
5、还有的朋友需要进一步提取这个grd或者dat文件,这就涉及到二进制数据的读取与操作问题了。
二进制数据是无格式的数据,读取与写入都不需要格式说明,里面的数据无法直接看到,其内部无非是0和1,而且数据之间没有间隔,读取写入只要read(文件号)
write(文件号)就好
读取种要注意,grads写入的数据循环从内到外依次为x 、y、z、变量、t,如果你需要确定某个数据的位置,那么,x是从西到东,y是从南到北,z是从地面到高空,t是从前到后的顺序。

另外此类文件读取目前论坛里主要有两种方法,一种是直接声明form=’binary’的,这种形式简单,如果数据是常规的顺序读取,选择binary读取方法简单的多,也不容易出错。如下面这段:
program ex01
real ss(360,180)
integeri,j
open(100,file='s01.dat',form='binary')
open(200,file='data0.txt')
doj=1,180
       read(100) (ss(i,j),i=1,360)
        write(200,*)(ss(i,j),i=1,360)
        write(*,*) j,"  ",ss(1,j)
enddo
end
另一种是无格式直接读取的方式,无格式直接读取主要是用于大量的数据需要处理,你只需要其中部分,可以用记录的跳跃选取你要的数据,如下面这段:
program readsst
integer,parameter:: ix=360,iy=180,iz=7
real sst(ix,iy,iz)
open(9,file='f:\sam\areacc\hadleycenter\sst_update.dat',form='unformatted',access='direct',recl=ix*iy*4)
read(9,rec=1) ((sst(i,j),i=1,ix),j=1,iy)
write(*,*) sst
end
最后总结下检查错误的思路:
1、数据没提取出来,先检查gs是否没有写disable fwrite,或者文件名.grd写错了;
2、数据出来后,ctl写好,画图与nc对比,如果发现,出来的图上只有个别区域有大条粗线,整幅图都是黑的,说明你的ctl里缺测值或者精度不够对应,q ctlinfo 查询下;
3、图对应上了,改变设定时间或层次,没有变化,说明,你提取数据的gs错了,层次或者时间都是输出的同一个点;
4、前三步都没有问题,恭喜你,数据提取成功了。Fortran编程的时候如果报错说endof file during read,很可能是你文件名错了,或者你的你读取数据的顺序不是按照grads的数据顺序读的,检查你的各个循环的次数,及循环的嵌套顺序是否正确。
5、如果你是顺序的读取数据的话,建议你选择binary的方式读取,犯错几率要小;
6、如果以上,还是报错,剩下的原因就可能是你马虎导致微小的错误了,你要认真的从头到尾检查程序,不行就让别人给你检查,因为有些问题太细微了,自己已经习惯了。
想下载下来的在这里: nc数据读取及编程常见问题解答.doc (29.5 KB, 下载次数: 897)

评分

参与人数 2威望 +2 金钱 +16 贡献 +5 体力 +200 收起 理由
yuanyuan815 + 1 很给力!
mofangbao + 2 + 15 + 5 + 200

查看全部评分

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

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-8-11 13:52:54 | 显示全部楼层
阿木辛苦啦,支持~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-8-11 14:06:52 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-8-13 09:21:38 | 显示全部楼层
感谢楼主,不仅把问题解答的这么详细,还很细心的贴出了word版,
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-8-15 13:01:08 | 显示全部楼层
辛苦辛苦啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-8-27 22:45:20 | 显示全部楼层
好好学习
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-9-10 15:02:55 | 显示全部楼层
木头V587,
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-9-11 11:46:58 | 显示全部楼层
学习啦,谢谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-9-23 16:10:13 | 显示全部楼层
在使用netcdf文件中,有的可以用sdfopen来打开,有的可能需要自编ctl文件,还有的,以上两种方式都不行(什么时候grads才能完全兼容netcdf呢?)

究竟什么样的nc文件才可以打开,什么样的不能打开?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-9-23 18:16:57 来自手机 | 显示全部楼层
slovoed 发表于 2012-9-23 16:10  在使用netcdf文件中,有的可以用sdfopen来打开,有的可能需要自编ctl文件,还有的,以上两种方式都不行(什 ...

关于什么样的nc文件需要编ctl论坛里有相关的贴子,写的很详细~你搜搜看!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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