From 0aad130001bbc71c9a362e9cfc6774bdf7b03375 Mon Sep 17 00:00:00 2001
From: XANTRONIX Industrial <xan@xantronix.com>
Date: Wed, 5 Mar 2025 00:34:23 -0500
Subject: [PATCH] Initial implementation of moist_lapse_rate()

---
 lib/xmet/thermo.py | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/lib/xmet/thermo.py b/lib/xmet/thermo.py
index cfefcac..540ad00 100644
--- a/lib/xmet/thermo.py
+++ b/lib/xmet/thermo.py
@@ -1,6 +1,9 @@
 LAPSE_RATE_DRY   = 9.8 / 1000 # degrees C per km
 LAPSE_RATE_MOIST = 4.0 / 1000
 
+def kelvin(c: float) -> float:
+    return 273.15 + c
+
 def vapor_pressure(dewpoint: float) -> float:
     """
     Return the pressure of vapor in a parcel of a given dewpoint.
@@ -56,3 +59,15 @@ def lapse(temp: float, delta: float, rate=LAPSE_RATE_DRY) -> float:
     given increase in height (in meters).
     """
     return temp - (rate * delta)
+
+def moist_lapse_rate(temp: float, dewpoint: float, pressure: float) -> float:
+    g   = 9.8076
+    Hv  = 2501000
+    r   = mixing_ratio(dewpoint, pressure)
+    Rsd = 287
+    Rsw = 461.5
+    Cpd = 1003.5
+    T   = kelvin(temp)
+
+    return g * (1 + (Hv * r) / (Rsd * T)) \
+             / (Cpd + ((Hv**2 * r) / (Rsw * T**2)))