diff --git a/src/humidity/absolute.clj b/src/humidity/absolute.clj index 38a93a8..d686e7c 100644 --- a/src/humidity/absolute.clj +++ b/src/humidity/absolute.clj @@ -31,8 +31,7 @@ ;; AH=(RH × Ps)​​/(Rw ​× T × 100) -(defn abs-humidity [& {:keys [relative-humidity saturation-pressure temperature-kelvin]}] - (when (and relative-humidity saturation-pressure temperature-kelvin) +(defn abs-humidity [& {:keys [relative-humidity saturation-vapour-pressure temperature-kelvin]}] + (when (and relative-humidity saturation-vapour-pressure temperature-kelvin) ;; I don't know why I'm having to multiply by a thousand here... - (* (/ (* relative-humidity saturation-pressure) Rw temperature-kelvin) 1000)) - ) + (* (/ (* relative-humidity saturation-vapour-pressure) Rw temperature-kelvin) 1000))) diff --git a/src/humidity/actual_vp.clj b/src/humidity/actual_vp.clj new file mode 100644 index 0000000..3e742f5 --- /dev/null +++ b/src/humidity/actual_vp.clj @@ -0,0 +1 @@ +(ns humidity.actual-vp) diff --git a/src/humidity/core.clj b/src/humidity/core.clj index 16f5054..6267107 100644 --- a/src/humidity/core.clj +++ b/src/humidity/core.clj @@ -1,6 +1,7 @@ (ns humidity.core (:require [humidity.absolute :refer [abs-humidity]] [humidity.constants :refer [celsius-offset Pa]] + [humidity.relative :refer [rel-humidity]] [humidity.saturation-vp :as saturation-vp] [humidity.utils :refer [?assoc]] [humidity.wet-bulb :refer [wet-bulb-temperature]])) @@ -28,6 +29,7 @@ (if pressure-millibars (* pressure-millibars 100) Pa)) :pressure-millibars (when-not pressure-millibars (if pressure-pascals (/ pressure-pascals 100) (/ Pa 100))) + :relative-humidity (when-not relative-humidity (rel-humidity packet)) :saturation-vapour-pressure (saturation-vp/saturation-vp packet)))) diff --git a/src/humidity/relative.clj b/src/humidity/relative.clj index 247f7e3..23e1b72 100644 --- a/src/humidity/relative.clj +++ b/src/humidity/relative.clj @@ -1,7 +1,7 @@ (ns ^{:authority "https://journals.ametsoc.org/view/journals/apme/35/4/1520-0450_1996_035_0601_imfaos_2_0_co_2.xml/" :author "simon" :doc "Function to return relative humidity."} humidity.relative - (:require [humidity.constants :refer [celsius-offset e]] + (:require [humidity.constants :refer [celsius-offset e Rw]] [humidity.utils :refer [expt]])) (def ^:const magic-numbers @@ -13,22 +13,43 @@ (def C magic-numbers) +;; / / relative-humidity x saturation-pressure \ \ +;; | | --------------------------------------- | | +;; 1000 * | \ Rw / | = absolute-humidity +;; | ------------------------------------------- | +;; \ temperature-kelvin / +;; +;; divide both sides by 1000 ==> +;; / / relative-humidity x saturation-pressure \ \ +;; | | --------------------------------------- | | / absolute-humidity \ +;; | \ Rw / | = | ----------------- | +;; | ------------------------------------------- | \ 1000 / +;; \ temperature-kelvin / +;; +;; multiply both sides by temperature-kelvin ==> +;; / relative-humidity x saturation-pressure \ / absolute-humidity x temperature-kelvin \ +;; | --------------------------------------- | = | -------------------------------------- | +;; \ Rw / \ 1000 / +;; +;; Multiply both sides by Rw ==> +;; absolute-humidity x temperature-kelvin x Rw +;; relative-humidity x saturation-pressure = ------------------------------------------- +;; 1000 +;; +;; Divide both sides by saturation-pressure ==> +;; +;; absolute-humidity x temperature-kelvin x Rw +;; relative-humidity = ------------------------------------------- +;; 1000 x saturation-pressure + (defn rel-humidity "Returns relative humidity (as a percentage, 0...100) given values for dew - point and temperature in either Celsius or Kelvin." - [& {:keys [dew-point temperature-celsius temperature-kelvin]}] - (cond (and dew-point (or temperature-celsius temperature-kelvin)) - (let [Tc (if temperature-celsius - temperature-celsius - (- temperature-kelvin celsius-offset))] - (* 100 (/ (expt e (/ (* (C 1) dew-point) - (+ (C 2) dew-point))) - (expt e (/ (* (C 1) Tc) - (+ (C 2) Tc)))))))) - -;; Absolute Humidity (grams/m3) = 6.112 × e^[(17.67 × T)/(T+243.5)] × rh × 2.1674 -;; ----------------------------------------------- -;; (273.15+T) -;; -;; => / -;; + point and temperature in Celsius or for absolute humidity, saturation vapour pressure temperature Kelvin." + [& {:keys [absolute-humidity dew-point saturation-vapour-pressure temperature-ke temperature-kelvin] :as packet}] + (cond (and dew-point temperature-ke) + (* 100 (/ (expt e (/ (* (C 1) dew-point) + (+ (C 2) dew-point))) + (expt e (/ (* (C 1) temperature-ke) + (+ (C 2) temperature-ke))))) + (and absolute-humidity saturation-vapour-pressure temperature-kelvin) + (/ (* absolute-humidity temperature-kelvin Rw) (* 1000 saturation-vapour-pressure)))) diff --git a/test/humidity/absolute_test.clj b/test/humidity/absolute_test.clj index b983e1f..9a13e6f 100644 --- a/test/humidity/absolute_test.clj +++ b/test/humidity/absolute_test.clj @@ -8,6 +8,6 @@ (let [min-expected 39.58 max-expected 39.59 actual (abs-humidity :relative-humidity 100 - :saturation-pressure 56.29 + :saturation-vapour-pressure 56.29 :temperature-kelvin (+ 35 celsius-offset))] (is (< min-expected actual max-expected))))) diff --git a/test/humidity/relative_test.clj b/test/humidity/relative_test.clj index 3a9d52b..9d7c5fd 100644 --- a/test/humidity/relative_test.clj +++ b/test/humidity/relative_test.clj @@ -1,9 +1,14 @@ (ns humidity.relative-test (:require [clojure.test :refer [deftest is testing]] [humidity.constants :refer [celsius-offset]] - [humidity.relative :refer [rel-humidity]])) + [humidity.relative :refer [rel-humidity rel-humidity-2]])) (deftest relative-humidity-test + (testing "definitional" + (let [min-expected 99 + max-expected 101 + actual (rel-humidity-2 :absolute-humidity 39.58 :saturation-vapour-pressure 5622.49 :temperature-kelvin (+ 35 celsius-offset))] + (is (< min-expected actual max-expected)))) (testing "Online examples" (let [min-expected 99 max-expected 101