登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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
- 'reinit'
- 'set gxout fwrite'
- 'set fwrite f:/1948-1952.grd'
- yy=1948
- while(yy<=1952)
- 'sdfopen f:/ncep/daily/hgt.'yy'.nc'
- 'set x 1 144'
- 'set y 1 73'
- if ((math_mod(yy,4)=0&math_mod(yy,100)!=0)|math_mod(yy,400)=0)
- tt=1
- while(tt<=366)
- 'set t 'tt''
- zz=1
- while(zz<=17)
- 'set z 'zz''
- 'd hgt'
- zz=zz+1
- endwhile
- tt=tt+1
- endwhile
- else
- tt=1
- while(tt<=365)
- 'set t 'tt''
- zz=1
- while(zz<=17)
- 'set z 'zz''
- 'd hgt'
- zz=zz+1
- endwhile
- tt=tt+1
- endwhile
- endif
- 'close 1'
- yy=yy+1
- endwhile
- 'disable fwrite'
- ;
其中需要注意的是'set gxout fwrite' 'set fwrite f:/1948-1952.grd'的位置,要合并成一个文件所以这个命令最好放在循环外面; 'close 1',是因为GrADS只能同时打开20个文件左右,如果要合并的资料很多话就需要打开一个转换一个关掉一个,否则提取出来的资料是前面资料的重复或者直接报错。
提取完成,生成1948-1952.grd文件,配如下ctl:
- dset F:/1948-1952.grd
- title mean daily NMC Reanalysis (1948-1952)
- undef -999000000.000000
- xdef 144 linear 0 2.5
- ydef 73 linear -90 2.5
- zdef 17 levels 1000 925 850 700 600 500 400 300 250 200 150 100 70 50 30 20 10
- tdef 1827 linear 00Z01Jan1948 1440mn
- vars 1
- hgt 17 99 mean Daily Geopotential height
- endvars
复制代码 对不对啊这样?画图对比一下就知道了,当然是一样的了,不然我也不拿出来了。
二,开始第二个问题,从多个nc文件中提取特定时间特定要素的资料并分别存放在不同的grd中,也给出例子,所使用的资料同上。
若想要提取从1948-1952年nc逐日资料文件中6-8月的位势高度资料
- 'reinit'
- yy=1948
- while(yy<=1952)
- 'set gxout fwrite'
- 'set fwrite f:/'yy'.grd'
- 'sdfopen f:/ncep/daily/hgt.'yy'.nc'
- if ((math_mod(yy,4)=0&math_mod(yy,100)!=0)|math_mod(yy,400)=0)
- tt=153
- while(tt<=244)
- 'set t 'tt''
- zz=1
- while(zz<=17)
- 'set z 'zz''
- 'set x 1 144'
- 'set y 1 73'
- 'd hgt'
- zz=zz+1
- endwhile
- tt=tt+1
- endwhile
- else
- tt=152
- while(tt<=243)
- 'set t 'tt''
- zz=1
- while(zz<=17)
- 'set z 'zz''
- 'set x 1 144'
- 'set y 1 73'
- 'd hgt'
- zz=zz+1
- endwhile
- tt=tt+1
- endwhile
- endif
- 'close 1'
- yy=yy+1
- endwhile
- 'disable fwrite'
- ;
同样要注意'set gxout fwrite' 、'set fwrite f:/'yy'.grd'的位置
这个我没有具体的去验证,因为看网上有类似的帖子,而且这和上面的合并是类似的。有需要的同学自己去验证吧。
最后还要强调一点,这个方法并不是处理上述问题最理想的方法。文件多的时候运行会比较慢,而且gs这么长,用到的循环也比较多,很容易出错。其实最好的方法处理上述问题就是使用一个ctl批量描述这些二进制文件,这和合并资料是一样的,而且省时省力,运行又快。所以不推荐以上方法。
ctl批量描述的帖子可以在这里看 nc资料的描述文件以及批量描述nc资料的方法。当然还有很多其他坛友发的相关帖子,大家可以自己在论坛搜索
就这么多,如果发现问题,还请不吝赐教!
|