> 文章列表 > WRF进阶:撰写Vtable文件添加气象场数据源:以JRA55积雪数据为例

WRF进阶:撰写Vtable文件添加气象场数据源:以JRA55积雪数据为例

WRF进阶:撰写Vtable文件添加气象场数据源:以JRA55积雪数据为例

在WRF的WPS前处理中,ungirb.exe可以将下载的气象场grib文件解码并转为中间格式,最终通过metgrid.exe与包含域信息的geo_em文件写入met_em文件中。
将气象数据转为metgrid.exe可以读取的中间格式有两种方法,一种为使用NCL或者Fortran直接写出:该方法我在博客NCL撰写WPS intermediate file添加海冰场中有所介绍,这里介绍另一种方法:撰写Vtable文件,再使用ungrib.exe对其解码,得到中间文件。

Vtable文件

ungrib,exe是通过链接Vtable文件,知道需要解码的GRIB文件格式、变量信息,对其解码,也就是对应我们的ln -sf ungrib/Variable_Tables/Vtable.** Vtable 这段代码,不同的数据来源需要链接不同的Vtable才能正常解码。
虽然WPS本身提供了众多数据集的Vtables,但是ungrib不可能以GRIB格式预测每种可能的气象数据来源。当ungrib.exe处理新的数据源时,用户可以从头开始创建新的Vtable,也可以使用现有的Vtable作为示例。
关于Vtable的价绍官方文档以及翻译:创建和编辑Vtable文件有很好的价绍,简单而言,用户创建编辑Vtable需要了解一下信息:

  • GRIB code:气象场的GRIB码(GRIB code,在该数据集集中是一个独一无二的数字,类似于ID。
  • Level信息
  • 数据本身在metgrid中的描述和名称

想要了解这些,可以借助ungrib下的g1print.exe和g2print.exe工具并结合官方数据来源给出的信息。

数据下载

JRA55的数据可以去JMA下,也可以去NACR下,不过JMA实在是太慢了,而NACR会主动提供批量的py和csh脚本下载。
不知为何我的电脑在Windows下用python返回的数据请求都是404,于是放在服务器上用wget下了,速度也很快的,这里下的是6小时地面再分析中的雪水当量数据,官方描述为:
WRF进阶:撰写Vtable文件添加气象场数据源:以JRA55积雪数据为例
其实JRA55还有一个雪深再分析,但是每天只有18:00,这就不太适合用ungrib了,不过WRF里雪深雪水当量原本就是能互相换算的,自己把变量名对应好就行。
下面是NACR提供的脚本,把pwd和opt换成你的邮箱密码就行:

#!/usr/bin/env cshset pswd = $1
if(x$pswd == x && `env | grep RDAPSWD` != '') thenset pswd = $RDAPSWD
endif
if(x$pswd == x) thenecho Usage: $0 YourPasswordexit 1
endif
set v = `wget -V |grep 'GNU Wget ' | cut -d ' ' -f 3`
set a = `echo $v | cut -d '.' -f 1`
set b = `echo $v | cut -d '.' -f 2`
if(100 * $a + $b > 109) thenset opt = 'wget --no-check-certificate'
elseset opt = 'wget'
endifset opt1 = '-O Authentication.log --save-cookies auth.rda_ucar_edu --post-data'
set opt2 = "email=youremail&passwd=$pswd&action=login"
$opt $opt1="$opt2" https://rda.ucar.edu/cgi-bin/login
if ( $status == 6 ) thenecho 'Please check that your password is correct.'echo "Usage: $0 YourPassword"exit 1
endif
set opt1 = "-N --load-cookies auth.rda_ucar_edu"
set opt2 = "$opt $opt1 https://rda.ucar.edu"
set filelist= (\\ /data/ds628.0/anl_land125/2022/anl_land125.225_soilw.2022120100_2022123118  \\
)
while($#filelist > 0)set syscmd = "$opt2$filelist[1]"echo "$syscmd ..."$syscmdshift filelist
end

中间的filelist你可以自己构建,也可以去NACR选的时候自带提供……无所谓。

查看GRIB信息

由于JRA55都是GRIB1格式,直接用g1print,exe打印以下就是了:./g1print.exe /JRA55/land/anl_land125.065_snwe.2020090100_2020093018
返回:

Fortran Unit = 0
UNIX File descriptor: 3----------------------------------------------------rec GRIB GRIB  Lvl  Lvl  Lvl         Time      FcstNum Code name  Code one  two                   hour
----------------------------------------------------1  65            1    0    0  2020-09-01_00:00 + 002  65            1    0    0  2020-09-01_06:00 + 003  65            1    0    0  2020-09-01_12:00 + 004  65            1    0    0  2020-09-01_18:00 + 005  65            1    0    0  2020-09-02_00:00 + 006  65            1    0    0  2020-09-02_06:00 + 007  65            1    0    0  2020-09-02_12:00 + 008  65            1    0    0  2020-09-02_18:00 + 009  65            1    0    0  2020-09-03_00:00 + 0010  65            1    0    0  2020-09-03_06:00 + 0011  65            1    0    0  2020-09-03_12:00 + 0012  65            1    0    0  2020-09-03_18:00 + 0013  65            1    0    0  2020-09-04_00:00 + 0014  65            1    0    0  2020-09-04_06:00 + 0015  65            1    0    0  2020-09-04_12:00 + 0016  65            1    0    0  2020-09-04_18:00 + 0017  65            1    0    0  2020-09-05_00:00 + 0018  65            1    0    0  2020-09-05_06:00 + 0019  65            1    0    0  2020-09-05_12:00 + 0020  65            1    0    0  2020-09-05_18:00 + 0021  65            1    0    0  2020-09-06_00:00 + 0022  65            1    0    0  2020-09-06_06:00 + 0023  65            1    0    0  2020-09-06_12:00 + 0024  65            1    0    0  2020-09-06_18:00 + 0025  65            1    0    0  2020-09-07_00:00 + 0026  65            1    0    0  2020-09-07_06:00 + 0027  65            1    0    0  2020-09-07_12:00 + 0028  65            1    0    0  2020-09-07_18:00 + 0029  65            1    0    0  2020-09-08_00:00 + 0030  65            1    0    0  2020-09-08_06:00 + 0031  65            1    0    0  2020-09-08_12:00 + 0032  65            1    0    0  2020-09-08_18:00 + 0033  65            1    0    0  2020-09-09_00:00 + 0034  65            1    0    0  2020-09-09_06:00 + 0035  65            1    0    0  2020-09-09_12:00 + 0036  65            1    0    0  2020-09-09_18:00 + 0037  65            1    0    0  2020-09-10_00:00 + 0038  65            1    0    0  2020-09-10_06:00 + 0039  65            1    0    0  2020-09-10_12:00 + 0040  65            1    0    0  2020-09-10_18:00 + 0041  65            1    0    0  2020-09-11_00:00 + 0042  65            1    0    0  2020-09-11_06:00 + 0043  65            1    0    0  2020-09-11_12:00 + 0044  65            1    0    0  2020-09-11_18:00 + 0045  65            1    0    0  2020-09-12_00:00 + 0046  65            1    0    0  2020-09-12_06:00 + 0047  65            1    0    0  2020-09-12_12:00 + 0048  65            1    0    0  2020-09-12_18:00 + 0049  65            1    0    0  2020-09-13_00:00 + 0050  65            1    0    0  2020-09-13_06:00 + 0051  65            1    0    0  2020-09-13_12:00 + 0052  65            1    0    0  2020-09-13_18:00 + 0053  65            1    0    0  2020-09-14_00:00 + 0054  65            1    0    0  2020-09-14_06:00 + 0055  65            1    0    0  2020-09-14_12:00 + 0056  65            1    0    0  2020-09-14_18:00 + 0057  65            1    0    0  2020-09-15_00:00 + 0058  65            1    0    0  2020-09-15_06:00 + 0059  65            1    0    0  2020-09-15_12:00 + 0060  65            1    0    0  2020-09-15_18:00 + 0061  65            1    0    0  2020-09-16_00:00 + 0062  65            1    0    0  2020-09-16_06:00 + 0063  65            1    0    0  2020-09-16_12:00 + 0064  65            1    0    0  2020-09-16_18:00 + 0065  65            1    0    0  2020-09-17_00:00 + 0066  65            1    0    0  2020-09-17_06:00 + 0067  65            1    0    0  2020-09-17_12:00 + 0068  65            1    0    0  2020-09-17_18:00 + 0069  65            1    0    0  2020-09-18_00:00 + 0070  65            1    0    0  2020-09-18_06:00 + 0071  65            1    0    0  2020-09-18_12:00 + 0072  65            1    0    0  2020-09-18_18:00 + 0073  65            1    0    0  2020-09-19_00:00 + 0074  65            1    0    0  2020-09-19_06:00 + 0075  65            1    0    0  2020-09-19_12:00 + 0076  65            1    0    0  2020-09-19_18:00 + 0077  65            1    0    0  2020-09-20_00:00 + 0078  65            1    0    0  2020-09-20_06:00 + 0079  65            1    0    0  2020-09-20_12:00 + 0080  65            1    0    0  2020-09-20_18:00 + 0081  65            1    0    0  2020-09-21_00:00 + 0082  65            1    0    0  2020-09-21_06:00 + 0083  65            1    0    0  2020-09-21_12:00 + 0084  65            1    0    0  2020-09-21_18:00 + 0085  65            1    0    0  2020-09-22_00:00 + 0086  65            1    0    0  2020-09-22_06:00 + 0087  65            1    0    0  2020-09-22_12:00 + 0088  65            1    0    0  2020-09-22_18:00 + 0089  65            1    0    0  2020-09-23_00:00 + 0090  65            1    0    0  2020-09-23_06:00 + 0091  65            1    0    0  2020-09-23_12:00 + 0092  65            1    0    0  2020-09-23_18:00 + 0093  65            1    0    0  2020-09-24_00:00 + 0094  65            1    0    0  2020-09-24_06:00 + 0095  65            1    0    0  2020-09-24_12:00 + 0096  65            1    0    0  2020-09-24_18:00 + 0097  65            1    0    0  2020-09-25_00:00 + 0098  65            1    0    0  2020-09-25_06:00 + 0099  65            1    0    0  2020-09-25_12:00 + 00100  65            1    0    0  2020-09-25_18:00 + 00101  65            1    0    0  2020-09-26_00:00 + 00102  65            1    0    0  2020-09-26_06:00 + 00103  65            1    0    0  2020-09-26_12:00 + 00104  65            1    0    0  2020-09-26_18:00 + 00105  65            1    0    0  2020-09-27_00:00 + 00106  65            1    0    0  2020-09-27_06:00 + 00107  65            1    0    0  2020-09-27_12:00 + 00108  65            1    0    0  2020-09-27_18:00 + 00109  65            1    0    0  2020-09-28_00:00 + 00110  65            1    0    0  2020-09-28_06:00 + 00111  65            1    0    0  2020-09-28_12:00 + 00112  65            1    0    0  2020-09-28_18:00 + 00113  65            1    0    0  2020-09-29_00:00 + 00114  65            1    0    0  2020-09-29_06:00 + 00115  65            1    0    0  2020-09-29_12:00 + 00116  65            1    0    0  2020-09-29_18:00 + 00117  65            1    0    0  2020-09-30_00:00 + 00118  65            1    0    0  2020-09-30_06:00 + 00119  65            1    0    0  2020-09-30_12:00 + 00120  65            1    0    0  2020-09-30_18:00 + 00***** End-Of-File on C unit   3

这样GRIB code和LEV code都有啦,开始写Vtable吧!

创建VTABLE

直接写一个肯定很麻烦,我这里是从ECMWF直接cp再改的,这无所谓:

GRIB | Level| Level| Level| metgrid  |  metgrid | metgrid                                  |
Code | Code |   1  |   2  | Name     |  Units   | Description                              |
-----+------+------+------+----------+----------+------------------------------------------+65 |  1   |   0  |      | SNOW     | kg m-2   |Water Equivalent of Accumulated Snow Depth|66 |  1   |   0  |      | SNOWH    | m        | Physical Snow Depth                      
-----+------+------+------+----------+----------+------------------------------------------+
#

格式检查

此时链接我们创建的Vtable下载的积雪数据,便能成功解码,你可以通过util下的d_intermediate.exe工具检验一下你的中间格式是什么样子。

================================================
FIELD = SNOW
UNITS = kg m-2 DESCRIPTION = Water Equivalent of Accumulated Snow Depth
DATE = 2020-01-26_00:00:00 FCST = 0.000000
SOURCE = unknown model and orig center
LEVEL = 200100.000000
I,J DIMS = 288, 145
IPROJ = 0  PROJECTION = LAT LONREF_X, REF_Y = 1.000000, 1.000000REF_LAT, REF_LON = 90.000008, 0.000000DLAT, DLON = -1.250000, 1.250000EARTH_RADIUS = 6367.470215
DATA(1,1)=-1000000015047466219876688855040.000000================================================
FIELD = SNOWH
UNITS = m DESCRIPTION = Physical Snow Depth
DATE = 2020-01-26_00:00:00 FCST = 0.000000
SOURCE = unknown model and orig center
LEVEL = 200100.000000
I,J DIMS = 288, 145
IPROJ = 0  PROJECTION = LAT LONREF_X, REF_Y = 1.000000, 1.000000REF_LAT, REF_LON = 90.000008, 0.000000DLAT, DLON = -1.250000, 1.250000EARTH_RADIUS = 6367.470215
DATA(1,1)=-4999999721059844884160053248.000000

修改METGRID.TBL

METGRID.TBL文件是一个文本文件,它定义了要用网格插值的每个气象场的参数。换句话说,只有参数在TBL文件中被定义,它才能被metgrid.exe文件读取插值。
我们应当注意,尽管在METGRID.TBL存在着SNOW这个变量,但它的一些属性并不一定与我们的SNOW对应,此时我们要修改使得其被正确读取。
比如这里我们就需要加入missing_value=-1.E20这一行。
WRF进阶:撰写Vtable文件添加气象场数据源:以JRA55积雪数据为例
想要知道更详细的信息,可以用NCL的filedump看一看:ncl_filedump JRA55/land/anl_land125.065_snwe.2020010100_2020013118.grib

file global attributes:dimensions:initial_time0_hours = 124g0_lat_1 = 145g0_lon_2 = 288variables:float SnWe_GDS0_SFC ( initial_time0_hours, g0_lat_1, g0_lon_2 )sub_center :   241center :       Japanese Meteorological Agency - Tokyo (RSMC)long_name :    Water equivalent of accumulated snow depthunits :        kg/m^2_FillValue :   1e+20level_indicator :      1gds_grid_type :        0parameter_table_version :      200parameter_number :     65forecast_time :        0forecast_time_units :  hours

然后便可以正常metgrid.exe即可。