Relative humidity now calculated (apparently) correctly.
This commit is contained in:
parent
d679bcf781
commit
be68481d06
6 changed files with 52 additions and 24 deletions
|
|
@ -31,8 +31,7 @@
|
||||||
|
|
||||||
;; AH=(RH × Ps)/(Rw × T × 100)
|
;; AH=(RH × Ps)/(Rw × T × 100)
|
||||||
|
|
||||||
(defn abs-humidity [& {:keys [relative-humidity saturation-pressure temperature-kelvin]}]
|
(defn abs-humidity [& {:keys [relative-humidity saturation-vapour-pressure temperature-kelvin]}]
|
||||||
(when (and relative-humidity saturation-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...
|
;; 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)))
|
||||||
)
|
|
||||||
|
|
|
||||||
1
src/humidity/actual_vp.clj
Normal file
1
src/humidity/actual_vp.clj
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
(ns humidity.actual-vp)
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
(ns humidity.core
|
(ns humidity.core
|
||||||
(: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.saturation-vp :as saturation-vp]
|
[humidity.saturation-vp :as saturation-vp]
|
||||||
[humidity.utils :refer [?assoc]]
|
[humidity.utils :refer [?assoc]]
|
||||||
[humidity.wet-bulb :refer [wet-bulb-temperature]]))
|
[humidity.wet-bulb :refer [wet-bulb-temperature]]))
|
||||||
|
|
@ -28,6 +29,7 @@
|
||||||
(if pressure-millibars (* pressure-millibars 100) Pa))
|
(if pressure-millibars (* pressure-millibars 100) Pa))
|
||||||
:pressure-millibars (when-not pressure-millibars
|
:pressure-millibars (when-not pressure-millibars
|
||||||
(if pressure-pascals (/ pressure-pascals 100) (/ Pa 100)))
|
(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))))
|
:saturation-vapour-pressure (saturation-vp/saturation-vp packet))))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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/"
|
(ns ^{:authority "https://journals.ametsoc.org/view/journals/apme/35/4/1520-0450_1996_035_0601_imfaos_2_0_co_2.xml/"
|
||||||
:author "simon"
|
:author "simon"
|
||||||
:doc "Function to return relative humidity."} humidity.relative
|
: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]]))
|
[humidity.utils :refer [expt]]))
|
||||||
|
|
||||||
(def ^:const magic-numbers
|
(def ^:const magic-numbers
|
||||||
|
|
@ -13,22 +13,43 @@
|
||||||
|
|
||||||
(def C magic-numbers)
|
(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
|
(defn rel-humidity
|
||||||
"Returns relative humidity (as a percentage, 0...100) given values for dew
|
"Returns relative humidity (as a percentage, 0...100) given values for dew
|
||||||
point and temperature in either Celsius or Kelvin."
|
point and temperature in Celsius or for absolute humidity, saturation vapour pressure temperature Kelvin."
|
||||||
[& {:keys [dew-point temperature-celsius temperature-kelvin]}]
|
[& {:keys [absolute-humidity dew-point saturation-vapour-pressure temperature-ke temperature-kelvin] :as packet}]
|
||||||
(cond (and dew-point (or temperature-celsius temperature-kelvin))
|
(cond (and dew-point temperature-ke)
|
||||||
(let [Tc (if temperature-celsius
|
(* 100 (/ (expt e (/ (* (C 1) dew-point)
|
||||||
temperature-celsius
|
(+ (C 2) dew-point)))
|
||||||
(- temperature-kelvin celsius-offset))]
|
(expt e (/ (* (C 1) temperature-ke)
|
||||||
(* 100 (/ (expt e (/ (* (C 1) dew-point)
|
(+ (C 2) temperature-ke)))))
|
||||||
(+ (C 2) dew-point)))
|
(and absolute-humidity saturation-vapour-pressure temperature-kelvin)
|
||||||
(expt e (/ (* (C 1) Tc)
|
(/ (* absolute-humidity temperature-kelvin Rw) (* 1000 saturation-vapour-pressure))))
|
||||||
(+ (C 2) Tc))))))))
|
|
||||||
|
|
||||||
;; Absolute Humidity (grams/m3) = 6.112 × e^[(17.67 × T)/(T+243.5)] × rh × 2.1674
|
|
||||||
;; -----------------------------------------------
|
|
||||||
;; (273.15+T)
|
|
||||||
;;
|
|
||||||
;; => /
|
|
||||||
;;
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,6 @@
|
||||||
(let [min-expected 39.58
|
(let [min-expected 39.58
|
||||||
max-expected 39.59
|
max-expected 39.59
|
||||||
actual (abs-humidity :relative-humidity 100
|
actual (abs-humidity :relative-humidity 100
|
||||||
:saturation-pressure 56.29
|
:saturation-vapour-pressure 56.29
|
||||||
:temperature-kelvin (+ 35 celsius-offset))]
|
:temperature-kelvin (+ 35 celsius-offset))]
|
||||||
(is (< min-expected actual max-expected)))))
|
(is (< min-expected actual max-expected)))))
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,14 @@
|
||||||
(ns humidity.relative-test
|
(ns humidity.relative-test
|
||||||
(:require [clojure.test :refer [deftest is testing]]
|
(:require [clojure.test :refer [deftest is testing]]
|
||||||
[humidity.constants :refer [celsius-offset]]
|
[humidity.constants :refer [celsius-offset]]
|
||||||
[humidity.relative :refer [rel-humidity]]))
|
[humidity.relative :refer [rel-humidity rel-humidity-2]]))
|
||||||
|
|
||||||
(deftest relative-humidity-test
|
(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"
|
(testing "Online examples"
|
||||||
(let [min-expected 99
|
(let [min-expected 99
|
||||||
max-expected 101
|
max-expected 101
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue