Source code for pythermalcomfort.classes_return

from __future__ import annotations

import datetime as dt
import textwrap
from dataclasses import dataclass, fields, is_dataclass

import numpy as np
import numpy.typing as npt
from numpy._typing import NDArray


class AutoStrMixin:
    def __str__(self) -> str:
        """Pretty-print dataclass fields as aligned single-line 'name : value'.

        - One line per field, no header/title.
        - NumPy arrays with >10 elements show first 5 and last 5.
        - Other long strings are shortened to 80 chars with an ellipsis.
        """
        if not is_dataclass(self):
            return super().__str__()

        MAX_STR_WIDTH = 80
        names = [f.name for f in fields(type(self))]
        values = [getattr(self, n) for n in names]

        # Format values as strings, using comma separation for arrays/lists
        def value_to_str(val):
            if isinstance(val, np.ndarray):
                v = np.array2string(
                    val,
                    separator=", ",
                    max_line_width=MAX_STR_WIDTH,
                    precision=2,
                    threshold=10,
                    edgeitems=5,
                    formatter={"float_kind": lambda x: f"{x:.2f}"},
                )
            elif isinstance(val, (list | tuple)):
                if len(val) > 10:
                    head = ", ".join(str(x) for x in val[:5])
                    tail = ", ".join(str(x) for x in val[-5:])
                    v = f"[{head}, ..., {tail}]"
                else:
                    v = f"[{', '.join(str(x) for x in val)}]"
            else:
                v = str(val)
            # Shorten if needed
            if isinstance(val, str) and len(v) > MAX_STR_WIDTH:
                v = textwrap.shorten(v, width=MAX_STR_WIDTH, placeholder="...")
            return v

        value_strs = [value_to_str(v) for v in values]
        # Find max name length for alignment
        max_name_len = max(len(n) for n in names) if names else 0
        # Compose lines with aligned colons
        lines = [
            f"{n.ljust(max_name_len)} : {v}"
            for n, v in zip(names, value_strs, strict=True)
        ]
        # Shorten each line to MAX_STR_WIDTH
        lines = [
            textwrap.shorten(line, width=MAX_STR_WIDTH, placeholder="...")
            if len(line) > MAX_STR_WIDTH
            else line
            for line in lines
        ]

        # Compute header length
        header_base = f"{self.__class__.__name__}"
        max_line_len = max([len(header_base)] + [len(line) for line in lines])
        header = f"{'-' * (max_line_len)}"
        title = f"{header_base}".center(max_line_len)
        result = [header, title, header] + lines
        return "\n".join(result)

    def __repr__(self) -> str:
        return self.__str__()

    def __getitem__(self, item: str):
        try:
            return getattr(self, item)
        except AttributeError as exc:
            error_msg = (
                f"{self.__class__.__name__} has no field '{item}'. "
                f"Available fields: {[f.name for f in fields(type(self))]}"
            )
            raise KeyError(error_msg) from exc


[docs] @dataclass(frozen=True, repr=False) class APMV(AutoStrMixin): """A dataclass to store the results of the adaptive Predicted Mean Vote (aPMV) model. Attributes ---------- a_pmv : float or list of floats Predicted Mean Vote. """ a_pmv: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class AdaptiveASHRAE(AutoStrMixin): """A dataclass to store the results of the adaptive thermal comfort model based on ASHRAE 55. Attributes ---------- tmp_cmf : float or list of floats Comfort temperature at a specific running mean temperature, default in [°C] or [°F]. tmp_cmf_80_low : float or list of floats Lower acceptable comfort temperature for 80% occupants, default in [°C] or [°F]. tmp_cmf_80_up : float or list of floats Upper acceptable comfort temperature for 80% occupants, default in [°C] or [°F]. tmp_cmf_90_low : float or list of floats Lower acceptable comfort temperature for 90% occupants, default in [°C] or [°F]. tmp_cmf_90_up : float or list of floats Upper acceptable comfort temperature for 90% occupants, default in [°C] or [°F]. acceptability_80 : bool or list of bools Acceptability for 80% occupants. acceptability_90 : bool or list of bools Acceptability for 90% occupants. """ tmp_cmf: float | list[float] tmp_cmf_80_low: float | list[float] tmp_cmf_80_up: float | list[float] tmp_cmf_90_low: float | list[float] tmp_cmf_90_up: float | list[float] acceptability_80: bool | list[bool] acceptability_90: bool | list[bool]
[docs] @dataclass class AdaptiveEN(AutoStrMixin): """Dataclass to store the results of the adaptive thermal comfort calculation based on EN 16798-1 2019. Attributes ---------- tmp_cmf : float or list of floats Comfort temperature at that specific running mean temperature, default in [°C] or in [°F]. acceptability_cat_i : bool or list of bools If the indoor conditions comply with comfort category I. acceptability_cat_ii : bool or list of bools If the indoor conditions comply with comfort category II. acceptability_cat_iii : bool or list of bools If the indoor conditions comply with comfort category III. tmp_cmf_cat_i_up : float or list of floats Upper acceptable comfort temperature for category I, default in [°C] or in [°F]. tmp_cmf_cat_ii_up : float or list of floats Upper acceptable comfort temperature for category II, default in [°C] or in [°F]. tmp_cmf_cat_iii_up : float or list of floats Upper acceptable comfort temperature for category III, default in [°C] or in [°F]. tmp_cmf_cat_i_low : float or list of floats Lower acceptable comfort temperature for category I, default in [°C] or in [°F]. tmp_cmf_cat_ii_low : float or list of floats Lower acceptable comfort temperature for category II, default in [°C] or in [°F]. tmp_cmf_cat_iii_low : float or list of floats Lower acceptable comfort temperature for category III, default in [°C] or in [°F]. """ tmp_cmf: float | list[float] acceptability_cat_i: bool | list[bool] acceptability_cat_ii: bool | list[bool] acceptability_cat_iii: bool | list[bool] tmp_cmf_cat_i_up: float | list[float] tmp_cmf_cat_ii_up: float | list[float] tmp_cmf_cat_iii_up: float | list[float] tmp_cmf_cat_i_low: float | list[float] tmp_cmf_cat_ii_low: float | list[float] tmp_cmf_cat_iii_low: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class AnkleDraft(AutoStrMixin): """Dataclass to store the results of the ankle draft calculation. Attributes ---------- ppd_ad : float or list of floats Predicted Percentage of Dissatisfied occupants with ankle draft, [%]. acceptability : bool or list of bools Indicates if the air speed at the ankle level is acceptable according to ASHRAE 55 2020 standard. """ ppd_ad: float | list[float] acceptability: bool | list[bool]
[docs] @dataclass(frozen=True, repr=False) class AT(AutoStrMixin): """Dataclass to store the results of the Apparent Temperature (AT) calculation. Attributes ---------- at : float or list of floats Apparent temperature, [°C] """ at: float
[docs] @dataclass(frozen=True, repr=False) class ATHB(AutoStrMixin): """Dataclass to store the results of the Adaptive Thermal Heat Balance (ATHB) calculation. Attributes ---------- athb_pmv : float or list of floats Predicted Mean Vote calculated with the Adaptive Thermal Heat Balance framework. """ athb_pmv: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class CloTOut(AutoStrMixin): """Dataclass to represent the clothing insulation Icl as a function of outdoor air temperature. Attributes ---------- clo_tout : float or list of floats Representative clothing insulation Icl. """ clo_tout: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class CE(AutoStrMixin): """Dataclass to represent the Cooling Effect (CE). Attributes ---------- ce : float or list of floats Cooling Effect value. """ ce: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class DI(AutoStrMixin): """Dataclass to represent the Discomfort Index (DI) and its classification. Attributes ---------- di : float or list of floats Discomfort Index, [°C]. discomfort_condition : str or list of str Classification of the thermal comfort conditions according to the discomfort index. """ di: float | list[float] discomfort_condition: str | list[str]
[docs] @dataclass(frozen=True, repr=False) class EPMV(AutoStrMixin): """Dataclass to represent the Adjusted Predicted Mean Votes with Expectancy Factor (ePMV). Attributes ---------- e_pmv : float or list of floats Adjusted Predicted Mean Votes with Expectancy Factor. """ e_pmv: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class ESI(AutoStrMixin): """Dataclass to represent the Environmental Stress Index (ESI). Attributes ---------- esi : float or list of floats Environmental Stress Index. """ esi: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class HI(AutoStrMixin): """Dataclass to represent the Heat Index (HI). Attributes ---------- hi : float or list of floats Heat Index, [°C] or [°F] depending on the units. """ hi: npt.ArrayLike stress_category: str | list[str] | None = None
[docs] @dataclass(frozen=True, repr=False) class Humidex(AutoStrMixin): """Dataclass to represent the Humidex and its discomfort category. Attributes ---------- humidex : float or list of floats Humidex value, [°C]. discomfort : str or list of str Degree of comfort or discomfort as defined in Havenith and Fiala (2016). """ humidex: float | list[float] discomfort: str | list[str]
[docs] @dataclass(frozen=True, repr=False) class NET(AutoStrMixin): """Dataclass to represent the Normal Effective Temperature (NET). Attributes ---------- net : float or list of floats Normal Effective Temperature, [°C]. """ net: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class PETSteady(AutoStrMixin): """Dataclass to represent the Physiological Equivalent Temperature (PET). Attributes ---------- pet : float or list of floats Physiological Equivalent Temperature. """ pet: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class PHS(AutoStrMixin): """Dataclass to represent the Predicted Heat Strain (PHS). Attributes ---------- t_re : float or list of floats Rectal temperature, [°C]. t_sk : float or list of floats Skin temperature, [°C]. t_cr : float or list of floats Core temperature, [°C]. t_cr_eq : float or list of floats Core temperature as a function of the metabolic rate, [°C]. t_sk_t_cr_wg : float or list of floats Fraction of the body mass at the skin temperature. d_lim_loss_50 : float or list of floats Maximum allowable exposure time limited by cumulative sweat mass loss for a mean worker (dehydration constraint), [minutes]. d_lim_loss_95 : float or list of floats Maximum allowable exposure time limited by cumulative sweat mass loss for 95% of the working population (dehydration constraint), [minutes]. d_lim_t_re : float or list of floats Maximum allowable exposure time for heat storage, [minutes]. sweat_loss_g : float or list of floats Cumulative evaporated sweat mass for the whole person over the simulated duration, [grams (g)]. This is a total mass per person (not per unit area). sweat_rate_watt : float or list of floats Instantaneous evaporative heat flux due to regulatory sweating at the skin, per unit area, [W·m⁻²]. Used at each simulation time step. evap_load_wm2_min : float or list of floats Accumulated evaporative load per unit area over the simulated duration, [W·min·m⁻²]. Computed as the running sum of the instantaneous evaporative heat flux (W·m⁻²) at each 1 minute step. Intended for chaining simulation segments. """ t_re: float | list[float] t_sk: float | list[float] t_cr: float | list[float] t_cr_eq: float | list[float] t_sk_t_cr_wg: float | list[float] d_lim_loss_50: float | list[float] d_lim_loss_95: float | list[float] d_lim_t_re: float | list[float] sweat_loss_g: float | list[float] sweat_rate_watt: float | list[float] evap_load_wm2_min: float | list[float]
@dataclass(frozen=True, repr=False) class PMV(AutoStrMixin): """Dataclass to represent the Predicted Mean Vote (PMV). Attributes ---------- pmv : float or list of floats Predicted Mean Vote. """ pmv: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class PMVPPD(AutoStrMixin): """Dataclass to represent the Predicted Mean Vote (PMV) and Predicted Percentage of Dissatisfied (PPD). Attributes ---------- pmv : float or list of floats Predicted Mean Vote. ppd : float or list of floats Predicted Percentage of Dissatisfied. tsv : str or list of strings Predicted thermal sensation vote. """ pmv: float | list[float] ppd: float | list[float] tsv: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class PMVPPDAshrae(PMVPPD): """Dataclass to represent the Predicted Mean Vote (PMV) and Predicted Percentage of Dissatisfied (PPD) calculated in accordance with ASHRAE Standard 55. Attributes ---------- pmv : float or list of floats Predicted Mean Vote. ppd : float or list of floats Predicted Percentage of Dissatisfied. tsv : str or list of strings Predicted thermal sensation vote. compliance : bool or list of bools True if PMV is within the acceptable range (-0.5 < PMV < 0.5) according to ASHRAE Standard 55-2023. When ``limit_inputs=True`` and any input is outside the standard applicability limits, ``compliance`` will be ``nan``. """ compliance: bool | list[bool]
@dataclass(frozen=True, repr=False) class PsychrometricValues(AutoStrMixin): p_sat: NDArray[np.float64] p_vap: NDArray[np.float64] hr: NDArray[np.float64] wet_bulb_tmp: NDArray[np.float64] dew_point_tmp: NDArray[np.float64] h: NDArray[np.float64]
[docs] @dataclass(frozen=True, repr=False) class SET(AutoStrMixin): """Dataclass to represent the Standard Effective Temperature (SET). Attributes ---------- set : float or list of floats Standard effective temperature, [°C]. """ set: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class SolarGain(AutoStrMixin): """Dataclass to represent the solar gain to the human body. Attributes ---------- erf : float or list of floats Solar gain to the human body using the Effective Radiant Field [W/m2]. delta_mrt : float or list of floats Delta mean radiant temperature. The amount by which the mean radiant temperature of the space should be increased if no solar radiation is present. """ erf: float | list[float] delta_mrt: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class GaggeTwoNodes(AutoStrMixin): """Dataclass to represent the results of the two-node model of human temperature regulation. Attributes ---------- e_skin : float or list of floats Total rate of evaporative heat loss from skin, [W/m2]. Equal to e_rsw + e_diff. e_rsw : float or list of floats Rate of evaporative heat loss from sweat evaporation, [W/m2]. e_max : float or list of floats Maximum rate of evaporative heat loss from skin, [W/m2]. q_sensible : float or list of floats Sensible heat loss from skin, [W/m2]. q_skin : float or list of floats Total rate of heat loss from skin, [W/m2]. Equal to q_sensible + e_skin. q_res : float or list of floats Total rate of heat loss through respiration, [W/m2]. t_core : float or list of floats Core temperature, [°C]. t_skin : float or list of floats Skin temperature, [°C]. m_bl : float or list of floats Skin blood flow, [kg/h/m2]. m_rsw : float or list of floats Rate at which regulatory sweat is generated, [mL/h/m2]. w : float or list of floats Skin wettedness, adimensional. Ranges from 0 to 1. w_max : float or list of floats Skin wettedness (w) practical upper limit, adimensional. Ranges from 0 to 1. set : float or list of floats Standard Effective Temperature (SET). et : float or list of floats New Effective Temperature (ET). pmv_gagge : float or list of floats PMV Gagge. pmv_set : float or list of floats PMV SET. disc : float or list of floats Thermal discomfort. t_sens : float or list of floats Predicted Thermal Sensation. """ e_skin: float | list[float] e_rsw: float | list[float] e_max: float | list[float] q_sensible: float | list[float] q_skin: float | list[float] q_res: float | list[float] t_core: float | list[float] t_skin: float | list[float] m_bl: float | list[float] m_rsw: float | list[float] w: float | list[float] w_max: float | list[float] set: float | list[float] et: float | list[float] pmv_gagge: float | list[float] pmv_set: float | list[float] disc: float | list[float] t_sens: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class GaggeTwoNodesJi(AutoStrMixin): """Dataclass to represent the results of the Gagge-Ji model of human temperature. Attributes ---------- t_core : float or list of floats Core temperature, [°C]. t_skin : float or list of floats Skin temperature, [°C]. """ t_core: float | list[float] t_skin: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class THI(AutoStrMixin): """Dataclass to represent the Temperature-Humidity Index (THI). Attributes ---------- thi : float or list of floats Temperature-Humidity Index (THI). """ thi: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class GaggeTwoNodesSleep(AutoStrMixin): """Dataclass to represent the results of the two-node sleep model. Attributes ---------- set : float or list of floats Standard Effective Temperature (SET). t_core : float or list of floats Core temperature, [°C]. t_skin : float or list of floats Skin temperature, [°C]. wet : float or list of floats Skin wettedness, adimensional. Ranges from 0 to 1. t_sens : float or list of floats Predicted Thermal Sensation. disc : float or list of floats Thermal discomfort. e_skin : float or list of floats Total rate of evaporative heat loss from skin, [W/m2]. Equal to e_rsw + e_diff. met_shivering : float or list of floats Metabolic rate due to shivering, [W/m2]. alfa : float or list of floats Dynamic fraction of total body mass assigned to the skin node (dimensionless). skin_blood_flow: float or list of floats Skin-blood-flow rate per unit surface area, [kg/h/m2]. """ set: float | list[float] t_core: float | list[float] t_skin: float | list[float] wet: float | list[float] t_sens: float | list[float] disc: float | list[float] e_skin: float | list[float] met_shivering: float | list[float] alfa: float | list[float] skin_blood_flow: float | list[float]
[docs] @dataclass(frozen=True) class UseFansHeatwaves(AutoStrMixin): """Dataclass to represent the results of using fans during heatwaves. Attributes ---------- e_skin : float or list of floats Total rate of evaporative heat loss from skin, [W/m2]. Equal to e_rsw + e_diff. e_rsw : float or list of floats Rate of evaporative heat loss from sweat evaporation, [W/m2]. e_max : float or list of floats Maximum rate of evaporative heat loss from skin, [W/m2]. q_sensible : float or list of floats Sensible heat loss from skin, [W/m2]. q_skin : float or list of floats Total rate of heat loss from skin, [W/m2]. Equal to q_sensible + e_skin. q_res : float or list of floats Total rate of heat loss through respiration, [W/m2]. t_core : float or list of floats Core temperature, [°C]. t_skin : float or list of floats Skin temperature, [°C]. m_bl : float or list of floats Skin blood flow, [kg/h/m2]. m_rsw : float or list of floats Rate at which regulatory sweat is generated, [mL/h/m2]. w : float or list of floats Skin wettedness, adimensional. Ranges from 0 to 1. w_max : float or list of floats Skin wettedness (w) practical upper limit, adimensional. Ranges from 0 to 1. heat_strain : bool or list of bools True if the model predicts that the person may be experiencing heat strain. heat_strain_blood_flow : bool or list of bools True if heat strain is caused by skin blood flow (m_bl) reaching its maximum value. heat_strain_w : bool or list of bools True if heat strain is caused by skin wettedness (w) reaching its maximum value. heat_strain_sweating : bool or list of bools True if heat strain is caused by regulatory sweating (m_rsw) reaching its maximum value. """ e_skin: float | list[float] e_rsw: float | list[float] e_max: float | list[float] q_sensible: float | list[float] q_skin: float | list[float] q_res: float | list[float] t_core: float | list[float] t_skin: float | list[float] m_bl: float | list[float] m_rsw: float | list[float] w: float | list[float] w_max: float | list[float] heat_strain: bool | list[bool] heat_strain_blood_flow: bool | list[bool] heat_strain_w: bool | list[bool] heat_strain_sweating: bool | list[bool]
[docs] @dataclass(frozen=True, repr=False) class UTCI(AutoStrMixin): """Dataclass to represent the Universal Thermal Climate Index (UTCI). Attributes ---------- utci : float or list of floats Universal Thermal Climate Index, [°C] or in [°F]. stress_category : str or list of strs UTCI categorized in terms of thermal stress [Blazejczyk2013]_. """ utci: float | list[float] stress_category: str | list[str]
[docs] @dataclass(frozen=True, repr=False) class VerticalTGradPPD(AutoStrMixin): """Dataclass to represent the Predicted Percentage of Dissatisfied (PPD) with vertical temperature gradient. Attributes ---------- ppd_vg : float or list of floats Predicted Percentage of Dissatisfied occupants with vertical temperature gradient. acceptability : bool or list of bools True if the value of air speed at the ankle level is acceptable (PPD_vg <= 5%). """ ppd_vg: float | list[float] acceptability: bool | list[bool]
[docs] @dataclass(frozen=True, repr=False) class WBGT(AutoStrMixin): """Dataclass to represent the Wet Bulb Globe Temperature (WBGT) index. Attributes ---------- wbgt : float or list of floats Wet Bulb Globe Temperature Index. """ wbgt: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class WCI(AutoStrMixin): """Dataclass to represent the Wind Chill Index (WCI). Attributes ---------- wci : float or list of floats Wind Chill Index, [W/m^2]. """ wci: float | list[float]
[docs] @dataclass(frozen=True, repr=False) class WCT(AutoStrMixin): """Dataclass to represent the Wind Chill Temperature (WCT). Attributes ---------- wct : float or list of floats Wind Chill Temperature, [°C]. """ wct: float | list[float]
[docs] @dataclass(frozen=True) class WorkCapacity(AutoStrMixin): """Dataclass to represent work loss. Attributes ---------- capacity : float or list of floats Work capacity affected by heat. """ capacity: float | list[float]
@dataclass(frozen=True, repr=False) class JOS3BodyParts(AutoStrMixin): """Dataclass to represent the body parts in the JOS3 model. It is very important to keep the order of the attributes as they are defined in the dataclass ['head', 'neck', 'chest', 'back', 'pelvis', 'left_shoulder', 'left_arm', 'left_hand', 'right_shoulder', 'right_arm', 'right_hand', 'left_thigh', 'left_leg', 'left_foot', 'right_thigh', 'right_leg', 'right_foot'] Attributes ---------- head : float Index of the head. neck : float Index of the neck. chest : float Index of the chest. back : float Index of the back. pelvis : float Index of the pelvis. left_shoulder : float Index of the left shoulder. left_arm : float Index of the left arm. left_hand : float Index of the left hand. right_shoulder : float Index of the right shoulder. right_arm : float Index of the right arm. right_hand : float Index of the right hand. left_thigh : float Index of the left thigh. left_leg : float Index of the left leg. left_foot : float Index of the left foot. right_thigh : float Index of the right thigh. right_leg : float Index of the right leg. right_foot : float Index of the right hand. """ head: float | None = None neck: float | None = None chest: float | None = None back: float | None = None pelvis: float | None = None left_shoulder: float | None = None left_arm: float | None = None left_hand: float | None = None right_shoulder: float | None = None right_arm: float | None = None right_hand: float | None = None left_thigh: float | None = None left_leg: float | None = None left_foot: float | None = None right_thigh: float | None = None right_leg: float | None = None right_foot: float | None = None @classmethod def get_attribute_names(cls): return [field.name for field in fields(cls)] def get_attribute_values(cls): return np.asarray([getattr(cls, field.name) for field in fields(cls)]) @dataclass(frozen=True, repr=False) class JOS3Output(AutoStrMixin): """Dataclass to represent the output of the JOS3 model simulation. Attributes ---------- simulation_time : datetime.timedelta The elapsed simulation time. dt : int or float The time step in seconds. t_skin_mean : float Mean skin temperature of the whole body [°C]. t_skin : np.ndarray Skin temperatures by the local body segments [°C]. t_core : np.ndarray Core temperatures by the local body segments [°C]. w_mean : float Mean skin wettedness of the whole body [-]. w : np.ndarray Skin wettedness on local body segments [-]. weight_loss_by_evap_and_res : float Weight loss by evaporation and respiration [g/sec]. cardiac_output : float Cardiac output [L/h]. q_thermogenesis_total : float Total thermogenesis [W]. q_res : float Heat loss by respiration [W]. q_skin2env : np.ndarray Total heat loss from the skin to the environment [W]. height : float Body height [m]. weight : float Body weight [kg]. bsa : np.ndarray Body surface area. fat : float Body fat rate [%]. sex : str Sex. age : int Age [years]. t_core_set : np.ndarray Core set point temperature [°C]. t_skin_set : np.ndarray Skin set point temperature [°C]. t_cb : float Central blood temperature [°C]. t_artery : np.ndarray Arterial blood temperature [°C]. t_vein : np.ndarray Venous blood temperature [°C]. t_superficial_vein : np.ndarray Superficial venous blood temperature [°C]. t_muscle : np.ndarray Muscle temperature [°C]. t_fat : np.ndarray Fat temperature [°C]. to : float Operative temperature [°C]. r_t : np.ndarray Radiative heat transfer coefficient. r_et : np.ndarray Evaporative heat transfer coefficient. tdb : np.ndarray Dry bulb air temperature [°C]. tr : np.ndarray Mean radiant temperature [°C]. rh : np.ndarray Relative humidity [%]. v : np.ndarray Air velocity [m/s]. par : float Physical activity ratio. clo : np.ndarray Clothing insulation. e_skin : np.ndarray Evaporative heat loss from the skin [W]. e_max : np.ndarray Maximum evaporative heat loss from the skin [W]. e_sweat : np.ndarray Evaporative heat loss from the skin by only sweating [W]. bf_core : np.ndarray Core blood flow rate [L/h]. bf_muscle : np.ndarray Muscle blood flow rate [L/h]. bf_fat : np.ndarray Fat blood flow rate [L/h]. bf_skin : np.ndarray Skin blood flow rate [L/h]. bf_ava_hand : np.ndarray AVA blood flow rate of one hand [L/h]. bf_ava_foot : np.ndarray AVA blood flow rate of one foot [L/h]. q_bmr_core : np.ndarray Core thermogenesis by basal metabolism [W]. q_bmr_muscle : np.ndarray Muscle thermogenesis by basal metabolism [W]. q_bmr_fat : np.ndarray Fat thermogenesis by basal metabolism [W]. q_bmr_skin : np.ndarray Skin thermogenesis by basal metabolism [W]. q_work : np.ndarray Thermogenesis by work [W]. q_shiv : np.ndarray Thermogenesis by shivering [W]. q_nst : np.ndarray Thermogenesis by non-shivering [W]. q_thermogenesis_core : np.ndarray Core total thermogenesis [W]. q_thermogenesis_muscle : np.ndarray Muscle total thermogenesis [W]. q_thermogenesis_fat : np.ndarray Fat total thermogenesis [W]. q_thermogenesis_skin : np.ndarray Skin total thermogenesis [W]. q_skin2env_sensible : np.ndarray Sensible heat loss from the skin to the environment [W]. q_skin2env_latent : np.ndarray Latent heat loss from the skin to the environment [W]. q_res_sensible : np.ndarray Sensible heat loss by respiration [W]. q_res_latent : np.ndarray Latent heat loss by respiration [W]. """ simulation_time: dt.timedelta | None = None dt: float | None = None t_skin_mean: float | None = None t_skin: JOS3BodyParts | None = None t_core: JOS3BodyParts | None = None w_mean: float | None = None w: JOS3BodyParts | None = None weight_loss_by_evap_and_res: float | None = None cardiac_output: float | None = None q_thermogenesis_total: float | None = None q_res: float | None = None q_skin2env: JOS3BodyParts | None = None height: float | None = None weight: float | None = None bsa: JOS3BodyParts | None = None fat: float | None = None sex: str | None = None age: int | None = None t_core_set: JOS3BodyParts | None = None t_skin_set: JOS3BodyParts | None = None t_cb: float | None = None t_artery: JOS3BodyParts | None = None t_vein: JOS3BodyParts | None = None t_superficial_vein: JOS3BodyParts | None = None t_muscle: JOS3BodyParts | None = None t_fat: JOS3BodyParts | None = None to: JOS3BodyParts | None = None r_t: JOS3BodyParts | None = None r_et: JOS3BodyParts | None = None tdb: JOS3BodyParts | None = None tr: JOS3BodyParts | None = None rh: JOS3BodyParts | None = None v: JOS3BodyParts | None = None par: float | None = None clo: JOS3BodyParts | None = None e_skin: JOS3BodyParts | None = None e_max: JOS3BodyParts | None = None e_sweat: JOS3BodyParts | None = None bf_core: JOS3BodyParts | None = None bf_muscle: JOS3BodyParts | None = None bf_fat: JOS3BodyParts | None = None bf_skin: JOS3BodyParts | None = None bf_ava_hand: float | None = None bf_ava_foot: float | None = None q_bmr_core: JOS3BodyParts | None = None q_bmr_muscle: JOS3BodyParts | None = None q_bmr_fat: JOS3BodyParts | None = None q_bmr_skin: JOS3BodyParts | None = None q_work: JOS3BodyParts | None = None q_shiv: JOS3BodyParts | None = None q_nst: JOS3BodyParts | None = None q_thermogenesis_core: JOS3BodyParts | None = None q_thermogenesis_muscle: JOS3BodyParts | None = None q_thermogenesis_fat: JOS3BodyParts | None = None q_thermogenesis_skin: JOS3BodyParts | None = None q_skin2env_sensible: JOS3BodyParts | None = None q_skin2env_latent: JOS3BodyParts | None = None q_res_sensible: float | None = None q_res_latent: float | None = None
[docs] @dataclass(frozen=True, repr=False) class PredictedBodyTemperatures(AutoStrMixin): """Dataclass for returning predicted temperature history. The `duration` mentioned in the shapes below is the `duration` parameter passed to the prediction function. Attributes ---------- t_re : numpy.ndarray of float, in °C Predicted rectal temperature history. - If scalar inputs are provided, this is a 1D array of shape (`duration`,). - If vector inputs are provided, this is a 2D array of shape (`n_inputs`, `duration`). t_sk : numpy.ndarray of float, in °C Predicted mean skin temperature history. - If scalar inputs are provided, this is a 1D array of shape (`duration`,). - If vector inputs are provided, this is a 2D array of shape (`n_inputs`, `duration`). """ t_re: np.ndarray t_sk: np.ndarray
@dataclass(frozen=True, repr=False) class ScaleWindSpeedLog(AutoStrMixin): """Dataclass to represent the output of scale_wind_speed_log. Attributes ---------- v_z2 : numpy.ndarray or float or list of floats Wind speed at the target height z2, [m/s]. The type can be a scalar, list or numpy array depending on the inputs provided to the function. """ v_z2: npt.ArrayLike
[docs] @dataclass(frozen=True, repr=False) class SportsHeatStressRisk(AutoStrMixin): """Dataclass to represent the Sports Heat Stress Risk calculation results. Attributes ---------- risk_level_interpolated : float or list of floats Interpolated risk level (1.0-4.0), [dimensionless]. Risk levels: 1-<2 = low, 2-<3 = moderate, 3-<4 = high, 4 = extreme. t_medium : float or list of floats Temperature threshold for medium risk level, [°C]. t_high : float or list of floats Temperature threshold for high risk level, [°C]. t_extreme : float or list of floats Temperature threshold for extreme risk level, [°C]. recommendation : str or list of str Heat stress management recommendations for the calculated risk level. """ risk_level_interpolated: float | list[float] t_medium: float | list[float] t_high: float | list[float] t_extreme: float | list[float] recommendation: str | list[str]