diff --git a/src/humidity/core.clj b/src/humidity/core.clj index 6267107..5bc3387 100644 --- a/src/humidity/core.clj +++ b/src/humidity/core.clj @@ -2,41 +2,47 @@ (:require [humidity.absolute :refer [abs-humidity]] [humidity.constants :refer [celsius-offset Pa]] [humidity.relative :refer [rel-humidity]] - [humidity.saturation-vp :as saturation-vp] + [humidity.saturation-vp :refer [saturation-vp]] [humidity.utils :refer [?assoc]] - [humidity.wet-bulb :refer [wet-bulb-temperature]])) + [humidity.wet-bulb :as wb])) (defn resolve-humidity "Resolve humidity equations given the data in this packet." - [& {:keys [temperature temperature-celsius temperature-kelvin relative-humidity - pressure-pascals pressure-millibars saturation-vapour-pressure] :as packet}] + [& {:keys [absolute-humidity pressure-pascals pressure-millibars + relative-humidity saturation-vapour-pressure temperature + temperature-celsius temperature-kelvin wet-bulb-temperature] :as packet}] (println packet) - (if temperature (resolve-humidity (assoc (dissoc packet :temperature) :temperature-celsius temperature)) + (if temperature (resolve-humidity + (assoc (dissoc packet :temperature) + :temperature-celsius temperature)) (?assoc packet + :absolute-humidity (when-not absolute-humidity + (abs-humidity packet)) + :pressure-pascals (when-not pressure-pascals + (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 (when-not saturation-vapour-pressure + (saturation-vp packet)) :temperature-celsius (when - (and temperature-kelvin (not temperature-celsius)) + (and temperature-kelvin + (not temperature-celsius)) (- temperature-kelvin celsius-offset)) :temperature-kelvin (when - (and temperature-celsius (not temperature-kelvin)) + (and temperature-celsius + (not temperature-kelvin)) (+ temperature-celsius celsius-offset)) - :wet-bulb-temperature (when - (and temperature-celsius relative-humidity) - (wet-bulb-temperature temperature-celsius relative-humidity)) - :absolute-humidity (abs-humidity :relative-humidity relative-humidity - :saturation-vapour-pressure saturation-vapour-pressure - :temperature-kelvin temperature-kelvin) - :pressure-pascals (when-not pressure-pascals - (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)))) - + :wet-bulb-temperature (when-not wet-bulb-temperature + (wb/wet-bulb-temperature packet))))) (defn resolution "Repeatedly run `resolve-humidity`, q.v., until we can infer no further information." - [packet] + [& {:keys [] :as packet}] (loop [p packet] (let [p' (resolve-humidity p)] (if (= (keys p) (keys p')) p diff --git a/src/humidity/wet_bulb.clj b/src/humidity/wet_bulb.clj index ffed146..04b4488 100644 --- a/src/humidity/wet_bulb.clj +++ b/src/humidity/wet_bulb.clj @@ -17,11 +17,13 @@ (defn wet-bulb-temperature "Returns wet bulb temperature (in ° C) given this `temperature` in ° C and `relative-humidity` percentage (0...100)" - [temperature relative-humidity] - (let [T temperature + [&{:keys [temperature relative-humidity]}] + (when + (and temperature relative-humidity) + (let [T temperature RHP relative-humidity] (+ (* T (atan (* (C 1) (expt (+ RHP (C 2)) 1/2)))) (atan (+ T RHP)) (- 0 (atan (- RHP (C 3)))) (* (C 4) (expt RHP 3/2) (atan (* (C 5) RHP))) - (- 0 (C 6))))) + (- 0 (C 6)))))) diff --git a/test/humidity/wet_bulb_test.clj b/test/humidity/wet_bulb_test.clj index 6dc802b..6678cf9 100644 --- a/test/humidity/wet_bulb_test.clj +++ b/test/humidity/wet_bulb_test.clj @@ -8,7 +8,7 @@ (let [expected 13.7 temperature 20 rel-humidity 50 - actual (wet-bulb-temperature temperature rel-humidity)] + actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] (println (format "Expected: %s; actual: %s" expected actual)) (is (< (abs (- expected actual)) 0.001)))) @@ -17,7 +17,7 @@ max-expected 33 temperature 37 rel-humidity 70 - actual (wet-bulb-temperature temperature rel-humidity)] + actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected))) @@ -25,7 +25,7 @@ max-expected 36 temperature 39.7 rel-humidity 70 - actual (wet-bulb-temperature temperature rel-humidity)] + actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected))) @@ -34,7 +34,7 @@ max-expected 34 temperature 40 rel-humidity 60 - actual (wet-bulb-temperature temperature rel-humidity)] + actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected))) @@ -42,6 +42,6 @@ max-expected 35 temperature 51 rel-humidity 30 - actual (wet-bulb-temperature temperature rel-humidity)] + actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) - (is (< min-expected actual max-expected))))) \ No newline at end of file + (is (< min-expected actual max-expected)))))