登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
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资料的方法。当然还有很多其他坛友发的相关帖子,大家可以自己在论坛搜索 
 
 
就这么多,如果发现问题,还请不吝赐教! 
 
 
 
 
 
 
 
 
 
 
 
 
 |