@neutrium/thermo.eos.iapws97
Version:
A javascript implementation of the IAWPS formulations for the thermodynamic properties of water and steam.
218 lines (211 loc) • 8.56 kB
JavaScript
;
exports.constants = {
// Critical and Gas Constants
'R': 0.461526,
//'Tc' : 647.096, // K
'Pc': 22.064,
//'Rhoc' : 322, // kg/m3
// Temperature and Pressure region limits
'MIN_P': 0.000611213,
'MAX_P': 100.0,
'MAX_T': 2273.15,
'MIN_T': 273.15,
'MIN_S': -0.000154549592045,
'MIN_H': -0.041587825659104,
'R2_MIN_T': 623.15,
'R2_MAX_T': 1073.15,
'R2_CRT_S': 5.85,
'R2_CRT_P': 4.0,
'B23_MIN_P': 16.5292,
'B23_MAX_T': 863.15,
'R5_MIN_T': 1073.15,
'R5_MAX_P': 50,
'R5_MAX_T': 2273.15,
'R3_MIN_T': 623.15,
'R3_CRT_S': 4.41202148223476,
'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
function CONST(key) {
return exports.constants[key];
}
exports.CONST = CONST;
//
// 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)
//
function viscosity(T, ρ) {
var 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 (var i = 0; i < 4; i++) {
x += μ0_H[i] / Math.pow(T_hat, i);
}
μ0 = μ0 / x;
var μ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 (var j = 0; j < 6; j++) {
x = Math.pow(1 / T_hat - 1, j);
y = 0;
for (var 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
var μ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;
}
exports.viscosity = viscosity;
//
// 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
//
function thermal_conductivity(T, ρ) {
var 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 (var i = 0; i < 5; i++) {
k0 += k0_L[i] / Math.pow(T_hat, i);
}
k0 = Math.sqrt(T_hat) / k0;
var 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 (var j = 0; j < 5; j++) {
x = Math.pow(1 / T_hat - 1, j);
y = 0;
for (var 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
var 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;
}
exports.thermal_conductivity = thermal_conductivity;
//
// Comments : IAPWS Surface Tension of ordinary water substances 2014
//
// @param T is the temperature in K
//
// @return The surface tension in mN/m
//
function surface_tension(T) {
var τ = 1 - T / 647.096, σ = 235.8 * Math.pow(τ, 1.256) * (1 - 0.625 * τ);
return σ;
}
exports.surface_tension = surface_tension;
//
// 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
//
function dielectric_constant(T, ρ) {
var 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 (var 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);
var 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 ε;
}
exports.dielectric_constant = dielectric_constant;
//
// 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)
//
function ionization_constant(T, ρ) {
var 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;
}
exports.ionization_constant = ionization_constant;
// Not all browsers support log10 (IE)
function log10(x) {
return Math.log(x) / Math.LN10;
}