GrADS数据格式简介
标签:
it教育 |
分类: GrADS |
简介
模式运行输出结果为GrADS格点数据格式,包括二进制数据文件和描述文件。
描述文件
data descriptor file, 或者control
file,通常以扩展名.ctl结尾,包含对二进制数据的文件位置,及数据信息完整描述,包括网格、时间、经纬度信息、层次、变量等信息。
二进制数据文件
binary data file,通常以扩展名.dat结尾或者没有扩展名。只保存数据值,没有时间等信息。
格式说明
为了快速掌握GrADS格点数据格式,从实例文件开始学习,研究每条语句的含义。
数据描述文件(ctl文件)
下面是某个ctl文件的样例,来自GRAPES MESO v4.0的模式积分输出:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
dset
^postvar201408110000100
options sequential
big_endian
title post output
from grapes
undef
9.999E+20
xdef
ydef
zdef
tdef 1 linear
01z11AUG2014
vars 30
endvars
|
1行,数据文件名
|
1
|
dset
^postvar201408110000100
|
dest表示描述文件对应的数据文件名, ^表示当前数据描述文件所在的目录。
2行,选项
|
1
|
options sequential
big_endian
|
options用于控制GRADS解释数据文件内容的方式,本示例文件中设置两项:
sequential
数据文件使用FORTRAN的sequential unformatted I/O方式写入,每个记录的首尾包含FORTRAN写入的数据长度,在文件解析中会详细分析此项选项带来的影响。
big_endian
使用大端存储,对应little_endian,用于数据交换的二进制数据文件一般需要确定字节存储顺序,IBM PowerPC AIX系统为大端存储,所以模式输出的文件也是大端存储的。参见我的一篇博文《字节顺序——大端存储和小端存储》
3行,描述
|
1
|
title post output
from grapes
|
title后面给出数据的描述。
4行,缺测值
|
1
|
undef
9.999E+20
|
undef:未定义或缺失数据的值,必须指定。
5行,经度
|
1
|
xdef
|
xdef定义x轴,即经度。格式如下:
|
1
|
XDEF xnum mapping
additional_arguments
|
xnum:个数
mapping:两个选项
LINEAR:线性映射
LEVELS:单独指定经度值
线性映射:指定起始点和增量,示例文件中采用这种方法
|
1
|
xdef
|
层数:指定层次列表
|
1
|
XDEF 12 LEVELS
0 30 60 90
120 150 180 210
240 270 300
330
|
6行,纬度
|
1
|
ydef
|
ydef定义y轴,即纬度。格式与
xdef相同,不过映射选项多了几个:
LINEAR Linear mapping
LEVELS Latitudes specified individually
GAUST62 Gaussian T62 latitudes
GAUSR15 Gaussian R15 latitudes
GAUSR20 Gaussian R20 latitudes
GAUSR30 Gaussian R30 latitudes
GAUSR40 Gaussian R40 latitudes
样例文件中使用线性映射关系,其它选项暂不考虑。
7-33行,层次
|
1
2
3
4
|
zdef
...
|
zdef定义垂直层次。格式与 xdef相同。样例文件中指定层次列表。
34行,时间
|
1
|
tdef 1 linear
01z11AUG2014
|
tdef定义时间范围,格式如下:
|
1
|
TDEF tnum LINEAR
start increment
|
start:起始时间,使用GrADS绝对时间格式
hh:mmZddmmmyyyy
其中
hh:小时(两位数字)
mm:分钟(两位数字)
dd:天(一位或两位数字)
mmm:月份,三字符
yyyy:年(两位或四位数字,两位数字年份在1950和2049之间)
increment 时间增量,格式
vvkk
vv:整数,1或2位
kk:mn、hr、dy、mo、yr
35-66行,变量记录
|
1
2
3
4
5
|
vars
...
endvars
|
vars和 endvars之间是变量记录,每条记录格式如下:
GrADS v2.0.1及以前版本
|
1
|
varname levs units
description
|
GrADS v2.0.2及以后版本
|
1
|
varname levs
<</span>additional_codes>
units description
|
当前模式输出使用的应该是v2.0.1的格式,没有加入附加说明。
varname:变量名,15个字符以内的字母或数字,以字母开头
levs:包含垂直层次的个数,如果为0,表示不对应任何垂直层次
units:对于目前这种4字节浮点数的二进制文件,忽略该变量但必须指定,可以设置为99。
description:描述,最多140字符
二进制数据文件
文件结构
由不同块组合到一起,每块是XY水平网格数据:第一维(X)默认从西到东,第二位(Y)默认从南到北。每块代表特定层次、特定时间的一个特定变量,每个GRADS文件中的水平网格必须一样。
块按顺序排列。维数变化顺序,从变化最快的维(一般是x轴,即经度)开始:
经度(lon,x)
纬度(lat,Y)
垂直层次(Z)
变量(VAR)
时间(T)
集合(ensemble,E)
可以省略没有的维度。
示例:
4维网格
Time 1, Variable 1, Each vertical level from bottom to top
Time 1, Variable 2, Each vertical level from bottom to top
Time 1, Variable 3, Each vertical level from bottom to top
Time 1, Variable 4, Each vertical level from bottom to top
Time 2, Variable 1, Each vertical level from bottom to top
Time 2, Variable 2, Each vertical level from bottom to top
Time 2, Variable 3, Each vertical level from bottom to top
Time 2, Variable 4, Each vertical level from bottom to top
etc.
业务中postvar只有3维网格,有些变量只有2维网格。
Variable 1, Each vertical level from bottom to top
Variable 2, Each vertical level from bottom to top
Variable 3, Each vertical level from bottom to top
Variable 4, Each vertical level from bottom to top
二进制格式
与FORTRAN写入方式有关。FORTRAN写入方式:
sequential
包含FORTRAN记录长度头,首尾各一个,每次写操作都会记录长度。当前模式输出中,每个要素层次写一次,也就是vars中每个变量记录写一次。
dircet access或
stream
没有内置的记录长度信息
options中设置
sequential时,文件包含FORTRAN记录长度头信息,读取时需要注意。
样例说明
样例文件是上面ctl文件对应的数据文件。
开始的头四个字节(0×00)是长度头,0x0FD200
http://ww1/large/4afdac38gw1ejgug2wvw2j20f3015wek.jpg
接下来是数据,每四字节为一个浮点数
http://ww1/large/4afdac38gw1ejgug3des1j20f0014t8s.jpg
最后四个字节( 0×04 + 0x0FD200 = 0xFD204 )是长度头,0x0FD200,与开头四字节相同
http://ww1/large/4afdac38gw1ejgug3oo7lj20f2015glo.jpg
之后又是下一个记录
文件解析
首先解析ctl文件,得到数据文件中的所有记录条目,在从数据文件中依次读取每个记录。

加载中…