下载及裁剪美国GFS全球数值天气预报资料的方法
2021-12-30史小康程文聪忤建勋
史小康,程文聪,忤建勋,李 森
(1.北京航空气象研究所,北京100085;2.西北核技术研究院,乌鲁木齐 841700)
0 引言
美国NCEP机构制作的GFS全球数值天气预报产品在中国气象业务中有着非常广泛的应用,除了可提供预报信息,还可作为背景场驱动有着同样广泛应用的区域数值天气模式WRF开展短期和短时预报等。随着GFS预报模型空间分辨率的不断提高,GFS全球数值天气预报产品的文件大小急速增加。相比过去1.0°分辨力的数据,目前0.25°的grib2格式的预报产品的数据大小增加了10多倍,单个文件达到330 Mb左右,这对数据传输和存储带来较大压力。
然而,及时下载和存储GFS的0.25°grib2格式的预报产品有着非常重要的业务价值。文章重点分析了当前下载GFS数据存在的困难和问题,给出了解决方法。另外,通过裁剪关心区域和减少无用变量的方法,缩小了原始grib2格式文件大小,并可给WRF模式提供背景场。
1 方法分析
1.1 现有方法和问题
1)在Windows环境下,访问数据网站https://ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/,点击下载目标文件。0.25°分辨力预报结果的文件命名格式为:gfs.t**z.pgrb2.0p25.f###,其中,“**”取值为00、06、12或18,代表1 d中的4次预报;“###”为预报时效。
但由于不明原因,当前数据下载速度非常慢(测试环境带宽为200 Mb/s),并且由于数据文件比较大,时常下载停止或掉线,从而导致下载失败。此现象在其他测试环境中也会出现。
2)在Linux环境下(测试环境带宽为200 Mb/s),数据下载相对稳定一些。经测试,每日清晨是下载速度最快的时段。但即使在此时段,下载12 h预报结果(比如,取3 h间隔,则共5个数据文件)也常需要数个小时,使得GFS资料的可用性降低。
3)访问数据网站https://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl,针对GFS预报产品,可以选取变量、层次和关心区域,这样下载的文件比较小。在相同网速下,这种方法耗时明显减少,且成功率非常高。但从2020-06-24起,该网站停止提供此服务,且尚未恢复。
1.2 初步解决方法
1)申请1台腾讯云计算服务器(Linux环境),最低配置即可。以腾讯云服务器为平台,利用其IP,可以较为稳定的访问数据网站https://ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/。
2)编写脚本,实现数据下载。
3)如需将腾讯云上的下载数据转移至本地,数据转移速度与购买的滕讯云带宽有关。为加快数据传输速度,减少存储空间,利用python软件及相关程序包编写程序,生成仅包含关心区域和变量的grib2文件,提供给WRF模式作为背景场。
2 grib2文件格式和WRF模式背景场变量
2.1 grib2文件格式
grib是世界气象组织(WMO)开发的一种用于交换和存储规则分布数据的二进制文件格式。现行的grib码版本有grib1和grib2两种格式,grib2相比grib1有较大优点,比如支持多种压缩方式、表示多维数据等。其中,jasper和jpeg是两种常用且高效的压缩方式,大大减小了文件大小。
1份grib2文件一般情况下可包含9部分[1]:0段为指示段;1段为标志段;2段为本地使用段;3段为网格定义段;4段为产品定义段;5段为数据表示段;6段为位图段;7段为数据段;8段为结束标志码7777。
由于文章仅对grib2文件进行区域裁剪,不作其他修改,故涉及修改的地方主要在3段和5段。其中,在3段中重新定义区域,在5段中重新写入数据。
2.2 WRF模式背景场变量
grib2格式的GFS资料可作为WRF模式背景场,驱动WRF模式开展更高时空分辨率的数值模拟。GFS资料包含的变量特别多,但在WRF模式中,通过编译安装grib2读写库,再借助Vtable变量表的形式,可实现指定变量的读取[2]。
使用包含以下物理量的grib2格式的GFS资料,可驱动WRF模式正常运行:各等压面层的位势高度、温度、相对湿度、U风速、V风速;各层的土壤温度和土壤湿度;累计雪深的水相当量、雪深、2 m气温、2 m相对湿度、10 mU风速、10 mV风速、地表气压、海陆分布标志、海平面气压和地形高度。
3 具体实现
3.1 数据下载脚本
核心内容是使用Linux系统自带的wget命令实现数据下载,具体为:
/usr/bin/wget ${filepath}/${filename}
其中,${filepath}为包含数据的网址;${filename}为被下载的GFS数据文件名。
经测试,利用腾讯云计算服务器的数据下载速度比使用之前的Linux环境快5倍左右。
3.2 基于python、ecCodes和pygrib软件的grib2文件裁剪
1)软件安装
参考https://www.cnblogs.com/sunshine8/p/10348204.html[3]中方法,依次安装anaconda3(V4.4.0)、ecCodes支持库、ecCodes(V 2.18.0)和pygrib(V 2.0.5)等软件。针对pygrib软件安装过程中存在的问题,文章给出以下解决步骤:
①修改setup.cfg文档内容,主要是去掉下列行的注释,并修改
tar -xzvf v2.0.5rel.tar.gz
cp setup.cfg.template setup.cfg
packages_to_install=["pygrib","ncepgrib2"]
grib_api_dir=/usr/local
jasper_dir=/usr
openjpeg_dir=/usr
grib_api_libname=grib_api_lib
②创建下面的2个链接,因为pygrib需要访问grib_api*库
cd /usr/local/lib
ln -sf libeccodes.so libgrib_api_lib.so
ln -sf libeccodes_f90.so libgrib_api_lib_f90.so
③安装
cd pygrib-2.0.5rel/
python3 setup.py build
python3 setup.py install
2)grib2文件的读写和区域裁剪
编写python程序,利用pygrib库实现grib2文件的读写和区域裁剪。
①导入库
import pygrib
from ncepgrib2 import Grib2Decode,Grib2Encode
②打开读写文件
infile=pygrib.open(infile_str) #被读的且完整的GFS文件
outfile=open(outfile_str,′wb′) #存储结果的GFS文件
③设置WRF模式运行需要的变量
#将要读取的变量包含在varnames列表中,这些变量可供WRF模式正常运行使用。
varnames=[′Geopotential Height′,′Temperature′,′Relative humidity′,′U component of wind′,′V component of wind′,′Soil Temperature′,′Volumetric soil moisture content′,′Water equivalent of accumulated snow depth (deprecated)′,′Snow depth′,′2 metre temperature′,′2 metre relative humidity′,′10 metre U wind component′,′10 metre V wind component′,′Surface pressure′,′Land-sea mask′,′Pressure reduced to MSL′,′MSLP (Eta model reduction)′,′Sea ice area fraction′,′Land -sea coverage (nearest neighbor) [land=1,sea=0]′,′Orography′]
④读取每一个gribmessage单元,并进行区域裁剪
for varname in varnames:
grbs=infile.select(name=varname)
for i in range(len(grbs)):
grbmsg=grbs[i]
#获得关心区域的数据datsubset和原文件的编码信息
datsubset,latsubset,lonsubset=grbmsg.data(lat1=lat1,lat2=lat2,lon1=lon1,lon2=lon2)
grb=Grib2Decode(grbmsg.tostring(),gribmsg=True)
#修改编码信息
grb.grid_definition_info[1]=number_data_unpack #关心区域的格点数
grb.grid_definition_template[7]=points_x #东西方向格点数
grb.grid_definition_template[8]=points_y #南北方向格点数
grb.grid_definition_template[11]=lat2*1000000 #起始纬度
grb.grid_definition_template[12]=lon1*1000000 #起始经度
grb.grid_definition_template[14]=lat1*1000000 #终点纬度
grb.grid_definition_template[15]=lon2*1000000 #终点经度
grb.latitude_first_gridpoint=lat2*1.0
grb.latitude_last_gridpoint=lat1*1.0
grb.longitude_first_gridpoint=lon1*1.0
grb.longitude_last_gridpoint=lon2*1.0
grb.number_of_data_points_to_unpack=number_data_unpack
grb.points_in_x_direction=points_x
grb.points_in_y_direction=points_y
#存储datsubset和新的编码信息
grbo=Grib2Encode(grb.discipline_code,grb.identification_section)
grbo.addgrid(grb.grid_definition_info,grb.grid_definition_template)
grbo.addfield(grb.product_definition_template_number,grb.product_definition_template,grb.data_representation_template_number,grb.data_representation_template,datsubset) #写数据
grbo.end()
outfile.write(grbo.msg) #写输出文件
通过以上步骤,可实现GFS预报资料的区域裁剪。其中,lat1 通过以上方法,根据关心区域的格点数与全球的格点数的比值,以及存储变量个数与全部变量个数的比值,可以大概算出文件最终的大小。 以生成区域——lat:17°E~57°E;lon:70°E~120°E的WRF模式背景场为例,实测表明采用文章所述方法可将1个GFS文件的大小从330 Mb缩小至7 Mb,在很大程度上节省了存储空间并加快了数据传递速度。 通过编写作业脚本,利用Linux系统自带的crontab命令设置定时作业,可实现GFS文件的批量自动下载和裁剪。经测试,测试平台可实现多个数据文件的并行下载,但基于python文件裁剪功能的进程数量不宜同时超过4个,因此需在作业提交时给予合理时间安排。 grib格式是存放气象数值预报产品的一种重要数据格式,开展grib格式文件的读写是一件非常重要的能力。在以往研究中,常基于Fortran或C程序进行开发,难度较大,文章基于python环境,利用pygrib库可较容易地实现数据读写与裁剪。 但此过程的实现,也用到了pygrib库的其他函数。比如,grbs.seek()函数可获得grib文件中所有变量的文字介绍;grbs.select()函数可实现对指定变量或指定位置的内容的读取;grbs.latlons()函数可获得详细的经纬度信息等。 此外,在pygrib库的test子目录下,有大量的python示例程序可供参考;在utils子目录下,有多个可执行程序可供使用,比如grib1和grib2的互转、grib文件的拆分和合并等,可加以关注和使用,这些都将方便用户对grib格式文件的使用。 针对当前美国GFS全球数值天气预报资料下载速度较慢和文件所需存储空间较大的问题,文章提出借助腾讯云计算服务器实现数据的稳定、快速下载;基于python、ecCodes和pygrib软件实现grib2格式文件的区域裁剪,减少无用变量,缩小文件大小,并可给WRF模式提供背景场,具有较强的业务应用价值。3.3 结果分析
3.4 pygrib在处理grib文件中的其他应用
4 结束语