Source code for pythermalcomfort.models.humidex
from __future__ import annotations
import numpy as np
from pythermalcomfort.classes_input import HumidexInputs, HumidexModels
from pythermalcomfort.classes_return import Humidex
from pythermalcomfort.utilities import dew_point_tmp
[docs]
def humidex(
tdb: float | list[float],
rh: float | list[float],
model: str = "rana",
round_output: bool = True,
) -> Humidex:
"""Calculate the humidex (short for "humidity index"). It has been developed by the
Canadian Meteorological service. It was introduced in 1965 and then it was revised
by Masterson and Richardson (1979) [Masterson1979]_. It aims to describe how hot,
humid weather is felt by the average person. The Humidex differs from the heat index
in being related to the dew point rather than relative humidity [Havenith2016]_.
Parameters
----------
tdb : float or list of floats
Dry bulb air temperature, [°C].
rh : float or list of floats
Relative humidity, [%].
model : str, optional
The model to be used for the calculation. Options are 'rana' and 'masterson'. Defaults to 'rana'.
.. note::
The 'rana' model is the Humidex model proposed by `Rana et al. (2013)`_.
The 'masterson' model is the Humidex model proposed by Masterson and Richardson (1979) [Masterson1979]_.
.. _Rana et al. (2013): https://doi.org/10.1016/j.enbuild.2013.04.019
round_output : bool, optional
If True, rounds output value. If False, it does not round it. Defaults to True.
Returns
-------
Humidex
A dataclass containing the Humidex value and its discomfort category. See :py:class:`~pythermalcomfort.classes_return.Humidex` for more details.
To access the `humidex` and `discomfort` values, use the respective attributes of the returned `Humidex` instance, e.g., `result.humidex`.
Examples
--------
.. code-block:: python
from pythermalcomfort.models import humidex
result = humidex(tdb=25, rh=50)
print(result.humidex) # 28.2
print(result.discomfort) # Little or no discomfort
result = humidex(tdb=[25, 30], rh=[50, 60], round_output=False)
print(result.humidex) # [28.2, 39.1]
print(result.discomfort)
# ['Little or no discomfort', 'Evident discomfort']
"""
# Validate inputs using the HumidexInputs class
HumidexInputs(
tdb=tdb,
rh=rh,
round_output=round_output,
)
tdb = np.asarray(tdb)
rh = np.asarray(rh)
if np.any(rh > 100) or np.any(rh < 0):
raise ValueError("Relative humidity must be between 0 and 100%")
if model not in HumidexModels._value2member_map_:
raise ValueError(
"Invalid model. The model must be either 'rana' or 'masterson'",
)
hi = tdb + 5 / 9 * ((6.112 * 10 ** (7.5 * tdb / (237.7 + tdb)) * rh / 100) - 10)
if model == HumidexModels.masterson.value:
hi = tdb + 5 / 9 * (
6.11
* np.exp(
5417.753 * (1 / 273.15 - 1 / (dew_point_tmp(tdb=tdb, rh=rh) + 273.15)),
)
- 10
)
if round_output:
hi = np.around(hi, 1)
stress_category = np.full_like(hi, "Heat stroke probable", dtype=object)
stress_category[hi <= 30] = "Little or no discomfort"
stress_category[(hi > 30) & (hi <= 35)] = "Noticeable discomfort"
stress_category[(hi > 35) & (hi <= 40)] = "Evident discomfort"
stress_category[(hi > 40) & (hi <= 45)] = "Intense discomfort; avoid exertion"
stress_category[(hi > 45) & (hi <= 54)] = "Dangerous discomfort"
return Humidex(humidex=hi, discomfort=stress_category)