首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >代码实战 | 使用 SKYBorn 计算并可视化 WRF 的热带气旋潜在强度(PI)

代码实战 | 使用 SKYBorn 计算并可视化 WRF 的热带气旋潜在强度(PI)

作者头像
用户11172986
发布2026-06-24 11:55:51
发布2026-06-24 11:55:51
1150
举报
文章被收录于专栏:气python风雨气python风雨

代码实战 | 使用 SKYBorn 计算并可视化 WRF 的热带气旋潜在强度(PI)

本教程演示如何:

  1. 使用 wrf-python 读取 WRF 输出文件并提取所需变量。
  2. 将模式层温度、比湿插值到标准等压面。
  3. 调用 SKYBornpotential_intensity 函数计算热带气旋潜在强度。
  4. 使用 Cartopy + Matplotlib 绘制最小中心气压(Pmin)和最大风速(Vmax)的空间分布。

函数说明

代码语言:javascript
复制
from skyborn.calc import potential_intensity

pmin, vmax, flag = potential_intensity( sst, # 海表温度,K(标量或 2D 网格) psl, # 海平面气压,Pa(标量或 2D 网格) pressure_levels, # 等压面数组,单位 mb(hPa) temperature, # 温度,K,形状 (level, lat, lon) 或 (level,) mixing_ratio # 水汽混合比,kg/kg,与 temperature 同形状 )

返回:最小中心气压 pmin(mb)、最大风速 vmax(m/s)、错误标志 flag

1. 导入依赖

代码语言:javascript
复制
!pip install skyborn -i https://pypi.mirrors.ustc.edu.cn/simple/
代码语言:javascript
复制
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Collecting skyborn
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/0b/9e/653b69973e8593c7f21bdd18bacca1b7796702c205711b843c1381b69ad6/skyborn-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.7 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 984.1 kB/s eta 0:00:000:00:01
[?25hRequirement already satisfied: numpy in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.26.4)
Requirement already satisfied: pandas in /opt/conda/lib/python3.11/site-packages (from skyborn) (2.2.3)
Requirement already satisfied: xarray in /opt/conda/lib/python3.11/site-packages (from skyborn) (2024.3.0)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.11/site-packages (from skyborn) (3.9.1)
Requirement already satisfied: netCDF4 in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.6.3)
Requirement already satisfied: metpy in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.6.3)
Requirement already satisfied: tqdm in /opt/conda/lib/python3.11/site-packages (from skyborn) (4.67.0)
Requirement already satisfied: statsmodels in /opt/conda/lib/python3.11/site-packages (from skyborn) (0.14.4)
Requirement already satisfied: scipy in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.14.1)
Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.6.0)
Requirement already satisfied: dask in /opt/conda/lib/python3.11/site-packages (from skyborn) (2024.8.1)
Requirement already satisfied: click>=8.1 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (8.1.7)
Requirement already satisfied: cloudpickle>=3.0.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (3.1.0)
Requirement already satisfied: fsspec>=2021.09.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (2025.2.0)
Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (24.1)
Requirement already satisfied: partd>=1.4.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (1.4.2)
Requirement already satisfied: pyyaml>=5.3.1 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (6.0.2)
Requirement already satisfied: toolz>=0.10.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (1.0.0)
Requirement already satisfied: importlib-metadata>=4.13.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (8.5.0)
Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (4.55.3)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (1.4.7)
Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (9.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (3.2.0)
Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (2.9.0.post0)
Requirement already satisfied: pint>=0.17 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (0.24.4)
Requirement already satisfied: pooch>=1.2.0 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (1.8.2)
Requirement already satisfied: pyproj>=3.0.0 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (3.5.0)
Requirement already satisfied: traitlets>=5.0.5 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (5.14.3)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.11/site-packages (from pandas->skyborn) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.11/site-packages (from pandas->skyborn) (2024.2)
Requirement already satisfied: cftime in /opt/conda/lib/python3.11/site-packages (from netCDF4->skyborn) (1.6.4)
Requirement already satisfied: joblib>=1.2.0 in /opt/conda/lib/python3.11/site-packages (from scikit-learn->skyborn) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/conda/lib/python3.11/site-packages (from scikit-learn->skyborn) (3.5.0)
Requirement already satisfied: patsy>=0.5.6 in /opt/conda/lib/python3.11/site-packages (from statsmodels->skyborn) (1.0.1)
Requirement already satisfied: zipp>=3.20 in /opt/conda/lib/python3.11/site-packages (from importlib-metadata>=4.13.0->dask->skyborn) (3.21.0)
Requirement already satisfied: locket in /opt/conda/lib/python3.11/site-packages (from partd>=1.4.0->dask->skyborn) (1.0.0)
Requirement already satisfied: platformdirs>=2.1.0 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (4.3.6)
Requirement already satisfied: typing_extensions>=4.0.0 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (4.12.2)
Requirement already satisfied: flexcache>=0.3 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (0.3)
Requirement already satisfied: flexparser>=0.4 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (0.4)
Requirement already satisfied: requests>=2.19.0 in /opt/conda/lib/python3.11/site-packages (from pooch>=1.2.0->metpy->skyborn) (2.32.3)
Requirement already satisfied: certifi in /opt/conda/lib/python3.11/site-packages (from pyproj>=3.0.0->metpy->skyborn) (2024.12.14)
Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib->skyborn) (1.17.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.11/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.11/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.11/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (2.2.3)
Installing collected packages: skyborn
Successfully installed skyborn-0.4.1
代码语言:javascript
复制
import os
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from netCDF4 import Dataset
from wrf import getvar, interplevel, to_np
from skyborn.calc import potential_intensity

2. 打开 WRF 输出文件

代码语言:javascript
复制
wrf_file = "/home/mw/input/typhoon9537/wrfout_d01_2019-08-08_21_00_00"
if not os.path.exists(wrf_file):
    raise FileNotFoundError(f"未找到文件:{wrf_file}")

nc = Dataset(wrf_file)
print("WRF 文件已打开")
代码语言:javascript
复制
WRF 文件已打开

3. 提取所需变量

计算 PI 需要以下输入:

变量

WRF 变量

单位

说明

SST

SST

K

海表温度

海平面气压

PSFC 或 slp

Pa

函数要求 Pa;若用 slp 需转换为 Pa

温度廓线

tk

K

插值到等压面

比湿廓线

QVAPOR

kg/kg

插值到等压面

等压面

自定义数组

mb(hPa)

建议覆盖 1000–100 hPa

代码语言:javascript
复制
# 读取第一个时次
p_hpa = getvar(nc, "pressure", timeidx=0)   # hPa
T_k   = getvar(nc, "tk", timeidx=0)         # K
Q     = getvar(nc, "QVAPOR", timeidx=0)     # kg/kg
SST   = getvar(nc, "SST", timeidx=0)        # K
slp = getvar(nc, "slp", timeidx=0)  *100     # Pa

4. 将温度、比湿插值到标准等压面

potential_intensity 需要输入变量位于等压面上。这里选择 19 个标准层,从地面到 100 hPa。

代码语言:javascript
复制
plevs = np.array([1000, 950, 900, 850, 800, 750, 700, 650, 600,
                  550, 500, 450, 400, 350, 300, 250, 200, 150, 100])  # mb

T_iso = interplevel(T_k, p_hpa, plevs)  # (level, south_north, west_east)
Q_iso = interplevel(Q, p_hpa, plevs)

print("T_iso shape:", T_iso.shape)
print("Q_iso shape:", Q_iso.shape)
print("等压面:", T_iso["level"].values, "hPa")
代码语言:javascript
复制
T_iso shape: (19, 437, 447)
Q_iso shape: (19, 437, 447)
等压面: [1000  950  900  850  800  750  700  650  600  550  500  450  400  350
  300  250  200  150  100] hPa

6. 空间场计算(3D)

本文件网格为 (695, 1011)。为便于教学演示,先对原场做稀疏采样;需要完整分辨率时,去掉 isel 即可。

注意:插值后高层可能存在 NaN(模式顶层以上无数据),potential_intensity 会自动处理缺失值。

代码语言:javascript
复制
# 稀疏采样(每第 4 个网格点),加快计算

# 调用 SKYBorn potential_intensity
pmin, vmax, flag = potential_intensity(
    to_np(SST),
    to_np(slp),
    plevs,
    to_np(T_iso),
    to_np(Q_iso)
)

print(f"计算标志 flag = {flag}")
print(f"Pmin 范围:{np.nanmin(pmin):.1f} ~ {np.nanmax(pmin):.1f} hPa")
print(f"Vmax 范围:{np.nanmin(vmax):.1f} ~ {np.nanmax(vmax):.1f} m/s")
代码语言:javascript
复制
Missing values detected in: temperature(NaN), mixing_ratio(NaN). Using missing value handling version.
计算标志 flag = 1
Pmin 范围:912.0 ~ 1008.3 hPa
Vmax 范围:0.0 ~ 80.4 m/s

7. 可视化最大潜在风速 Vmax

代码语言:javascript
复制
fig, ax = plt.subplots(
    1, 1, figsize=(12, 8),
    subplot_kw={"projection": ccrs.PlateCarree()}
)

lon = T_iso.XLONG.values
lat = T_iso.XLAT.values

cf = ax.pcolormesh(
    lon, lat,vmax,
    transform=ccrs.PlateCarree(),
    cmap="YlOrRd",
    shading="auto"
)

ax.coastlines(resolution="10m", linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linestyle=":")
gl = ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.5, linestyle="--")
gl.top_labels = False
gl.right_labels = False

cbar = plt.colorbar(cf, ax=ax, shrink=0.8, pad=0.02)
cbar.set_label("Vmax (m s$^{-1}$)")

ax.set_title("WRF Potential Intensity - Maximum Wind Speed (SKYBorn)\n2024-09-13 21:00 UTC")
plt.tight_layout()
plt.show()

output

8. 可视化最小中心气压 Pmin

代码语言:javascript
复制
fig, ax = plt.subplots(
    1, 1, figsize=(12, 8),
    subplot_kw={"projection": ccrs.PlateCarree()}
)

cf = ax.pcolormesh(
    lon, lat, pmin,
    transform=ccrs.PlateCarree(),
    cmap="YlGnBu_r",
    shading="auto"
)

ax.coastlines(resolution="10m", linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linestyle=":")
gl = ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.5, linestyle="--")
gl.top_labels = False
gl.right_labels = False

cbar = plt.colorbar(cf, ax=ax, shrink=0.8, pad=0.02)
cbar.set_label("Pmin (hPa)")

ax.set_title("WRF Potential Intensity - Minimum Central Pressure (SKYBorn)\n2024-09-13 21:00 UTC")
plt.tight_layout()
plt.show()

output

代码实战 | 使用 SKYBorn 计算并可视化 WRF 的热带气旋潜在强度(PI)

本教程演示如何:

  1. 使用 wrf-python 读取 WRF 输出文件并提取所需变量。
  2. 将模式层温度、比湿插值到标准等压面。
  3. 调用 SKYBornpotential_intensity 函数计算热带气旋潜在强度。
  4. 使用 Cartopy + Matplotlib 绘制最小中心气压(Pmin)和最大风速(Vmax)的空间分布。

函数说明

代码语言:javascript
复制
from skyborn.calc import potential_intensity

pmin, vmax, flag = potential_intensity( sst, # 海表温度,K(标量或 2D 网格) psl, # 海平面气压,Pa(标量或 2D 网格) pressure_levels, # 等压面数组,单位 mb(hPa) temperature, # 温度,K,形状 (level, lat, lon) 或 (level,) mixing_ratio # 水汽混合比,kg/kg,与 temperature 同形状 )

返回:最小中心气压 pmin(mb)、最大风速 vmax(m/s)、错误标志 flag

1. 导入依赖

代码语言:javascript
复制
!pip install skyborn -i https://pypi.mirrors.ustc.edu.cn/simple/
代码语言:javascript
复制
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Collecting skyborn
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/0b/9e/653b69973e8593c7f21bdd18bacca1b7796702c205711b843c1381b69ad6/skyborn-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.7 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.7/2.7 MB 984.1 kB/s eta 0:00:000:00:01
[?25hRequirement already satisfied: numpy in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.26.4)
Requirement already satisfied: pandas in /opt/conda/lib/python3.11/site-packages (from skyborn) (2.2.3)
Requirement already satisfied: xarray in /opt/conda/lib/python3.11/site-packages (from skyborn) (2024.3.0)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.11/site-packages (from skyborn) (3.9.1)
Requirement already satisfied: netCDF4 in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.6.3)
Requirement already satisfied: metpy in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.6.3)
Requirement already satisfied: tqdm in /opt/conda/lib/python3.11/site-packages (from skyborn) (4.67.0)
Requirement already satisfied: statsmodels in /opt/conda/lib/python3.11/site-packages (from skyborn) (0.14.4)
Requirement already satisfied: scipy in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.14.1)
Requirement already satisfied: scikit-learn in /opt/conda/lib/python3.11/site-packages (from skyborn) (1.6.0)
Requirement already satisfied: dask in /opt/conda/lib/python3.11/site-packages (from skyborn) (2024.8.1)
Requirement already satisfied: click>=8.1 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (8.1.7)
Requirement already satisfied: cloudpickle>=3.0.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (3.1.0)
Requirement already satisfied: fsspec>=2021.09.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (2025.2.0)
Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (24.1)
Requirement already satisfied: partd>=1.4.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (1.4.2)
Requirement already satisfied: pyyaml>=5.3.1 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (6.0.2)
Requirement already satisfied: toolz>=0.10.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (1.0.0)
Requirement already satisfied: importlib-metadata>=4.13.0 in /opt/conda/lib/python3.11/site-packages (from dask->skyborn) (8.5.0)
Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (1.3.1)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (4.55.3)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (1.4.7)
Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (9.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (3.2.0)
Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.11/site-packages (from matplotlib->skyborn) (2.9.0.post0)
Requirement already satisfied: pint>=0.17 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (0.24.4)
Requirement already satisfied: pooch>=1.2.0 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (1.8.2)
Requirement already satisfied: pyproj>=3.0.0 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (3.5.0)
Requirement already satisfied: traitlets>=5.0.5 in /opt/conda/lib/python3.11/site-packages (from metpy->skyborn) (5.14.3)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.11/site-packages (from pandas->skyborn) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.11/site-packages (from pandas->skyborn) (2024.2)
Requirement already satisfied: cftime in /opt/conda/lib/python3.11/site-packages (from netCDF4->skyborn) (1.6.4)
Requirement already satisfied: joblib>=1.2.0 in /opt/conda/lib/python3.11/site-packages (from scikit-learn->skyborn) (1.4.2)
Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/conda/lib/python3.11/site-packages (from scikit-learn->skyborn) (3.5.0)
Requirement already satisfied: patsy>=0.5.6 in /opt/conda/lib/python3.11/site-packages (from statsmodels->skyborn) (1.0.1)
Requirement already satisfied: zipp>=3.20 in /opt/conda/lib/python3.11/site-packages (from importlib-metadata>=4.13.0->dask->skyborn) (3.21.0)
Requirement already satisfied: locket in /opt/conda/lib/python3.11/site-packages (from partd>=1.4.0->dask->skyborn) (1.0.0)
Requirement already satisfied: platformdirs>=2.1.0 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (4.3.6)
Requirement already satisfied: typing_extensions>=4.0.0 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (4.12.2)
Requirement already satisfied: flexcache>=0.3 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (0.3)
Requirement already satisfied: flexparser>=0.4 in /opt/conda/lib/python3.11/site-packages (from pint>=0.17->metpy->skyborn) (0.4)
Requirement already satisfied: requests>=2.19.0 in /opt/conda/lib/python3.11/site-packages (from pooch>=1.2.0->metpy->skyborn) (2.32.3)
Requirement already satisfied: certifi in /opt/conda/lib/python3.11/site-packages (from pyproj>=3.0.0->metpy->skyborn) (2024.12.14)
Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib->skyborn) (1.17.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.11/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.11/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.11/site-packages (from requests>=2.19.0->pooch>=1.2.0->metpy->skyborn) (2.2.3)
Installing collected packages: skyborn
Successfully installed skyborn-0.4.1
代码语言:javascript
复制
import os
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from netCDF4 import Dataset
from wrf import getvar, interplevel, to_np
from skyborn.calc import potential_intensity

2. 打开 WRF 输出文件

代码语言:javascript
复制
wrf_file = "/home/mw/input/typhoon9537/wrfout_d01_2019-08-08_21_00_00"
if not os.path.exists(wrf_file):
    raise FileNotFoundError(f"未找到文件:{wrf_file}")

nc = Dataset(wrf_file)
print("WRF 文件已打开")
代码语言:javascript
复制
WRF 文件已打开

3. 提取所需变量

计算 PI 需要以下输入:

变量

WRF 变量

单位

说明

SST

SST

K

海表温度

海平面气压

PSFC 或 slp

Pa

函数要求 Pa;若用 slp 需转换为 Pa

温度廓线

tk

K

插值到等压面

比湿廓线

QVAPOR

kg/kg

插值到等压面

等压面

自定义数组

mb(hPa)

建议覆盖 1000–100 hPa

代码语言:javascript
复制
# 读取第一个时次
p_hpa = getvar(nc, "pressure", timeidx=0)   # hPa
T_k   = getvar(nc, "tk", timeidx=0)         # K
Q     = getvar(nc, "QVAPOR", timeidx=0)     # kg/kg
SST   = getvar(nc, "SST", timeidx=0)        # K
slp = getvar(nc, "slp", timeidx=0)  *100     # Pa

4. 将温度、比湿插值到标准等压面

potential_intensity 需要输入变量位于等压面上。这里选择 19 个标准层,从地面到 100 hPa。

代码语言:javascript
复制
plevs = np.array([1000, 950, 900, 850, 800, 750, 700, 650, 600,
                  550, 500, 450, 400, 350, 300, 250, 200, 150, 100])  # mb

T_iso = interplevel(T_k, p_hpa, plevs)  # (level, south_north, west_east)
Q_iso = interplevel(Q, p_hpa, plevs)

print("T_iso shape:", T_iso.shape)
print("Q_iso shape:", Q_iso.shape)
print("等压面:", T_iso["level"].values, "hPa")
代码语言:javascript
复制
T_iso shape: (19, 437, 447)
Q_iso shape: (19, 437, 447)
等压面: [1000  950  900  850  800  750  700  650  600  550  500  450  400  350
  300  250  200  150  100] hPa

6. 空间场计算(3D)

本文件网格为 (695, 1011)。为便于教学演示,先对原场做稀疏采样;需要完整分辨率时,去掉 isel 即可。

注意:插值后高层可能存在 NaN(模式顶层以上无数据),potential_intensity 会自动处理缺失值。

代码语言:javascript
复制
# 稀疏采样(每第 4 个网格点),加快计算

# 调用 SKYBorn potential_intensity
pmin, vmax, flag = potential_intensity(
    to_np(SST),
    to_np(slp),
    plevs,
    to_np(T_iso),
    to_np(Q_iso)
)

print(f"计算标志 flag = {flag}")
print(f"Pmin 范围:{np.nanmin(pmin):.1f} ~ {np.nanmax(pmin):.1f} hPa")
print(f"Vmax 范围:{np.nanmin(vmax):.1f} ~ {np.nanmax(vmax):.1f} m/s")
代码语言:javascript
复制
Missing values detected in: temperature(NaN), mixing_ratio(NaN). Using missing value handling version.
计算标志 flag = 1
Pmin 范围:912.0 ~ 1008.3 hPa
Vmax 范围:0.0 ~ 80.4 m/s

7. 可视化最大潜在风速 Vmax

代码语言:javascript
复制
fig, ax = plt.subplots(
    1, 1, figsize=(12, 8),
    subplot_kw={"projection": ccrs.PlateCarree()}
)

lon = T_iso.XLONG.values
lat = T_iso.XLAT.values

cf = ax.pcolormesh(
    lon, lat,vmax,
    transform=ccrs.PlateCarree(),
    cmap="YlOrRd",
    shading="auto"
)

ax.coastlines(resolution="10m", linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linestyle=":")
gl = ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.5, linestyle="--")
gl.top_labels = False
gl.right_labels = False

cbar = plt.colorbar(cf, ax=ax, shrink=0.8, pad=0.02)
cbar.set_label("Vmax (m s$^{-1}$)")

ax.set_title("WRF Potential Intensity - Maximum Wind Speed (SKYBorn)\n2024-09-13 21:00 UTC")
plt.tight_layout()
plt.show()
output
output

output

8. 可视化最小中心气压 Pmin

代码语言:javascript
复制
fig, ax = plt.subplots(
    1, 1, figsize=(12, 8),
    subplot_kw={"projection": ccrs.PlateCarree()}
)

cf = ax.pcolormesh(
    lon, lat, pmin,
    transform=ccrs.PlateCarree(),
    cmap="YlGnBu_r",
    shading="auto"
)

ax.coastlines(resolution="10m", linewidth=0.8)
ax.add_feature(cfeature.BORDERS, linestyle=":")
gl = ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.5, linestyle="--")
gl.top_labels = False
gl.right_labels = False

cbar = plt.colorbar(cf, ax=ax, shrink=0.8, pad=0.02)
cbar.set_label("Pmin (hPa)")

ax.set_title("WRF Potential Intensity - Minimum Central Pressure (SKYBorn)\n2024-09-13 21:00 UTC")
plt.tight_layout()
plt.show()
output
output

output

提示:

  • potential_intensitypsl 参数要求单位为 Pa。WRF 的 PSFC 直接是 Pa;若使用 slp(hPa),需乘以 100 转换。
  • 等压面需要覆盖对流层中上层,否则 PI 计算可能不准确。
  • 陆地上 SST 通常为缺失值或陆面温度,计算结果仅供参考;实际分析中建议用陆地掩膜剔除。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码实战 | 使用 SKYBorn 计算并可视化 WRF 的热带气旋潜在强度(PI)
  • 返回:最小中心气压 pmin(mb)、最大风速 vmax(m/s)、错误标志 flag
    • 1. 导入依赖
    • 2. 打开 WRF 输出文件
    • 3. 提取所需变量
    • 4. 将温度、比湿插值到标准等压面
    • 6. 空间场计算(3D)
    • 7. 可视化最大潜在风速 Vmax
    • 8. 可视化最小中心气压 Pmin
  • 代码实战 | 使用 SKYBorn 计算并可视化 WRF 的热带气旋潜在强度(PI)
  • 返回:最小中心气压 pmin(mb)、最大风速 vmax(m/s)、错误标志 flag
    • 1. 导入依赖
    • 2. 打开 WRF 输出文件
    • 3. 提取所需变量
    • 4. 将温度、比湿插值到标准等压面
    • 6. 空间场计算(3D)
    • 7. 可视化最大潜在风速 Vmax
    • 8. 可视化最小中心气压 Pmin
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档