Source code for pythermalcomfort.models.set_tmp

import numpy as np

from pythermalcomfort.models.two_nodes import two_nodes
from pythermalcomfort.utilities import (
    units_converter,
    check_standard_compliance_array,
    body_surface_area,
)


[docs]def set_tmp( tdb, tr, v, rh, met, clo, wme=0, body_surface_area=1.8258, p_atm=101325, body_position="standing", units="SI", limit_inputs=True, **kwargs, ): """ Calculates the Standard Effective Temperature (SET). The SET is the temperature of a hypothetical isothermal environment at 50% (rh), <0.1 m/s (20 fpm) average air speed (v), and tr = tdb, in which the total heat loss from the skin of an imaginary occupant wearing clothing, standardized for the activity concerned is the same as that from a person in the actual environment with actual clothing and activity level. [10]_ Parameters ---------- tdb : float or array-like dry bulb air temperature, default in [°C] in [°F] if `units` = 'IP' tr : float or array-like mean radiant temperature, default in [°C] in [°F] if `units` = 'IP' v : float or array-like air speed, default in [m/s] in [fps] if `units` = 'IP' rh : float or array-like relative humidity, [%] met : float or array-like metabolic rate, [met] clo : float or array-like clothing insulation, [clo] wme : float or array-like external work, [met] default 0 body_surface_area : float body surface area, default value 1.8258 [m2] in [ft2] if `units` = 'IP' The body surface area can be calculated using the function :py:meth:`pythermalcomfort.utilities.body_surface_area`. p_atm : float atmospheric pressure, default value 101325 [Pa] in [atm] if `units` = 'IP' body_position: str default="standing" or array-like select either "sitting" or "standing" units : {'SI', 'IP'} select the SI (International System of Units) or the IP (Imperial Units) system. limit_inputs : boolean default True By default, if the inputs are outsude the following limits the function returns nan. If False returns values regardless of the input values. The limits are 10 < tdb [°C] < 40, 10 < tr [°C] < 40, 0 < v [m/s] < 2, 1 < met [met] < 4, and 0 < clo [clo] < 1.5. Other Parameters ---------------- round : boolean, deafult True if True rounds output value, if False it does not round it Returns ------- SET : float or array-like Standard effective temperature, [°C] Notes ----- You can use this function to calculate the `SET`_ temperature in accordance with the ASHRAE 55 2020 Standard [1]_. .. _SET: https://en.wikipedia.org/wiki/Thermal_comfort#Standard_effective_temperature Examples -------- .. code-block:: python >>> from pythermalcomfort.models import set_tmp >>> set_tmp(tdb=25, tr=25, v=0.1, rh=50, met=1.2, clo=.5) 24.3 >>> set_tmp(tdb=[25, 25], tr=25, v=0.1, rh=50, met=1.2, clo=.5) array([24.3, 24.3]) >>> # for users who wants to use the IP system >>> set_tmp(tdb=77, tr=77, v=0.328, rh=50, met=1.2, clo=.5, units='IP') 75.8 """ # When SET is used to calculate CE then h_c is calculated in a slightly different way default_kwargs = {"round": True, "calculate_ce": False} kwargs = {**default_kwargs, **kwargs} if units.lower() == "ip": if body_surface_area == 1.8258: body_surface_area = 19.65 if p_atm == 101325: p_atm = 1 tdb, tr, v, body_surface_area, p_atm = units_converter( tdb=tdb, tr=tr, v=v, area=body_surface_area, pressure=p_atm ) tdb = np.array(tdb) tr = np.array(tr) v = np.array(v) rh = np.array(rh) met = np.array(met) clo = np.array(clo) wme = np.array(wme) set_array = two_nodes( tdb=tdb, tr=tr, v=v, rh=rh, met=met, clo=clo, wme=wme, body_surface_area=body_surface_area, p_atmospheric=p_atm, body_position=body_position, calculate_ce=kwargs["calculate_ce"], round=False, output="all", )["_set"] if units.lower() == "ip": set_array = units_converter(tmp=set_array, from_units="si")[0] if limit_inputs: ( tdb_valid, tr_valid, v_valid, met_valid, clo_valid, ) = check_standard_compliance_array( "ashrae", tdb=tdb, tr=tr, v=v, met=met, clo=clo ) all_valid = ~( np.isnan(tdb_valid) | np.isnan(tr_valid) | np.isnan(v_valid) | np.isnan(met_valid) | np.isnan(clo_valid) ) set_array = np.where(all_valid, set_array, np.nan) if kwargs["round"]: return np.around(set_array, 1) else: return set_array