Source code for hvacpy.equipment._airflow

"""Supply airflow pure functions.

Calculates required supply air volume flow rates from sensible loads.
"""

from __future__ import annotations

from typing import TYPE_CHECKING

from hvacpy.units import Q_
from hvacpy.exceptions import AirflowCalculationError

if TYPE_CHECKING:
    from pint import Quantity

# Physical constants
RHO_AIR = 1.2      # kg/m³ standard air density
CP_DA = 1006.0      # J/(kg·K) specific heat dry air


[docs] def supply_airflow_cooling( sensible_load: 'Quantity', t_room: 'Quantity | None' = None, t_supply: 'Quantity | None' = None, ) -> 'Quantity': """Calculate supply airflow for cooling from sensible load. V_dot = Q_sensible / (rho_air * CP_DA * (T_room - T_supply)) Args: sensible_load: Sensible cooling load as Quantity (W). t_room: Room temperature. Default 24°C. t_supply: Supply air temperature. Default 13°C. Returns: Volume flow rate as Quantity (m³/s). Raises: AirflowCalculationError: If T_supply >= T_room. """ if t_room is None: t_room = Q_(24, 'degC') if t_supply is None: t_supply = Q_(13, 'degC') t_room_c = t_room.to('degC').magnitude t_supply_c = t_supply.to('degC').magnitude delta_t = t_room_c - t_supply_c if delta_t <= 0: raise AirflowCalculationError( 'Supply air temperature must be below room temperature for cooling.' ) q_w = sensible_load.to('W').magnitude v_dot = q_w / (RHO_AIR * CP_DA * delta_t) return Q_(v_dot, 'm**3/s')
[docs] def supply_airflow_heating( heating_load: 'Quantity', t_room: 'Quantity | None' = None, t_supply: 'Quantity | None' = None, ) -> 'Quantity': """Calculate supply airflow for heating from heating load. V_dot = Q_heating / (rho_air * CP_DA * (T_supply - T_room)) Args: heating_load: Heating load as Quantity (W). t_room: Room temperature. Default 21°C. t_supply: Supply air temperature. Default 40°C. Returns: Volume flow rate as Quantity (m³/s). """ if t_room is None: t_room = Q_(21, 'degC') if t_supply is None: t_supply = Q_(40, 'degC') t_room_c = t_room.to('degC').magnitude t_supply_c = t_supply.to('degC').magnitude delta_t = t_supply_c - t_room_c if delta_t <= 0: raise AirflowCalculationError( 'Supply air temperature must be above room temperature for heating.' ) q_w = heating_load.to('W').magnitude v_dot = q_w / (RHO_AIR * CP_DA * delta_t) return Q_(v_dot, 'm**3/s')
[docs] def airflow_from_cooling_load(cooling_load, t_supply=None) -> 'Quantity': """Convenience wrapper — compute supply airflow from a CoolingLoad object. Uses peak_sensible and the room's indoor temperature. """ sensible = cooling_load.peak_sensible # Try to get room temperature from the space t_room = Q_(24, 'degC') if hasattr(cooling_load, '_rooms') and cooling_load._rooms: t_room = cooling_load._rooms[0].t_indoor return supply_airflow_cooling(sensible, t_room=t_room, t_supply=t_supply)