playing around with temperatures and humidity
This commit is contained in:
parent
c4fb68f809
commit
105ab06cd9
79
src/tools/climate.py
Normal file
79
src/tools/climate.py
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
from math import log10
|
||||||
|
|
||||||
|
ABSOLUTE_ZERO_C = -273.15
|
||||||
|
|
||||||
|
|
||||||
|
def celsius_to_fahrenheit(celsius: float) -> float:
|
||||||
|
return celsius * 9 / 5 + 32
|
||||||
|
|
||||||
|
|
||||||
|
def fahrenheit_to_celsius(fahrenheit: float) -> float:
|
||||||
|
return (fahrenheit - 32) / 9 * 5
|
||||||
|
|
||||||
|
|
||||||
|
def celsius_to_kelvin(celsius: float) -> float:
|
||||||
|
return celsius - ABSOLUTE_ZERO_C
|
||||||
|
|
||||||
|
|
||||||
|
def kelvin_to_celsius(kelvin: float) -> float:
|
||||||
|
return kelvin + ABSOLUTE_ZERO_C
|
||||||
|
|
||||||
|
|
||||||
|
def fahrenheit_to_kelvin(fahrenheit: float) -> float:
|
||||||
|
return celsius_to_kelvin(fahrenheit_to_celsius(fahrenheit))
|
||||||
|
|
||||||
|
|
||||||
|
def kelvin_to_fahrenheit(kelvin: float) -> float:
|
||||||
|
return celsius_to_fahrenheit(kelvin_to_celsius(kelvin))
|
||||||
|
|
||||||
|
|
||||||
|
def saturation_vapor_pressure(temperature: float) -> float:
|
||||||
|
"""
|
||||||
|
Saturation vapor pressure for a given temperature (in °C) in hPa
|
||||||
|
"""
|
||||||
|
a = 7.5 if temperature >= 0 else 7.6
|
||||||
|
b = 237.3 if temperature >= 0 else 240.7
|
||||||
|
return 6.1078 * 10 ** ((a * temperature) / (b + temperature))
|
||||||
|
|
||||||
|
|
||||||
|
def vapor_pressure(relative_humidity: float, temperature: float) -> float:
|
||||||
|
"""
|
||||||
|
Vapor pressure for a given relative humidity (in %) and temperature (in °C) in hPa
|
||||||
|
"""
|
||||||
|
return relative_humidity / 100 * saturation_vapor_pressure(temperature)
|
||||||
|
|
||||||
|
|
||||||
|
def relative_humidity(temperature: float, due_point: float) -> float:
|
||||||
|
"""
|
||||||
|
Relative humidity for a given temperature (in °C) in and due point (in °C)
|
||||||
|
"""
|
||||||
|
return 100 * saturation_vapor_pressure(due_point) / saturation_vapor_pressure(temperature)
|
||||||
|
|
||||||
|
|
||||||
|
def absolute_humidity_from_humidity(relative_humidity: float, temperature: float) -> float:
|
||||||
|
"""
|
||||||
|
Absolute humidity for a given relative humidity (in %) and temperature (in °C) in g/m³
|
||||||
|
"""
|
||||||
|
mw = 18.016
|
||||||
|
rs = 8314.3
|
||||||
|
return 10**5 * mw / rs * vapor_pressure(relative_humidity, temperature) / celsius_to_kelvin(temperature)
|
||||||
|
|
||||||
|
|
||||||
|
def absolute_humidity_from_due_point(due_point: float, temperature: float) -> float:
|
||||||
|
"""
|
||||||
|
Absolute humidity for a given due point (in °C) and temperature (in °C) in g/m³
|
||||||
|
"""
|
||||||
|
mw = 18.016
|
||||||
|
rs = 8314.3
|
||||||
|
return 10**5 * mw / rs * saturation_vapor_pressure(due_point) / celsius_to_kelvin(temperature)
|
||||||
|
|
||||||
|
|
||||||
|
def due_point(relative_humidity: float, temperature: float) -> float:
|
||||||
|
"""
|
||||||
|
Due Point for a given relative humidity (in %) and temperature (in °C) in °C
|
||||||
|
"""
|
||||||
|
a = 7.5 if temperature >= 0 else 7.6
|
||||||
|
b = 237.3 if temperature >= 0 else 240.7
|
||||||
|
v = log10(vapor_pressure(relative_humidity, temperature) / 6.1078)
|
||||||
|
|
||||||
|
return b * v / (a - v)
|
||||||
@ -35,4 +35,13 @@ class String(str):
|
|||||||
|
|
||||||
|
|
||||||
class List(list):
|
class List(list):
|
||||||
pass
|
def moving_window(self, size: int = 2) -> Iterable[List]:
|
||||||
|
if len(self) % size != 0:
|
||||||
|
raise ValueError("number of list items must be divisible by size")
|
||||||
|
|
||||||
|
for i in range(len(self) // size):
|
||||||
|
this_window = List()
|
||||||
|
for j in range(size):
|
||||||
|
this_window.append(self[i * size + j])
|
||||||
|
|
||||||
|
yield this_window
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user