新浪博客

GrADS数据格式简介

2014-11-04 15:09阅读:
reprinted from http://windrocblog.sinaapp.com/?p=1459

简介

模式运行输出结果为GrADS格点数据格式,包括二进制数据文件和描述文件。
描述文件
data descriptor file, 或者control file,通常以扩展名.ctl结尾,包含对二进制数据的文件位置,及数据信息完整描述,包括网格、时间、经纬度信息、层次、变量等信息。
二进制数据文件
binary data file,通常以扩展名.dat结尾或者没有扩展名。只保存数据值,没有时间等信息。

格式说明

为了快速掌握GrADS格点数据格式,从实例文件开始学习,研究每条语句的含义。

数据描述文件(ctl文件)

下面是某个ctl文件的样例,来自GRAPES MESO v4.0的模式积分输出:
0 650.0000000 600.0000000 550.0000000 500.0000000 450.0000000 400.0000000 350.0000000 300.0000000 250.0000000 200.0000000 150.0000000 100.0000000 70.00000000 50.00000000 30.00000000 20.00000000 10.00000000 tdef 1 linear 01z11AUG2014 60mn vars 30 u 26 0 u_wind v 26 0 v_wind t 26 0 temperature h 26 0 geopotential height Qv 26 0 Q vapor Qc 26 0 Q cloud Qr 26 0 Q rain Qi 26 0 Q ice Qs 26 0 Q snow Qg 26 0 Q grapaul w 26 0 vertical wind ps 0 0 surface pressure psl 0 0 sea level pressure rainc 0 0 precipitation rainnc 0 0 precipitation ts 0 0 surface temperature glw 0 0 surface long wave radiation flux gsw 0 0 surface short wave radiation flux hfx 0 0 surface heat flux qfx 0 0 surface vapour flux q2m 0 0 vapour at 2m t2m 0 0 t at 2m u10m 0 0 u at 10m v10m 0 0 v at 10m lu 0 0 land use zs 0 0 terrain tmn 0 0 tmn cr 0 0 cr in dbz tslb 4 0 tslb mslb 4 0 mslb endvars
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 751 linear 70.0000 0.1000
ydef 501 linear 15.0000 0.1000
zdef 26 levels
1000.000000
975.0000000
950.0000000
925.0000000
900.0000000
850.0000000
800.0000000
750.0000000
700.0000000
650.0000000
600.0000000
550.0000000
500.0000000
450.0000000
400.0000000
350.0000000
300.0000000
250.0000000
200.0000000
150.0000000
100.0000000
70.00000000
50.00000000
30.00000000
20.00000000
10.00000000
tdef 1 linear 01z11AUG2014 60mn
vars 30
u 26 0 u_wind
v 26 0 v_wind
t 26 0 temperature
h 26 0 geopotential height
Qv 26 0 Q vapor
Qc 26 0 Q cloud
Qr 26 0 Q rain
Qi 26 0 Q ice
Qs 26 0 Q snow
Qg 26 0 Q grapaul
w 26 0 vertical wind
ps 0 0 surface pressure
psl 0 0 sea level pressure
rainc 0 0 precipitation
rainnc 0 0 precipitation
ts 0 0 surface temperature
glw 0 0 surface long wave radiation flux
gsw 0 0 surface short wave radiation flux
hfx 0 0 surface heat flux
qfx 0 0 surface vapour flux
q2m 0 0 vapour at 2m
t2m 0 0 t at 2m
u10m 0 0 u at 10m
v10m 0 0 v at 10m
lu 0 0 land use
zs 0 0 terrain
tmn 0 0 tmn
cr 0 0 cr in dbz
tslb 4 0 tslb
mslb 4 0 mslb
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 751 linear 70.0000 0.1000

xdef定义x轴,即经度。格式如下:

1
XDEF xnum mapping additional_arguments

xnum:个数
mapping:两个选项
LINEAR:线性映射
LEVELS:单独指定经度值
线性映射:指定起始点和增量,示例文件中采用这种方法

1
xdef 751 linear 70.0000 0.1000

层数:指定层次列表

1
XDEF 12 LEVELS 0 30 60 90 120 150 180 210 240 270 300 330

6行,纬度


1
ydef 501 linear 15.0000 0.1000

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 26 levels
1000.000000
...
10.00000000

zdef定义垂直层次。格式与 xdef相同。样例文件中指定层次列表。

34行,时间


1
tdef 1 linear 01z11AUG2014 60mn

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
u 26 0 u_wind
...
mslb 4 0 mslb
endvars

varsendvars之间是变量记录,每条记录格式如下:
GrADS v2.0.1及以前版本

1
varname levs units description

GrADS v2.0.2及以后版本
units description
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 accessstream
没有内置的记录长度信息
options中设置 sequential时,文件包含FORTRAN记录长度头信息,读取时需要注意。

样例说明

样例文件是上面ctl文件对应的数据文件。
开始的头四个字节(0×00)是长度头,0x0FD200

接下来是数据,每四字节为一个浮点数

最后四个字节( 0×04 + 0x0FD200 = 0xFD204 )是长度头,0x0FD200,与开头四字节相同

之后又是下一个记录

文件解析

首先解析ctl文件,得到数据文件中的所有记录条目,在从数据文件中依次读取每个记录。

我的更多文章

下载客户端阅读体验更佳

APP专享