summaryrefslogtreecommitdiff
path: root/Utilib/src/region3.c
diff options
context:
space:
mode:
Diffstat (limited to 'Utilib/src/region3.c')
-rw-r--r--Utilib/src/region3.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/Utilib/src/region3.c b/Utilib/src/region3.c
new file mode 100644
index 0000000..189fb79
--- /dev/null
+++ b/Utilib/src/region3.c
@@ -0,0 +1,185 @@
+/*
+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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#define FREESTEAM_BUILDING_LIB
+#include "region.h"
+
+const double REGION3_ARHOT_TSTAR = 647.096 /* K */;
+const double REGION3_ARHOT_RHOSTAR = 322. /* K */;
+
+#define DEFINE_DELTAU(RHO,T) \
+ double del = rho / REGION3_ARHOT_RHOSTAR; \
+ double tau = REGION3_ARHOT_TSTAR / T
+
+#define R 461.526
+
+static double phi(double del, double tau);
+static double phidel(double del, double tau);
+static double phideldel(double del, double tau);
+static double phitau(double del, double tau);
+static double phitautau(double del, double tau);
+static double phideltau(double del, double tau);
+
+#include <math.h>
+
+double freesteam_region3_p_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return rho * R * T * del * phidel(del,tau);
+}
+
+double freesteam_region3_u_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return R * T * tau * phitau(del,tau);
+}
+
+double freesteam_region3_s_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return R * (tau * phitau(del,tau) - phi(del,tau));
+}
+
+double freesteam_region3_h_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return R * T * (tau * phitau(del,tau) + del * phidel(del,tau));
+}
+
+double freesteam_region3_cp_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return R * (
+ -SQ(tau) * phitautau(del,tau)
+ + (
+ ipow (del * phidel(del,tau) - del * tau * phideltau(del,tau), 2)
+ / (2 * del * phidel(del,tau) + SQ(del) * phideldel(del,tau))
+ )
+ );
+}
+
+double freesteam_region3_cv_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return R * (-SQ(tau) * phitautau(del,tau));
+}
+
+double freesteam_region3_alphap_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return 1./T * (1. - tau*phideltau(del,tau)/phidel(del,tau));
+}
+
+double freesteam_region3_betap_rhoT(double rho, double T){
+ DEFINE_DELTAU(rho,T);
+ return rho*(2. + del * phideldel(del,tau)/phidel(del,tau));
+}
+
+/*----------------------------------------------------------------------------*/
+
+typedef struct{
+ int I, J;
+ double n;
+} IJNData;
+
+const double REGION3_N1 = 0.10658070028513E+01;
+
+const IJNData REGION3_ARHOT_DATA[] = {
+ {0, 0, -0.15732845290239E+02}
+ ,{0, 1, 0.20944396974307E+02}
+ ,{0, 2, -0.76867707878716E+01}
+ ,{0, 7, 0.26185947787954E+01}
+ ,{0, 10, -0.28080781148620E+01}
+ ,{0, 12, 0.12053369696517E+01}
+ ,{0, 23, -0.84566812812502E-02}
+ ,{1, 2, -0.12654315477714E+01}
+ ,{1, 6, -0.11524407806681E+01}
+ ,{1, 15, 0.88521043984318E+00}
+ ,{1, 17, -0.64207765181607E+00}
+ ,{2, 0, 0.38493460186671E+00}
+ ,{2, 2, -0.85214708824206E+00}
+ ,{2, 6, 0.48972281541877E+01}
+ ,{2, 7, -0.30502617256965E+01}
+ ,{2, 22, 0.39420536879154E-01}
+ ,{2, 26, 0.12558408424308E+00}
+ ,{3, 0, -0.27999329698710E+00}
+ ,{3, 2, 0.13899799569460E+01}
+ ,{3, 4, -0.20189915023570E+01}
+ ,{3, 16, -0.82147637173963E-02}
+ ,{3, 26, -0.47596035734923E+00}
+ ,{4, 0, 0.43984074473500E-01}
+ ,{4, 2, -0.44476435428739E+00}
+ ,{4, 4, 0.90572070719733E+00}
+ ,{4, 26, 0.70522450087967E+00}
+ ,{5, 1, 0.10770512626332E+00}
+ ,{5, 3, -0.32913623258954E+00}
+ ,{5, 26, -0.50871062041158E+00}
+ ,{6, 0, -0.22175400873096E-01}
+ ,{6, 2, 0.94260751665092E-01}
+ ,{6, 26, 0.16436278447961E+00}
+ ,{7, 2, -0.13503372241348E-01}
+ ,{8, 26, -0.14834345352472E-01}
+ ,{9, 2, 0.57922953628084E-03}
+ ,{9, 26, 0.32308904703711E-02}
+ ,{10, 0, 0.80964802996215E-04}
+ ,{10, 1, -0.16557679795037E-03}
+ ,{11, 26, -0.44923899061815E-04}
+};
+
+const unsigned REGION3_ARHOT_MAX = sizeof(REGION3_ARHOT_DATA)/sizeof(IJNData);
+
+#define REGION3_ARHOT_LOOP \
+ double sum = 0; \
+ const IJNData *d, *e = REGION3_ARHOT_DATA + REGION3_ARHOT_MAX; \
+ for(d = REGION3_ARHOT_DATA; d < e; ++d)
+
+double phi(double del, double tau){
+ REGION3_ARHOT_LOOP{
+ sum += d->n * ipow(del, d->I) * ipow(tau, d->J);
+ }
+ return sum + REGION3_N1 * log(del);
+}
+
+double phidel(double del, double tau){
+ REGION3_ARHOT_LOOP{
+ sum += +d->n * d->I * ipow(del, d->I - 1) * ipow(tau, d->J);
+ }
+ return sum + REGION3_N1 / del;
+}
+
+double phideldel(double del, double tau){
+ REGION3_ARHOT_LOOP{
+ sum += d->n * d->I * (d->I - 1) * ipow(del, d->I - 2) * ipow(tau, d->J);
+ }
+ return sum - REGION3_N1 / SQ(del) ;
+}
+
+double phitau(double del, double tau){
+ REGION3_ARHOT_LOOP{
+ sum += d->n * ipow(del, d->I) * d->J * ipow(tau, d->J - 1);
+ }
+ return sum;
+}
+
+double phitautau(double del, double tau){
+ REGION3_ARHOT_LOOP{
+ sum += d->n * ipow(del, d->I) * d->J * (d->J - 1) * ipow(tau, d->J - 2);
+ }
+ return sum;
+}
+
+double phideltau(double del, double tau){
+ REGION3_ARHOT_LOOP{
+ sum += d->n * d->I * ipow(del, d->I - 1) * d->J * ipow(tau, d->J - 1);
+ }
+ return sum;
+}