Ideal-gas properties#
See the appendix of https://tsapps.nist.gov/publication/get_pdf.cfm?pub_id=933725 for the mathematical representations. They can be summarized like so:
$ u_{\rm ig} = RT:nbsphinx-math:left`((1/T):nbsphinx-math:left`(\frac{\partial\alpha_{\rm ig}}{\partial(1/T)}\right){:nbsphinx-math:`delta`}:nbsphinx-math:`right`) = RT:nbsphinx-math:`left`(:nbsphinx-math:`tau`:nbsphinx-math:`left`(:nbsphinx-math:`frac{partialalpha_{rm ig}}{partialtau}`:nbsphinx-math:`right`){\delta}:nbsphinx-math:right) $
$ h_{\rm ig} = RT:nbsphinx-math:left`(1+(1/T):nbsphinx-math:left`(\frac{\partial\alpha_{\rm ig}}{\partial(1/T)}\right){:nbsphinx-math:`delta`}:nbsphinx-math:`right`) = RT:nbsphinx-math:`left`(1+:nbsphinx-math:`tau`:nbsphinx-math:`left`(:nbsphinx-math:`frac{partialalpha_{rm ig}}{partialtau}`:nbsphinx-math:`right`){\delta}:nbsphinx-math:right) $
$ s_{\rm ig} = R:nbsphinx-math:left`((1/T):nbsphinx-math:left`(\frac{\partial\alpha_{\rm ig}}{\partial(1/T)}\right){:nbsphinx-math:`delta`}-:nbsphinx-math:`alpha`{\rm ig}:nbsphinx-math:right) = R:nbsphinx-math:left`(:nbsphinx-math:tau`:nbsphinx-math:left`(:nbsphinx-math:frac{partialalpha_{rm ig}}{partialtau}`:nbsphinx-math:right){:nbsphinx-math:`delta`}-:nbsphinx-math:`alpha`{\rm ig}:nbsphinx-math:right) $
The precise reference state used in Table A-22 of Moran and Shapiro is unknown, but they are based on the gas tables from the 1950s at the then National Bureau of Standards (now NIST). According to a summary report from one year later, the enthalpy and Gibbs energy (and therefore also the entropy because \(g=h-Ts\)) are set to 0 at 0 K. This differs to the reference state used in the pseudo-pure Air EOS, but the offset is identical, as shown here:
[1]:
import CoolProp.CoolProp as CP
[2]:
# Some check values from Moran & Shapiro, 6th edition, Table A-22
Ts = [200, 440, 740]
hs = [199.97, 441.61, 756.44]
ss = [1.29559, 2.08870, 2.63280]
us = [142.56, 315.30, 544.02]
for T, h0, s0, u0 in zip(Ts, hs, ss, us):
AS = CP.AbstractState("HEOS", "Air")
# Use the density obtained from Z=1
rho = 101325/(CP.PropsSI('molemass','Air')*T)
AS.update(CP.DmolarT_INPUTS, rho, T)
R = AS.gas_constant()/AS.molar_mass()
RT = R*T
ucalc_kJkg = RT*(AS.tau()*AS.dalpha0_dTau())/1000 # kJ/kg
hcalc_kJkg = RT*(1+AS.tau()*AS.dalpha0_dTau())/1000 # kJ/kg
scalc_kJkgK = R*(AS.tau()*AS.dalpha0_dTau()-AS.alpha0())/1000 # kJ/kg/K
print('T:', T, 'u:', ucalc_kJkg, 'h:', hcalc_kJkg, 's:', scalc_kJkgK, 'deltau:', ucalc_kJkg-u0, 'deltah:', hcalc_kJkg-h0, 'deltas:', scalc_kJkgK-s0)
T: 200 u: 268.7943717754444 h: 326.2041971329565 s: 1.8560457472717602 deltau: 126.2343717754444 deltah: 126.2341971329565 deltas: 0.5604557472717602
T: 440 u: 441.7087305389626 h: 568.010346325489 s: 2.649670290945472 deltau: 126.40873053896257 deltah: 126.40034632548895 deltas: 0.5609702909454723
T: 740 u: 670.468780219468 h: 882.8851340422626 s: 3.193835221127113 deltau: 126.44878021946806 deltah: 126.44513404226257 deltas: 0.561035221127113
As of version 7.2, you can also get the ideal-gas properties directly from the model without additional work:
[3]:
for T, h0, s0, u0 in zip(Ts, hs, ss, us):
AS = CP.AbstractState("HEOS", "Air")
# Use the density obtained from Z=1
rho = 101325/(CP.PropsSI('molemass','Air')*T)
AS.update(CP.DmolarT_INPUTS, rho, T)
R = AS.gas_constant()/AS.molar_mass()
RT = R*T
ucalc_kJkg = AS.umass_idealgas()/1000 # kJ/kg
hcalc_kJkg = AS.hmass_idealgas()/1000 # kJ/kg
scalc_kJkgK = AS.smass_idealgas()/1000 # kJ/kg/K
print('T:', T, 'u:', ucalc_kJkg, 'h:', hcalc_kJkg, 's:', scalc_kJkgK, 'deltau:', ucalc_kJkg-u0, 'deltah:', hcalc_kJkg-h0, 'deltas:', scalc_kJkgK-s0)
T: 200 u: 268.7943717754444 h: 326.20419713295644 s: 1.85604574727176 deltau: 126.2343717754444 deltah: 126.23419713295644 deltas: 0.56045574727176
T: 440 u: 441.7087305389625 h: 568.010346325489 s: 2.6496702909454717 deltau: 126.40873053896252 deltah: 126.40034632548895 deltas: 0.5609702909454719
T: 740 u: 670.4687802194679 h: 882.8851340422626 s: 3.193835221127113 deltau: 126.44878021946795 deltah: 126.44513404226257 deltas: 0.561035221127113
Or with the high-level interface (less efficient computationally)
[4]:
for T, h0, s0, u0 in zip(Ts, hs, ss, us):
# Use the density obtained from Z=1
rho = 101325/(CP.PropsSI('molemass','Air')*T)
ucalc_kJkg = CP.PropsSI('Umass_idealgas','T|phase_gas',T,'Dmolar',rho,'Air')/1000 # kJ/kg
hcalc_kJkg = CP.PropsSI('Hmass_idealgas','T|phase_gas',T,'Dmolar',rho,'Air')/1000 # kJ/kg
scalc_kJkgK = CP.PropsSI('Smass_idealgas','T|phase_gas',T,'Dmolar',rho,'Air')/1000 # kJ/kg/K
print('T:', T, 'u:', ucalc_kJkg, 'h:', hcalc_kJkg, 's:', scalc_kJkgK, 'deltau:', ucalc_kJkg-u0, 'deltah:', hcalc_kJkg-h0, 'deltas:', scalc_kJkgK-s0)
T: 200 u: 268.7943717754444 h: 326.20419713295644 s: 1.85604574727176 deltau: 126.2343717754444 deltah: 126.23419713295644 deltas: 0.56045574727176
T: 440 u: 441.7087305389625 h: 568.010346325489 s: 2.6496702909454717 deltau: 126.40873053896252 deltah: 126.40034632548895 deltas: 0.5609702909454719
T: 740 u: 670.4687802194679 h: 882.8851340422626 s: 3.193835221127113 deltau: 126.44878021946795 deltah: 126.44513404226257 deltas: 0.561035221127113