Source code for pythermalcomfort.models.at
from __future__ import annotations
import numpy as np
from pythermalcomfort.classes_input import ATInputs
from pythermalcomfort.classes_return import AT
from pythermalcomfort.utilities import psy_ta_rh
[docs]
def at(
tdb: float | list[float],
rh: float | list[float],
v: float | list[float],
q: float | list[float] = None,
round_output: bool = True,
) -> AT:
"""Calculate the Apparent Temperature (AT). The AT is defined as the temperature at
the reference humidity level producing the same amount of discomfort as that
experienced under the current ambient temperature, humidity, and solar radiation
[Steadman1984]_. In other words, the AT is an adjustment to the dry bulb temperature
based on the relative humidity value. Absolute humidity with a dew point of 14°C is
chosen as a reference.
It includes the chilling effect of the wind at lower temperatures. [Blazejczyk2012]_
.. note::
Two formulas for AT are in use by the Australian Bureau of Meteorology: one includes
solar radiation and the other one does not (http://www.bom.gov.au/info/thermal_stress/
, 29 Sep 2021). Please specify q if you want to estimate AT with solar load.
Parameters
----------
tdb : float or list of floats
Dry bulb air temperature, [°C]
rh : float or list of floats
Relative humidity, [%]
v : float or list of floats
Wind speed 10m above ground level, [m/s]
q : float or list of floats, optional
Net radiation absorbed per unit area of body surface [W/m2]
round_output : bool, default True
If True, rounds the output value; if False, does not round it.
Returns
-------
AT
Dataclass containing the apparent temperature, [°C]. See :py:class:`~pythermalcomfort.classes_return.AT` for more details.
Examples
--------
.. code-block:: python
from pythermalcomfort.models import at
at(tdb=25, rh=30, v=0.1)
# AT(at=24.1)
"""
# Validate inputs
ATInputs(tdb=tdb, rh=rh, v=v, q=q, round_output=round_output)
# Convert lists to numpy arrays if necessary
tdb = np.asarray(tdb)
rh = np.asarray(rh)
v = np.asarray(v)
# Calculate vapor pressure
p_vap = psy_ta_rh(tdb, rh).p_vap / 100
# Calculate apparent temperature
if q is not None:
q = np.asarray(q)
t_at = tdb + 0.348 * p_vap - 0.7 * v + 0.7 * q / (v + 10) - 4.25
else:
t_at = tdb + 0.33 * p_vap - 0.7 * v - 4.00
if round_output:
t_at = np.around(t_at, 1)
return AT(at=t_at)