@neutrium/thermo.eos.iapws97
Version:
A javascript implementation of the IAWPS formulations for the thermodynamic properties of water and steam.
290 lines (239 loc) • 9 kB
text/typescript
export const constants = {
// Critical and Gas Constants
'R' : 0.461526, // kJ/kg.K
//'Tc' : 647.096, // K
'Pc' : 22.064, // Mpa
//'Rhoc' : 322, // kg/m3
// Temperature and Pressure region limits
'MIN_P' : 0.000611213, // MPa
'MAX_P' : 100.0, // MPa
'MAX_T' : 2273.15, // K
'MIN_T' : 273.15, // K
'MIN_S' : -0.000154549592045, // kJ/kg
'MIN_H' : -0.041587825659104, // kJ/kg.K
'R2_MIN_T' : 623.15, // K
'R2_MAX_T' : 1073.15, // K
'R2_CRT_S' : 5.85, // kJ/kg.K
'R2_CRT_P' : 4.0, // MPa
'B23_MIN_P' : 16.5292, // MPa (The region 2-3 boundary pressure at R2_MIN_T)
'B23_MAX_T' : 863.15, // K (The region 2-3 boundary temperature at MAX_P)
'R5_MIN_T' : 1073.15, // K
'R5_MAX_P' : 50, // Mpa
'R5_MAX_T' : 2273.15, // K
'R3_MIN_T' : 623.15, // K
'R3_CRT_S' : 4.41202148223476, // kJ/kg.K
'B23_S_MIN' : 5.048096828,
'B23_S_MAX' : 5.260578707,
'B23_H_MIN' : 2563.592004,
'B23_H_MAX' : 2812.942061
}
// This function is to help in porting to typescript
export function CONST(key: string)
{
return constants[key];
}
//
// Auxiliary Equation for additonal properties
//
//
// Comments : IAPWS Viscosity of ordinary water substances 2008
//
// @param T is the temperature in K
// @param Rho is the density in kg/m^3
//
// @return Viscosity in Pa.s (P)
//
export function viscosity(T, ρ)
{
let T_hat = T/647.096,
ρ_hat = ρ/322,
μ0_H = [1.67752, 2.20462, 0.6366564, -0.241605],
μ0 = 100*Math.sqrt(T_hat),
x = 0,
y = 0;
for (let i = 0; i < 4; i++)
{
x += μ0_H[i]/Math.pow(T_hat, i);
}
μ0 = μ0/x;
let μ1 = 0,
μ1_H = [5.20094E-1,8.50895E-2,-1.08374,-2.89555E-1,0,0,2.22531E-1,9.99115E-1,1.88797,1.26613,0,1.20573E-1,-2.81378E-1,-9.06851E-1,-7.72479E-1,-4.89837E-1,-2.5704E-1,0,1.61913E-1,2.57399E-1,0,0,0,0,-3.25372E-2,0,0,6.98452E-2,0,0,0,0,0,0,8.72102E-3,0,0,0,0,-4.35673E-3,0,-5.93264E-4];
for (let j = 0; j < 6; j++)
{
x = Math.pow(1/T_hat - 1, j);
y = 0;
for (let z = 0; z < 7; z++)
{
y += μ1_H[z*6+j]*Math.pow(ρ_hat - 1, z);
}
μ1 += x*y;
}
μ1 = Math.exp(ρ_hat*μ1);
// No correction at the subcritical region yet
let μ2 = 1;
/*
// start of critcial enhancement
let chi = rho_hat*(zetaX(T_hat, rho_hat) - zetaR(rho_hat)*1.5/T_hat),
xi = 0.13*Math.pow(chi/0.06, 0.63/1.239),
psi_d = Math.acos(Math.pow(1+xi*xi/1.21, -0.5)),
w = Math.sqrt((xi/1.9-1)/(xi/1.9+1))*Math.tan(0.5*psi_d),
Lw = xi/1.9 > 1 ? Math.log((1+w)/(1-w)) : 2*Math.atan(Math.abs(w)),
qcxi = xi/1.9,
qdxi = xi/1.1;
if(xi > 0.3817016416)
{
y = (1/12)*Math.sin(3*psi_d) - (1/(4*qcxi))*Math.sin(2*psi_d) + 1/(qcxi*qcxi)*(1 - 5*qcxi*qcxi/4)*Math.sin(psi_d) - 1/Math.pow(qcxi, 3)*((1 - 1.5*qcxi*qcxi)*psi_d - Math.pow(Math.abs(qcxi*qcxi-1),1.5)*Lw);
}
else
{
y = (1/5)*qcxi*Math.pow(qdxi,5)*(1 - qcxi + qcxi*qcxi - 765*qdxi*qdxi/504);
}
*/
return μ0*μ1*μ2;
}
//
// Comments : IAPWS Thermal conductivity of ordinary water substances 2011
//
// @param T is the temperature in K
// @param Rho is the density in kg/m^3
//
// @return The thermal conductivity in mW/m.K
//
export function thermal_conductivity(T, ρ)
{
let T_hat = T/647.096,
ρ_hat = ρ/322,
k0_L = [2.443221E-3, 1.323095E-2, 6.770357E-3, -3.454586E-3, 4.096266E-4],
k0 = 0;
for (let i = 0; i < 5; i++)
{
k0 += k0_L[i]/Math.pow(T_hat, i);
}
k0 = Math.sqrt(T_hat)/k0;
let k1 = 0,
k1_L = [1.60397357, -0.646013523, 0.111443906, 0.102997357, -0.0504123634, 0.00609859258, 2.33771842, -2.78843778, 1.53616167, -0.463045512, 0.0832827019, -0.00719201245, 2.19650529, -4.54580785, 3.55777244, -1.40944978, 0.275418278, -0.0205938816, -1.21051378, 1.60812989, -0.621178141, 0.0716373224, 0, 0, -2.720337, 4.57586331, -3.18369245, 1.1168348, -0.19268305, 0.012913842],
x = 0,
y = 0;
for (let j = 0; j < 5; j++)
{
x = Math.pow(1/T_hat - 1, j);
y = 0;
for(let z = 0; z < 6; z++)
{
y += k1_L[j*6 + z]*Math.pow(ρ_hat - 1, z);
}
k1 += x*y;
}
k1 = Math.exp(ρ_hat*k1);
// The critical enhancement not implemented yet
let k2 = 0;
/*
To be included once zeta(T_hat, rho_hat) function found
let mu_hat = mu/1E-6, // need mu
cp_hat = cp/R,
chi = rho_hat*(zeta(T_hat, rho_hat) - 1.5*zetaR(rho_hat)/T-hat),
xi = 0.13*Math.pow(chi/0.06, 0.63/1.239),
y = (xi/0.4),
kappa = cp/cv, // get this from previous calculations
Z = 2/(Math.PI*y)*(((1 - 1/kappa)*Math.atan(y) + y/kappa) - (1 - Math.exp(-1/(1/y + y*y/(3*rho_hat*rho_hat))))),
k2 = 177.8514*rho_hat*cp_hat*T_hat*Z/mu_hat;
function zetaR(rho_hat)
{
let a = [6.53786807199516, 6.52717759281799, 5.35500529896124, 1.55225959906681, 1.11999926419994, -5.61149954923348, -6.30816983387575, -3.96415689925446, 0.464621290821181, 0.595748562571649, 3.39624167361325, 8.08379285492595, 8.91990208918795, 8.93237374861479, 9.88952565078920, -2.27492629730878, -9.82240510197603, -12.0338729505790, -11.0321960061126, -10.3255051147040, 10.2631854662709, 12.1358413791395, 9.19494865194302, 6.16780999933360, 4.66861294457414, 1.97815050331519, -5.54349664571295, -2.16866274479712, -0.965458722086812, -0.503243546373828];
j = 0,
z = 0;
if(rho_hat <= 0.310559006)
{
j = 0;
}
else if(rho_hat <= 0.776397516)
{
j = 1;
}
else if(rho_hat <= 1.242236025)
{
j = 2;
}
else if(rho_hat <= 1.863354037)
{
j = 3;
}
else
{
j = 4;
}
for(let i = 0; i < 6; i++)
{
z += A[i*5 + j]*Math.pow(rho_hat, i);
}
return 1/z;
}
*/
return k0*k1 + k2;
}
//
// Comments : IAPWS Surface Tension of ordinary water substances 2014
//
// @param T is the temperature in K
//
// @return The surface tension in mN/m
//
export function surface_tension(T)
{
let τ = 1 - T/647.096,
σ = 235.8*Math.pow(τ,1.256)*(1 - 0.625*τ);
return σ;
}
//
// Comments : IAPWS Static Dielectric Constant of ordinary water substances 1997
//
// @param T is the temperature in K
// @param ρ is the density in kg . m^-3
//
// @return The surface tension in mN/m
//
export function dielectric_constant(T, ρ)
{
let MW = 0.018015268,
ρm = ρ/MW, // Molecular density (mol . m^-3)
ρρc = ρm/(322/MW),
α = 1.636E-40, // Mean molecular polarizability (C^2 . J^-1 . m^2)
N_a = 6.0221367E23, // Avogadro's number (mol^-1)
μ = 6.138E-30, // Molecular dipole moment (C . m)
ε_0 = 1/(4E-7*Math.PI*Math.pow(299792458,2)), // Permittivity of free space (C^2 . J^-1 . m^-1)
k = 1.380658E-23, // Boltzmann's constant (J . K^-1)
Nh = [0.978224486826, -0.957771379375, 0.237511794148, 0.714692244396, -0.298217036956, -0.108863472196, 0.0949327488264, -0.00980469816509, 0.16516763497E-4, 0.937359795772E-4, -0.12317921872E-9],
//Nh = [0.978224486826,-0.957771379375,0.237511794148,0.714692244396,-0.298217036956,-0.108863472196,0.0949327488264,-0.00980469816509,0.000016516763497,0.0000937359795772,-1.23179218720E-10],
Ih = [1, 1, 1, 2, 3, 3, 4, 5, 6, 7, 10],
Jh = [0.25, 1, 2.5, 1.5, 1.5, 2.5, 2, 2, 5, 0.5, 10],
g = 0;
for (let i = 0; i < 11; i++)
{
g += Nh[i]*Math.pow(ρρc, Ih[i])*Math.pow(647.096/T, Jh[i]);
}
g = 1 + g + 0.00196096504426*(ρρc)*Math.pow(T/228 - 1, -1.2);
let A = N_a*μ*μ*ρm*g/(ε_0*k*T),
B = N_a*α*ρm/(3*ε_0),
ε = (1 + A + 5*B + Math.sqrt(9 + 2*A + 18*B + A*A + 10*A*B + 9*B*B))/(4 - 4*B);
return ε;
}
//
// Comments : IAPWS Ionization Constant of H2O 2007
//
// @param T is the temperature in K
// @param ρ is the density in kg.m^-3
//
// @return The ionization constant in (dimensionless)
//
export function ionization_constant(T, ρ)
{
let pK_wg = 0.61415 + 48251.33/T - 67707.93/(T*T) + 10102100/(T*T*T),
Q = ρ*Math.exp(-0.864671 + 8659.19/T - 22786.2*Math.pow(ρ, 2/3)/(T*T)),
pK_w = -12*(log10(1+Q) - Q/(Q+1)*ρ*(0.642044 -56.8534/T -0.375754*ρ)) + pK_wg + 2*log10(0.018015268);
return pK_w;
}
// Not all browsers support log10 (IE)
function log10(x)
{
return Math.log(x) / Math.LN10;
}