Regularised the calling signature of the calculator functions.

This commit is contained in:
Simon Brooke 2026-08-11 18:38:35 +01:00
parent 37689df3e2
commit 91343b9c10
3 changed files with 38 additions and 30 deletions

View file

@ -2,41 +2,47 @@
(:require [humidity.absolute :refer [abs-humidity]] (:require [humidity.absolute :refer [abs-humidity]]
[humidity.constants :refer [celsius-offset Pa]] [humidity.constants :refer [celsius-offset Pa]]
[humidity.relative :refer [rel-humidity]] [humidity.relative :refer [rel-humidity]]
[humidity.saturation-vp :as saturation-vp] [humidity.saturation-vp :refer [saturation-vp]]
[humidity.utils :refer [?assoc]] [humidity.utils :refer [?assoc]]
[humidity.wet-bulb :refer [wet-bulb-temperature]])) [humidity.wet-bulb :as wb]))
(defn resolve-humidity (defn resolve-humidity
"Resolve humidity equations given the data in this packet." "Resolve humidity equations given the data in this packet."
[& {:keys [temperature temperature-celsius temperature-kelvin relative-humidity [& {:keys [absolute-humidity pressure-pascals pressure-millibars
pressure-pascals pressure-millibars saturation-vapour-pressure] :as packet}] relative-humidity saturation-vapour-pressure temperature
temperature-celsius temperature-kelvin wet-bulb-temperature] :as packet}]
(println 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 (?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 :temperature-celsius (when
(and temperature-kelvin (not temperature-celsius)) (and temperature-kelvin
(not temperature-celsius))
(- temperature-kelvin celsius-offset)) (- temperature-kelvin celsius-offset))
:temperature-kelvin (when :temperature-kelvin (when
(and temperature-celsius (not temperature-kelvin)) (and temperature-celsius
(not temperature-kelvin))
(+ temperature-celsius celsius-offset)) (+ temperature-celsius celsius-offset))
:wet-bulb-temperature (when :wet-bulb-temperature (when-not wet-bulb-temperature
(and temperature-celsius relative-humidity) (wb/wet-bulb-temperature packet)))))
(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))))
(defn resolution (defn resolution
"Repeatedly run `resolve-humidity`, q.v., until we can infer no further "Repeatedly run `resolve-humidity`, q.v., until we can infer no further
information." information."
[packet] [& {:keys [] :as packet}]
(loop [p packet] (loop [p packet]
(let [p' (resolve-humidity p)] (let [p' (resolve-humidity p)]
(if (= (keys p) (keys p')) p (if (= (keys p) (keys p')) p

View file

@ -17,11 +17,13 @@
(defn wet-bulb-temperature (defn wet-bulb-temperature
"Returns wet bulb temperature (in ° C) given this `temperature` in "Returns wet bulb temperature (in ° C) given this `temperature` in
° C and `relative-humidity` percentage (0...100)" ° C and `relative-humidity` percentage (0...100)"
[temperature relative-humidity] [&{:keys [temperature relative-humidity]}]
(when
(and temperature relative-humidity)
(let [T temperature (let [T temperature
RHP relative-humidity] RHP relative-humidity]
(+ (* T (atan (* (C 1) (expt (+ RHP (C 2)) 1/2)))) (+ (* T (atan (* (C 1) (expt (+ RHP (C 2)) 1/2))))
(atan (+ T RHP)) (atan (+ T RHP))
(- 0 (atan (- RHP (C 3)))) (- 0 (atan (- RHP (C 3))))
(* (C 4) (expt RHP 3/2) (atan (* (C 5) RHP))) (* (C 4) (expt RHP 3/2) (atan (* (C 5) RHP)))
(- 0 (C 6))))) (- 0 (C 6))))))

View file

@ -8,7 +8,7 @@
(let [expected 13.7 (let [expected 13.7
temperature 20 temperature 20
rel-humidity 50 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)) (println (format "Expected: %s; actual: %s" expected actual))
(is (< (abs (- expected actual)) 0.001)))) (is (< (abs (- expected actual)) 0.001))))
@ -17,7 +17,7 @@
max-expected 33 max-expected 33
temperature 37 temperature 37
rel-humidity 70 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)) (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual))
(is (< min-expected actual max-expected))) (is (< min-expected actual max-expected)))
@ -25,7 +25,7 @@
max-expected 36 max-expected 36
temperature 39.7 temperature 39.7
rel-humidity 70 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)) (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual))
(is (< min-expected actual max-expected))) (is (< min-expected actual max-expected)))
@ -34,7 +34,7 @@
max-expected 34 max-expected 34
temperature 40 temperature 40
rel-humidity 60 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)) (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual))
(is (< min-expected actual max-expected))) (is (< min-expected actual max-expected)))
@ -42,6 +42,6 @@
max-expected 35 max-expected 35
temperature 51 temperature 51
rel-humidity 30 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)) (println (format "Expected: %s...%s; actual: %s" min-expected max-expected actual))
(is (< min-expected actual max-expected))))) (is (< min-expected actual max-expected)))))