为何抬升凝结高度(LCL)处的混合比与初始状态不一致?
问题
作为Metpy新手,我尝试计算温度25℃、气压950hPa、相对湿度70%的气块的抬升凝结高度(LCL):
- 先计算得到气块的混合比:
mr: 15.016493919350289 gram / kilogram
- 再计算出LCL参数:
pLCL: 871.9597894290378 hectopascal TLCL: 17.786684840244334 degree_Celsius
但当从LCL开始计算各层参数时,用mixing_ratio_from_relative_humidity(相对湿度设为100%)计算的LCL处混合比为14.862703501798386 gram / kilogram,和初始混合比不一致。按原理,气块干绝热上升至LCL时混合比应保持不变,且LCL处相对湿度为100%,为何会出现这种差异?
相关代码及输出如下:
from metpy.calc import dewpoint_from_relative_humidity from metpy.calc import equivalent_potential_temperature from metpy.calc import mixing_ratio_from_relative_humidity from metpy.calc import lcl from metpy.calc import moist_lapse from metpy.calc import saturation_equivalent_potential_temperature from metpy.units import units p = 950 * units.hPa T = 25 * units.degC rh = 70 * units.percent print('p:\t', p) print('T:\t', T) print('RF:\t', rh) dp = dewpoint_from_relative_humidity(T, rh) mr = mixing_ratio_from_relative_humidity(p, T, rh).to('g/kg') print('mr:\t', mr) ept = equivalent_potential_temperature(p, T, dp) print('Θe :\t', ept.to(units.degC)) mylcl = lcl(p, T, dp) plcl = mylcl[0] tlcl = mylcl[1] print('pLCL:\t', plcl) print('TLCL:\t', tlcl) plevs = [plcl.magnitude, 800, 700, 600, 500, 400, 300, 200, 100, 50, 25] * units.hPa ml = moist_lapse(plevs, tlcl).to('degC') print() print('Moist adiabatic lift, starting from LCL') print() rh100 = 100 * units.percent for idx in range(len(plevs)): p = plevs[idx] T = ml[idx] print('-------------------------------------------------------------') print('p:\t', p) print('T(p):\t', T) ept = saturation_equivalent_potential_temperature(plevs[idx], ml[idx]) print('Θe(p):\t', ept.to(units.degC)) mr = mixing_ratio_from_relative_humidity(p, T, rh100) print('mr:\t', mr.to('g/kg'))
输出:
p: 950 hectopascal T: 25 degree_Celsius RF: 70 percent mr: 15.016493919350289 gram / kilogram Θe : 73.59933073452271 degree_Celsius pLCL: 871.9597894290378 hectopascal TLCL: 17.786684840244334 degree_Celsius Moist adiabatic lift, starting from LCL ------------------------------------------------------------- p: 871.9597894290378 hectopascal T(p): 17.786684840244334 degree_Celsius Θe(p): 73.56266438016314 degree_Celsius mr: 14.862703501798386 gram / kilogram <--- 差异点 ------------------------------------------------------------- # 后续输出省略
原因分析
这个差异来自数值计算的精度限制:
- Metpy的
lcl函数采用迭代法求解气块干绝热上升至饱和(即温度等于露点温度)的高度,迭代过程有终止精度阈值,导致返回的pLCL和TLCL是近似解,而非理论上的精确值。 - 用这个近似的
pLCL和TLCL计算饱和混合比(即rh=100%时的混合比),就会和初始气块的混合比产生微小偏差——理论上LCL处的饱和混合比应严格等于初始混合比,但迭代的近似性打破了这个严格相等的关系。
解决方法
有两种简单的修正方式:
- 直接复用初始混合比:气块干绝热上升过程中混合比守恒,LCL处的混合比就是初始计算得到的
15.01649... g/kg,不需要重新计算。 - 用初始混合比反推精确的LCL温度:如果需要严格保证LCL处饱和混合比等于初始值,可以用
saturation_mixing_ratio函数,结合LCL的气压,反解出对应的温度,替代lcl函数返回的TLCL。
示例代码片段(修正LCL处混合比的输出):
# 在循环中判断是否是LCL层 for idx in range(len(plevs)): p = plevs[idx] T = ml[idx] print('-------------------------------------------------------------') print('p:\t', p) print('T(p):\t', T) ept = saturation_equivalent_potential_temperature(plevs[idx], ml[idx]) print('Θe(p):\t', ept.to(units.degC)) # 针对LCL层,直接使用初始混合比 if idx == 0: print('mr:\t', mr) else: mr_current = mixing_ratio_from_relative_humidity(p, T, rh100) print('mr:\t', mr_current.to('g/kg'))
内容的提问来源于stack exchange,提问作者MichaelW
相关产品推荐
相关产品推荐

