计算热带气旋潜在强度 | Easyclimate 一行代码分析气候学(2)

文摘   2024-11-19 14:06   北京  





Photo by Sebastian Unrau on Unsplash


潜在强度(Potential Intensity, PI)是一个理论模型,用于预测热带气旋(TC)强度的上限(俗称“速度极限”),这一上限由环境条件和能量约束决定(例如,Emanuel, 1986; Holland, 1997)。PI 具备多项特性,使其成为研究热带气旋的重要工具。

  • 研究表明,PI 与实际观测到的风暴生命期内的最大强度具有统计关联(Emanuel, 2000),因此可用来分析和解释实际强度的变化趋势和波动(例如,Wing 等, 2007; Gilford 等, 2019; Shields 等, 2019)。
  • PI 可以通过标准的大气剖面(无论是模型数据还是观测数据)轻松计算,这使得它在不同应用场景和时空尺度中都具备极高的灵活性。
  • PI 能够分解为热力学和参数化的组成部分,这种分解方式方便进行收支分析和敏感性分析,并为研究实际风暴提供了直接的参考。
  • 作为一个以气象数据为基础的理论模型,PI 非常适合用于增强强度的预测和诊断指标(如 Ventilation index, VI;Tang 和 Emanuel, 2012)、热带气旋生成的指标(如 Genesis potential index, GPI;Camargo 等, 2007,Tropical cyclone genesis index, TCGI;Tippett 等, 2011)以及衡量破坏潜力的指标(如 Power dissipation index, PDI;Emanuel, 2005)。

参考文献请参考

Gilford, D. M.: pyPI (v1.3): Tropical Cyclone Potential Intensity Calculations in Python, Geosci. Model Dev., 14, 2351–2369, https://doi.org/10.5194/gmd-14-2351-2021, 2021.

根据 Bister and Emanuel (1998) 式子(21)可知,

其中,分别表示焓通量交换系数和动量通量交换系数;表示海表温度;表示平均外流温度;表示海表的饱和湿静力能;表示自由对流层的湿静力能。比值是一个具有不确定性的量,通常假定为常数(默认值为 0.9,详见 Emanuel 2003 及相关文献)。

热带气旋潜在强度(PI)的效率等同于卡诺效率。在热带地区,其典型值通常介于 50%至 70%之间。

PI 方程中的每一项可以通过对两边取自然对数进行分解,得到以下形式(Wing 等,2015;公式 2):

需要注意的是,代入公式的所有量(特别是温度)的单位必须保持一致。

Easy Climate 包对tcpyPI[1]包进一步抽象处理,现在只需要一步代码即可完成热带气旋潜在强度的计算。

💎 Easyclimate 版本需大于等于 2024.11.0

首先打开示例数据

# 导入必要的包
import xarray as xr
import easyclimate as ecl
import cartopy.crs as ccrs

# 打开示例数据
ds = xr.open_dataset('tcpi_sample_data.nc')
ds

示例数据可在公众号前台回复  easyclimate  获取。

使用easyclimate.field.mesoscale.calc_potential_intensity_Bister_Emanuel_2002计算 TC 潜在强度和相关特征参数。

pi_result = ecl.field.mesoscale.calc_potential_intensity_Bister_Emanuel_2002(
    sst_data = ds.sst,
    sst_data_units = 'degC',
    surface_pressure_data = ds.msl,
    surface_pressure_data_units = 'hPa',
    temperature_data = ds.t,
    temperature_data_units = 'degC',
    specific_humidity_data = ds.q,
    specific_humidity_data_units = 'g/kg',
    vertical_dim = 'level',
    vertical_dim_units = 'hPa'
)
pi_result

相关参数如下

  • sst_data:海表面温度数据
  • sst_data_units:海表面温度数据对应的单位。可选值有celsius,kelvin,fahrenheit等符合 python pint 包定义的单位。
  • surface_pressure_data: 平均海平面气压。
  • surface_pressure_data_units:平均海平面气压对应的单位。可选值有hPa,Pa,mbar等符合 python pint 包定义的单位。
  • temperature_data:垂直大气温度数据。
  • temperature_data_units:垂直大气温度数据对应的单位。可选值有celsius,kelvin,fahrenheit等符合 python pint 包定义的单位。
  • specific_humidity_data:垂直大气比湿数据。
  • specific_humidity_data_units:垂直大气比湿数据对应的单位。可选值有kg/kg,g/g,g/kg等符合 python pint 包定义的单位。
  • vertical_dim:垂直坐标名称。例如plev或者level
  • vertical_dim_units:垂直坐标对应的单位。例如plev常为Palevel常为hPa

为确保正确计算,需确保传入的多个数据的水平维度保持一致。不一致的情形须通过插值至同一水平网格上计算。

其他参数,如CKCDV_reduc等的使用请查阅https://doi.org/10.5194/gmd-14-2351-2021.

接下来我们尝试绘制几个重要的参数

PI ()

fig, ax = ecl.plot.quick_draw_spatial_basemap(central_longitude = 200)
# 绘制 7 月数据
pi_result.vmax.sel(month = 7).plot(
    ax = ax,
    cbar_kwargs = {'location''bottom'},
    transform = ccrs.PlateCarree(),
)
ax.set_title('PI ($V_{max}$)', size = 18)

Outflow Temperature ()

fig, ax = ecl.plot.quick_draw_spatial_basemap(central_longitude = 200)
pi_result.t0.sel(month = 7).plot(
    ax = ax,
    cbar_kwargs = {'location''bottom'},
    transform = ccrs.PlateCarree(),
)
ax.set_title('Outflow Temperature ($T_0$)', size = 18)

Outflow Temperature Level (OTL)

fig, ax = ecl.plot.quick_draw_spatial_basemap(central_longitude = 200)
pi_result.otl.sel(month = 7).plot(
    ax = ax,
    cbar_kwargs = {'location''bottom'},
    transform = ccrs.PlateCarree(),
    vmax = 1050,
)
ax.set_title('Outflow Temperature Level (OTL)', size = 18)

TC Efficiency

fig, ax = ecl.plot.quick_draw_spatial_basemap(central_longitude = 200)
pi_result.eff.sel(month = 7).plot(
    ax = ax,
    cbar_kwargs = {'location''bottom'},
    transform = ccrs.PlateCarree(),
)
ax.set_title('TC Efficiency $\\left(\\frac{T_{s} - T_{0}}{T_{0}}\\right)$', size = 18)

Disequlibrium ()

fig, ax = ecl.plot.quick_draw_spatial_basemap(central_longitude = 200)
pi_result.diseq.sel(month = 7).plot(
    ax = ax,
    cbar_kwargs = {'location''bottom'},
    transform = ccrs.PlateCarree(),
    vmin = 0,
    vmax = 20000
)
ax.set_title('Disequlibrium ($h_0^* - h^*$)', size = 18)

参考资料

[1]

tcpyPI:https://github.com/dgilford/tcpyPI


easyclimate 专题资料下载可在公众号前台回复 easyclimate 获取。


安装方法

#在Python终端环境中输入

pip install easyclimate

#升级方法

pip install -U easyclimate

#无需下载,在线体验 Easy climate

看完啦,不妨花式点赞一下呗❤

气python风雨
主要发一些涉及大气科学的Python文章与个人学习备忘录
 最新文章