function GetHumRatioFromTWetBulb(TDryBulb, TWetBulb, Pressure) result(HumRatio)
!+ Return humidity ratio given dry-bulb temperature, wet-bulb temperature, and pressure.
!+ References:
!+ ASHRAE Handbook - Fundamentals (2017) ch. 1 eqn 33 and 35
real, intent(in) :: TDryBulb
!+ Dry-bulb temperature in °F [IP] or °C [SI]
real, intent(in) :: TWetBulb
!+ Wet-bulb temperature in °F [IP] or °C [SI]
real, intent(in) :: Pressure
!+ Atmospheric pressure in Psi [IP] or Pa [SI]
real :: HumRatio
!+ Humidity ratio in lb_H₂O lb_Air⁻¹ [IP] or kg_H₂O kg_Air⁻¹ [SI]
real :: Wsstar
!+ Humidity ratio at temperature Tstar in lb_H₂O lb_Air⁻¹ [IP] or kg_H₂O kg_Air⁻¹ [SI]
if (TWetBulb > TDryBulb) then
error stop "Error: wet bulb temperature is above dry bulb temperature"
end if
Wsstar = GetSatHumRatio(TWetBulb, Pressure)
if (isIP()) then
if (TWetBulb >= FREEZING_POINT_WATER_IP) then
HumRatio = ((1093.0 - 0.556 * TWetBulb) * Wsstar - 0.240 * (TDryBulb - TWetBulb)) &
/ (1093.0 + 0.444 * TDryBulb - TWetBulb)
else
HumRatio = ((1220.0 - 0.04 * TWetBulb) * Wsstar - 0.240 * (TDryBulb - TWetBulb)) &
/ (1220.0 + 0.444 * TDryBulb - 0.48 * TWetBulb)
end if
else
if (TWetBulb >= FREEZING_POINT_WATER_SI) then
HumRatio = ((2501.0 - 2.326 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) &
/ (2501.0 + 1.86 * TDryBulb - 4.186 * TWetBulb)
else
HumRatio = ((2830.0 - 0.24 * TWetBulb) * Wsstar - 1.006 * (TDryBulb - TWetBulb)) &
/ (2830.0 + 1.86 * TDryBulb - 2.1 * TWetBulb)
end if
end if
! Validity check.
HumRatio = max(HumRatio, MIN_HUM_RATIO)
end function GetHumRatioFromTWetBulb