grads处理多个ctl文件和nc文件解析Word格式.docx
《grads处理多个ctl文件和nc文件解析Word格式.docx》由会员分享,可在线阅读,更多相关《grads处理多个ctl文件和nc文件解析Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
两位天
%h1
1或者2位时
%h2
2位时
例如:
原文件其中之一的文件名为gdas2006050812f00,且所有文件只有天和时的变化
那么新描述文件的文件名为:
gdas200605%d2%h2f00
另外如果源文件里有index项的话,需要修改其idx的文件名,假设改成fnl.idx。
并用在dos下用gribmap函数生成一个新的idx文件。
gribmap-e-ifnl.ctl(加绝对路径)
openfnl.ctl就可以打开所有文件。
**********************************************************************************************************************************
若想要提取从1951-2006年56年nc文件中的某些数据,一个一个处理非常麻烦,这里介绍种较为简易的方法。
例如想提取6-8月的位势高度资料。
'
reinit'
t5=1951
*作文件名循环
while(t5<
=2006)
setgxoutfwrite'
setfwriteD:
\sichuan\hgt1\'
%t5%'
.dat'
sdfopene:
\ncep1\hgt\hgt.'
.nc'
t3=t5-1950
*判断是否为闰年
if(t3=2|t3=6|t3=10|t3=14|t3=18|t3=22|t3=26|t3=30|t3=34|t3=38|t3=42|t3=46|t3=50|t3=54)
to=153
else
to=152
endif
t4=to+91
while(to<
=t4)
'
sett'
to
t1=1
while(t1<
=12)
setz'
t1
setlon80140'
setlat1555'
dhgt'
t1=t1+1
endwhile
to=to+1
*这里必须先观点上述运行的文件,grads最多同时可以打开20个文件左右。
t5=t5+1
endwhile
这样可以提取你想要的年数据,然后你大可运用fortran对数据进行随心所欲的处理。
能否直接生成一个文件还正在探索中。
批量读取nc数据,用你的方法成功了,谢谢!
!
直接配个批量描述的ctl就可以了
有一批nc数据,一个月一个文件,现将文件名改为:
197901.nc,197902.nc,依次类推,对二进制的数据知道写ctl文件来进行批处理运算,那么nc数据应该怎么做呢?
试过了写ctl文件,sdfopen***\%y4%m2.nc,
year=1978
while(year<
=2011)
month=01
while(month<
sdfopen***\'
year'
month'
...
month=month+1
year=year+1
实我也是糊里糊涂的解决了。
。
ctl文件如下:
dset
^%y4%m2.nc
undef1e+15
optionstemplate
titleMERRAdata
dtypeNetCDF
ydef
144linear-901.25
xdef
288linear-1801.25
zdef
21levels1000975950925900875850825800775750725700650600550500450400350300
tdef
396linear00Z01JAN19791mo
vars3
qv21t,z,y,xSpecifichumidity
u21t,z,y,xEastwardwindcomponent
v21t,z,y,xNorthwardwindcomponent
endvars
然后open***.ctl就行了,之前的问题是打不开ctl文件,怎么改也不行,后来换了台机子就好了。
所以我说我也不知道怎么回事,希望对你有帮助。
我之前就这样做的,能打开ctl文件,但是d之后,都显示allundefinedvalues,我的ctl如下,麻烦帮我看看哪里错了?
dtypenetcdf
288linear-179.3751.25
144linear-89.3751.25
396linear00Z01JAN19791mn
可以的,但文件名一定要连续
这个时间长度一定要和你的文件对应好
最近发了一个利用grads批量合并nc文件的帖子
很多人也都问怎么批量描述,,很多人也都去自己尝试,尝试过程中出了各种问题。
推荐兰溪给nc文件写ctl的帖子
“SDFfilehasnodiscernableXcoordinate”的同学们,非常推荐这个帖子。
肯定很多人已经看过这个帖子,也照着做过,还是出了问题。
其实论坛还有很多其他有关ctl批量描述nc的帖子,大家参考一下,对照自己出现的问题,应该大部分情况下都能解决。
但是有一些人很着急,连一个nc文件的描述文件都写不对,就直接批量的,那肯定只会出更多的错误,还一时半会儿改不对。
只会造成时间的浪费。
我不是来说教的,只是我觉得什么事儿都是循序渐进的,不要那么浮躁。
俗话说磨刀不误砍柴工,其实真的是这么回事。
就说批量描述nc文件,它也是在正确描述一个nc文件的基础上来修改的。
只要描述一个的出来了,往上加一两个语句,用正确的替代格式替代了文件名,再改一下时间长度就出来了。
那能正确描述一个nc文件的ctl就是你磨得很锋利的砍柴刀,有了它后面的柴就相当好砍了。
下面我就以ncep逐日再分析资料为例说一下nc文件的描述和批量描述。
文件名连续,hgt.1948.nc
hgt.1949.nc
hgt.1950.nc`````````
首先看一下它自带的ctl,如下图红色圈起来的部分,就不详细解释了,对grads有一定了解的人,看一下就知道什么
自带ctl.PNG(29.64KB,下载次数:
9)
下载附件
保存到相册
2013-5-2222:
42上传
下面就可以根据这个自己编写一个ctl文件来描述这个nc文件了。
照着自带的写下来先,存成1948.ctl然后使用open命令打开,画图,发现出来的图和缺测值设置错误时差不多。
那就想方设法的改缺测值,比如用在grads中使用qattr查看有一句missing_value32766,修改缺测值,再画图,还是那样;
qundef出来的是-999000000.000000,再改,再画还是那样。
无论怎么改,都还是那样。
如果你这么反复折腾,最后还没发现问题,那就说明你没有好好利用论坛的搜索功能,也没有看到兰溪的帖子,也没看到黎大叶子的用Fortran批量为nc写ctl的帖子
但是不用着急,我看见了,其中最重要的是打开netcdf格式数据的描述文件是需要用xdfopen命令的,那就先要去看看xdfopen能打开的ctl需要怎么写http:
//grads.iges.org/grads/gadoc/gadocindex.html。
看完了,差不多就能明白了,有这么多前人的成果,那就照着修改呗,最终我修改出来了,图画的也很正常了。
写出来的如下
1.dsetF:
/ncep/daily/hgt.1948.nc
2.titlemeandailyNMCReanalysis(1948)
3.undef-999
4.xdeflon144linear02.5
5.ydeflat73linear-902.5
6.zdeflevel17levels10009258507006005004003002502001501007050302010
7.tdeftime366linear00Z01Jan19481440mn
8.vars1
9.hgt=>
hgt17
t,z,y,x
meanDailyGeopotentialheight
10.endvars
复制代码
光看着正常不行啊,需要和原始的图对比验证了才能确定是对的吧。
所以在grads里面用sdfopen命令打开hgt.1948.nc画第一层第一个时次的图,再用xdfopen打开你编写的ctl,也画第一层第一个时次的图看看。
我擦!
对不上啊,看来还是有问题啊。
说明上面的ctl是有问题的,还得改进才行。
其实到这步已经基本成功了,仔细看看叠加起来的那两张图,几乎是一样的,只是南北的方向是反的。
那就好办了,在ctl里加上optionsyrev,告诉grads南北要反向不就行了么。
于是最终的ctl出来了,如下
3.optionsyrev
4.*yrev表示y轴反向
5.undef-999
6.xdeflon144linear02.5
7.ydeflat73linear-902.5
8.zdeflevel17levels10009258507006005004003002502001501007050302010
9.tdeftime366linear00Z01Jan19481440mn
10.vars1
11.hgt=>
12.endvars
再用xdfopen打开画图,这回就一模一样了啊。
说明成功了!
那下面的批量描述就太简单了,比如我要批量描述1948和1949两年的,算一下一个闰年一个平年,一共有时次366+365=731,那么就修改ctl吧
dsetF:
/ncep/daily/hgt.%y4.nc
titlemeandailyNMCReanalysis
optionsyrev
*yrev表示y轴反向
*undef-999
xdeflon144linear02.5
ydeflat73linear-902.5
zdeflevel17levels10009258507006005004003002502001501007050302010
tdeftime731linear00Z01Jan19481440mn
vars1
hgt=>
就这么简单,只要用%y4代表四位年,把总的时次改成731,再增加一句optionstemplate就可以了。
然后就可以利用xdfopen命令打开画图和原来的对比一下,一样一样的吧,可以批量描述了吧!
注意:
有人可能注意到我把缺测那一项给注释掉了,其实这个是完全不需要的,去掉或者改成任何值,都不影响。
这是问什么?
不细说了,因为我没仔细研究(比较晚了,我要去睡觉了,以后再说,或者有人知道可以告诉我)
其他的资料都同理了,思路都差不多,变通一下就可以了。
1.首先编写可以正确描述一个资料的ctl,并能正确出图。
2.修改该ctl里dest后的文件名,使用合适的替代格式替代(具体的格式看实用手册)
3.增加optionstemplate,这个是批量描述必须加上的一句
4.计算出所要批量描述的文件的总时次,修改ctl里的总时次
5.画图进行验证,如果不对,再根据具体情况做出相应的修改
6.大功告成,可以用了
7.需注意的一点就是optionsyrev,这是可选项,要根据资料实际情况来使用。
今天这个帖子有点儿罗嗦了,大家捡有用的看就行。
其实说那么多,无非是想和一些人说我们这个年代的人已经是站在前人的肩膀上了,很多东西别人都已经有了经验,分享给你你就要好好利用,不要把时间都浪费在发帖和等回复上面。
很多东西,只要自己有一定的基础,在一定合理的范围内就会找到那个答案的·
·
[GrADS]grads批量处理nc文件求区域平均
[复制链接]|关注本帖
∙取消最新回复
∙取消置顶回复
∙取消最新编辑
stefan_scofield
stefan_scofield当前离线
积分
4181
贡献
精华
在线时间
小时
注册时间
2013-7-18
最后登录
1970-1-1
窥视卡
雷达卡
电梯直达
楼主
海温资料是1965-2013年的逐月资料(每年的4,5,6月),我需要求每年4,5,6月nino3.4区域的平均海温,然后三个月再平均,就是每年得一个值。
win7
批量处理nc文件,合成一个dat文件时遇到问题,请大家帮指点一下!
setfwriteg:
\mls\1.20.32.dat'
t5=1
=20)
sdfopeng:
\mls\h2o.'
t5'
setx1144'
sety191'
sett1'
z=1
while(z<
=25)
z
dh2o.'
t5
z=z+1
disablefwrite'
grads提取某个范围内的资料时注意的一个问题
热度4已有524次阅读2011-11-1916:
10|资料
这两天被一个资料的提取程序弄的晕乎乎的,今天终于发现问题所在了。
提取资料的时候,经度的范围即使原来就是全球的,也不能写成setlon0360,得写成setlon0357.5,就这个2.5(格点间距)把我折腾了这么久,下次一定要注意了!
报错:
Datarequestwarning:
requestiscompletelyoutsidefilelimits
gs如下:
setfwrited:
/sst/4-6nino.grd'
yy=1965
while(yy<
=2013)
sdfopend:
/sst/ersst.'
yy'
04.nc'
05.nc'
06.nc'
;
setz1'
setlat-55'
setlon170240'
a=aave(sst.1,lon=170,lon=240,lat=-5,lat=5)'
b=aave(sst.2,lon=170,lon=240,lat=-5,lat=5)'
c=aave(sst.3,lon=170,lon=240,lat=-5,lat=5)'
s=(a+b+c)/3.0'
ds'
close3'
close2'
close1'
yy=yy+1
我编写的批量描述文件如下:
DSETd:
/TRMMdata/3b42/9801/3b42.2000%m201.00.7a.nc
TITLETRMMdataofyear2000
DTYPEnetcdf
OPTIONStemplate
UNDEF-9.99E33
XDEF144LINEAR02.5
YDEF20LINEAR02.5
ZDEF1LEVELS1000
TDEF12LINEAR01JAN20001mo
VARS1
pcp=>
pcp0t,z,y,xprecipitation
ENDVARS
gs文件如下:
opend:
/trmmdata/work/2000.ctl'
setlat060'
setlon030'
setlev1000'
dave(pcp,t=1,t=12)'
用GrADS转换nc数据
——byArtmunichfrom
kittyhare在一篇帖子里向我们初步介绍了使用GrADS转化nc为grd格式(摸我去看看~),我想能不能再详细点,于是借鉴以前自己见到的一个教程,更详细的介绍一下这方面的知识,希望大家指正。
先给出一个单层的二进制文件转化的gs
sdfopenf:
/data/nc/1980/air.1980.nc'
setfwritef:
/data//air.1980.bin'
setlon0357.5'
setlat-9090'
sett1640'
dair'
但我们知道nc文件是按照经度、纬度、高度、变量、时次顺序排列,要转nc文件,需要靠循环,由于高度的不连续性,我们可以在时间循环里面把每层的高度写出来。
t=1
while(t<
=365)
sett'
t
setlev925'
*Youcancontinuetowritehgt
t=t+1
当然,如果用z坐标系,这样z就是从1到17的,在时间的循环里嵌套z=1;
=17)我认为也是可行的,不过自己没试过,有用过的朋友可以告诉一下结果。
高度循环的:
=8)
t'
=21)
z'
setlon90125'
setlat1035'
definet=tmpprs'
definerh=rhprs'
definees=(6.112*exp(17.67*(t-273.15)/(t-29.65)))'
defineq=rh*(0.62197*es/(lev-es))/100.'
definee=lev*q/(0.62197+q)+1e-10'
definetlcl=55.0+2840.0/(3.5*log(t)-log(e)-4.805)'
definetheta=t*pow((1000./lev),(0.2854*(1.0-0.28*q)))'
definethetse=theta*exp(((3376./tlcl)-2.54)*q*(1.0+0.81*q))'
dthetse'
z=z+1