Humidity

Published

September 8, 2022

# devtools::install_github('sebastian-gerdes/smisc')
library('smisc')
library('knitr')
library('tidyverse')
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library('lattice')
plot(absolute_humidity, -20, 20, log = 'y')

volume_of_flat <- 120 * 3
relative_humidity_inside <- 50
relative_humidity_outside <- 70
temperature_inside <- 20
temperature_outside <- 0
(water_in_air_inside <- absolute_humidity(relative_humidity = relative_humidity_inside,
                                  temperature = temperature_inside) * volume_of_flat)
[1] 3.110073
(water_in_air_outside <- absolute_humidity(relative_humidity = relative_humidity_outside,
                                  temperature = temperature_outside) * volume_of_flat)
[1] 1.222142
water_out <- water_in_air_inside - water_in_air_outside

Conclusion: Airing once with an indoor temperature of 20 degress Celsius with a relative humidity of 50% and an outdoor temperature of 0 degrees Celsius with a relative outdoor humidity of 70% transports approx. 1.9 liters of water out of the flat, assuming a volume of 360 m3 of the flat.

temperatures <- seq(from = -10, to = 35)
relative_humidities <- seq(from = 0, to = 100, by = 5)
result <- matrix(nrow = length(temperatures), 
                 ncol = length(relative_humidities), 
                 dimnames = list(temperatures, relative_humidities))
for (i in 1:length(temperatures)) {
  for (j in 1:length(relative_humidities)){
    result[i, j] <- absolute_humidity(temperature = temperatures[i], 
                                      relative_humidity = relative_humidities[j])
  }
}
my_breaks <- c(0.5, 0.7, 1, 1.5, 2, 3, 4, 6, 8, 10, 12, 16, 20, 30) / 1000
contour(result, levels = c(0.5, 1, 2, 3, 4, 10, 20) / 1000)

contourplot(result, at = my_breaks,
            scales=list(x=list(rot=90)), 
            xlab = 'Temperature (degrees Celsius)',
            ylab = 'Relative humidity (%)')

Absolute humidity in 1 m3 at a relative humiditiy of 100%

# scenario 1:
temperatures <- seq(from = -10, to = 35, by = 5)
relative_humidities <- seq(from = 0, to = 100, by = 10)
result <- matrix(nrow = length(temperatures), 
                 ncol = length(relative_humidities), 
                 dimnames = list(temperatures, relative_humidities))
for (i in 1:length(temperatures)) {
  for (j in 1:length(relative_humidities)){
    result[i, j] <- absolute_humidity(temperature = temperatures[i], 
                                      relative_humidity = relative_humidities[j])
  }
}

kable(round(result, digits = 2)) 
0 10 20 30 40 50 60 70 80 90 100
-10 0 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
-5 0 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0 0 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
5 0 0 0.00 0.00 0.00 0.00 0.00 0.00 0.01 0.01 0.01
10 0 0 0.00 0.00 0.00 0.00 0.01 0.01 0.01 0.01 0.01
15 0 0 0.00 0.00 0.01 0.01 0.01 0.01 0.01 0.01 0.01
20 0 0 0.00 0.01 0.01 0.01 0.01 0.01 0.01 0.02 0.02
25 0 0 0.00 0.01 0.01 0.01 0.01 0.02 0.02 0.02 0.02
30 0 0 0.01 0.01 0.01 0.02 0.02 0.02 0.02 0.03 0.03
35 0 0 0.01 0.01 0.02 0.02 0.02 0.03 0.03 0.04 0.04
# scenario 2:
temperatures <- -10:30
abs_humidity <- round(absolute_humidity(temperature = temperatures), digits = 3)
kable(tibble(temperatures = temperatures, abs_humidity = abs_humidity))
temperatures abs_humidity
-10 0.002
-9 0.003
-8 0.003
-7 0.003
-6 0.003
-5 0.003
-4 0.004
-3 0.004
-2 0.004
-1 0.005
0 0.005
1 0.005
2 0.006
3 0.006
4 0.006
5 0.007
6 0.007
7 0.008
8 0.008
9 0.009
10 0.009
11 0.010
12 0.011
13 0.011
14 0.012
15 0.013
16 0.014
17 0.014
18 0.015
19 0.016
20 0.017
21 0.018
22 0.019
23 0.021
24 0.022
25 0.023
26 0.024
27 0.026
28 0.027
29 0.029
30 0.030
dw <- Vectorize(diff_water)

dat <- expand_grid(temperature_inside = -20:40, 
                   temperature_outside = -20:40,
                   relative_humidity_inside = 0:5 * 20,
                   relative_humidity_outside = 0:5 * 20) |> 
  mutate(
                   diff_water = dw(temperature_outside,
                                           relative_humidity_outside,
                                           temperature_inside,
                                           relative_humidity_outside))

glimpse(dat)
Rows: 133,956
Columns: 5
$ temperature_inside        <int> -20, -20, -20, -20, -20, -20, -20, -20, -20,…
$ temperature_outside       <int> -20, -20, -20, -20, -20, -20, -20, -20, -20,…
$ relative_humidity_inside  <dbl> 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20, 20, 40…
$ relative_humidity_outside <dbl> 0, 20, 40, 60, 80, 100, 0, 20, 40, 60, 80, 1…
$ diff_water                <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
dat |> ggplot(aes(temperature_outside, temperature_inside, z = diff_water)) + 
  geom_contour_filled() +
  facet_grid(rows = vars(relative_humidity_inside), 
             cols = vars(relative_humidity_outside),
             scales = 'free')

dat |> 
  filter(relative_humidity_inside == 40,
         relative_humidity_outside == 40) |> 
  ggplot(aes(temperature_outside, temperature_inside, z = diff_water)) +
  geom_contour_filled()