Hi,

Does anyone have an Excel-friendly equation they would be willing to share

that can convert Tdb and RH into Twb? We have metered data giving us Tdb,

RH, and Tdp, but we need to know wetbulb. We usually solve this problem

with an Excel psychrometric add-in, but we need to distribute this

spreadsheet to a client and cannot distribute the add-in at the same time.

We've tried a couple of multivariable regressions on the data, but because

it is nonlinear, it is not proving to be that straightforward. Next stop

might be a two-way lookup table, but that is kind of cumbersome and was

hoping to avoid it.

Any help much appreciated.

Sincerely,

Alec Stevens

You should be able to find these routines in the HVAC Toolkit book - sold by

ashrae. I don't have it handy so not sure if you can use the routine

directly in excel - you might need visual basic. I have done this previously

in matlab, C++

-Rohini

?Hi there,

Spreadsheet is attached that does exactly what you want to do. If you

unprotected the sheet you will see how the wb formula is used.

Regards

Dear Alec,

Here is a suite of VBA functions that are tested (except where indicated

otherwise) and have served me well. Most have been tested against the

ASHRAE Psychrometric Chart program and the results compare well. You?ll

have to be the final judge, depending on your accuracy and other needs.

p.s., They?re all IP units-based.

' Version 1.1 09/07/09

' These functions are written in Visual Basic for Excel.

' The routines are approximations based on empirical data as published

' in the ASHRAE document called "Computerized Algorithms for Psychrometric

Approximations".

' Input for all functions require the following units:

'

' ElevInFt = Elevation above sea level, feet

' pvs = vapor pressure at saturation, inches Hg

' pv = vapor pressure, inches Hg

' db = Dry Bulb Temperature, ?F

' wb = Wet Bulb Temperature, ?F

' rh = Relative humidity (0

' RH = Relative Humidity, decimal

' h = Enthalpy, btu/lb

' W = # H2O / # air

' Patm (Atmospheric Pressure) = psia

Function Cp_1(DB)

' Calculate specific heat of air (temp-corrected)

Cp_1 = -2.0921943E-14 * DB ^ 4 + 2.5588383E-11 * DB ^ 3 + 0.000000012900877

* DB ^ 2 + 0.0000058045267 * DB + 0.23955919

End Function

Function Cp_2(DB, W)

' Calculate specific heat of air (temp and moisture-corrected)

Cp_h = Cp_1(DB)

Cp_2 = Cp_h * DB + W * (1061 + 0.444 * DB)

End Function

Function Patm(ElevInFt)

' Calculate Atmospheric pressure (psia) given elevation in ft.

Patm = 14.696 * (1 - 0.0000068753 * ElevInFt) ^ 5.2559

End Function

Function Patm_hg(ElevInFt)

' Calculate Atmospheric pressure (in.Hg) given elevation in ft.

Patm_hg = Patm(ElevInFt) * 2.03602

End Function

Function DBfromW_RH(W, RH, ElevInFt)

' Calculate DB given W, RH, Elevation ASL

' validated 1/8/08 by JVDII

' Calculate Dewpoint (in F) for given W (this is the lowest possible

value for DB)

DB = DewPt2(ElevInFt, W)

P = Patm(ElevInFt)

Do

ps = Pws(DB)

RHtest = W * (P - W * P / (0.62198 + W)) / (0.62198 * ps)

DB = DB + 1

Loop Until RHtest < RH

DB = DB - 1.1

Do

ps = Pws(DB)

RHtest = W * (P - W * P / (0.62198 + W)) / (0.62198 * ps)

DB = DB + 0.1

Loop Until RHtest < RH

DB = DB - 0.1

DBfromW_RH = DB

End Function

Function Twb_h(DB, H, ElevInFt)

' Calculate DB given W, H, Elevation ASL

' Not validated yet.

WBtest = DB

Do

htest = 0.24 * WBtest + (1061 + 0.444 * WBtest) * HumRat3(WBtest,

WBtest, ElevInFt)

WBtest = WBtest - 1

Loop Until htest < H

WBtest = WBtest + 2

Do

htest = 0.24 * WBtest + (1061 + 0.444 * WBtest) * HumRat3(WBtest,

WBtest, ElevInFt)

WBtest = WBtest - 0.1

Loop Until htest < H WBtest = WBtest + 0.1 Twb_h = WBtest End Function Function Twb(DB, W, ElevInFt) ' Calculate WB given DB, W, Elevation ASL ' validated 1/8/08 by JVDII ' Start checking at 70F below DB WBtest = DB - 70 Wtest = 0 P_atm = Patm(ElevInFt) ' This macro uses the "For" structure in combination with the "Do" structure to prevent ' infinite looping when one of the cells used in calculation is undefined. For I = 1 To 70 P_ws = Pws(WBtest) wsat = (P_ws * 0.62198) / (P_atm - P_ws) wnum = (1093 - 0.556 * WBtest) * wsat - 0.24 * (DB - WBtest) wdenom = 1093 + 0.444 * DB - WBtest Wtest = wnum / wdenom If Wtest > W Then GoTo 100

WBtest = WBtest + 1

Next I

100 WBtest = WBtest - 1.1

Do

P_ws = Pws(WBtest)

wsat = (P_ws * 0.62198) / (P_atm - P_ws)

wnum = (1093 - 0.556 * WBtest) * wsat - 0.24 * (DB - WBtest)

wdenom = 1093 + 0.444 * DB - WBtest

Wtest = wnum / wdenom

WBtest = WBtest + 0.1

Loop Until Wtest > W

Twb = WBtest - 0.1

If Twb > DB Then Twb = DB

End Function

Function HumRat(DB6, WB, ElevInFt)

' Calculate Humidity Ratio (W) given DB, WB, Elevation ASL

' validated 1/8/08 by JVDII

wsat = (Pws(WB) * 0.62198) / (Patm(ElevInFt) - Pws(WB))

If WB > 32 Then

HumRat = ((1093 - 0.556 * WB) * wsat - Cp_1(DB6) * (DB6 - WB)) / (1093 +

0.444 * DB6 - WB)

Else

HumRat = ((1061 + 0.444 * WB - (-143.34 + 0.5 * (WB - 32))) * wsat -

Cp_1(DB6) * (DB6 - WB)) / (1061 + 0.444 * WB - (-143.34 + 0.5 * (WB - 32)))

End If

End Function

Function HumRat2(DB, RH, ElevInFt)

' Calculate Humidity Ratio (W) given dry bulb temp, relative humidity,

and elevation

' validated 1/8/08 by JVDII

atm = Patm_hg(ElevInFt)

wsat = Pvs(DB)

wtemp = 0.62198 * wsat / (atm - wsat)

HumRat2 = RH * wtemp

End Function

Function HumRat3(DB, WB, ElevInFt)

' Calculate Humidity Ratio (W) given dry bulb temp, wet bulb temp, and

elevation

' This form is used by the v() function

atm = Patm_hg(ElevInFt)

vp = Pv1(DB, WB, atm)

HumRat3 = 0.62198 * vp / (atm - vp)

End Function

Function Pws(Temp)

' Calculate Pws (psia) given temp in F

' Validated by JVDII

Rt = Temp + 459.67

If Rt > 491.67 Then

Pws = Exp(-10440.4 / Rt - 11.29465 - 0.027022355 * Rt + 0.00001289036 * Rt ^

2 - 0.000000002478068 * Rt ^ 3 + 6.5459673 * Log(Rt))

Else

Pws = Exp(-10214.165 / Rt - 4.8932428 - 0.0053765794 * Rt + 0.00000019202377

* Rt ^ 2 - 3.5575832E-10 * Rt ^ 3 + 9.0344688E-14 * Rt ^ 4 + 4.1635019 *

Log(Rt))

End If

End Function

Function log10(number)

' Calculate the Logarithm of a number to the base 10 (used in Pvs

function)

log10 = Log(number) / Log(10#)

End Function

Function Pvs(DB)

' Calculate vapor pressure (in. Hg) at saturation given dry bulb temp

' (Same as Pws, except uses in. HG for units and is applicable below

32F)

ta = (DB + 459.688) / 1.8

If ta > 273.16 Then

Z = 373.16 / ta

p1 = (Z - 1) * (-7.90298)

p2 = log10(Z) * 5.02808

p3 = ((10 ^ ((1 - (1 / Z)) * 11.344)) - 1) * (-0.00000013816)

p4 = ((10 ^ ((-3.49149) * (Z - 1))) - 1) * 0.0081328

Else

Z = 273.16 / ta

p1 = (-9.09718) * (Z - 1)

p2 = (-3.56654) * log10(Z)

p3 = 0.876793 * (1 - (1 / Z))

p4 = log10(0.0060273)

End If

Pvs = 29.921 * (10 ^ (p1 + p2 + p3 + p4))

End Function

Function Pv1(DB, WB, ElevInFt)

' Calculate Vapor Pressure given dry bulb temp, wet bulb temp, and

elevation

atm = Patm_hg(ElevInFt)

pvp = Pvs(WB)

Ws = (pvp / (atm - pvp)) * 0.62198

If WB <= 32# Then

Pv1 = pvp - 0.0005704 * atm * (DB - WB) / 1.8

Else

hl = 1093.049 + (0.441 * (DB - WB))

ch = 0.24 + (0.441 * Ws)

wh = Ws - (ch * (DB - WB) / hl)

Pv1 = atm * (wh / (0.62198 + wh))

End If

End Function

Function DewPt1(Pv)

' Calculate dew point temp. given Vapor Pressure

y = Log(Pv)

If Pv < 0.18036 Then

DewPt1 = 71.98 + (24.873 * y) + (0.8927 * y ^ 2)

Else

DewPt1 = 79.047 + (30.579 * y) + (1.8893 * y ^ 2)

End If

End Function

Function DewPt2(ElevInFt, W)

' Calculate dewpoint given Patm, Humidity ratio

P = Patm(ElevInFt)

Pw = (P * W) / (0.62198 + W)

alpha = Log(Pw)

DewPt2 = 100.45 + 33.193 * alpha + 2.319 * alpha ^ 2 + 0.17074 * alpha ^ 3 +

1.2063 * (Pw) ^ 0.1984

End Function

Function Enth(DB, WB, ElevInFt)

' Calculate Enthalpy given dry bulb temp, wet bulb temp, and elevation

Enth = (DB * 0.24) + ((1061 + (0.444 * DB)) * (W(DB, WB, ElevInFt)))

End Function

Function Enth2(DB, W)

' Calculate Enthalpy given dry bulb temp, humidity ratio

Enth2 = Cp_1(DB) * DB + W * (1061 + 0.444 * DB)

End Function

Function RH(DB, WB, ElevInFt)

' Doesn't work.........use RH2() until I figure it out

Rt = WB + 459.67

pt = Patm(ElevInFt)

wsat = (Pws(DB) * 0.62198) / (pt - Pws(DB))

wnum = (1093 - 0.556 * WB) * wsat - 0.24 * (DB - WB)

wdenom = 1093 + 0.444 * DB - WB

W_1 = wnum / wdenom

Pw = (W_1 * pt) / (0.62198 + W_1)

Rt = DB + 459.67

ps = Pws(Rt)

pa = pt - Pw

RH = (W_1 * pa) / (0.62198 * ps)

End Function

Function RH2(DB, WB, ElevInFt)

' Calculate relative humidity given dry bulb temp, wet bulb temp, and

elevation

atm = Patm_hg(ElevInFt)

RH2 = Pv1(DB, WB, ElevInFt) / Pvs(DB)

End Function

Function v(DB, WB, ElevInFt)

' Calculate Specific Volume given dry bulb temp, wet bulb temp, and

elevation

atm = Patm_hg(ElevInFt)

v = (0.754 * (DB + 459.7) * (1 + (7000 * HumRat3(DB, WB, ElevInFt) /

4360))) / atm

End Function

James V. Dirkes II, P.E., LEED AP

Alec,

ASHRAE also has wetbulb formula in the spreadsheets that come with the ASHRAE RP865 final report, which are being incorporated into Standard 140.

Jeff S. Haberl, Ph.D.,P.E., FASHRAE

Alec:

In the past, I wrote two programs in Turbo Pascal that calculates

thermal properties of moist air based on ASHRAE equations. They are

called PSY and PSY2. PSY2 takes values of Dry-bulb and Relative

Humidity under a particular pressure condition (in.Hg) and returns all

properties of that air including Relative Humidity.

I will attempt to send this PSY2.exe file but our university email

system blocks any .exe files from being sent over their system. So I

will remove the .exe from the file and you can re-name it later. You

can also try to unzip the attached PSY2.exe file.

If it doesn't work, let me know, and I will send it through other email

accounts to you directly. You may also try to download it from my

website: http://houseenergydoctor.arizona.edu

Nader V. Chalfoun, Ph.D., LEED AP, CEA

Dear Jeff,

Where might one find this report and the spreadsheets? I searched the

ASHRAE Web site for RP865 and came up empty.

James V. Dirkes II, P.E., LEED AP