本项目将带领您使用WRFOUT数据绘制探空图,探索大气垂直结构。我们将使用Python中的MetPy库和Matplotlib库来处理和可视化WRF模型输出数据。
在本项目中,我们将学习如何:
从WRFOUT文件中提取探空所需的变量,如压力、温度、露点温度、风向和风速。 使用MetPy库将变量单位转换为适当的物理单位,并计算其他有用的气象参数,如相对湿度。 使用Matplotlib库创建探空图,展示大气垂直结构,并标注重要的气象参数。 添加自定义标记和注释,以使探空图更具可读性和专业性。 通过完成本项目,您将掌握使用Python处理WRF模型输出数据并绘制探空图的基本技能,有助于您更好地理解和分析大气中的垂直变化。
镜像:气象分析3.7 数据:自制wrfout数据
提示:代码参考https://unidata.github.io/MetPy/latest/examples/Advanced_Sounding_With_Complex_Layout.html
In [4]:
#
First let's start with some simple imports
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import metpy.calc as mpcalc
from metpy.cbook import get_test_data
from metpy.plots import add_metpy_logo, Hodograph, SkewT
from metpy.units import units
from wrf import uvmet, to_np, getvar, interplevel, smooth2d, get_cartopy, cartopy_xlim, cartopy_ylim, latlon_coords,ll_to_xy
import numpy as np
from netCDF4 import Dataset
import matplotlib.pyplot as plt
import matplotlib as m
import metpy.calc as mpcalc
from metpy.plots import Hodograph, SkewT
from metpy.units import units
import metpy.calc as mpcalc
from metpy.cbook import get_test_data
from metpy.plots import add_metpy_logo, SkewT
from metpy.units import units
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
In [5]:
#读取WRF输出文件
wrfin = Dataset('/home/mw/input/wrfout3385/wrfout_d02_2022-07-14_0700.nc')
#指定要提取的经纬度坐标点
lat_lon = [35, 104]
#将经纬度坐标转换为模型坐标系(x, y)
x_y = ll_to_xy(wrfin, lat_lon[0], lat_lon[1])
#提取所需变量数据
p = getvar(wrfin, "pressure", timeidx=0)[:, x_y[0], x_y[1]] * units.hPa
T = getvar(wrfin, "tc", timeidx=0)[:, x_y[0], x_y[1]] * units.degC
Td = getvar(wrfin, "td", timeidx=0)[:, x_y[0], x_y[1]] * units.degC
u = getvar(wrfin, "ua", timeidx=0)[:, x_y[0], x_y[1]] * units('m/s')
v = getvar(wrfin, "va", timeidx=0)[:, x_y[0], x_y[1]] * units('m/s')
h = getvar(wrfin, "height", timeidx=0)[:, x_y[0], x_y[1]]
# 计算风向和风速
wind_dir = mpcalc.wind_direction(u, v)
wind_speed = mpcalc.wind_speed(u, v)
因为是模拟数据,没有nan值就不作处理
In [6]:
# 将变量转换为pandas数据框
data = {'pressure': p, 'height': h, 'temperature': T,
'dewpoint': Td, 'direction': wind_dir, 'speed': wind_speed}
df = pd.DataFrame(data)
df
Out[6]:
pressure | height | temperature | dewpoint | direction | speed | |
---|---|---|---|---|---|---|
0 | 943.985352 | 520.198059 | 32.352478 | 22.249786 | 173.563004 | 4.560096 |
1 | 937.630615 | 581.346436 | 31.644012 | 21.787685 | 174.424530 | 5.573391 |
2 | 929.556824 | 659.033325 | 30.854553 | 21.485380 | 175.379730 | 5.930669 |
3 | 919.438904 | 757.166809 | 29.893890 | 21.191944 | 176.281525 | 6.096784 |
4 | 906.881775 | 880.202393 | 28.709045 | 20.865412 | 177.253723 | 6.161201 |
5 | 891.476624 | 1033.035889 | 27.250488 | 20.476461 | 178.732330 | 6.154555 |
6 | 872.767883 | 1220.762939 | 25.464203 | 19.987505 | 180.915268 | 6.098031 |
7 | 850.493835 | 1448.283936 | 23.326904 | 19.303892 | 184.701294 | 6.031889 |
8 | 824.462097 | 1719.740967 | 21.045746 | 17.734608 | 193.769211 | 6.187472 |
9 | 794.750366 | 2038.156982 | 20.123383 | 12.263219 | 207.160187 | 7.180388 |
10 | 761.633423 | 2405.482910 | 19.506012 | 5.936941 | 202.073013 | 7.949438 |
11 | 725.601379 | 2821.581299 | 18.023834 | -0.173127 | 191.301971 | 7.303473 |
12 | 687.296143 | 3283.545654 | 15.787170 | -6.051855 | 174.246216 | 5.806906 |
13 | 647.411987 | 3787.612061 | 12.561188 | -8.418921 | 140.167648 | 3.927935 |
14 | 606.331848 | 4333.663086 | 8.837128 | -10.864210 | 95.477211 | 3.086081 |
15 | 566.007507 | 4898.102051 | 4.749023 | -14.805732 | 57.554775 | 3.682608 |
16 | 528.298096 | 5455.543457 | 1.055725 | -19.578125 | 64.445663 | 3.437842 |
17 | 493.058929 | 6007.291504 | -1.319977 | -31.940838 | 115.304291 | 3.008985 |
18 | 460.090851 | 6555.794434 | -3.268036 | -45.036537 | 161.520844 | 4.939357 |
19 | 429.213074 | 7101.801270 | -5.814728 | -43.751118 | 156.900665 | 7.625146 |
20 | 400.273621 | 7644.802246 | -8.792572 | -44.145741 | 141.799286 | 8.342997 |
21 | 373.144714 | 8184.130859 | -12.256317 | -44.045998 | 134.284042 | 8.280623 |
22 | 347.708618 | 8719.172852 | -16.021942 | -44.819721 | 131.203552 | 7.658325 |
23 | 323.864716 | 9249.713867 | -19.812988 | -46.924389 | 130.019043 | 6.590580 |
24 | 301.514160 | 9775.668945 | -23.736221 | -49.687439 | 125.813492 | 5.560450 |
25 | 280.569458 | 10296.727539 | -27.875992 | -53.631744 | 101.562874 | 5.099050 |
26 | 260.943420 | 10812.695312 | -32.060272 | -49.909401 | 85.334778 | 5.956165 |
27 | 242.563034 | 11323.200195 | -36.477219 | -48.752514 | 87.081406 | 7.033397 |
28 | 225.406082 | 11826.583984 | -40.750198 | -49.067841 | 86.745895 | 9.056532 |
29 | 209.448914 | 12321.805664 | -44.440414 | -49.997738 | 80.000626 | 13.469767 |
30 | 194.621262 | 12809.050781 | -48.156723 | -53.990211 | 78.625031 | 17.567860 |
31 | 180.844040 | 13287.771484 | -52.342529 | -58.609692 | 80.277695 | 18.865040 |
32 | 168.041809 | 13757.522461 | -56.484619 | -63.112320 | 78.791733 | 19.316374 |
33 | 156.145294 | 14218.854492 | -60.171005 | -66.167366 | 70.582771 | 20.821161 |
34 | 145.092346 | 14672.651367 | -63.499786 | -69.599571 | 62.424961 | 23.402493 |
35 | 134.820816 | 15119.364258 | -66.764023 | -72.987907 | 57.396305 | 26.121828 |
36 | 125.275864 | 15559.001953 | -70.088821 | -75.606995 | 55.394241 | 27.428947 |
37 | 116.407120 | 15992.118164 | -72.842148 | -79.010063 | 60.044327 | 26.893284 |
38 | 108.165977 | 16420.232422 | -74.750351 | -80.447861 | 70.432640 | 25.205303 |
39 | 100.507690 | 16844.751953 | -76.192749 | -80.447861 | 82.011841 | 22.888161 |
40 | 93.393013 | 17266.359375 | -77.469101 | -80.447861 | 86.693985 | 20.770243 |
41 | 86.780533 | 17686.335938 | -77.716248 | -80.447861 | 87.425171 | 19.650486 |
42 | 80.637291 | 18106.185547 | -77.593887 | -80.447861 | 87.339310 | 18.539335 |
43 | 74.928581 | 18526.910156 | -76.902344 | -80.447861 | 84.728310 | 17.221291 |
44 | 69.623833 | 18950.027344 | -75.374191 | -80.447861 | 79.777496 | 15.912707 |
45 | 64.694771 | 19377.269531 | -73.063370 | -80.447861 | 74.544220 | 15.561893 |
46 | 60.114914 | 19809.617188 | -70.625854 | -80.447861 | 71.903061 | 15.667484 |
47 | 55.859241 | 20247.150391 | -68.238922 | -80.447861 | 71.870743 | 15.989688 |
48 | 51.904198 | 20689.757812 | -65.902191 | -80.447861 | 74.913803 | 17.490532 |
给变量乘单位
In [7]:
p = df['pressure'].values * units.hPa
z = df['height'].values * units.m
T = df['temperature'].values * units.degC
Td = df['dewpoint'].values * units.degC
wind_speed = df['speed'].values * units.knots
wind_dir = df['direction'].values * units.degrees
u, v = mpcalc.wind_components(wind_speed, wind_dir)
In [9]:
fig = plt.figure(figsize=(9, 9))
skew = SkewT(fig, rotation=45, rect=(0.1, 0.1, 0.55, 0.85))
# Plot the data using normal plotting functions, in this case using
# log scaling in Y, as dictated by the typical meteorological plot
skew.plot(p, T, 'r')
skew.plot(p, Td, 'g')
skew.plot_barbs(p, u, v)
# Change to adjust data limits and give it a semblance of what we want
skew.ax.set_adjustable('datalim')
skew.ax.set_ylim(1000, 100)
skew.ax.set_xlim(-20, 30)
# Add the relevant special lines
skew.plot_dry_adiabats()
skew.plot_moist_adiabats()
skew.plot_mixing_lines()
# Create a hodograph
ax = plt.axes((0.7, 0.75, 0.2, 0.2))
h = Hodograph(ax, component_range=60.)
h.add_grid(increment=20)
h.plot(u, v)
Out[9]:
[<matplotlib.lines.Line2D at 0x7f45e9a01650>]
In [12]:
# STEP 1: CREATE THE SKEW-T OBJECT AND MODIFY IT TO CREATE A
# NICE, CLEAN PLOT
# Create a new figure. The dimensions here give a good aspect ratio
fig = plt.figure(figsize=(18, 12))
skew = SkewT(fig, rotation=45, rect=(0.05, 0.05, 0.50, 0.90))
# Change to adjust data limits and give it a semblance of what we want
skew.ax.set_adjustable('datalim')
skew.ax.set_ylim(1000, 100)
skew.ax.set_xlim(-20, 30)
# Set some better labels than the default to increase readability
skew.ax.set_xlabel(str.upper(f'Temperature ({T.units:~P})'), weight='bold')
skew.ax.set_ylabel(str.upper(f'Pressure ({p.units:~P})'), weight='bold')
# Set the facecolor of the skew-t object and the figure to white
fig.set_facecolor('#ffffff')
skew.ax.set_facecolor('#ffffff')
# Here we can use some basic math and Python functionality to make a cool
# shaded isotherm pattern.
x1 = np.linspace(-100, 40, 8)
x2 = np.linspace(-90, 50, 8)
y = [1100, 50]
for i in range(0, 8):
skew.shade_area(y=y, x1=x1[i], x2=x2[i], color='gray', alpha=0.02, zorder=1)
# STEP 2: PLOT DATA ON THE SKEW-T. TAKE A COUPLE EXTRA STEPS TO
# INCREASE READABILITY
# Plot the data using normal plotting functions, in this case using
# log scaling in Y, as dictated by the typical meteorological plot
# Set the linewidth to 4 for increased readability.
# We will also add the 'label' keyword argument for our legend.
skew.plot(p, T, 'r', lw=4, label='TEMPERATURE')
skew.plot(p, Td, 'g', lw=4, label='DEWPOINT')
# Again we can use some simple Python math functionality to 'resample'
# the wind barbs for a cleaner output with increased readability.
# Something like this would work.
interval = np.logspace(2, 3, 40) * units.hPa
idx = mpcalc.resample_nn_1d(p, interval)
skew.plot_barbs(pressure=p[idx], u=u[idx], v=v[idx])
# Add the relevant special lines native to the Skew-T Log-P diagram &
# provide basic adjustments to linewidth and alpha to increase readability
# first, we add a matplotlib axvline to highlight the 0-degree isotherm
skew.ax.axvline(0 * units.degC, linestyle='--', color='blue', alpha=0.3)
skew.plot_dry_adiabats(lw=1, alpha=0.3)
skew.plot_moist_adiabats(lw=1, alpha=0.3)
skew.plot_mixing_lines(lw=1, alpha=0.3)
# Calculate LCL height and plot as a black dot. Because `p`'s first value is
# ~1000 mb and its last value is ~250 mb, the `0` index is selected for
# `p`, `T`, and `Td` to lift the parcel from the surface. If `p` was inverted,
# i.e. start from a low value, 250 mb, to a high value, 1000 mb, the `-1` index
# should be selected.
lcl_pressure, lcl_temperature = mpcalc.lcl(p[0], T[0], Td[0])
skew.plot(lcl_pressure, lcl_temperature, 'ko', markerfacecolor='black')
# Calculate full parcel profile and add to plot as black line
prof = mpcalc.parcel_profile(p, T[0], Td[0]).to('degC')
skew.plot(p, prof, 'k', linewidth=2, label='SB PARCEL PATH')
# Shade areas of CAPE and CIN
skew.shade_cin(p, T, prof, Td, alpha=0.2, label='SBCIN')
skew.shade_cape(p, T, prof, alpha=0.2, label='SBCAPE')
# STEP 3: CREATE THE HODOGRAPH INSET. TAKE A FEW EXTRA STEPS TO
# INCREASE READABILITY
# Create a hodograph object: first we need to add an axis
# then we can create the Metpy Hodograph
hodo_ax = plt.axes((0.48, 0.45, 0.5, 0.5))
h = Hodograph(hodo_ax, component_range=80.)
# Add two separate grid increments for a cooler look. This also
# helps to increase readability
h.add_grid(increment=20, ls='-', lw=1.5, alpha=0.5)
h.add_grid(increment=10, ls='--', lw=1, alpha=0.2)
# The next few steps makes for a clean hodograph inset, removing the
# tick marks, tick labels, and axis labels
h.ax.set_box_aspect(1)
h.ax.set_yticklabels([])
h.ax.set_xticklabels([])
h.ax.set_xticks([])
h.ax.set_yticks([])
h.ax.set_xlabel(' ')
h.ax.set_ylabel(' ')
# Here we can add a simple Python for loop that adds tick marks
# to the inside of the hodograph plot to increase readability!
plt.xticks(np.arange(0, 0, 1))
plt.yticks(np.arange(0, 0, 1))
for i in range(10, 120, 10):
h.ax.annotate(str(i), (i, 0), xytext=(0, 2), textcoords='offset pixels',
clip_on=True, fontsize=10, weight='bold', alpha=0.3, zorder=0)
for i in range(10, 120, 10):
h.ax.annotate(str(i), (0, i), xytext=(0, 2), textcoords='offset pixels',
clip_on=True, fontsize=10, weight='bold', alpha=0.3, zorder=0)
# plot the hodograph itself, using plot_colormapped, colored
# by height
h.plot_colormapped(u, v, c=z, linewidth=6, label='0-12km WIND')
# compute Bunkers storm motion so we can plot it on the hodograph!
RM, LM, MW = mpcalc.bunkers_storm_motion(p, u, v, z)
h.ax.text((RM[0].m + 0.5), (RM[1].m - 0.5), 'RM', weight='bold', ha='left',
fontsize=13, alpha=0.6)
h.ax.text((LM[0].m + 0.5), (LM[1].m - 0.5), 'LM', weight='bold', ha='left',
fontsize=13, alpha=0.6)
h.ax.text((MW[0].m + 0.5), (MW[1].m - 0.5), 'MW', weight='bold', ha='left',
fontsize=13, alpha=0.6)
h.ax.arrow(0, 0, RM[0].m - 0.3, RM[1].m - 0.3, linewidth=2, color='black',
alpha=0.2, label='Bunkers RM Vector',
length_includes_head=True, head_width=2)
# STEP 4: ADD A FEW EXTRA ELEMENTS TO REALLY MAKE A NEAT PLOT
# First we want to actually add values of data to the plot for easy viewing
# To do this, let's first add a simple rectangle using Matplotlib's 'patches'
# functionality to add some simple layout for plotting calculated parameters
# xloc yloc xsize ysize
fig.patches.extend([plt.Rectangle((0.563, 0.05), 0.334, 0.37,
edgecolor='black', facecolor='white',
linewidth=1, alpha=1, transform=fig.transFigure,
figure=fig)])
# Now let's take a moment to calculate some simple severe-weather parameters using
# metpy's calculations
# Here are some classic severe parameters!
kindex = mpcalc.k_index(p, T, Td)
total_totals = mpcalc.total_totals_index(p, T, Td)
# mixed layer parcel properties!
ml_t, ml_td = mpcalc.mixed_layer(p, T, Td, depth=50 * units.hPa)
ml_p, _, _ = mpcalc.mixed_parcel(p, T, Td, depth=50 * units.hPa)
mlcape, mlcin = mpcalc.mixed_layer_cape_cin(p, T, prof, depth=50 * units.hPa)
# most unstable parcel properties!
mu_p, mu_t, mu_td, _ = mpcalc.most_unstable_parcel(p, T, Td, depth=50 * units.hPa)
mucape, mucin = mpcalc.most_unstable_cape_cin(p, T, Td, depth=50 * units.hPa)
# Estimate height of LCL in meters from hydrostatic thickness (for sig_tor)
new_p = np.append(p[p > lcl_pressure], lcl_pressure)
new_t = np.append(T[p > lcl_pressure], lcl_temperature)
lcl_height = mpcalc.thickness_hydrostatic(new_p, new_t)
# Compute Surface-based CAPE
sbcape, sbcin = mpcalc.surface_based_cape_cin(p, T, Td)
# Compute SRH
(u_storm, v_storm), *_ = mpcalc.bunkers_storm_motion(p, u, v, z)
*_, total_helicity1 = mpcalc.storm_relative_helicity(z, u, v, depth=1 * units.km,
storm_u=u_storm, storm_v=v_storm)
*_, total_helicity3 = mpcalc.storm_relative_helicity(z, u, v, depth=3 * units.km,
storm_u=u_storm, storm_v=v_storm)
*_, total_helicity6 = mpcalc.storm_relative_helicity(z, u, v, depth=6 * units.km,
storm_u=u_storm, storm_v=v_storm)
# Copmute Bulk Shear components and then magnitude
ubshr1, vbshr1 = mpcalc.bulk_shear(p, u, v, height=z, depth=1 * units.km)
bshear1 = mpcalc.wind_speed(ubshr1, vbshr1)
ubshr3, vbshr3 = mpcalc.bulk_shear(p, u, v, height=z, depth=3 * units.km)
bshear3 = mpcalc.wind_speed(ubshr3, vbshr3)
ubshr6, vbshr6 = mpcalc.bulk_shear(p, u, v, height=z, depth=6 * units.km)
bshear6 = mpcalc.wind_speed(ubshr6, vbshr6)
# Use all computed pieces to calculate the Significant Tornado parameter
sig_tor = mpcalc.significant_tornado(sbcape, lcl_height,
total_helicity3, bshear3).to_base_units()
# Perform the calculation of supercell composite if an effective layer exists
super_comp = mpcalc.supercell_composite(mucape, total_helicity3, bshear3)
# There is a lot we can do with this data operationally, so let's plot some of
# these values right on the plot, in the box we made
# First lets plot some thermodynamic parameters
plt.figtext(0.58, 0.37, 'SBCAPE: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.37, f'{sbcape:.0f~P}', weight='bold',
fontsize=15, color='orangered', ha='right')
plt.figtext(0.58, 0.34, 'SBCIN: ', weight='bold',
fontsize=15, color='black', ha='left')
plt.figtext(0.71, 0.34, f'{sbcin:.0f~P}', weight='bold',
fontsize=15, color='lightblue', ha='right')
plt.figtext(0.58, 0.29, 'MLCAPE: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.29, f'{mlcape:.0f~P}', weight='bold',
fontsize=15, color='orangered', ha='right')
plt.figtext(0.58, 0.26, 'MLCIN: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.26, f'{mlcin:.0f~P}', weight='bold',
fontsize=15, color='lightblue', ha='right')
plt.figtext(0.58, 0.21, 'MUCAPE: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.21, f'{mucape:.0f~P}', weight='bold',
fontsize=15, color='orangered', ha='right')
plt.figtext(0.58, 0.18, 'MUCIN: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.18, f'{mucin:.0f~P}', weight='bold',
fontsize=15, color='lightblue', ha='right')
plt.figtext(0.58, 0.13, 'TT-INDEX: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.13, f'{total_totals:.0f~P}', weight='bold',
fontsize=15, color='orangered', ha='right')
plt.figtext(0.58, 0.10, 'K-INDEX: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.71, 0.10, f'{kindex:.0f~P}', weight='bold',
fontsize=15, color='orangered', ha='right')
# now some kinematic parameters
plt.figtext(0.73, 0.37, '0-1km SRH: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.37, f'{total_helicity1:.0f~P}',
weight='bold', fontsize=15, color='navy', ha='right')
plt.figtext(0.73, 0.34, '0-1km SHEAR: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.34, f'{bshear1:.0f~P}', weight='bold',
fontsize=15, color='blue', ha='right')
plt.figtext(0.73, 0.29, '0-3km SRH: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.29, f'{total_helicity3:.0f~P}',
weight='bold', fontsize=15, color='navy', ha='right')
plt.figtext(0.73, 0.26, '0-3km SHEAR: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.26, f'{bshear3:.0f~P}', weight='bold',
fontsize=15, color='blue', ha='right')
plt.figtext(0.73, 0.21, '0-6km SRH: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.21, f'{total_helicity6:.0f~P}',
weight='bold', fontsize=15, color='navy', ha='right')
plt.figtext(0.73, 0.18, '0-6km SHEAR: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.18, f'{bshear6:.0f~P}', weight='bold',
fontsize=15, color='blue', ha='right')
plt.figtext(0.73, 0.13, 'SIG TORNADO: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.13, f'{sig_tor[0]:.0f~P}', weight='bold', fontsize=15,
color='orangered', ha='right')
plt.figtext(0.73, 0.10, 'SUPERCELL COMP: ', weight='bold', fontsize=15,
color='black', ha='left')
plt.figtext(0.88, 0.10, f'{super_comp[0]:.0f~P}', weight='bold', fontsize=15,
color='orangered', ha='right')
# Add legends to the skew and hodo
skewleg = skew.ax.legend(loc='upper left')
hodoleg = h.ax.legend(loc='upper left')
# add a quick plot title, this could be automated by
# declaring a station and datetime variable when using
# realtime observation data from Siphon.
plt.figtext(0.45, 0.97, 'OUN | MAY 4TH 1999 - 00Z VERTICAL PROFILE',
weight='bold', fontsize=20, ha='center')
# Show the plot
plt.show()
实际上只在数据读取做了小改,其他没怎么动
SBCAPE:这个CAPE值考察了从表面上升的空气团的不稳定性。这个值往往高于MLCAPE。 MLCAPE:在大多数风暴追踪时使用的最佳CAPE版本是MLCAPE,因为它往往是地表或近地表上升气流将摄入的最具代表性的空气。描述MLCAPE的最不技术的方法是,它平均了风暴云基以下的CAPE值。 MUCAPE:这项测量发现了测深中最不稳定的空气块,并记录了该值。通常,当有强烈的地表反转时,这是最有用的,因此风暴可能会升高。
以上机翻自https://www.tornadotitans.com/ 还有什么风暴螺旋度、风切变什么就不多介绍了,什么k指数,tt指数想必老师也教过
另外要注意就是单位问题,有什么需要就自行替换