Source code for pythermalcomfort.models.pmv_athb

from __future__ import annotations

import numpy as np

from pythermalcomfort.classes_input import ATHBInputs
from pythermalcomfort.classes_return import ATHB
from pythermalcomfort.models._pmv_ppd_optimized import _pmv_ppd_optimized
from pythermalcomfort.utilities import met_to_w_m2


[docs] def pmv_athb( tdb: float | list[float], tr: float | list[float], vr: float | list[float], rh: float | list[float], met: float | list[float], t_running_mean: float | list[float], clo: bool | float | list[float] = False, ) -> ATHB: """Return the PMV value calculated with the Adaptive Thermal Heat Balance Framework [Schweiker2022]_. The adaptive thermal heat balance (ATHB) framework introduced a method to account for the three adaptive principals, namely physiological, behavioral, and psychological adaptation, individually within existing heat balance models. The objective is a predictive model of thermal sensation applicable during the design stage or in international standards without knowing characteristics of future occupants. Parameters ---------- tdb : float or list of floats Dry bulb air temperature, in [°C]. tr : float or list of floats Mean radiant temperature, in [°C]. vr : float or list of floats Relative air speed, in [m/s]. .. note:: vr is the relative air speed caused by body movement and not the air speed measured by the air speed sensor. The relative air speed is the sum of the average air speed measured by the sensor plus the activity-generated air speed (Vag). Where Vag is the activity-generated air speed caused by motion of individual body parts. vr can be calculated using the function :py:meth:`pythermalcomfort.utilities.v_relative`. rh : float or list of floats Relative humidity, [%]. met : float or list of floats Metabolic rate, [met]. clo : bool, float or list of floats, optional Clothing insulation, in [clo]. If `clo` is set to False, the clothing insulation value will be calculated using the equation provided in the paper. Defaults to False. t_running_mean: float or list of floats Running mean temperature, in [°C]. .. note:: The running mean temperature can be calculated using the function :py:meth:`pythermalcomfort.utilities.running_mean_outdoor_temperature`. Returns ------- ATHB Dataclass containing the results of the ATHB calculation. See :py:class:`~pythermalcomfort.classes_return.ATHB` for more details. Examples -------- .. code-block:: python from pythermalcomfort.models import pmv_athb # calculate the predicted mean vote (PMV) using the Adaptive Thermal Heat Balance model results = pmv_athb(tdb=25, tr=25, vr=0.1, rh=50, met=1.2, t_running_mean=20) print(results.athb_pmv) # returns the PMV value # for multiple points results = pmv_athb( tdb=[25, 25, 25], tr=[25, 25, 25], vr=[0.1, 0.1, 0.1], rh=[50, 50, 50], met=[1.2, 1.2, 1.2], t_running_mean=[20, 20, 20], ) print(results.athb_pmv) """ # Validate inputs using the ATHBInputs class ATHBInputs(tdb=tdb, tr=tr, vr=vr, rh=rh, met=met, t_running_mean=t_running_mean) tdb = np.asarray(tdb) tr = np.asarray(tr) vr = np.asarray(vr) met = np.asarray(met) rh = np.asarray(rh) t_running_mean = np.asarray(t_running_mean) met_adapted = met - (0.234 * t_running_mean) / 58.2 clo_adapted = clo if clo is False: # Adapted clothing insulation level through behavioral adaptation clo_adapted = np.power( 10, ( -0.17168 - 0.000485 * t_running_mean + 0.08176 * met_adapted - 0.00527 * t_running_mean * met_adapted ), ) pmv_res = _pmv_ppd_optimized(tdb, tr, vr, rh, met_adapted, clo_adapted, 0) ts = 0.303 * np.exp(-0.036 * met_adapted * met_to_w_m2) + 0.028 l_adapted = pmv_res / ts # Predicted thermal sensation vote athb_pmv = np.around( 1.484 + 0.0276 * l_adapted - 0.9602 * met_adapted - 0.0342 * t_running_mean + 0.0002264 * l_adapted * t_running_mean + 0.018696 * met_adapted * t_running_mean - 0.0002909 * l_adapted * met_adapted * t_running_mean, 3, ) return ATHB(athb_pmv=athb_pmv)