09a06be1a4
Conflicts: src/thermophysicalModels/basic/derivedFvPatchFields/fixedEnthalpy/fixedEnthalpyFvPatchScalarField.C src/thermophysicalModels/basic/derivedFvPatchFields/gradientEnthalpy/gradientEnthalpyFvPatchScalarField.C src/thermophysicalModels/basic/derivedFvPatchFields/mixedEnthalpy/mixedEnthalpyFvPatchScalarField.C
869 lines
24 KiB
C
869 lines
24 KiB
C
/*
|
|
freesteam - IAPWS-IF97 steam tables library
|
|
Copyright (C) 2004-2009 John Pye
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*//** @file
|
|
Backwards equations for IAPWS-IF97. Facilitate calculation of
|
|
properties in terms of (p,h) without requiring any iteration.
|
|
|
|
TODO add boundary curves?
|
|
TODO add more equations for (p,s) calculation?
|
|
|
|
Numerical data for T(p,h) and v(p,h) correlations was extracted from
|
|
the Matlab version 2.6 of Xsteam by by Magnus Holmgren.
|
|
*/
|
|
|
|
#define FREESTEAM_BUILDING_LIB
|
|
#include "backwards.h"
|
|
|
|
#include "backwards_impl.h"
|
|
#include <math.h>
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 1 BACKWARDS EQUATION T(P,H)
|
|
*/
|
|
|
|
typedef struct{
|
|
int I, J;
|
|
double n;
|
|
} BackwardsData;
|
|
|
|
/**
|
|
Source: IAPWS-IF97-REV section 5.2.1
|
|
*/
|
|
BackwardsData REGION1_TPH_DATA[] = {
|
|
{0, 0, -238.72489924521}
|
|
,{0, 1, 404.21188637945}
|
|
,{0, 2, 113.49746881718}
|
|
,{0, 6, -5.8457616048039}
|
|
,{0, 22, -1.528548241314E-04}
|
|
,{0, 32, -1.0866707695377E-06}
|
|
,{1, 0, -13.391744872602}
|
|
,{1, 1, 43.211039183559}
|
|
,{1, 2, -54.010067170506}
|
|
,{1, 3, 30.535892203916}
|
|
,{1, 4, -6.5964749423638}
|
|
,{1,10, 9.3965400878363E-03}
|
|
,{1,32, 1.157364750534E-07}
|
|
,{2,10,-2.5858641282073E-05}
|
|
,{2,32,-4.0644363084799E-09}
|
|
,{3,10,6.6456186191635E-08}
|
|
,{3,32,8.0670734103027E-11}
|
|
,{4,32,-9.3477771213947E-13}
|
|
,{5,32,5.8265442020601E-15}
|
|
,{6,32,-1.5020185953503E-17}
|
|
};
|
|
|
|
const unsigned REGION1_TPH_MAX = sizeof(REGION1_TPH_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION1_TPH_HSTAR = 2500e3; /* J/kg */
|
|
const double REGION1_TPH_PSTAR = 1e6; /* Pa */
|
|
|
|
/**
|
|
Backward equation for temperature in terms of pressure and enthalpy
|
|
in IAPWS-IF97 Region 1. Source: IAPWS-IF97-Rev section 5.2.1.
|
|
|
|
@param p pressure in Pa
|
|
@param h enthalpy in J/kg
|
|
@return temperature in K
|
|
*/
|
|
double freesteam_region1_T_ph(double p, double h){
|
|
double pi = p / REGION1_TPH_PSTAR;
|
|
double e1 = 1. + (h / REGION1_TPH_HSTAR);
|
|
unsigned i;
|
|
BackwardsData *d;
|
|
double sum = 0;
|
|
for(i=0, d = REGION1_TPH_DATA; i<REGION1_TPH_MAX; ++i, ++d){
|
|
/* TODO some optimisations are possible here with pow(pi,...) */
|
|
sum += d->n * ipow(pi,d->I) * ipow(e1, d->J);
|
|
}
|
|
return sum /* * REGION1_TPH_TSTAR = 1. */;
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 2 BACKWARDS EQUATION T(P,H)
|
|
*/
|
|
|
|
/* sub-region 2a */
|
|
BackwardsData REGION2A_TPH_DATA[] = {
|
|
{0, 0, 1089.8952318288}
|
|
,{0, 1, 849.51654495535}
|
|
,{0, 2, -107.81748091826}
|
|
,{0, 3, 33.153654801263}
|
|
,{0, 7, -7.4232016790248}
|
|
,{0, 20, 11.765048724356}
|
|
,{1, 0, 1.844574935579}
|
|
,{1, 1, -4.1792700549624}
|
|
,{1, 2, 6.2478196935812}
|
|
,{1, 3, -17.344563108114}
|
|
,{1, 7, -200.58176862096}
|
|
,{1, 9, 271.96065473796}
|
|
,{1, 11, -455.11318285818}
|
|
,{1, 18, 3091.9688604755}
|
|
,{1, 44, 252266.40357872}
|
|
,{2, 0, -6.1707422868339E-03}
|
|
,{2, 2, -0.31078046629583}
|
|
,{2, 7, 11.670873077107}
|
|
,{2, 36, 128127984.04046}
|
|
,{2, 38, -985549096.23276}
|
|
,{2, 40, 2822454697.3002}
|
|
,{2, 42, -3594897141.0703}
|
|
,{2, 44, 1722734991.3197}
|
|
,{3, 24, -13551.334240775}
|
|
,{3, 44, 12848734.66465}
|
|
,{4, 12, 1.3865724283226}
|
|
,{4, 32, 235988.32556514}
|
|
,{4, 44, -13105236.545054}
|
|
,{5, 32, 7399.9835474766}
|
|
,{5, 36, -551966.9703006}
|
|
,{5, 42, 3715408.5996233}
|
|
,{6, 34, 19127.72923966}
|
|
,{6, 44, -415351.64835634}
|
|
,{7, 28, -62.459855192507}
|
|
|
|
};
|
|
|
|
const unsigned REGION2A_TPH_MAX = sizeof(REGION2A_TPH_DATA)/sizeof(BackwardsData);
|
|
|
|
/* sub-region 2b */
|
|
|
|
BackwardsData REGION2B_TPH_DATA[] = {
|
|
{0, 0, 1489.5041079516}
|
|
,{0, 1, 743.07798314034}
|
|
,{0, 2, -97.708318797837}
|
|
,{0, 12, 2.4742464705674}
|
|
,{0, 18, -0.63281320016026}
|
|
,{0, 24, 1.1385952129658}
|
|
,{0, 28, -0.47811863648625}
|
|
,{0, 40, 8.5208123431544E-03}
|
|
,{1, 0, 0.93747147377932}
|
|
,{1, 2, 3.3593118604916}
|
|
,{1, 6, 3.3809355601454}
|
|
,{1, 12, 0.16844539671904}
|
|
,{1, 18, 0.73875745236695}
|
|
,{1, 24, -0.47128737436186}
|
|
,{1, 28, 0.15020273139707}
|
|
,{1, 40, -0.002176411421975}
|
|
,{2, 2, -0.021810755324761}
|
|
,{2, 8, -0.10829784403677}
|
|
,{2, 18, -0.046333324635812}
|
|
,{2, 40, 7.1280351959551E-05}
|
|
,{3, 1, 1.1032831789999E-04}
|
|
,{3, 2, 1.8955248387902E-04}
|
|
,{3, 12, 3.0891541160537E-03}
|
|
,{3, 24, 1.3555504554949E-03}
|
|
,{4, 2, 2.8640237477456E-07}
|
|
,{4, 12, -1.0779857357512E-05}
|
|
,{4, 18, -7.6462712454814E-05}
|
|
,{4, 24, 1.4052392818316E-05}
|
|
,{4, 28, -3.1083814331434E-05}
|
|
,{4, 40, -1.0302738212103E-06}
|
|
,{5, 18, 2.821728163504E-07}
|
|
,{5, 24, 1.2704902271945E-06}
|
|
,{5, 40, 7.3803353468292E-08}
|
|
,{6, 28, -1.1030139238909E-08}
|
|
,{7, 2, -8.1456365207833E-14}
|
|
,{7, 28, -2.5180545682962E-11}
|
|
,{9, 1, -1.7565233969407E-18}
|
|
,{9, 40, 8.6934156344163E-15}
|
|
|
|
};
|
|
|
|
const unsigned REGION2B_TPH_MAX = sizeof(REGION2B_TPH_DATA)/sizeof(BackwardsData);
|
|
|
|
/* sub-region 2c */
|
|
BackwardsData REGION2C_TPH_DATA[] ={
|
|
{-7, 0, -3236839855524.2}
|
|
,{-7, 4, 7326335090218.1}
|
|
,{-6, 0, 358250899454.47}
|
|
,{-6, 2, -583401318515.9}
|
|
,{-5, 0, -10783068217.47}
|
|
,{-5, 2, 20825544563.171}
|
|
,{-2, 0, 610747.83564516}
|
|
,{-2, 1, 859777.2253558}
|
|
,{-1, 0, -25745.72360417}
|
|
,{-1, 2, 31081.088422714}
|
|
,{0, 0, 1208.2315865936}
|
|
,{0, 1, 482.19755109255}
|
|
,{1, 4, 3.7966001272486}
|
|
,{1, 8, -10.842984880077}
|
|
,{2, 4, -0.04536417267666}
|
|
,{6, 0, 1.4559115658698E-13}
|
|
,{6, 1, 1.126159740723E-12}
|
|
,{6, 4, -1.7804982240686E-11}
|
|
,{6, 10, 1.2324579690832E-07}
|
|
,{6, 12, -1.1606921130984E-06}
|
|
,{6, 16, 2.7846367088554E-05}
|
|
,{6, 20, -5.9270038474176E-04}
|
|
,{6, 22, 1.2918582991878E-03}
|
|
|
|
};
|
|
|
|
const unsigned REGION2C_TPH_MAX = sizeof(REGION2C_TPH_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION2AB_P = 4.e6; /* Pa */
|
|
|
|
const double REGION2_HSTAR = 2000e3;
|
|
const double REGION2_PSTAR = 1.e6;
|
|
|
|
/* REGION2_B2BC_PH defined in backwards_impl.h */
|
|
|
|
/**
|
|
Backward equation for temperature in terms of pressure and enthalpy
|
|
in IAPWS-IF97 Region 2 (composed of sub-regions 2a, 2b, 2c).
|
|
Source: IAPWS-IF97-Rev section 5.2.1.
|
|
|
|
@param p pressure in Pa
|
|
@param h enthalpy in J/kg
|
|
@return temperature in K
|
|
*/
|
|
double freesteam_region2_T_ph(double p, double h){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
double eta = h / REGION2_HSTAR;
|
|
double pi = p / REGION2_PSTAR;
|
|
double pi1, eta1;
|
|
BackwardsData *d;
|
|
unsigned i, n;
|
|
double sum = 0;
|
|
if(p < REGION2AB_P){
|
|
//fprintf(stderr,"region 2a\n");
|
|
pi1 = pi; eta1 = eta - 2.1;
|
|
d = REGION2A_TPH_DATA;
|
|
n = REGION2A_TPH_MAX;
|
|
}else{
|
|
if(REGION2_B2BC_PH(p,h) < 0.){
|
|
//fprintf(stderr,"region 2b\n");
|
|
pi1 = pi - 2.; eta1 = eta - 2.6;
|
|
d = REGION2B_TPH_DATA;
|
|
n = REGION2B_TPH_MAX;
|
|
}else{
|
|
//fprintf(stderr,"region 2c\n");
|
|
pi1 = pi + 25.; eta1 = eta - 1.8;
|
|
d = REGION2C_TPH_DATA;
|
|
n = REGION2C_TPH_MAX;
|
|
}
|
|
}
|
|
|
|
for(i = 0; i<n; ++i, ++d){
|
|
sum += d->n * ipow(pi1, d->I) * ipow(eta1, d->J);
|
|
}
|
|
|
|
return sum /* * REGION2_TSTAR = 1 K */;
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 3 BACKWARDS EQUATION T(P,H)
|
|
*/
|
|
|
|
/* sub-region 3a */
|
|
BackwardsData REGION3A_TPH_DATA[] = {
|
|
{-12, 0, -1.33645667811215E-07}
|
|
,{-12, 1, 4.55912656802978E-06}
|
|
,{-12, 2, -1.46294640700979E-05}
|
|
,{-12, 6, 6.3934131297008E-03}
|
|
,{-12, 14, 372.783927268847}
|
|
,{-12, 16, -7186.54377460447}
|
|
,{-12, 20, 573494.7521034}
|
|
,{-12, 22, -2675693.29111439}
|
|
,{-10, 1, -3.34066283302614E-05}
|
|
,{-10, 5, -2.45479214069597E-02}
|
|
,{-10, 12, 47.8087847764996}
|
|
,{-8, 0, 7.64664131818904E-06}
|
|
,{-8, 2, 1.28350627676972E-03}
|
|
,{-8, 4, 1.71219081377331E-02}
|
|
,{-8, 10, -8.51007304583213}
|
|
,{-5, 2, -1.36513461629781E-02}
|
|
,{-3, 0, -3.84460997596657E-06}
|
|
,{-2, 1, 3.37423807911655E-03}
|
|
,{-2, 3, -0.551624873066791}
|
|
,{-2, 4, 0.72920227710747}
|
|
,{-1, 0, -9.92522757376041E-03}
|
|
,{-1, 2, -0.119308831407288}
|
|
,{0, 0, 0.793929190615421}
|
|
,{0, 1, 0.454270731799386}
|
|
,{1, 1, 0.20999859125991}
|
|
,{3, 0, -6.42109823904738E-03}
|
|
,{3, 1, -0.023515586860454}
|
|
,{4, 0, 2.52233108341612E-03}
|
|
,{4, 3, -7.64885133368119E-03}
|
|
,{10, 4, 1.36176427574291E-02}
|
|
,{12, 5, -1.33027883575669E-02}
|
|
};
|
|
|
|
const unsigned REGION3A_TPH_MAX = sizeof(REGION3A_TPH_DATA)/sizeof(BackwardsData);
|
|
|
|
BackwardsData REGION3B_TPH_DATA[] = {
|
|
{-12, 0, 3.2325457364492E-05}
|
|
,{-12, 1, -1.27575556587181E-04}
|
|
,{-10, 0, -4.75851877356068E-04}
|
|
,{-10, 1, 1.56183014181602E-03}
|
|
,{-10, 5, 0.105724860113781}
|
|
,{-10, 10, -85.8514221132534}
|
|
,{-10, 12, 724.140095480911}
|
|
,{-8, 0, 2.96475810273257E-03}
|
|
,{-8, 1, -5.92721983365988E-03}
|
|
,{-8, 2, -1.26305422818666E-02}
|
|
,{-8, 4, -0.115716196364853}
|
|
,{-8, 10, 84.9000969739595}
|
|
,{-6, 0, -1.08602260086615E-02}
|
|
,{-6, 1, 1.54304475328851E-02}
|
|
,{-6, 2, 7.50455441524466E-02}
|
|
,{-4, 0, 2.52520973612982E-02}
|
|
,{-4, 1, -6.02507901232996E-02}
|
|
,{-3, 5, -3.07622221350501}
|
|
,{-2, 0, -5.74011959864879E-02}
|
|
,{-2, 4, 5.03471360939849}
|
|
,{-1, 2, -0.925081888584834}
|
|
,{-1, 4, 3.91733882917546}
|
|
,{-1, 6, -77.314600713019}
|
|
,{-1, 10, 9493.08762098587}
|
|
,{-1, 14, -1410437.19679409}
|
|
,{-1, 16, 8491662.30819026}
|
|
,{0, 0, 0.861095729446704}
|
|
,{0, 2, 0.32334644281172}
|
|
,{1, 1, 0.873281936020439}
|
|
,{3, 1, -0.436653048526683}
|
|
,{5, 1, 0.286596714529479}
|
|
,{6, 1, -0.131778331276228}
|
|
,{8, 1, 6.76682064330275E-03}
|
|
};
|
|
|
|
const unsigned REGION3B_TPH_MAX = sizeof(REGION3B_TPH_DATA)/sizeof(BackwardsData);
|
|
|
|
/* REGION3_B3AB_PH(P,H) boundary test declared in backwards_impl.h */
|
|
|
|
const double REGION3A_TPH_HSTAR = 2300e3;
|
|
const double REGION3A_TPH_PSTAR = 100.e6;
|
|
const double REGION3A_TPH_TSTAR = 760;
|
|
|
|
const double REGION3B_TPH_HSTAR = 2800e3;
|
|
const double REGION3B_TPH_PSTAR = 100.e6;
|
|
const double REGION3B_TPH_TSTAR = 860;
|
|
|
|
/**
|
|
Backward equation for temperature in terms of pressure and enthalpy
|
|
in IAPWS-IF97 Region 3 (composed of sub-regions 3a, 3b).
|
|
|
|
Source: IAPWS 'Revised Supplementary Release on Backward Equations for the Functions
|
|
T(p,h), v(p,h) and T(p,s), v(p,s) for Region 3 of the IAPWS Industrial
|
|
Formulation 1997 for the Thermodynamic Properties of Water and Steam', 2004.
|
|
|
|
@param p pressure in Pa
|
|
@param h enthalpy in J/kg
|
|
@return temperature in K
|
|
*/
|
|
double freesteam_region3_T_ph(double p, double h){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
double pi1, eta1;
|
|
double Tstar;
|
|
BackwardsData *d;
|
|
unsigned i, n;
|
|
double sum = 0;
|
|
if(REGION3_B3AB_PH(p,h) <= 0.){
|
|
/* sub-region 3a */
|
|
pi1 = p/REGION3A_TPH_PSTAR + 0.240; eta1 = h/REGION3A_TPH_HSTAR - 0.615;
|
|
d = REGION3A_TPH_DATA;
|
|
n = REGION3A_TPH_MAX;
|
|
Tstar = REGION3A_TPH_TSTAR;
|
|
}else{
|
|
/* sub-region 3b */
|
|
pi1 = p/REGION3B_TPH_PSTAR + 0.298; eta1 = h/REGION3B_TPH_HSTAR - 0.720;
|
|
d = REGION3B_TPH_DATA;
|
|
n = REGION3B_TPH_MAX;
|
|
Tstar = REGION3B_TPH_TSTAR;
|
|
}
|
|
|
|
for(i = 0; i<n; ++i, ++d){
|
|
sum += d->n * ipow(pi1, d->I) * ipow(eta1, d->J);
|
|
}
|
|
|
|
return sum * Tstar;
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 3 V(P,H)
|
|
*/
|
|
|
|
BackwardsData REGION3A_VPH_DATA[] = {
|
|
{-12, 6, 5.29944062966028E-03}
|
|
,{-12, 8, -0.170099690234461}
|
|
,{-12, 12, 11.1323814312927}
|
|
,{-12, 18, -2178.98123145125}
|
|
,{-10, 4, -5.06061827980875E-04}
|
|
,{-10, 7, 0.556495239685324}
|
|
,{-10, 10, -9.43672726094016}
|
|
,{-8, 5, -0.297856807561527}
|
|
,{-8, 12, 93.9353943717186}
|
|
,{-6, 3, 1.92944939465981E-02}
|
|
,{-6, 4, 0.421740664704763}
|
|
,{-6, 22, -3689141.2628233}
|
|
,{-4, 2, -7.37566847600639E-03}
|
|
,{-4, 3, -0.354753242424366}
|
|
,{-3, 7, -1.99768169338727}
|
|
,{-2, 3, 1.15456297059049}
|
|
,{-2, 16, 5683.6687581596}
|
|
,{-1, 0, 8.08169540124668E-03}
|
|
,{-1, 1, 0.172416341519307}
|
|
,{-1, 2, 1.04270175292927}
|
|
,{-1, 3, -0.297691372792847}
|
|
,{0, 0, 0.560394465163593}
|
|
,{0, 1, 0.275234661176914}
|
|
,{1, 0, -0.148347894866012}
|
|
,{1, 1, -6.51142513478515E-02}
|
|
,{1, 2, -2.92468715386302}
|
|
,{2, 0, 6.64876096952665E-02}
|
|
,{2, 2, 3.52335014263844}
|
|
,{3, 0, -1.46340792313332E-02}
|
|
,{4, 2, -2.24503486668184}
|
|
,{5, 2, 1.10533464706142}
|
|
,{8, 2, -4.08757344495612E-02}
|
|
};
|
|
|
|
const unsigned REGION3A_VPH_MAX = sizeof(REGION3A_VPH_DATA)/sizeof(BackwardsData);
|
|
|
|
BackwardsData REGION3B_VPH_DATA[] = {
|
|
{-12, 0, -2.25196934336318E-09}
|
|
,{-12, 1, 1.40674363313486E-08}
|
|
,{-8, 0, 2.3378408528056E-06}
|
|
,{-8, 1, -3.31833715229001E-05}
|
|
,{-8, 3, 1.07956778514318E-03}
|
|
,{-8, 6, -0.271382067378863}
|
|
,{-8, 7, 1.07202262490333}
|
|
,{-8, 8, -0.853821329075382}
|
|
,{-6, 0, -2.15214194340526E-05}
|
|
,{-6, 1, 7.6965608822273E-04}
|
|
,{-6, 2, -4.31136580433864E-03}
|
|
,{-6, 5, 0.453342167309331}
|
|
,{-6, 6, -0.507749535873652}
|
|
,{-6, 10, -100.475154528389}
|
|
,{-4, 3, -0.219201924648793}
|
|
,{-4, 6, -3.21087965668917}
|
|
,{-4, 10, 607.567815637771}
|
|
,{-3, 0, 5.57686450685932E-04}
|
|
,{-3, 2, 0.18749904002955}
|
|
,{-2, 1, 9.05368030448107E-03}
|
|
,{-2, 2, 0.285417173048685}
|
|
,{-1, 0, 3.29924030996098E-02}
|
|
,{-1, 1, 0.239897419685483}
|
|
,{-1, 4, 4.82754995951394}
|
|
,{-1, 5, -11.8035753702231}
|
|
,{0, 0, 0.169490044091791}
|
|
,{1, 0, -1.79967222507787E-02}
|
|
,{1, 1, 3.71810116332674E-02}
|
|
,{2, 2, -5.36288335065096E-02}
|
|
,{2, 6, 1.6069710109252}
|
|
};
|
|
|
|
const unsigned REGION3B_VPH_MAX = sizeof(REGION3B_VPH_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION3A_VPH_HSTAR = 2100e3; /* J/kg */
|
|
const double REGION3A_VPH_PSTAR = 100.e6; /* Pa */
|
|
const double REGION3A_VPH_VSTAR = 0.0028; /* m³/kg */
|
|
|
|
const double REGION3B_VPH_HSTAR = 2800e3;
|
|
const double REGION3B_VPH_PSTAR = 100.e6;
|
|
const double REGION3B_VPH_VSTAR = 0.0088;
|
|
|
|
/**
|
|
Backward equation for specific volume in terms of pressure and enthalpy
|
|
in IAPWS-IF97 Region 3 (composed of sub-regions 3a, 3b).
|
|
|
|
Source: IAPWS 'Revised Supplementary Release on Backward Equations for the Functions
|
|
T(p,h), v(p,h) and T(p,s), v(p,s) for Region 3 of the IAPWS Industrial
|
|
Formulation 1997 for the Thermodynamic Properties of Water and Steam', 2004.
|
|
|
|
@param p pressure in Pa
|
|
@param h enthalpy in J/kg
|
|
@return temperature in K
|
|
*/
|
|
double freesteam_region3_v_ph(double p, double h){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
double pi1, eta1;
|
|
BackwardsData *d;
|
|
unsigned i, n;
|
|
double sum = 0;
|
|
double vstar;
|
|
if(REGION3_B3AB_PH(p,h) <= 0.){
|
|
/* sub-region 3a */
|
|
pi1 = p/REGION3A_VPH_PSTAR + 0.128; eta1 = h/REGION3A_VPH_HSTAR - 0.727;
|
|
d = REGION3A_VPH_DATA;
|
|
n = REGION3A_VPH_MAX;
|
|
vstar = REGION3A_VPH_VSTAR;
|
|
}else{
|
|
/* sub-region 3b */
|
|
pi1 = p/REGION3B_VPH_PSTAR + 0.0661; eta1 = h/REGION3B_VPH_HSTAR - 0.720;
|
|
d = REGION3B_VPH_DATA;
|
|
n = REGION3B_VPH_MAX;
|
|
vstar = REGION3B_VPH_VSTAR;
|
|
}
|
|
|
|
for(i = 0; i<n; ++i, ++d){
|
|
sum += d->n * ipow(pi1, d->I) * ipow(eta1, d->J);
|
|
}
|
|
|
|
return sum * vstar;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 3 PSAT(H) BOUNDARY
|
|
*/
|
|
|
|
BackwardsData REGION3_PSATH_DATA[] = {
|
|
{ 0, 0, 0.600073641753024}
|
|
,{1, 1, -0.936203654849857e1}
|
|
,{1, 3, 0.246590798594147e2}
|
|
,{1, 4, -0.107014222858224e3}
|
|
,{1, 36, -0.915821315805768e14}
|
|
,{5, 3, -0.862332011700662e4}
|
|
,{7, 0, -0.235837344740032e2}
|
|
,{8, 24, 0.252304969384128e18}
|
|
,{14, 16, -0.389718771997719e19}
|
|
,{20, 16, -0.333775713645296e23}
|
|
,{22, 3, 0.356499469636328e11}
|
|
,{24, 18, -0.148547544720641e27}
|
|
,{28, 8, 0.330611514838798e19}
|
|
,{36, 24, 0.813641294467829e38}
|
|
};
|
|
|
|
const unsigned REGION3_PSATH_MAX = sizeof(REGION3_PSATH_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION3_PSATH_HSTAR = 2600e3;
|
|
const double REGION3_PSATH_PSTAR = 22.e6;
|
|
|
|
double freesteam_region3_psat_h(double h){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
BackwardsData *d, *e = REGION3_PSATH_DATA + REGION3_PSATH_MAX;
|
|
double eta = h / REGION3_PSATH_HSTAR;
|
|
double eta1 = eta - 1.02;
|
|
double eta2 = eta - 0.608;
|
|
double sum = 0;
|
|
for(d = REGION3_PSATH_DATA; d<e; ++d){
|
|
sum += d->n * ipow(eta1, d->I) * ipow(eta2, d->J);
|
|
}
|
|
return sum * REGION3_PSATH_PSTAR;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 3 PSAT(S) BOUNDARY
|
|
*/
|
|
|
|
BackwardsData REGION3_PSATS_DATA[] = {
|
|
{ 0, 0, 0.639767553612785}
|
|
, {1, 1, -0.129727445396014e2}
|
|
, {1, 32, -0.224595125848403e16}
|
|
, {4, 7, 0.177466741801846e7}
|
|
, {12, 4, 0.717079349571538e10}
|
|
, {12, 14, -0.378829107169011e18}
|
|
, {16, 36, -0.955586736431328e35}
|
|
, {24, 10, 0.187269814676188e24}
|
|
, {28, 0, 0.119254746466473e12}
|
|
, {32, 18, 0.110649277244882e37}
|
|
};
|
|
|
|
const unsigned REGION3_PSATS_MAX = sizeof(REGION3_PSATS_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION3_PSATS_SSTAR = 5.2e3;
|
|
const double REGION3_PSATS_PSTAR = 22.e6;
|
|
|
|
double freesteam_region3_psat_s(double s){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
BackwardsData *d, *e = REGION3_PSATS_DATA + REGION3_PSATS_MAX;
|
|
double sig = s / REGION3_PSATS_SSTAR;
|
|
double sig1 = sig - 1.03;
|
|
double sig2 = sig - 0.699;
|
|
double sum = 0;
|
|
for(d = REGION3_PSATS_DATA; d<e; ++d){
|
|
sum += d->n * ipow(sig1, d->I) * ipow(sig2, d->J);
|
|
}
|
|
return sum * REGION3_PSATS_PSTAR;
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
REGION 3 BACKWARDS EQUATION T(P,S)
|
|
*/
|
|
|
|
/**
|
|
Source: Revised_Release_Tv3ph_Tv3ps_Rev3.doc sect 3.4
|
|
*/
|
|
BackwardsData REGION3A_TPS_DATA[] = {
|
|
{-12, 28, 1500420082.63875}
|
|
,{-12, 32, -159397258480.424}
|
|
,{-10, 4, 5.02181140217975E-04}
|
|
,{-10, 10, -67.2057767855466}
|
|
,{-10, 12, 1450.58545404456}
|
|
,{-10, 14, -8238.8953488889}
|
|
,{-8, 5, -0.154852214233853}
|
|
,{-8, 7, 11.2305046746695}
|
|
,{-8, 8, -29.7000213482822}
|
|
,{-8, 28, 43856513263.5495}
|
|
,{-6, 2, 1.37837838635464E-03}
|
|
,{-6, 6, -2.97478527157462}
|
|
,{-6, 32, 9717779473494.13}
|
|
,{-5, 0, -5.71527767052398E-05}
|
|
,{-5, 14, 28830.794977842}
|
|
,{-5, 32, -74442828926270.3}
|
|
,{-4, 6, 12.8017324848921}
|
|
,{-4, 10, -368.275545889071}
|
|
,{-4, 36, 6.64768904779177E+15}
|
|
,{-2, 1, 0.044935925195888}
|
|
,{-2, 4, -4.22897836099655}
|
|
,{-1, 1, -0.240614376434179}
|
|
,{-1, 6, -4.74341365254924}
|
|
,{0, 0, 0.72409399912611}
|
|
,{0, 1, 0.923874349695897}
|
|
,{0, 4, 3.99043655281015}
|
|
,{1, 0, 3.84066651868009E-02}
|
|
,{2, 0, -3.59344365571848E-03}
|
|
,{2, 3, -0.735196448821653}
|
|
,{3, 2, 0.188367048396131}
|
|
,{8, 0, 1.41064266818704E-04}
|
|
,{8, 1, -2.57418501496337E-03}
|
|
,{10, 2, 1.23220024851555E-03}
|
|
};
|
|
|
|
const unsigned REGION3A_TPS_MAX = sizeof(REGION3A_TPS_DATA)/sizeof(BackwardsData);
|
|
|
|
/**
|
|
Source: Revised_Release_Tv3ph_Tv3ps_Rev3.doc sect 3.4
|
|
*/
|
|
BackwardsData REGION3B_TPS_DATA[] = {
|
|
{-12, 1, 0.52711170160166}
|
|
,{-12, 3, -40.1317830052742}
|
|
,{-12, 4, 153.020073134484}
|
|
,{-12, 7, -2247.99398218827}
|
|
,{-8, 0, -0.193993484669048}
|
|
,{-8, 1, -1.40467557893768}
|
|
,{-8, 3, 42.6799878114024}
|
|
,{-6, 0, 0.752810643416743}
|
|
,{-6, 2, 22.6657238616417}
|
|
,{-6, 4, -622.873556909932}
|
|
,{-5, 0, -0.660823667935396}
|
|
,{-5, 1, 0.841267087271658}
|
|
,{-5, 2, -25.3717501764397}
|
|
,{-5, 4, 485.708963532948}
|
|
,{-5, 6, 880.531517490555}
|
|
,{-4, 12, 2650155.92794626}
|
|
,{-3, 1, -0.359287150025783}
|
|
,{-3, 6, -656.991567673753}
|
|
,{-2, 2, 2.41768149185367}
|
|
,{0, 0, 0.856873461222588}
|
|
,{2, 1, 0.655143675313458}
|
|
,{3, 1, -0.213535213206406}
|
|
,{4, 0, 5.62974957606348E-03}
|
|
,{5, 24, -316955725450471.}
|
|
,{6, 0, -6.99997000152457E-04}
|
|
,{8, 3, 1.19845803210767E-02}
|
|
,{12, 1, 1.93848122022095E-05}
|
|
,{14, 2, -2.15095749182309E-05}
|
|
};
|
|
|
|
const unsigned REGION3B_TPS_MAX = sizeof(REGION3B_TPS_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION3A_TPS_TSTAR = 760.; /* K */
|
|
const double REGION3A_TPS_SSTAR = 4.4e3; /* J/kgK */
|
|
const double REGION3A_TPS_PSTAR = 100e6; /* Pa */
|
|
|
|
const double REGION3B_TPS_TSTAR = 860.; /* K */
|
|
const double REGION3B_TPS_SSTAR = 5.3e3; /* J/kgK */
|
|
const double REGION3B_TPS_PSTAR = 100e6; /* Pa */
|
|
|
|
const double REGION3AB_SC = 4.41202148223476e3; /* J/kgK */
|
|
|
|
/**
|
|
Backward equation for temperature in terms of pressure and entropy
|
|
in IAPWS-IF97 Region 3 (composed of sub-regions 3a, 3b).
|
|
|
|
Source: IAPWS 'Revised Supplementary Release on Backward Equations for the Functions
|
|
T(p,h), v(p,h) and T(p,s), v(p,s) for Region 3 of the IAPWS Industrial
|
|
Formulation 1997 for the Thermodynamic Properties of Water and Steam', 2004.
|
|
|
|
@param p pressure in Pa
|
|
@param s specific entropy in J/kgK
|
|
@return temperature in K
|
|
*/
|
|
double freesteam_region3_T_ps(double p, double s){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
double p1, s1;
|
|
double Tstar;
|
|
BackwardsData *d;
|
|
unsigned i, n;
|
|
double sum = 0;
|
|
if(s < REGION3AB_SC){
|
|
/* sub-region 3a */
|
|
p1 = p/REGION3A_TPS_PSTAR + 0.240; s1 = s/REGION3A_TPS_SSTAR - 0.703;
|
|
d = REGION3A_TPS_DATA;
|
|
n = REGION3A_TPS_MAX;
|
|
Tstar = REGION3A_TPS_TSTAR;
|
|
}else{
|
|
/* sub-region 3b */
|
|
p1 = p/REGION3B_TPS_PSTAR + 0.760; s1 = s/REGION3B_TPS_SSTAR - 0.818;
|
|
d = REGION3B_TPS_DATA;
|
|
n = REGION3B_TPS_MAX;
|
|
Tstar = REGION3B_TPS_TSTAR;
|
|
}
|
|
|
|
for(i = 0; i<n; ++i, ++d){
|
|
sum += d->n * ipow(p1, d->I) * ipow(s1, d->J);
|
|
}
|
|
|
|
return sum * Tstar;
|
|
}
|
|
|
|
|
|
/**
|
|
Source: Revised_Release_Tv3ph_Tv3ps_Rev3.doc sect 3.4
|
|
*/
|
|
BackwardsData REGION3A_VPS_DATA[] = {
|
|
{-12, 10, 0.795544074093975e2}
|
|
, {-12, 12, -0.238261242984590e4}
|
|
, {-12, 14, 0.176813100617787e5}
|
|
, {-10, 4, -0.110524727080379e-2}
|
|
, {-10, 8, -0.153213833655326e2}
|
|
, {-10, 10, 0.297544599376982e3}
|
|
, {-10, 20, -0.350315206871242e8}
|
|
, {-8, 5, 0.277513761062119}
|
|
, {-8, 6, -0.523964271036888}
|
|
, {-8, 14, -0.148011182995403e6}
|
|
, {-8, 16, 0.160014899374266e7}
|
|
, {-6, 28, 0.170802322663427e13}
|
|
, {-5, 1, 0.246866996006494e-3}
|
|
, {-4, 5, 0.165326084797980e1}
|
|
, {-3, 2, -0.118008384666987}
|
|
, {-3, 4, 0.253798642355900e1}
|
|
, {-2, 3, 0.965127704669424}
|
|
, {-2, 8, -0.282172420532826e2}
|
|
, {-1, 1, 0.203224612353823}
|
|
, {-1, 2, 0.110648186063513e1}
|
|
, {0, 0, 0.526127948451280}
|
|
, {0, 1, 0.277000018736321}
|
|
, {0, 3, 0.108153340501132e1}
|
|
, {1, 0, -0.744127885357893e-1}
|
|
, {2, 0, 0.164094443541384e-1}
|
|
, {4, 2, -0.680468275301065e-1}
|
|
, {5, 2, 0.257988576101640e-1}
|
|
, {6, 0, -0.145749861944416e-3}
|
|
};
|
|
|
|
const unsigned REGION3A_VPS_MAX = sizeof(REGION3A_VPS_DATA)/sizeof(BackwardsData);
|
|
|
|
/**
|
|
Source: Revised_Release_Tv3ph_Tv3ps_Rev3.doc sect 3.4
|
|
*/
|
|
BackwardsData REGION3B_VPS_DATA[] = {
|
|
{-12, 0, 0.591599780322238e-4}
|
|
, {-12, 1, -0.185465997137856e-2}
|
|
, {-12, 2, 0.104190510480013e-1}
|
|
, {-12, 3, 0.598647302038590e-2}
|
|
, {-12, 5, -0.771391189901699}
|
|
, {-12, 6, 0.172549765557036e1}
|
|
, {-10, 0, -0.467076079846526e-3}
|
|
, {-10, 1, 0.134533823384439e-1}
|
|
, {-10, 2, -0.808094336805495e-1}
|
|
, {-10, 4, 0.508139374365767}
|
|
, {-8, 0, 0.128584643361683e-2}
|
|
, {-5, 1, -0.163899353915435e1}
|
|
, {-5, 2, 0.586938199318063e1}
|
|
, {-5, 3, -0.292466667918613e1}
|
|
, {-4, 0, -0.614076301499537e-2}
|
|
, {-4, 1, 0.576199014049172e1}
|
|
, {-4, 2, -0.121613320606788e2}
|
|
, {-4, 3, 0.167637540957944e1}
|
|
, {-3, 1, -0.744135838773463e1}
|
|
, {-2, 0, 0.378168091437659e-1}
|
|
, {-2, 1, 0.401432203027688e1}
|
|
, {-2, 2, 0.160279837479185e2}
|
|
, {-2, 3, 0.317848779347728e1}
|
|
, {-2, 4, -0.358362310304853e1}
|
|
, {-2, 12, -0.115995260446827e7}
|
|
, {0, 0, 0.199256573577909}
|
|
, {0, 1, -0.122270624794624}
|
|
, {0, 2, -0.191449143716586e2}
|
|
, {1, 0, -0.150448002905284e-1}
|
|
, {1, 2, 0.146407900162154e2}
|
|
, {2, 2, -0.327477787188230e1}
|
|
};
|
|
|
|
const unsigned REGION3B_VPS_MAX = sizeof(REGION3B_VPS_DATA)/sizeof(BackwardsData);
|
|
|
|
const double REGION3A_VPS_VSTAR = 0.0028; /* kg/m³ */
|
|
const double REGION3A_VPS_SSTAR = 4.4e3; /* J/kgK */
|
|
const double REGION3A_VPS_PSTAR = 100e6; /* Pa */
|
|
|
|
const double REGION3B_VPS_VSTAR = 0.0088; /* kg/m³ */
|
|
const double REGION3B_VPS_SSTAR = 5.3e3; /* J/kgK */
|
|
const double REGION3B_VPS_PSTAR = 100e6; /* Pa */
|
|
|
|
/**
|
|
Backward equation for temperature in terms of pressure and entropy
|
|
in IAPWS-IF97 Region 3 (composed of sub-regions 3a, 3b).
|
|
|
|
Source: IAPWS 'Revised Supplementary Release on Backward Equations for the Functions
|
|
T(p,h), v(p,h) and T(p,s), v(p,s) for Region 3 of the IAPWS Industrial
|
|
Formulation 1997 for the Thermodynamic Properties of Water and Steam', 2004.
|
|
|
|
@param p pressure in Pa
|
|
@param s specific entropy in J/kgK
|
|
@return temperature in K
|
|
*/
|
|
double freesteam_region3_v_ps(double p, double s){
|
|
|
|
IAPWS97_APPROXIMATE;
|
|
|
|
double p1, s1;
|
|
double vstar;
|
|
BackwardsData *d;
|
|
unsigned i, n;
|
|
double sum = 0;
|
|
if(s < REGION3AB_SC){
|
|
/* sub-region 3a */
|
|
//fprintf(stderr,"3A\n");
|
|
p1 = p/REGION3A_VPS_PSTAR + 0.187; s1 = s/REGION3A_VPS_SSTAR - 0.755;
|
|
d = REGION3A_VPS_DATA;
|
|
n = REGION3A_VPS_MAX;
|
|
vstar = REGION3A_VPS_VSTAR;
|
|
}else{
|
|
/* sub-region 3b */
|
|
//fprintf(stderr,"3B\n");
|
|
p1 = p/REGION3B_VPS_PSTAR + 0.298; s1 = s/REGION3B_VPS_SSTAR - 0.816;
|
|
d = REGION3B_VPS_DATA;
|
|
n = REGION3B_VPS_MAX;
|
|
vstar = REGION3B_VPS_VSTAR;
|
|
}
|
|
|
|
for(i = 0; i<n; ++i, ++d){
|
|
sum += d->n * ipow(p1, d->I) * ipow(s1, d->J);
|
|
}
|
|
|
|
return sum * vstar;
|
|
}
|
|
|
|
|