预处理系统 WPS 详解:以4.5版本为例
将气象数据写入中间格式(Writing Meteorological Data to the Intermediate Format)
ungrib 程序将 GRIB 数据集解码为 metgrid 可以理解的简单中间格式。如果气象数据不是 GRIB Edition 1 或 GRIB Edition 2 格式,则用户负责将此类数据写入中间文件格式。幸运的是,中间格式相对简单,由一系列未格式化的 Fortran 写入组成。请注意,这些未格式化的写入使用大端字节顺序,通常可以使用编译器标志指定。
下面描述了 WPS 中间格式;对 SI 或 MM5 中间格式感兴趣的用户可以首先熟悉非常相似的 WPS 格式,然后检查读取和写入所有三种中间格式的 Fortran 子例程(分别为 metgrid/src/read_met_module.F 和 metgrid/src/write_met_module.F)。
将数据写入 WPS 中间格式时,二维字段将写入实值的矩形数组。三维数组必须在垂直维度上拆分为二维数组,这些数组必须单独写入。
请注意,对于全球数据集,必须使用高斯或圆柱等距投影,而对于区域数据集,可以使用墨卡托、兰伯特等角、极地立体或圆柱等距。
用于写入单个二维数组的写入顺序如下(请注意,并非所有下面声明的变量都用于给定的数据投影)。
integer :: version ! Format version (must =5 for WPS format)
integer :: nx, ny ! x- and y-dimensions of 2-d array
integer :: iproj ! Code for projection of data in array:! 0 = cylindrical equidistant! 1 = Mercator! 3 = Lambert conformal conic! 4 = Gaussian (global only!)! 5 = Polar stereographic
real :: nlats ! Number of latitudes north of equator! (for Gaussian grids)
real :: xfcst ! Forecast hour of data
real :: xlvl ! Vertical level of data in 2-d array
real :: startlat, startlon ! Lat/lon of point in array indicated by! startloc string
real :: deltalat, deltalon ! Grid spacing, degrees
real :: dx, dy ! Grid spacing, km
real :: xlonc ! Standard longitude of projection
real :: truelat1, truelat2 ! True latitudes of projection
real :: earth_radius ! Earth radius, km
real, dimension(nx,ny) :: slab ! The 2-d array holding the data
logical :: is_wind_grid_rel ! Flag indicating whether winds are! relative to source grid (TRUE) or! relative to earth (FALSE)
character (len=8) :: startloc ! Which point in array is given by! startlat/startlon; set either! to 'SWCORNER' or 'CENTER '
character (len=9) :: field ! Name of the field
character (len=24) :: hdate ! Valid date for data YYYY:MM:DD_HH:00:00
character (len=25) :: units ! Units of data
character (len=32) :: map_source ! Source model / originating center
character (len=46) :: desc ! Short description of data! 1) WRITE FORMAT VERSION
write(unit=ounit) version! 2) WRITE METADATA
! Cylindrical equidistant
if (iproj == 0) thenwrite(unit=ounit) hdate, xfcst, map_source, field, &units, desc, xlvl, nx, ny, iprojwrite(unit=ounit) startloc, startlat, startlon, &deltalat, deltalon, earth_radius! Mercator
else if (iproj == 1) thenwrite(unit=ounit) hdate, xfcst, map_source, field, &units, desc, xlvl, nx, ny, iprojwrite(unit=ounit) startloc, startlat, startlon, dx, dy, &truelat1, earth_radius! Lambert conformal
else if (iproj == 3) thenwrite(unit=ounit) hdate, xfcst, map_source, field, &units, desc, xlvl, nx, ny, iprojwrite(unit=ounit) startloc, startlat, startlon, dx, dy, &xlonc, truelat1, truelat2, earth_radius! Gaussian
else if (iproj == 4) thenwrite(unit=ounit) hdate, xfcst, map_source, field, &units, desc, xlvl, nx, ny, iprojwrite(unit=ounit) startloc, startlat, startlon, &nlats, deltalon, earth_radius! Polar stereographic
else if (iproj == 5) thenwrite(unit=ounit) hdate, xfcst, map_source, field, &units, desc, xlvl, nx, ny, iproj
write(unit=ounit) startloc, startlat, startlon, dx, dy, &xlonc, truelat1, earth_radiusend if! 3) WRITE WIND ROTATION FLAG
write(unit=ounit) is_wind_grid_rel! 4) WRITE 2-D ARRAY OF DATA
write(unit=ounit) slab
WRFRequired_Input_for_Running_WRF_91">WRF运行所需字段(Required Input for Running WRF)
为了成功初始化 WRF 模拟,real.exe 预处理器要求 metgrid.exe 程序的输出中包含一组最低限度的气象和地表字段。
因此,metgrid.exe 处理的中间文件中必须包含这些必需字段。下表描述了必需字段集。
WRF_Using_MPAS_Output_for_WRF_Input_97">使用 MPAS 输出作为 WRF 输入(Using MPAS Output for WRF Input)
metgrid.exe 程序能够从 跨尺度预测模型 (MPAS) 读取 netCDF 格式的原生非结构化网格输出。metgrid.exe 随后可以将 MPAS 字段直接水平插入到 geogrid.exe 程序定义的任何域中,以生成可供 WRF real.exe 程序使用的输出文件,其方式与从中间文件插入的 metgrid 输出相同。这样,MPAS 的输出可用于为 WRF 提供初始和横向边界条件。
运行 MPAS 模拟时,必须设置输出流以包含初始化 WRF 模拟所需的最小字段集。对于 MPAS v5.x 及更高版本的代码,以下输出流应该足够了。
<stream name="wrf_ic_bc"type="output"filename_template="MPAS.$Y-$M-$D_$h.nc"output_interval="3:00:00" ><var name="xtime"/><var_array name="scalars"/><var name="pressure"/><var name="zgrid"/><var name="theta"/><var name="uReconstructZonal"/><var name="uReconstructMeridional"/><var name="u10"/><var name="v10"/><var name="q2"/><var name="t2m"/><var name="skintemp"/><var name="surface_pressure"/><var name="mslp"/><var name="tslb"/><var name="smois"/></stream>
在运行定义了合适输出流的 MPAS 后,将生成一组 netCDF 文件,其中包含原始 MPAS 网格上的字段。由于这些文件不包含描述 MPAS 网格单元的位置、几何形状和连通性的字段,因此必须使用 MPAS 模拟中的“静态”文件将此信息提供给 metgrid 程序。因此,必须在 &metgrid 名称列表记录中为 constants_name 和 fg_name 变量指定 MPAS netCDF 文件(以 mpas 为前缀),例如,
&metgridconstants_name = 'mpas:static.nc'fg_name = 'mpas:MPAS'
/
在上面的例子中,metgrid.exe 首先读取 MPAS static.nc 文件以收集网格信息并计算从 MPAS 网格到 geogrid.exe 程序定义的 WRF 域的重映射权重,然后处理所有时间段的 MPAS 文件,这些文件的前缀为 MPAS(后缀为 YYYY-MM-DD_HH.nc)。然后 real.exe 程序可以照常运行。
metgrid 程序可以将 ungrib.exe 程序创建的中间文件的数据与 MPAS 数据相结合。这可能很有用,例如,可以使用来自其他来源的 SST、海冰或陆地表面场。下面显示了将 MPAS 数据与 ERA-Interim 中间文件与土壤数据(前缀为 ERAI_SOIL)相结合的示例。
&metgridconstants_name = 'mpas:static.nc'fg_name = 'mpas:MPAS', 'ERAI_SOIL'
/
由于 MPAS zgrid 字段不会随时间变化,因此可以从 MPAS 周期性输出流中省略它;但是,在这种情况下,zgrid 字段必须放在其自己的 netCDF 文件中,该文件还必须将时间维度定义为 netCDF 无限维度。然后,可以使用 constants_name namelist 变量将此文件(例如 zgrid.nc)提供给 metgrid 程序,例如,
&metgridconstants_name = 'mpas:static.nc', 'mpas:zgrid.nc'fg_name = 'mpas:MPAS'
/
当运行较长的 MPAS 模拟或以高时间频率写出用作 WRF 初始和边界条件的输出流时,将 zgrid 放在其自己的文件中可以节省大量空间。下面的 python 脚本可以作为如何将 zgrid 字段提取到其自己的 netCDF 文件的示例。
from netCDF4 import Datasetfin = Dataset('init.nc')
fout = Dataset('zgrid.nc','w',format='NETCDF3_64BIT')nCells = fin.dimensions['nCells'].size
nVertLevelsP1 = fin.dimensions['nVertLevelsP1'].sizefout.createDimension(dimname='Time',size=None)
fout.createDimension(dimname='nCells',size=nCells)
fout.createDimension(dimname='nVertLevelsP1',size=nVertLevelsP1)
fout.createVariable(varname='zgrid',datatype='f',dimensions=('nCells', 'nVertLevelsP1'))
fout.variables['zgrid'][:] = fin.variables['zgrid'][:]
fout.close()
fin.close()
注意:对于并行(即 dmpar)构建的 WPS,metgrid.exe 的原生 MPAS 输出的使用尚未经过彻底测试;因此,建议在处理 MPAS 数据集时连续运行 metgrid.exe。
对于大型 MPAS 网格,可能需要增加 metgrid 代码中两个常量的值,这两个常量用于静态分配用于计算从 MPAS 网格到 WRF 域的重新映射权重的几个数据结构。这两个常量如下所示,位于 WPS/src/metgrid/remapper.F 文件中。
! should be at least (earth circumference / minimum grid distance)
integer, parameter :: max_queue_length = 2700! should be at least (nCells/32)
integer, parameter :: max_dictionary_size = 82000
改变这些常量的值后,必须重新编译 metgrid。
创建并编辑Vtables(Creating and Editing Vtables)
尽管为许多常见数据集提供了 Vtable,但并未考虑 GRIB 格式的所有可能的气象数据源,有时可能需要用户创建新的 Vtable。这可以从头开始,也可以使用现有的 Vtable 作为示例。无论哪种情况,了解 Vtable 各个字段的含义和用法的基本知识都会有所帮助。
每个 Vtable 包含七个或十一个字段,具体取决于 Vtable 分别用于 GRIB Edition 1 还是 GRIB Edition 2 数据源。Vtable 字段分为以下三类:
1、描述如何在 GRIB 文件中识别数据的字段
2、描述如何由 ungrib 和 metgrid 程序识别数据的字段
3、特定于 GRIB Edition 2 的字段。
每个变量在 Vtable 中都有一行或多行,其中多行用于存放在不同级别类型(例如,地表级别和高空级别)之间的数据。Vtable 中必须为行或条目指定的字段取决于字段和级别的具体情况。
第一组字段(描述如何在 GRIB 文件中识别数据的字段)在以下显示的 Vtable 的列标题下给出。
GRIB1| Level| From | To |
Param| Type |Level1|Level2|
-----+------+------+------+
GRIB1 Param 字段指定气象字段的 GRIB 代码,该代码是数据集内该字段的唯一编号。不同的数据集可能对同一字段使用不同的 GRIB 代码 - 例如,高空温度在 GFS 数据中的 GRIB 代码为 11,但在 ECMWF 数据中的 GRIB 代码为 130。要查找字段的 GRIB 代码,可以使用 g1print.exe 和 g2print.exe 实用程序。
给定 GRIB 代码,级别类型、来自级别 1 和来自级别 2 字段用于指定可以在哪些级别找到字段。与 GRIB1 Param 字段一样,g1print.exe 和 g2print.exe 程序可用于查找级别字段的值。
级别字段的含义取决于级别类型字段,并在下表中进行了总结。
当指定层字段(级别类型 112)时,层的起点和终点具有依赖于字段本身的单位;可以使用 g1print.exe 和 g2print.exe 实用程序找到适当的值。
Vtable 中的第二组字段,即描述如何在 metgrid 和 real 程序中识别数据的字段,属于下面显示的列标题。
| metgrid | metgrid | metgrid |
| Name | Units | Description |
+----------+---------+-----------------------------------------+
metgrid 名称确定当 ungrib 将气象字段写入中间文件时将分配给该字段的变量名称。此名称必须与 METGRID.TBL 中的条目匹配,以便 metgrid 程序可以确定如何水平插入该字段。metgrid 单位和 metgrid 描述分别指定字段的单位和简短描述。如果没有为字段提供描述,则不会将该字段写入中间文件。
最后一组字段提供 GRIB2 特定的信息,位于下面的列标题下。
|GRIB2|GRIB2|GRIB2|GRIB2|
|Discp|Catgy|Param|Level|
+-----------------------+
GRIB2 字段仅在用于 GRIB Edition 2 数据集的 Vtable 中才需要,尽管 Vtable 中包含这些字段并不妨碍 Vtable 用于 GRIB Edition 1 数据。例如,Vtable.GFS 包含 GRIB2 Vtable 字段,但用于 1 度 (GRIB1) GFS 和 0.5 度 (GRIB2) GFS 数据集。由于为大多数已知的 GRIB Edition 2 数据集提供了 Vtable,因此目前不在此处描述相应的 Vtable 字段。