From 0e7ecdbb7bab0e3a60feb9da1448c04ace1a2d2c Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Wed, 12 Aug 2026 14:18:43 +0100 Subject: [PATCH] Initial release. Computes: 1. :absolute-humidity 2. :actual-vapour-pressure 3. :dew-point-celsius 4. :pressure-millibars 5. :pressure-pascals 6. :relative-humidity 7. :saturation-vapour-pressure 8. :temperature-celsius 9. :temperature-kelvin 10. :volume 11. :wet-bulb-temperature --- CHANGELOG.md | 15 +++++++++++++++ project.clj | 2 +- src/humidity/wet_bulb.clj | 23 +++++++++++------------ test/humidity/core_test.clj | 11 ++++++----- test/humidity/wet_bulb_test.clj | 10 +++++----- 5 files changed, 38 insertions(+), 23 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a6207ac --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,15 @@ +# humidity: Change Log + +## Releae 0.1.0 12th August 2026 + +Initial release. + +Computes: + +1. :absolute-humidity +2. :actual-vapour-pressure +3. :dew-point-celsius +4. :pressure-millibars +5. :pressure-pascals +6. :relative-humidity +7. :saturation-vapour-pressure :temperature-celsius :temperature-kelvin :volume diff --git a/project.clj b/project.clj index b3bb11c..ed0c40b 100644 --- a/project.clj +++ b/project.clj @@ -1,4 +1,4 @@ -(defproject humidity "0.1.0-SNAPSHOT" +(defproject humidity "0.1.0" :cloverage {:output "docs/cloverage" :ns-exclude-regex [#"beowulf\.gendoc" #"beowulf\.scratch"]} :codox {:metadata {:doc "**TODO**: write docs" diff --git a/src/humidity/wet_bulb.clj b/src/humidity/wet_bulb.clj index c5ca18f..5d87968 100644 --- a/src/humidity/wet_bulb.clj +++ b/src/humidity/wet_bulb.clj @@ -1,7 +1,7 @@ (ns ^{:doc "Function to calculate wet bulb temperature (in ° C) given temperature in ° C and relative-humidity percentage (0...100)" - :author "simon"} - humidity.wet-bulb + :author "simon"} + humidity.wet-bulb (:require [clojure.math :refer [atan]] [humidity.utils :refer [expt]])) @@ -25,7 +25,6 @@ ;;; USA. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (def ^:const magic-numbers "The magic numbers (empirical constants) from the derived expression. It bothers me that all these formulae depend on 'empirical constants', *and* @@ -38,13 +37,13 @@ (defn wet-bulb-temperature "Returns wet bulb temperature (in ° C) given this `temperature` in ° C and `relative-humidity` percentage (0...100)" - [&{:keys [temperature relative-humidity]}] + [& {:keys [temperature-celsius 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)))))) + (and temperature-celsius relative-humidity) + (let [T temperature-celsius + 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)))))) diff --git a/test/humidity/core_test.clj b/test/humidity/core_test.clj index 34e24b9..505df11 100644 --- a/test/humidity/core_test.clj +++ b/test/humidity/core_test.clj @@ -27,15 +27,16 @@ (deftest resolution-test (testing "resolution") (let [expected {:absolute-humidity 3953.618101887827, - :pressure-pascals 101325, - :temperature-celsius 35, + :actual-vapour-pressure 4765.10094206357, :dew-point-celsius 35.00000000000001, :pressure-millibars 1013.25, - :volume 1.1281347245103424, - :temperature-kelvin 308.15, + :pressure-pascals 101325, :relative-humidity 100, :saturation-vapour-pressure 5622.488734516426, - :actual-vapour-pressure 4765.10094206357} + :temperature-celsius 35, + :temperature-kelvin 308.15, + :volume 1.1281347245103424, + :wet-bulb-temperature 35.11625928298915} packet {:relative-humidity 100 :temperature-celsius 35} actual (resolution packet)] (is (= actual expected)))) diff --git a/test/humidity/wet_bulb_test.clj b/test/humidity/wet_bulb_test.clj index 267ba44..902f17c 100644 --- a/test/humidity/wet_bulb_test.clj +++ b/test/humidity/wet_bulb_test.clj @@ -28,7 +28,7 @@ (let [expected 13.7 temperature 20 rel-humidity 50 - actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] + actual (wet-bulb-temperature :temperature-celsius temperature :relative-humidity rel-humidity)] (println (format "Expected: %s; actual: %s" expected actual)) (is (< (abs (- expected actual)) 0.001)))) @@ -37,7 +37,7 @@ max-expected 33 temperature 37 rel-humidity 70 - actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] + actual (wet-bulb-temperature :temperature-celsius temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected))) @@ -45,7 +45,7 @@ max-expected 36 temperature 39.7 rel-humidity 70 - actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] + actual (wet-bulb-temperature :temperature-celsius temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected))) @@ -53,7 +53,7 @@ max-expected 34 temperature 40 rel-humidity 60 - actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] + actual (wet-bulb-temperature :temperature-celsius temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected))) @@ -61,6 +61,6 @@ max-expected 35 temperature 51 rel-humidity 30 - actual (wet-bulb-temperature :temperature temperature :relative-humidity rel-humidity)] + actual (wet-bulb-temperature :temperature-celsius temperature :relative-humidity rel-humidity)] (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual)) (is (< min-expected actual max-expected)))))