Use virtual temperature to fix CAPE calculation

This commit is contained in:
XANTRONIX 2025-03-14 21:10:39 -04:00
parent cd6bb30167
commit 45e616b39f
2 changed files with 23 additions and 10 deletions

View file

@ -260,7 +260,7 @@ class SkewTGraph():
if self.opts.draw_cape_mixing_ratio:
cr.set_source_rgb(0.8, 0.8, 1.0)
self.draw_series(cr, x, y, params.saturated_mr_line)
self.draw_series(cr, x, y, params.mixing_ratio_line)
def draw(self,
cr: cairo.Context,

View file

@ -10,6 +10,7 @@ from xmet.thermo import follow_dry_adiabat, \
follow_moist_adiabat, \
follow_saturated_mixing_ratio, \
pressure_height, \
virtual_temp, \
kelvin
LAPSE_RATE_DRY = 9.8 # degrees C per 1000m
@ -233,19 +234,31 @@ class SoundingParams():
return 9.8076 * cape
def load_sounding(self, sounding: Sounding):
temp_line = sounding.follow_temp()
dry_adiabat = follow_dry_adiabat(sounding.samples[0].temp,
sounding.samples[0].pressure)
surface = sounding.samples[0]
saturated_mr_line = follow_saturated_mixing_ratio(sounding.samples[0].dewpoint,
sounding.samples[0].pressure)
tv = virtual_temp(surface.temp,
surface.dewpoint,
surface.pressure)
lcl = dry_adiabat.intersect(saturated_mr_line, SeriesIntersection.LESSER)
temp_line = sounding.follow_temp()
dewpoint_line = sounding.follow_dewpoint()
dry_adiabat = follow_dry_adiabat(tv, surface.pressure)
moist_adiabat = follow_moist_adiabat(*lcl)
mixing_ratio_line = follow_saturated_mixing_ratio(surface.dewpoint,
surface.pressure)
lcl = dry_adiabat.intersect(mixing_ratio_line,
SeriesIntersection.LESSER)
tv2 = virtual_temp(temp_line.nearest(lcl[1]),
dewpoint_line.nearest(lcl[1]),
lcl[1])
moist_adiabat = follow_moist_adiabat(tv2, lcl[1])
lfc = temp_line.intersect(moist_adiabat, SeriesIntersection.LESSER)
el = temp_line.intersect(moist_adiabat, SeriesIntersection.GREATER, lfc[1]-100)
el = temp_line.intersect(moist_adiabat, SeriesIntersection.GREATER,
lfc[1])
self.lcl = lcl
self.lfc = lfc
@ -254,7 +267,7 @@ class SoundingParams():
self.temp_line = temp_line
self.dry_adiabat = dry_adiabat
self.saturated_mr_line = saturated_mr_line
self.mixing_ratio_line = mixing_ratio_line
self.moist_adiabat = moist_adiabat
@staticmethod