预处理系统 WPS 详解:以4.5版本为例
本系列专栏针对WRF4.5版本教程,详细理解教程每一步操作。
前期内容可参见博客-【WRF教程第一期】WRF模型概述:以4.5版本为例。
本博客继续针对WPS预处理模块进行详细介绍,具体参考-The WRF Preprocessing System (WPS)。
WRF 预处理系统 (WPS) 是一组三个程序,它们的共同作用是为真实数据模拟准备真实程序的输入。每个程序执行一个准备阶段:
- geogrid 定义模型域并将静态地理数据插入网格
- ungrib 从 GRIB 格式的文件中提取气象场
- metgrid 将 ungrib 提取的气象场水平插入 geogrid 定义的模型网格
将气象场垂直插入 WRF eta 级别的工作在 真实程序(real) 中执行。
上图显示了 WPS 程序之间的数据流。每个程序都从公共名称列表文件 (namelist.wps) 读取参数,该文件包含代表每个程序的单独名称列表记录,以及定义多个 WPS 程序使用的参数的共享名称列表记录。图中未显示各个程序使用的附加表文件。这些表提供了对程序操作的额外控制(通常不需要修改)。本章后面将介绍 GEOGRID.TBL、METGRID.TBL 和 Vtable 文件。
WPS 的构建机制与 WRF 模型使用的构建机制非常相似,它提供了在各种平台上编译 WPS 的选项。当有 MPI 库和合适的编译器时,metgrid 和 geogrid 程序可以编译为分布式内存执行,从而允许在更短的时间内处理大型模型域。ungrib 程序执行的工作不适合并行化,因此 ungrib 只能在单个处理器上运行。
每个 WPS 程序的功能
WPS 由三个独立的程序组成:geogrid、ungrib 和 metgrid。
WPS 中还包括几个实用程序,这些程序在 WPS 实用程序部分进行了描述。下面对三个主要程序分别进行了简要说明,后续部分将介绍更多详细信息。
程序1:geogrid
地理网格(geogrid) 的目的是定义模拟域,并将各种陆地数据集插入到模型网格中。这些域是使用用户在 WPS 名称列表文件 (namelist.wps) 的地理网格名称列表记录 (&geogrid) 中指定的信息定义的。除了计算每个网格点的纬度、经度和地图比例因子外,地理网格还默认将土壤类别、土地利用类别、地形高度、年平均深层土壤温度、月植被分数、月反照率、最大雪反照率和坡度类别插入到模型网格中。每个字段的全局数据集均通过 WPS 地理静态数据下载页面提供,由于这些数据是时不变的,因此只需下载一次。一些数据集仅提供一种分辨率,但其他数据集则以“全分辨率”下载和“低分辨率”下载提供。通常,静态字段的低分辨率源仅适用于代码测试和教育目的,任何需要关注模型准确性的应用都应使用全分辨率地理数据集。
除了插入默认的陆地字段外,geogrid 程序还足够通用,可以将大多数连续和分类字段插入到模拟域中。可以使用表文件 GEOGRID.TBL 将新数据集或附加数据集插入到模拟域中。GEOGRID.TBL 文件定义了 geogrid 将生成的每个字段;它描述了要用于字段的插值方法,以及该字段的数据集在文件系统中的位置。
geogrid 的输出以 WRF I/O API 格式写入,因此,通过选择 netCDF I/O 格式,geogrid 可以将其输出写入 netCDF,以便使用外部软件包(包括 ncview、NCL 和 RIP4)轻松进行可视化。
ncview工具的使用可参见另一博客-【WRF工具】WRF 模型输出可视化工具 ncview。
程序2:ungrib
ungrib 程序读取 GRIB 文件,“分解”数据,并将数据写入一种称为中间格式的简单格式(有关格式的详细信息,请参阅“将气象数据写入中间格式”一节)。GRIB 文件包含随时间变化的气象场,通常来自另一个区域或全球模型,例如 NCEP 的 NAM 或 GFS 模型。ungrib 程序可以读取 GRIB 版本 1,如果使用“GRIB2”选项编译,还可以读取 GRIB 版本 2 文件。
GRIB 文件通常包含比初始化 WRF 所需的更多字段。两种版本的 GRIB 格式都使用各种代码来识别 GRIB 文件中的变量和级别。Ungrib 使用这些代码的表(称为 Vtables,即“变量表”)来定义从 GRIB 文件中提取哪些字段并写入中间格式。有关代码的详细信息,请参阅 WMO GRIB 文档和原始中心的文档。
ungrib 软件提供了以下用于常见 GRIB 模型输出文件的 Vtable(位于 ungrib/Variable_Tables):
用户可以使用任何 Vtable 作为模板为其他模型输出创建自己的 Vtable;有关 Vtable 中字段含义的更多详细信息,请参阅“创建和编辑 Vtable”部分。
Ungrib 可以以三种用户可选格式中的任意一种格式写入中间数据文件:
- WPS - 包含对下游程序有用的附加信息的格式;
- SI - WRF 系统的较旧中间格式;
- 以及 MM5 格式,此处包含该格式,以便 ungrib 可用于向 MM5 建模系统提供 GRIB2 输入。
WPS 可以使用其中任何一种格式来初始化 WRF,但建议使用 WPS 格式。
程序3:metgrid
metgrid 程序将 ungrib 程序提取的中间格式气象数据水平插入 geogrid 程序定义的模拟域。然后,WRF real 程序可以获取插入的 metgrid 输出。metgrid 将插入的日期范围在 namelist.wps 中的 &share namelist 记录中定义,其中必须为每个模拟域指定日期范围。由于 metgrid 程序的工作与 ungrib 程序一样,与时间相关,因此每次初始化新模拟时都会运行 metgrid。
METGRID.TBL 文件控制每个气象场的插值方式。它为每个字段提供一个部分,并且在一个部分中,可以指定要用于该字段的插值方法、用作掩码插值的掩码的字段以及字段要插入到的网格交错(例如,ARW 中的 U、V;NMM 中的 H、V)。
metgrid 的输出以 WRF I/O API 格式写入,因此,通过选择 netCDF I/O 格式,metgrid 可以将其输出写入 netCDF,以便使用外部软件包(包括新版本的 RIP4)轻松进行可视化。
WPS运行(Running the WPS)
运行 WRF 预处理系统有三个主要步骤。
1、使用 geogrid 定义模型粗域和任何嵌套域。
2、使用 ungrib 从 GRIB 数据集中提取模拟期间的气象场。
3、使用 metgrid 将气象场水平插入到模型域中。
当要对同一模型域运行多个模拟时,只需执行 第一步(geogrid) 一次;此后,只需使用第二步和第三步为每个模拟处理 随时间变化的数据。同样,如果使用同一气象数据源在同一时间段运行多个模型域,则无需为每个模拟单独运行 ungrib。下面将详细说明这三个步骤。
如果成功安装了 WPS 软件,则 WPS 目录结构的根目录中应该存在指向 geogrid.exe、ungrib.exe 和 metgrid.exe 程序的符号链接。除了这三个链接之外,还应该存在 namelist.wps 文件。因此,WPS 根目录中的列表应如下所示:
ls -ls
drwxr-xr-x 2 4096 arch
-rwxr-xr-x 1 1765 clean
-rwxr-xr-x 1 4795 compile
-rw-r--r-- 1 118862 compile.log
-rwxr-xr-x 1 16613 configure
-rw-r--r-- 1 3424 configure.wps
drwxr-xr-x 4 4096 geogrid
lrwxrwxrwx 1 23 geogrid.exe -> geogrid/src/geogrid.exe
-rwxr-xr-x 1 1331 link_grib.csh
drwxr-xr-x 3 4096 metgrid
lrwxrwxrwx 1 23 metgrid.exe -> metgrid/src/metgrid.exe
-rw-r--r-- 1 705 namelist.wps
-rw-r--r-- 1 2749 namelist.wps.all_options
-rw-r--r-- 1 1637 namelist.wps.global
-rw-r--r-- 1 6232 README
drwxr-xr-x 4 4096 ungrib
lrwxrwxrwx 1 21 ungrib.exe -> ungrib/src/ungrib.exe
drwxr-xr-x 3 4096 util
步骤1:Define model domains with geogrid
模型粗域和任何嵌套域均在 namelist.wps 文件的 &geogrid 记录中定义,此外,还需要设置 &share namelist 记录中的参数。下面给出了这两个 namelist 记录的示例(有关每个变量的用途和选项的更多信息,请参阅 WPS Namelist 变量)。
&share
wrf_core = 'ARW',
max_dom = 2,
start_date = '2019-09-04_12:00:00','2019-09-04_12:00:00',
end_date = '2019-09-06_18:00:00','2019-09-04_12:00:00',
interval_seconds = 10800,
io_form_geogrid = 2
/
&geogrid
parent_id = 1, 1,
parent_grid_ratio = 1, 3,
i_parent_start = 1, 53,
j_parent_start = 1, 25,
e_we = 150, 220,
e_sn = 130, 214,
geog_data_res = 'default','default',
dx = 15000,
dy = 15000,
map_proj = 'lambert',
ref_lat = 33.00,
ref_lon = -79.00,
truelat1 = 30.0,
truelat2 = 60.0,
stand_lon = -79.0.,
geog_data_path = '/glade/work/wrfhelp/WPS_GEOG/'
/
总结与 geogrid 相关的 &share 名称列表记录的一组典型变化,
- wrf_core:WRF 动态核心。如果 WPS 正在运行 ARW 模拟,则应将 wrf_core 设置为“ARW”,如果正在运行 NMM 模拟,则应将其设置为“NMM”。
- max_dom:域的总数(对于 ARW)或嵌套级别(对于 NMM)
- io_form_geogrid:geogrid 生成的文件的输出格式(geo_em*)
注意:由于 geogrid 仅生成与时间无关的数据,因此 geogrid 会忽略 start_date、end_date 和 interval_seconds 变量。可选地,可以使用 opt_output_from_geogrid_path 变量指示域文件应写入的位置(如果不是默认位置,则为当前工作目录)
在 &geogrid namelist 记录中,定义了模拟域的投影,以及所有模型网格的大小和位置。地图投影由 map_proj 变量指定。地图投影的详细介绍可参见另一博客-【WRF理论第六期】研究区设置技巧及投影介绍。
除了设置与模型域的投影、位置和覆盖范围相关的变量外,还必须使用 geog_data_path 变量指定静态地理数据集的路径。设置 geog_data_res 会告诉 geogrid 从哪个静态数据分辨率进行插值,并且该值应与 GEOGRID.TBL 中的数据分辨率之一匹配。
根据 wrf_core 名称列表变量的值,必须将适当的 GEOGRID.TBL 文件与 geogrid 一起使用,因为 WPS 插值的网格交错在动态核心之间有所不同。
- 对于 ARW,应使用 GEOGRID.TBL.ARW 文件
- 对于 NMM,应使用 GEOGRID.TBL.NMM 文件
通过将正确的文件链接到 geogrid 目录中的 GEOGRID.TBL(或 opt_geogrid_tbl_path 指定的目录中,如果此变量在名称列表中设置)来选择适当的 GEOGRID.TBL。
ls -ls geogrid/GEOGRID.TBL
lrwxrwxrwx 1 15 GEOGRID.TBL -> GEOGRID.TBL.ARW
在 namelist.wps 中适当定义模拟粗域和嵌套域后,可以运行 geogrid.exe 可执行文件来生成域文件。
- 对于 ARW 域,域文件命名为 geo_em.d0N.nc,其中 N 是每个文件中定义的嵌套数。
- 当针对 NMM 域运行时,geogrid 会为粗域生成文件 geo_nmm.d01.nc,并为每个嵌套级别 N 生成 geo_nmm_nest.l0N.nc 文件。
另请注意,文件后缀将根据所选的 io_form_geogrid 而有所不同。要运行 geogrid,请发出以下命令:
./geogrid.exe
当 geogrid.exe 完成运行时,将显示以下消息
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Successful completion of geogrid. !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
并且 WPS 根目录(或 opt_output_from_geogrid_path 指定的目录,如果设置了此变量)的列表应显示域文件。如果没有,请查阅 geogrid.log 文件以确定失败的可能原因。有关详细信息,请参阅检查 WPS 输出。
ls -ls
-rw-r--r-- 1 1957004 geo_em.d01.nc
-rw-r--r-- 1 4745324 geo_em.d02.nc
-rw-r--r-- 1 11169 geogrid.log
步骤2:Extracting Meteorological Fields from GRIB Files with Ungrib
已经下载了 GRIB 格式的气象数据,将字段提取为中间格式的第一步是编辑 namelist.wps 文件的 share 和 ungrib 名称列表记录 - 该文件与用于定义模拟域的文件相同。下面给出了两个名称列表记录的示例。
&share
wrf_core = 'ARW',
max_dom = 2,
start_date = '2019-09-04_12:00:00','2019-09-04_12:00:00',
end_date = '2019-09-04_18:00:00','2019-09-04_12:00:00',
interval_seconds = 10800,
io_form_geogrid = 2
/
&ungrib
out_format = 'WPS',
prefix = 'FILE'
/
在 共享名称列表(share) 记录中,与 ungrib 相关的变量是粗域的开始和结束时间(start_date 和 end_date;或者 start_year、start_month、start_day、start_hour、end_year、end_month、end_day 和 end_hour)以及气象数据文件之间的间隔(interval_seconds)。
在 ungrib 名称列表记录中,变量 out_format 用于选择 ungrib 将写入的中间数据格式;metgrid 程序可以读取 ungrib 支持的任何格式(“WPS”、“SI”和“MM5”- 建议值为“WPS”)。
用户还可以使用前缀变量为中间文件指定路径和前缀。例如,如果前缀设置为“GFS”,则 ungrib 生成的中间文件将根据 GFS:YYYY-MM-DD_HH 命名,其中 YYYY-MM-DD_HH 是文件中数据的有效时间。
在适当修改 namelist.wps 后,必须提供 Vtable,并且必须将 GRIB 文件链接(或复制)到 ungrib 所需的文件名。WPS 为许多气象数据源提供了 Vtable 文件,并且适当的 Vtable 可以符号链接到文件 Vtable,这是 ungrib 所需的 Vtable 名称。
例如,如果 GRIB 数据来自 GFS 模型:
ln -s ungrib/Variable_Tables/Vtable.GFS Vtable
Ungrib 将尝试读取名为 GRIBFILE.AAA、GRIBFILE.AAB、…、GRIBFILE.ZZZ 的 GRIB 文件。
为了将 GRIB 文件链接到这些文件名,提供了一个 shell 脚本 link_grib.csh。link_grib.csh 脚本将要链接的 GRIB 文件列表作为命令行参数。例如,如果 GRIB 数据已下载到目录 /data/gfs,则文件将通过 link_grib.csh 链接,如下所示:
ls -ls /data/gfs
-rw-r--r-- 1 42728372 gfs_20190904_12_00
-rw-r--r-- 1 48218303 gfs_20190904_12_03
-rw-r--r-- 1 48218303 gfs_20190904_12_06
./link_grib.csh /data/gfs/gfs*
链接 GRIB 文件和 Vtable 后,WPS 目录列表应显示链接的 GRIBFILE* 文件及其链接路径。
ls -ls
lrwxrwxrwx 1 38 GRIBFILE.AAA -> /data/gfs/gfs_20190904_12_00
lrwxrwxrwx 1 38 GRIBFILE.AAA -> /data/gfs/gfs_20190904_12_03
lrwxrwxrwx 1 38 GRIBFILE.AAB -> /data/gfs/gfs_20190904_12_06
编辑 namelist.wps 并链接相应的 Vtable 和 GRIB 文件后,运行 ungrib.exe 可执行文件以生成中间格式的气象数据文件。要运行 ungrib,请输入以下内容:
./ungrib.exe
如果 ungrib.exe 成功运行,则会出现以下消息
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Successful completion of ungrib. !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
将被写入 ungrib.output 文件的末尾,中间文件应出现在当前工作目录中。
ungrib 写入的中间文件的名称将采用 FILE:YYYY-MM-DD_HH 格式(当然,除非前缀变量设置为 FILE 以外的前缀)。
ls -ls
-rw-r--r-- 1 154946888 FILE:2019-09-04_12
-rw-r--r-- 1 154946888 FILE:2019-09-04_15
-rw-r--r-- 1 154946888 FILE:2019-09-04_18
步骤3:Horizontally interpolating meteorological data with metgrid
在运行 WPS 的最后一步,将 ungrib 提取的气象数据水平插入到 geogrid 定义的模拟网格中。为了运行 metgrid,必须编辑 namelist.wps 文件的 share 和 metgrid namelist 记录。这些记录的示例如下所示。
&share
wrf_core = 'ARW',
max_dom = 2,
start_date = '2019-09-04_12:00:00','2019-09-04_12:00:00',
end_date = '2019-09-04_18:00:00','2019-09-04_12:00:00',
interval_seconds = 10800,
io_form_geogrid = 2
/
&metgrid
fg_name = 'FILE',
io_form_metgrid = 2,
/
到目前为止,通常不需要更改共享名称列表(share)记录中的任何变量,因为这些变量应该已经在前面的步骤中进行了适当设置。但是,如果在运行 geogrid 和 ungrib 时未编辑共享名称列表,则必须在共享名称列表记录中设置 WRF 动态核心、域数、开始和结束时间、气象数据之间的间隔以及静态域文件的路径,如运行 geogrid 和 ungrib 的步骤中所述。
在 metgrid 名称列表记录中,必须使用 fg_name 给出中间气象数据文件的路径和前缀,可以使用 constants_name 变量指定任何包含常量字段的中间文件的完整路径和文件名,可以使用 io_form_metgrid 变量指定水平插值文件的输出格式。 metgrid 名称列表记录中的其他变量,即 opt_output_from_metgrid_path 和 opt_metgrid_tbl_path,允许指定 metgrid 应写入插值数据文件的位置以及可以找到 METGRID.TBL 文件的位置。
与 geogrid 和 GEOGRID.TBL 文件一样,适用于 WRF 核心的 METGRID.TBL 文件必须链接到 metgrid 目录中(或 opt_metgrid_tbl_path 指定的目录中,如果设置了此变量)。如果使用 ARW 核心,默认情况下,以下内容已设置。
ls -ls metgrid/METGRID.TBL
lrwxrwxrwx 1 15 METGRID.TBL -> METGRID.TBL.ARW
在适当编辑 namelist.wps 并验证将使用正确的 METGRID.TBL 后,通过发出命令运行 metgrid
./metgrid.exe
如果 metgrid 成功运行,则消息
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Successful completion of metgrid. !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
被打印出来,metgrid 输出文件应该出现在 WPS 根目录中(或者在 opt_output_from_metgrid_path 指定的目录中,如果设置了此变量)。
- 这些文件将在 ARW 域的情况下命名为 met_em.d0N.YYYY-MM-DD_HH:mm:ss.nc,其中 N 是数据驻留在文件中的嵌套编号
- 或者在 NMM 域的情况下命名为 met_nmm.d01.YYYY-MM-DD_HH:mm:ss.nc。这里,YYYY-MM-DD_HH:mm:ss 指的是每个文件中插入数据的日期。
如果在共享名称列表记录中给出的范围内的每个时间都不存在这些文件,请查阅 metgrid.log 文件以确定运行 metgrid 时的问题。
ls -ls
-rw-r--r-- 1 5217648 met_em.d01.2008-03-24_12:00:00.nc
-rw-r--r-- 1 5217648 met_em.d01.2008-03-24_18:00:00.nc
-rw-r--r-- 1 12658200 met_em.d02.2008-03-24_12:00:00.nc
-rw-r--r-- 1 65970 metgrid.log