【WRF教程第3.4期】预处理系统 WPS 详解:以4.5版本为例

ops/2024/12/24 7:47:55/

预处理系统 WPS 详解:以4.5版本为例

  • 将气象数据写入中间格式(Writing Meteorological Data to the Intermediate Format)
  • WRF运行所需字段(Required Input for Running WRF
  • 使用 MPAS 输出作为 WRF 输入(Using MPAS Output for WRF Input)
  • 创建并编辑Vtables(Creating and Editing Vtables)
  • 参考

将气象数据写入中间格式(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 字段。

参考


http://www.ppmy.cn/ops/144515.html

相关文章

html 中 表格和表单的关系与区别

在 HTML 中&#xff0c;表格 (<table>) 和表单 (<form>) 是两种常用于展示数据和收集用户输入的元素。它们具有不同的功能和结构。以下是关于这两者的详细介绍&#xff1a; 1. HTML 表格&#xff08;<table>&#xff09; 表格用于展示结构化的数据&#xf…

JDK11下载安装和配置超详细过程

一、下载JDK11资源包 JDK11安装包文件夹资源资源https://download.csdn.net/download/Z0412_J0103/90160803 二、配置环境 2.1 找到文件位置 2.2 打开文件&#xff0c;点击“下一步” ” 2.3 记住文件配置路径&#xff0c;并不要更改&#xff0c;点击下一步 2.4 等待安装完…

裸金属服务器的作用都有哪些?

随着云计算时代的到来&#xff0c;为企业的发展带来了更多的机遇和发展&#xff0c;裸金属服务器则是一种结合了传统物理服务器和虚拟化技术的计算服务&#xff0c;能够为用户提供独享的物理计算资源&#xff0c;本文就将深入探讨一下裸金属服务器的作用与优势。 裸金属服务器有…

鸿蒙风起,未来已来——云学堂鸿蒙应用认证开营啦!

鸿蒙风起,未来已来——云学堂鸿蒙应用入门级开发者认证开营啦! 在科技飞速发展的今天,鸿蒙系统以其开放、创新、安全的特点,正逐步构建起一个全新的智能生态。从智能手机到智能家居,从穿戴设备到出行工具,鸿蒙系统的身影无处不在,它不仅为用户带来了更加流畅、智能的使用体验,…

使用elasticsearch-head插件修改elasticsearch数据

1、先使用elasticsearch-head插件基本查询功能找到要修改的数据 2、切换到复合查询界面 url&#xff1a; http://es的ip地址:端口号/索引名称/文档类型&#xff08;没特殊设置过就是_doc&#xff09;/文档id/ 例子&#xff1a;http://127.0.0.1:9200/tab_inout_record/_doc/84…

重温设计模式--中介者模式

中介者模式介绍 定义&#xff1a;中介者模式是一种行为设计模式&#xff0c;它通过引入一个中介者对象来封装一系列对象之间的交互。中介者使得各个对象之间不需要显式地相互引用&#xff0c;从而降低了它们之间的耦合度&#xff0c;并且可以更方便地对它们的交互进行管理和协调…

Java基础知识面试题总结

一、Java概述 1.1 编程与Java的定义 编程是用程序设计语言编写代码解决问题并得到结果的过程。Java是一门面向对象编程语言&#xff0c;具有功能强大、简单易用的特点&#xff0c;吸收了C优点并摒弃了复杂概念。 1.2 JDK版本、JVM、JRE和JDK的关系 JDK版本&#xff1a;JDK1…

PHP 微信棋牌开发全解析:高级教程

PHP - 多维数组详解 多维数组是 PHP 中一种强大的数据结构&#xff0c;指的是一个数组的元素中可以包含一个或多个数组。它常用于存储复杂的嵌套数据&#xff0c;如表格数据或多层次关系的数据结构。 注释&#xff1a; 数组的维度表示您需要指定索引的层级数&#xff0c;以访问…