diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Utilib/src/region3.c | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Utilib/src/region3.c')
| -rw-r--r-- | Utilib/src/region3.c | 185 |
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; +} |
