在上一篇文章中,我们展示了如何利用 Python (MetPy + WRF) 绘制 Skew-T 图并计算 CAPE/CIN。
评论区有小伙伴提到一个非常专业的问题:“早上的探空(或模型初始场)能不能代表下午的对流潜势?有没有订正方法?”
这是一个非常好的切入点。正如教程所述,08时的探空往往显示CAPE很小,CIN很大(逆温层存在),但到了下午地面加热后,对流潜势可能会爆发式增长。
本文将基于“临近探空订正原理”,教大家如何在 Python 中通过假定午后地面最高温度和露点,计算订正后的 CAPE (Modified CAPE)。
根据气象学原理(参考 Section 5.1.3 探空的代表性问题和订正):
我们将复用上一篇代码的数据读取部分,重点在于 数据修正和 重算。
import numpy as np
import matplotlib.pyplot as plt
from netCDF4 import Dataset
from wrf import getvar, ll_to_xy
import metpy.calc as mpcalc
from metpy.plots import SkewT
from metpy.units import units
# ================= 1. 数据读取 (同前文) =================
ncfile = Dataset("/home/mw/input/typhoon9537/wrfout_d01_2019-08-08_19_00_00")
lat0, lon0 = 25.0, 120.4
x, y = ll_to_xy(ncfile, lat0, lon0)
# 获取原始廓线数据
p = getvar(ncfile, "pressure")[:, y, x].values * units.hPa
tc = getvar(ncfile, "tc")[:, y, x].values * units.degC
td = getvar(ncfile, "td")[:, y, x].values * units.degC
# ================= 2. 计算原始 CAPE =================
# 原始气块路径
prof_orig = mpcalc.parcel_profile(p, tc[0], td[0])
cape_orig, cin_orig = mpcalc.surface_based_cape_cin(p, tc, td)
print(f"原始 CAPE: {cape_orig:.2f}")
print(f"原始 CIN: {cin_orig:.2f}")
# ================= 3. 核心:执行订正 (Correction) =================
# --- 设定预估的午后地面最大温湿条件 ---
# 在实际业务中,这通常来自于 MOS 预报、临近地面观测或经验估计
# 假设午后地面升温至 32度,露点维持或略变为 26度
T_max_sfc = 32.0 * units.degC
Td_max_sfc = 26.0 * units.degC
# --- 复制数据以防污染原始数据 ---
tc_mod = tc.copy()
td_mod = td.copy()
# --- 修改底层 (Index 0) 数据 ---
# 注意:这里我们简单暴力地修改最底层。
# 更严谨的做法是混合边界层 (Mixed Layer),但在“午后订正”法中,
# 通常直接提升这一“最暖最湿”的假定地面气块。
tc_mod[0] = T_max_sfc
td_mod[0] = Td_max_sfc
# --- 基于修正后的廓线重新计算气块路径和能量 ---
# 注意:这里传入的是修改后的 tc_mod 和 td_mod
prof_mod = mpcalc.parcel_profile(p, tc_mod[0], td_mod[0])
cape_mod, cin_mod = mpcalc.surface_based_cape_cin(p, tc_mod, td_mod)
print(f"订正后 CAPE: {cape_mod:.2f}")
print(f"订正后 CIN: {cin_mod:.2f}")
# ================= 4. 绘图对比 =================
fig = plt.figure(figsize=(9, 9))
skew = SkewT(fig, rotation=45)
# 1. 绘制环境场 (保持不变)
skew.plot(p, tc, 'r', lw=2, label='Env Temp')
skew.plot(p, td, 'g', lw=2, label='Env Dewpoint')
# 2. 绘制原始状态气块路径 (灰色虚线)
skew.plot(p, prof_orig, 'gray', lw=1, ls='--', alpha=0.6, label='Original Parcel')
# 3. 绘制订正后气块路径 (黑色实线)
# 这一条线通常会比原始路径更“胖”(CAPE面积更大)
skew.plot(p, prof_mod, 'k', lw=2, ls='-', label='Modified Parcel (Afternoon)')
# 4. 填充订正后的 CAPE 面积
skew.shade_cape(p, tc_mod, prof_mod, alpha=0.3, color='orangered')
# 5. 标记订正点
skew.plot(p[0], T_max_sfc, 'ro', markerfacecolor='none', markeredgewidth=2, markersize=10, label='Est. Max T')
# 设置轴范围和图例
skew.ax.set_ylim(1050, 100)
skew.ax.set_xlim(-30, 40)
plt.legend(loc='upper left')
title_l = f'Correction Analysis @ ({lat0}, {lon0})'
title_r = (f'Orig CAPE={cape_orig.m:.0f} | Mod CAPE={cape_mod.m:.0f}\n'
f'Orig CIN={cin_orig.m:.0f} | Mod CIN={cin_mod.m:.0f}')
plt.title(title_l, loc='left')
plt.title(title_r, loc='right', fontsize=10)
plt.show()
输出示例:
原始 CAPE: 1691.50 joule / kilogram
原始 CIN: 0.00 joule / kilogram
订正后 CAPE: 3093.00 joule / kilogram
订正后 CIN: 0.00 joule / kilogram

image
tc 和 td 之前,务必使用 .copy()。xarray 或 numpy 数组是可变对象,如果不拷贝直接修改,会破坏原始的环境场数据。mpcalc.mixed_layer_cape_cin 实现。通过简单的几行 Python 代码修改数组的第0个索引值,我们就能实现教科书上的“探空订正”。这对于分析台风外围下沉气流区(往往由晴空辐射导致午后剧烈升温)或副高边缘的热雷暴潜势非常有用。