From c0ed20cce50b02d2b21fdf8e253e6f8f5cf69591 Mon Sep 17 00:00:00 2001
From: XANTRONIX Industrial <xan@xantronix.com>
Date: Wed, 5 Mar 2025 16:13:50 -0500
Subject: [PATCH] Reimplement draw_adiabat() with loft_parcel()

---
 lib/xmet/skew_t.py | 44 +++++++++-----------------------------------
 1 file changed, 9 insertions(+), 35 deletions(-)

diff --git a/lib/xmet/skew_t.py b/lib/xmet/skew_t.py
index 6dc0e5e..f30b878 100644
--- a/lib/xmet/skew_t.py
+++ b/lib/xmet/skew_t.py
@@ -4,12 +4,9 @@ import cairo
 from typing import Callable
 
 from xmet.sounding import Sounding
-from xmet.thermo   import pressure_height, lapse, moist_lapse_rate, \
-                          LAPSE_RATE_DRY
-
-PRESSURE_MAX  = 1050 # millibar
-PRESSURE_MIN  =  100
-PRESSURE_STEP =   50
+from xmet.thermo   import pressure_height, loft_parcel, moist_lapse_rate, \
+                          LAPSE_RATE_DRY, PRESSURE_MAX, PRESSURE_MIN, \
+                          PRESSURE_STEP
 
 PRESSURE_LOG_MAX   = math.log(PRESSURE_MAX)
 PRESSURE_LOG_MIN   = math.log(PRESSURE_MIN)
@@ -107,26 +104,11 @@ class SkewTGraph():
                      start_temp: float,
                      start_pressure: float,
                      lapse_rate: Callable):
-        start_height = pressure_height(start_pressure)
-        sx_last      = None
-        sy_last      = None
-        height_last  = None
+        sx_last = None
+        sy_last = None
 
-        temp     = start_temp
-        pressure = start_pressure
-
-        while pressure >= PRESSURE_MIN:
-            height = pressure_height(pressure)
-
-            if height_last is None:
-                height_last = height
-
-            try:
-                rate = lapse_rate(temp, temp, pressure)
-            except OverflowError:
-                break
-
-            temp = lapse(temp, height - height_last, rate)
+        for level in loft_parcel(start_temp, start_pressure, lapse_rate):
+            temp, pressure = level
 
             sx, sy = self.sample_to_screen(temp, pressure)
 
@@ -135,16 +117,8 @@ class SkewTGraph():
                 cr.line_to(x + sx_last, y + sy_last)
                 cr.stroke()
 
-            sx_last     = sx
-            sy_last     = sy
-            height_last = height
-
-            if pressure == PRESSURE_MIN:
-                break
-            elif pressure - 10.0 < PRESSURE_MIN:
-                pressure = PRESSURE_MIN
-            else:
-                pressure -= 10.0
+            sx_last = sx
+            sy_last = sy
 
     def draw_adiabats(self,
                       cr: cairo.Context,