GrADS格点数据格式

目录

参见《About GrADS Gridded Data Sets

简介

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

格式说明

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

数据描述文件(ctl文件)

下面是某个ctl文件的样例,来自GRAPES MESO v4.0的模式积分输出:

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行,数据文件名

dset ^postvar201408110000100

dest表示描述文件对应的数据文件名,{shell}^{/shell}表示当前数据描述文件所在的目录。

2行,选项

options sequential big_endian

{shell}options{/shell}用于控制GRADS解释数据文件内容的方式,本示例文件中设置两项:
sequential
数据文件使用FORTRAN的sequential unformatted I/O方式写入,每个记录的首尾包含FORTRAN写入的数据长度,在文件解析中会详细分析此项选项带来的影响。
big_endian
使用大端存储,对应little_endian,用于数据交换的二进制数据文件一般需要确定字节存储顺序,IBM PowerPC AIX系统为大端存储,所以模式输出的文件也是大端存储的。参见我的一篇博文《字节顺序——大端存储和小端存储

3行,描述

title post output from grapes

{shell}title{/shell}后面给出数据的描述。

4行,缺测值

undef 9.999E+20

{shell}undef{/shell}:未定义或缺失数据的值,必须指定。

5行,经度

xdef   751  linear    70.0000    0.1000

{shell}xdef{/shell}定义x轴,即经度。格式如下:

XDEF xnum mapping additional_arguments

{shell}xnum{/shell}:个数
{shell}mapping{/shell}:两个选项

LINEAR:线性映射

LEVELS:单独指定经度值

线性映射:指定起始点和增量,示例文件中采用这种方法

xdef   751  linear    70.0000    0.1000

层数:指定层次列表

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

6行,纬度

ydef   501  linear    15.0000    0.1000

{shell}ydef{/shell}定义y轴,即纬度。格式与{shell}xdef{/shell}相同,不过映射选项多了几个:
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行,层次

zdef   26 levels
    1000.000000
...
    10.00000000

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

34行,时间

tdef 1 linear 01z11AUG2014    60mn

{shell}tdef{/shell}定义时间范围,格式如下:

TDEF tnum LINEAR start increment

{shell}start{/shell}:起始时间,使用GrADS绝对时间格式

{shell}hh:mmZddmmmyyyy{/shell}

其中
{shell}hh{/shell}:小时(两位数字)
{shell}mm{/shell}:分钟(两位数字)
{shell}dd{/shell}:天(一位或两位数字)
{shell}mmm{/shell}:月份,三字符
{shell}yyyy{/shell}:年(两位或四位数字,两位数字年份在1950和2049之间)
{shell}increment{/shell} 时间增量,格式

{shell}vvkk{/shell}

{shell}vv{/shell}:整数,1或2位
{shell}kk{/shell}:mn、hr、dy、mo、yr

35-66行,变量记录

vars
    u 26 0 u_wind
...
    mslb  4 0 mslb
endvars

{shell}vars{/shell}和{shell}endvars{/shell}之间是变量记录,每条记录格式如下:
GrADS v2.0.1及以前版本

varname levs units description

GrADS v2.0.2及以后版本

varname levs <additional_codes> units description

当前模式输出使用的应该是v2.0.1的格式,没有加入附加说明。
{shell}varname{/shell}:变量名,15个字符以内的字母或数字,以字母开头
{shell}levs{/shell}:包含垂直层次的个数,如果为0,表示不对应任何垂直层次
{shell}units{/shell}:对于目前这种4字节浮点数的二进制文件,忽略该变量但必须指定,可以设置为99。
{shell}description{/shell}:描述,最多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写入方式:
{shell}sequential{/shell}
包含FORTRAN记录长度头,首尾各一个,每次写操作都会记录长度。当前模式输出中,每个要素层次写一次,也就是vars中每个变量记录写一次。
{shell}dircet access{/shell}或{shell}stream{/shell}
没有内置的记录长度信息
{shell}options{/shell}中设置{shell}sequential{/shell}时,文件包含FORTRAN记录长度头信息,读取时需要注意。

样例说明

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

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

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

之后又是下一个记录

文件解析

首先解析ctl文件,得到数据文件中的所有记录条目,在从数据文件中依次读取每个记录。
详细内容参见后续文章。