写在前面
写matlab教程,我有思想准备,是要触及一些人的利益,是会触及一些人的利益,是会有不同的观点和看法的。而且,也想写matlab教程的这些人社会联系还蛮广泛的,是有舆论能力的。我敢于写matlab教程,也就是说,像古人说的:“苟利国家生死以,岂因祸福避趋之”,就是要有这种精神!在此呢,也有不少人给气象家园泼脏水,包括给我本人给我朋友泼脏水,甚至说我是个妹子,一派胡言!我感到非常气愤,一派胡言!我就是个汉子,几十年就是这么下来的!
当然,这都是吐槽一下。对于资瓷我的童鞋们,我表示十分感谢。正是因为你们的资瓷,我才一直坚持写下来。说句实话,我本人的姿势水平其实也是感到拙计,还需要学习一个。闻道有先后,术业有专攻。有很多读者比我不知道高到哪里去了,希望大家能够和我谈笑风生,就自己擅长的方面对我进行帮助,同大家一起进行分享。鄙人的联系方式都在文末,希望专家们可以告诉我一些人生的经验,谢谢大家!
言归正传
Grib码是WMO推荐使用的三种表格驱动编码之一(其余两种是BUFR和CREX)。GRIB码是一种与计算机硬件无关的压缩二进制编码,主要用来表示数值天气分析和预报的产品资料。现行的GRIB码版本有GRIB1和GRIB2两种版本。与ASCII编码的文件不同,二进制编码的文件直接打开就是乱码,如同天书一般。因此GRIB码不适合人工直接解读(给我读我也读不懂…),而适合计算机解译。我知道肯定有人会问:没图你说个兰溪。于是我就贴个图好了…
1.GRIB1
GRIB1资料说起来还比较复杂的。一般分为六大段:
0段:指示段(“GRIB”,资料长度,GRIB码版本号)
1段:产品定义段(段长,编码的分析或预报产品的标识号)
2段:(网格描述段)(段长,网格的几何形状(必要时))
3段:(位图段)(段长,每个格点一位,按照适当顺序存放,比特位的取值指明对应格点的数值十分被省略)
4段:二进制数据段(段长和数据值)
5段:(结束段)
至于为什么从0开始,我想肯定是他们用C用的顺手了…
2.GRIB2
GRIB2资料是GRIB1资料的进化版,从六段变成了九段(还是从0段开始的……)。而且,与八股文似的GRIB1不同,GRIB允许将2-7段、3-7段或者-7段进行重复。在重复的段序列中,应包含该序列的所有段,并按照上述段号顺序排列。不重复的段在再定义之前一直有效。
在GRIB编码的资料中,资料长度和段长都是以8位组来表示的。其中,0段是8个八位组,5段是个。其余均是可变的,各段前三个八位组表示该段的段长。在不同的数据段中,八位组的序号表示不同的内容。只要将对应序列的八位组翻译成ASCII码,就可愉快的读取文件内容了。当然,这个具体的数据结构嘛…估计能写一本小册子了。不同的位置,不同的数据类型,不同的数值都被赋予了不同的意义,不知道多到哪里去了。而且还有各种压缩算法需要将二进制数字还原成十进制数字,包括谱资料等等。
写到这里,大家可能感觉其实说复杂也并不复杂。只要结合数据结构,按照二进制的规则来读取GRIB编码文件,结合对应压缩算法的解压缩算法就可以读取GRIB编码文件了。事实上,大家经常用的rad_grib也是这么做的,重要的部分就是frad和fsk。当然,这种事情总是说起来简单,做起来异常麻烦的。自己重头写起也是很麻烦的,一般我们都使用rad_grib和rad_grib2两个程序。当然,猫同学也推荐了一个很好的程序,地址我附在文后了。
3.rad_grib用法简介
关于工具箱的安装方法,我就不说了,在文件夹里面的Radm都有说明。安装过后,我们就可以使用了。
举个栗子:
filnam=fnl__12_00;
%grib1格式的文件名,改文件为NCEP的FNL再分析资料
data0=rad_grib(filnam,1,ScrnDiag,0);
%用rad_grib函数打开文件的函数,
%最主要的形式rad_grib(gribnam,irc);
%输入参数的前两个为必须的,filnam为文件名,第二个为指定的grib记录号
%irc为-1时,默认返回所有的记录,例如dd=rad_grib(filnam,-1);
%则dd为一个结构数据,里面包含grib文件的记录信息,用户可以选择自己使用的记录号
%来读取相应的数据
data1=data0(1).fltarray;
%将data0中的数据导出
data1=rshap(data1,[]);
data1=data1;
%根据数据经纬度的排列方式,进行重新变形,以适合气象学上应用的形式
酱紫,data1就被读出来了。rad_grib2的使用也是类似的啦~
一般来讲,fnl文件包含的数据类型如下:
1PRES=Prssur[Pa]气压
2HGT=Gopotntialhight[gpm]位势高度
3TMP=Tmp.[K]温度
VVEL=Prssurvrticalvlocity[Pa/s]气压垂直速度
5RH=Rlativhumidity[%]相对湿度
6ABSV=Absolutvorticity[/s]绝对涡度
7O3MR=Ozonmixingratio[kg/kg]臭氧混合比
8CLWMR=Cloudwatr[kg/kg]云水
95WAVH=5-wavgopotntialhight[gpm]
10UGRD=uwind[m/s]纬向风
11VGRD=vwind[m/s]经向风
12SPFH=Spcifichumidity[kg/kg]比湿
13PWAT=Prcipitablwatr[kg/m^2]降雨量
1VWSH=Vrticalspdshar[1/s]垂向风切变
15LFTX=Surfacliftdindx[K]地面举升指数
16CAPE=ConvctivAvail.Pot.Enrgy[J/kg]对流可用位能
17CIN=Convctivinhibition[J/kg]对流抑制能
18LFTX=Bst(-layr)liftdindx[K]
19PRMSL=PrssurrducdtoMSL[Pa]
20POT=Potntialtmp.[K]位温
21TOZNE=Totalozon[Dobson]总臭氧
22CWAT=Cloudwatr[kg/m^2]云水
23SOILW=Volumtricsoilmoistur[fraction]
2WEASD=Accum.snow[kg/m^2]雪深
25LAND=Landcovr(land=1;sa=0)[fraction]土地标示
26ICEC=Icconcntration(ic=1;noic=0)[fraction]冰密集度
27HPBL=Plantaryboundarylayrhight行星边界层高度
28TCDC=Totalcloudcovr[%]总云水
29GPA=Gopotntialhightanomaly[gpm]位势高度异常
WAVA=5-wavgopot.hightanomaly[gpm]
具体关于函数的使用问题,函数自带的hlp里面说的比较清楚,我再重复也没什么意思了。
论坛的
⑤0/tuu号童鞋指出在极射投影的情况下,rad_grib会出现错误,需要将tabl6.m中的cas5修改为PolarStrographic,并重新编译mxBDS_unpack_mx5.c就OK了(需要删除原有rad_grib文件夹,重新copy)。Rad_grib的一个下载鍖椾含鏈夋不鐧界櫆椋庣殑鍚?鍖椾含娌荤枟鐧界櫆椋庣殑浠锋牸