Source code for pythermalcomfort.models.heat_index_rothfusz
from __future__ import annotations
import numpy as np
from pythermalcomfort.classes_input import HIInputs
from pythermalcomfort.classes_return import HI
from pythermalcomfort.shared_functions import mapping, valid_range
[docs]
def heat_index_rothfusz(
tdb: float | list[float],
rh: float | list[float],
round_output: bool = True,
limit_inputs: bool = True,
) -> HI:
"""Calculate the Heat Index (HI) in accordance with the Rothfusz (1990) model
[Rothfusz1990]_.
Parameters
----------
tdb : float or list of floats
Dry bulb air temperature, [°C].
rh : float or list of floats
Relative humidity, [%].
round_output : bool, optional
If True, rounds output value. If False, it does not round it. Defaults to True.
limit_inputs : bool, optional
If True, limits the inputs to the standard applicability limits. Defaults to True.
.. note::
By default, if the inputs are outside the standard applicability limits the
function returns NaN. If False returns heat index
values even if input values are outside the applicability limits of the model.
The applicability limit is tdb >= 27°C.
Returns
-------
HI
A dataclass containing the Heat Index. See :py:class:`~pythermalcomfort.classes_return.HI` for more details.
To access the `hi` value, use the `hi` attribute of the returned `HI` instance, e.g., `result.hi`.
Examples
--------
.. code-block:: python
from pythermalcomfort.models import heat_index_rothfusz
result = heat_index_rothfusz(tdb=29, rh=50)
print(result.hi) # 29.7
print(result.stress_category) # "caution"
"""
# Validate inputs using the HeatIndexInputs class
HIInputs(
tdb=tdb,
rh=rh,
round_output=round_output,
limit_inputs=limit_inputs,
)
tdb = np.asarray(tdb)
rh = np.asarray(rh)
hi = -8.784695 + 1.61139411 * tdb + 2.338549 * rh - 0.14611605 * tdb * rh
hi += -1.2308094 * 10**-2 * tdb**2 - 1.6424828 * 10**-2 * rh**2
hi += 2.211732 * 10**-3 * tdb**2 * rh + 7.2546 * 10**-4 * tdb * rh**2
hi += -3.582 * 10**-6 * tdb**2 * rh**2
# heat index should only be calculated for temperatures above 27 °C
if limit_inputs:
tdb_valid = valid_range(tdb, (27.0, np.inf))
hi_valid = np.where(~np.isnan(tdb_valid), hi, np.nan)
else:
hi_valid = hi
heat_index_categories = {
27.0: "no risk",
32.0: "caution",
41.0: "extreme caution",
54.0: "danger",
1000.0: "extreme danger",
}
if round_output:
hi_valid = np.around(hi_valid, 1)
return HI(hi=hi_valid, stress_category=mapping(hi_valid, heat_index_categories))