爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 226833|回复: 216

[分享资料] grads批量合并有规律的二进制文件(如NC逐日资料等)和批量提取特定时间的特定要素

  [复制链接]

新浪微博达人勋

发表于 2013-5-16 10:12:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 river 于 2016-10-28 13:10 编辑

grads批量合并有规律的二进制文件(如NC逐日资料等)和批量提取特定时间的特定要素

最近毕业季啊,开始各种论文写作啊,然后突然发现自己各种不会啊,有木有?!再然后论坛里各种奇葩问题,有木有?!很多热心坛子看帖帮忙回答的头晕目眩,有木有?!算了,不吐槽了。


本来不打算发这个帖子的,但是最近发现还是有很多人问这样的问题,比如求助:关于批处理nc数据的问题比如请问如何将多个单时次NC资料合成一个多时次的数据?还有很多形如“求助求助”、“小白求助”之类的让人不明就里的帖子也都问到了相关问题。


不想发这个帖子,不是因为问这个问题的人少;也不是因为我自己忙没时间;更不会是因为觉得这种问题不值得回答。而是因为这种方法并不是处理这种问题最好的方法,但看到还是很多人问啊问的,那就先发上来让大家解解燃眉之急吧


一 ,给出一个例子,使用set fwrite 命令将多个文件名连续,内部时间连续的NC逐日资料合并成一个二进制文件,文件名为hgt.1948.nc  hgt.1949.nc  hgt.1950.nc·······(对于ncep资料的熟悉的人一看就明白了,就不详细说明文件格式什么的了,如果您还不是很明白,那就搜索一下ncep资料的介绍看一下)并配上ctl文件画图。


首先给出的是合并多个文件的gs
  1. 'reinit'
  2. 'set gxout fwrite'
  3. 'set fwrite f:/1948-1952.grd'
  4. yy=1948
  5. while(yy<=1952)
  6. 'sdfopen f:/ncep/daily/hgt.'yy'.nc'
  7. 'set x 1 144'
  8. 'set y 1 73'
  9. if ((math_mod(yy,4)=0&math_mod(yy,100)!=0)|math_mod(yy,400)=0)
  10. tt=1
  11. while(tt<=366)
  12. 'set t 'tt''
  13. zz=1
  14. while(zz<=17)
  15. 'set z 'zz''
  16. 'd hgt'
  17. zz=zz+1
  18. endwhile
  19. tt=tt+1
  20. endwhile
  21. else
  22. tt=1
  23. while(tt<=365)
  24. 'set t 'tt''
  25. zz=1
  26. while(zz<=17)
  27. 'set z 'zz''
  28. 'd hgt'
  29. zz=zz+1
  30. endwhile
  31. tt=tt+1
  32. endwhile
  33. endif
  34. 'close 1'
  35. yy=yy+1
  36. endwhile
  37. 'disable fwrite'
  38. ;

其中需要注意的是'set gxout fwrite'  'set fwrite f:/1948-1952.grd'的位置,要合并成一个文件所以这个命令最好放在循环外面; 'close 1',是因为GrADS只能同时打开20个文件左右,如果要合并的资料很多话就需要打开一个转换一个关掉一个,否则提取出来的资料是前面资料的重复或者直接报错。


提取完成,生成1948-1952.grd文件,配如下ctl:
  1. dset F:/1948-1952.grd
  2. title mean daily NMC Reanalysis (1948-1952)
  3. undef -999000000.000000
  4. xdef 144 linear 0 2.5
  5. ydef  73 linear -90 2.5
  6. zdef 17 levels 1000 925 850 700 600 500 400 300 250 200 150 100 70 50 30 20 10
  7. tdef 1827 linear 00Z01Jan1948 1440mn
  8. vars 1
  9. hgt 17 99  mean Daily Geopotential height
  10. endvars
复制代码
对不对啊这样?画图对比一下就知道了,当然是一样的了,不然我也不拿出来了。


二,开始第二个问题,从多个nc文件中提取特定时间特定要素的资料并分别存放在不同的grd中,也给出例子,所使用的资料同上。
若想要提取从1948-1952年nc逐日资料文件中6-8月的位势高度资料
  1. 'reinit'

  2. yy=1948
  3. while(yy<=1952)
  4. 'set gxout fwrite'
  5. 'set fwrite f:/'yy'.grd'
  6. 'sdfopen f:/ncep/daily/hgt.'yy'.nc'

  7. if ((math_mod(yy,4)=0&math_mod(yy,100)!=0)|math_mod(yy,400)=0)
  8. tt=153
  9. while(tt<=244)
  10. 'set t 'tt''
  11. zz=1
  12. while(zz<=17)
  13. 'set z 'zz''
  14. 'set x 1 144'
  15. 'set y 1 73'
  16. 'd hgt'
  17. zz=zz+1
  18. endwhile
  19. tt=tt+1
  20. endwhile
  21. else
  22. tt=152
  23. while(tt<=243)
  24. 'set t 'tt''
  25. zz=1
  26. while(zz<=17)
  27. 'set z 'zz''
  28. 'set x 1 144'
  29. 'set y 1 73'
  30. 'd hgt'
  31. zz=zz+1
  32. endwhile
  33. tt=tt+1
  34. endwhile
  35. endif
  36. 'close 1'
  37. yy=yy+1
  38. endwhile
  39. 'disable fwrite'
  40. ;


同样要注意'set gxout fwrite''set fwrite f:/'yy'.grd'的位置

这个我没有具体的去验证,因为看网上有类似的帖子,而且这和上面的合并是类似的。有需要的同学自己去验证吧。

最后还要强调一点,这个方法并不是处理上述问题最理想的方法。文件多的时候运行会比较慢,而且gs这么长,用到的循环也比较多,很容易出错。其实最好的方法处理上述问题就是使用一个ctl批量描述这些二进制文件,这和合并资料是一样的,而且省时省力运行又快。所以不推荐以上方法。

ctl批量描述的帖子可以在这里看 nc资料的描述文件以及批量描述nc资料的方法。当然还有很多其他坛友发的相关帖子,大家可以自己在论坛搜索


就这么多,如果发现问题,还请不吝赐教!












评分

参与人数 3威望 +2 金钱 +16 贡献 +2 收起 理由
居一桠 + 1
十字天阶 + 5 真的很棒很棒啊,我因为忘记close文件,错.
做个霸气的木头 + 2 + 10 + 2 river辛苦了,我也这么合并过,呵呵...

查看全部评分

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

新浪微博达人勋

 楼主| 发表于 2013-5-22 06:49:12 | 显示全部楼层

缺测值有问题吧,应该是32766,改下试试。使用fwrite命令提取出来的nc资料的缺测值才是-9.99E+33。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2013-5-16 10:22:49 | 显示全部楼层
顶一个,楼主辛苦了。建议楼主把gs分一下行
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-16 10:35:50 | 显示全部楼层
曾记否 发表于 2013-5-16 10:22
顶一个,楼主辛苦了。建议楼主把gs分一下行

速度很快啊,沙发被你抢了。添加代码那个命令太让人郁闷,还得自己排版。下回直接贴上去好了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-16 11:04:27 | 显示全部楼层
顶一个!!!!!!!!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-16 11:15:17 | 显示全部楼层
楼主威武!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-5-16 12:05:28 | 显示全部楼层
LZ威武。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2013-5-16 12:06:59 | 显示全部楼层
river 发表于 2013-5-16 10:35
速度很快啊,沙发被你抢了。添加代码那个命令太让人郁闷,还得自己排版。下回直接贴上去好了

你是不是用了GsEditor之类的编辑器啊,那个里面的文字都是带格式的,你可以复制出来,贴到记事本里面“过滤”一下,再复制出来,然后在插入代码的地方插入就行了。
这个帖子真不错,总结的挺到位啊!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2013-5-16 12:15:59 | 显示全部楼层
建议写ctl描述nc或二进制文件~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-16 12:35:37 | 显示全部楼层
mofangbao 发表于 2013-5-16 12:06
你是不是用了GsEditor之类的编辑器啊,那个里面的文字都是带格式的,你可以复制出来,贴到记事本里面“过 ...

我直接从写字板里复制出来的,插入代码的时候估计粘贴成纯文本应该就好了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-5-16 12:43:13 | 显示全部楼层
兰溪之水 发表于 2013-5-16 12:15
建议写ctl描述nc或二进制文件~

呜呜好激动,兰溪哥哥第一次回我的贴啊
对的,我帖子里就说不推荐上面的方法,最好的还是ctl批量描述
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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