iapws-if97 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -0
  3. package/dist/backward/hs.d.ts +16 -0
  4. package/dist/backward/hs.d.ts.map +1 -0
  5. package/dist/backward/hs.js +234 -0
  6. package/dist/backward/hs.js.map +1 -0
  7. package/dist/backward/ph.d.ts +21 -0
  8. package/dist/backward/ph.d.ts.map +1 -0
  9. package/dist/backward/ph.js +231 -0
  10. package/dist/backward/ph.js.map +1 -0
  11. package/dist/backward/ps.d.ts +13 -0
  12. package/dist/backward/ps.d.ts.map +1 -0
  13. package/dist/backward/ps.js +189 -0
  14. package/dist/backward/ps.js.map +1 -0
  15. package/dist/constants.d.ts +65 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +74 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/core/region-detector.d.ts +24 -0
  20. package/dist/core/region-detector.d.ts.map +1 -0
  21. package/dist/core/region-detector.js +409 -0
  22. package/dist/core/region-detector.js.map +1 -0
  23. package/dist/core/solver.d.ts +19 -0
  24. package/dist/core/solver.d.ts.map +1 -0
  25. package/dist/core/solver.js +92 -0
  26. package/dist/core/solver.js.map +1 -0
  27. package/dist/index.d.ts +24 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +28 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/regions/boundaries.d.ts +50 -0
  32. package/dist/regions/boundaries.d.ts.map +1 -0
  33. package/dist/regions/boundaries.js +98 -0
  34. package/dist/regions/boundaries.js.map +1 -0
  35. package/dist/regions/region1.d.ts +18 -0
  36. package/dist/regions/region1.d.ts.map +1 -0
  37. package/dist/regions/region1.js +95 -0
  38. package/dist/regions/region1.js.map +1 -0
  39. package/dist/regions/region2.d.ts +18 -0
  40. package/dist/regions/region2.d.ts.map +1 -0
  41. package/dist/regions/region2.js +134 -0
  42. package/dist/regions/region2.js.map +1 -0
  43. package/dist/regions/region3-data-am.d.ts +19 -0
  44. package/dist/regions/region3-data-am.d.ts.map +1 -0
  45. package/dist/regions/region3-data-am.js +53 -0
  46. package/dist/regions/region3-data-am.js.map +1 -0
  47. package/dist/regions/region3-data-nz.d.ts +18 -0
  48. package/dist/regions/region3-data-nz.d.ts.map +1 -0
  49. package/dist/regions/region3-data-nz.js +53 -0
  50. package/dist/regions/region3-data-nz.js.map +1 -0
  51. package/dist/regions/region3-eval.d.ts +30 -0
  52. package/dist/regions/region3-eval.d.ts.map +1 -0
  53. package/dist/regions/region3-eval.js +25 -0
  54. package/dist/regions/region3-eval.js.map +1 -0
  55. package/dist/regions/region3-subregions.d.ts +5 -0
  56. package/dist/regions/region3-subregions.d.ts.map +1 -0
  57. package/dist/regions/region3-subregions.js +164 -0
  58. package/dist/regions/region3-subregions.js.map +1 -0
  59. package/dist/regions/region3.d.ts +18 -0
  60. package/dist/regions/region3.d.ts.map +1 -0
  61. package/dist/regions/region3.js +112 -0
  62. package/dist/regions/region3.js.map +1 -0
  63. package/dist/regions/region4.d.ts +27 -0
  64. package/dist/regions/region4.d.ts.map +1 -0
  65. package/dist/regions/region4.js +62 -0
  66. package/dist/regions/region4.js.map +1 -0
  67. package/dist/regions/region5.d.ts +18 -0
  68. package/dist/regions/region5.d.ts.map +1 -0
  69. package/dist/regions/region5.js +92 -0
  70. package/dist/regions/region5.js.map +1 -0
  71. package/dist/saturation/common.d.ts +12 -0
  72. package/dist/saturation/common.d.ts.map +1 -0
  73. package/dist/saturation/common.js +75 -0
  74. package/dist/saturation/common.js.map +1 -0
  75. package/dist/saturation/two-phase.d.ts +22 -0
  76. package/dist/saturation/two-phase.d.ts.map +1 -0
  77. package/dist/saturation/two-phase.js +44 -0
  78. package/dist/saturation/two-phase.js.map +1 -0
  79. package/dist/solvers/nelder-mead.d.ts +21 -0
  80. package/dist/solvers/nelder-mead.d.ts.map +1 -0
  81. package/dist/solvers/nelder-mead.js +99 -0
  82. package/dist/solvers/nelder-mead.js.map +1 -0
  83. package/dist/solvers/newton-raphson.d.ts +25 -0
  84. package/dist/solvers/newton-raphson.d.ts.map +1 -0
  85. package/dist/solvers/newton-raphson.js +44 -0
  86. package/dist/solvers/newton-raphson.js.map +1 -0
  87. package/dist/transport/properties.d.ts +47 -0
  88. package/dist/transport/properties.d.ts.map +1 -0
  89. package/dist/transport/properties.js +205 -0
  90. package/dist/transport/properties.js.map +1 -0
  91. package/dist/types.d.ts +161 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +56 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +62 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 jltonghui
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,113 @@
1
+ # `iapws-if97`
2
+
3
+ IAPWS-IF97 water/steam properties for Node.js and TypeScript.
4
+
5
+ This library implements the industrial IAPWS-IF97 formulation for Regions 1 to 5, backward equations for `PH`, `PS`, and `HS`, saturation solvers for `Px` and `Tx`, and transport-property helpers commonly needed in engineering work.
6
+
7
+ ## Features
8
+
9
+ - Forward solver: `solvePT(p, T)`
10
+ - Backward solvers: `solvePH(p, h)`, `solvePS(p, s)`, `solveHS(h, s)`
11
+ - Saturation solvers: `solvePx(p, x)`, `solveTx(T, x)`
12
+ - Unified dispatcher: `solve({ mode, ... })`
13
+ - Region-level advanced APIs for direct access and verification
14
+ - TypeScript declarations included
15
+ - Verified against IAPWS reference tables and supplementary releases
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install iapws-if97
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ ```ts
26
+ import { solvePT, solvePH, solvePx } from 'iapws-if97';
27
+
28
+ const state = solvePT(3, 300);
29
+ console.log(state.enthalpy); // kJ/kg
30
+
31
+ const fromPH = solvePH(3, state.enthalpy);
32
+ console.log(fromPH.temperature); // K
33
+
34
+ const wetSteam = solvePx(1, 0.5);
35
+ console.log(wetSteam.quality); // 0.5
36
+ ```
37
+
38
+ ## Units
39
+
40
+ - Pressure: `MPa`
41
+ - Temperature: `K`
42
+ - Specific volume: `m^3/kg`
43
+ - Density: `kg/m^3`
44
+ - Enthalpy, internal energy: `kJ/kg`
45
+ - Entropy, heat capacities: `kJ/(kg·K)`
46
+ - Speed of sound: `m/s`
47
+ - Viscosity: `Pa·s`
48
+ - Thermal conductivity: `W/(m·K)`
49
+ - Surface tension: `N/m`
50
+
51
+ ## API
52
+
53
+ ### Main solvers
54
+
55
+ - `solvePT(p, T)`
56
+ - `solvePH(p, h)`
57
+ - `solvePS(p, s)`
58
+ - `solveHS(h, s)`
59
+ - `solvePx(p, x)`
60
+ - `solveTx(T, x)`
61
+ - `solve(input)`
62
+
63
+ ### Advanced exports
64
+
65
+ - Region functions: `region1`, `region2`, `region3ByRhoT`, `region5`
66
+ - Saturation helpers: `saturationPressure`, `saturationTemperature`
67
+ - Boundary helpers: `boundary23_T_to_P`, `boundary23_P_to_T`, `region3Volume`, `region3SatVolume`
68
+ - Transport properties: `viscosity`, `thermalConductivity`, `surfaceTension`, `dielectricConstant`, `ionizationConstant`
69
+
70
+ ## Validity notes
71
+
72
+ - Thermodynamic core follows IF97 industrial validity ranges up to `100 MPa` and `2273.15 K`, including Region 5.
73
+ - Surface tension is only meaningful on the saturation line below the critical point.
74
+ - Thermal conductivity follows the IAPWS 2011 release.
75
+ - Ionization constant uses the latest IAPWS 2024 revised release and is officially recommended for stable fluid states from `273.15 K` to `1273.15 K` and up to `1000 MPa`.
76
+
77
+ ## Verification
78
+
79
+ The test suite includes:
80
+
81
+ - Official IF97 verification tables for Regions 1 to 5
82
+ - Backward-equation round trips
83
+ - High-pressure Region 4 regression tests
84
+ - IAPWS R11-24 ionization-constant verification values
85
+ - Coverage thresholds enforced in CI-style local runs
86
+ - ASME and GB/T steam-table comparison reports for published standard values
87
+
88
+ Run locally:
89
+
90
+ ```bash
91
+ npm run build
92
+ npm test
93
+ npm run test:coverage
94
+ npm run test:standards
95
+ ```
96
+
97
+ ## References
98
+
99
+ - IAPWS R7-97(2012), Revised Release on the IAPWS Industrial Formulation 1997 for the Thermodynamic Properties of Water and Steam
100
+ - IAPWS supplementary releases for backward equations `T(p,h)`, `T(p,s)`, and `p(h,s)`
101
+ - IAPWS R15-11, Thermal Conductivity of Ordinary Water Substance
102
+ - IAPWS R1-76(2014), Surface Tension of Ordinary Water Substance
103
+ - IAPWS R11-24, Revised Release on the Ionization Constant of H2O
104
+
105
+ ## License
106
+
107
+ MIT
108
+
109
+ ## Disclaimer
110
+
111
+ This software is provided "as is", without warranty of any kind, express or implied, including but not limited to warranties of merchantability, fitness for a particular purpose, and noninfringement.
112
+
113
+ In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use of the software.
@@ -0,0 +1,16 @@
1
+ /**
2
+ * IAPWS-IF97 Backward Equations: H-S -> P, T
3
+ *
4
+ * Given specific enthalpy and entropy, compute pressure and temperature.
5
+ * Uses backward P(h,s) equations for initial guess + Nelder-Mead refinement.
6
+ *
7
+ * Reference: IAPWS-IF97 Supplementary Release on Backward Equations p(h,s)
8
+ */
9
+ import type { BasicProperties } from '../types.js';
10
+ /**
11
+ * Solve for thermodynamic state given H and S.
12
+ * @param h - Specific enthalpy [kJ/kg]
13
+ * @param s - Specific entropy [kJ/(kg·K)]
14
+ */
15
+ export declare function solveHS(h: number, s: number): BasicProperties;
16
+ //# sourceMappingURL=hs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs.d.ts","sourceRoot":"","sources":["../../src/backward/hs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAmMrE;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CA8F7D"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * IAPWS-IF97 Backward Equations: H-S -> P, T
3
+ *
4
+ * Given specific enthalpy and entropy, compute pressure and temperature.
5
+ * Uses backward P(h,s) equations for initial guess + Nelder-Mead refinement.
6
+ *
7
+ * Reference: IAPWS-IF97 Supplementary Release on Backward Equations p(h,s)
8
+ */
9
+ import { Region, IF97Error } from '../types.js';
10
+ import * as C from '../constants.js';
11
+ import { region1 } from '../regions/region1.js';
12
+ import { region2 } from '../regions/region2.js';
13
+ import { region3ByRhoT } from '../regions/region3.js';
14
+ import { region5 } from '../regions/region5.js';
15
+ import { detectRegionHS } from '../core/region-detector.js';
16
+ import { newtonRaphson } from '../solvers/newton-raphson.js';
17
+ import { nelderMead } from '../solvers/nelder-mead.js';
18
+ import { solvePH } from './ph.js';
19
+ import { mixSaturationState, qualityFromSaturationProperty, saturationEndpointsAtPressure, saturationEndpointsAtTemperature, } from '../saturation/common.js';
20
+ // ─── Backward Polynomial Evaluator ─────────────────────────────────────────
21
+ function evalPoly(table, aShift, bShift, a, b) {
22
+ let sum = 0;
23
+ for (const [I, J, N] of table) {
24
+ sum += N * Math.pow(a - aShift, I) * Math.pow(b - bShift, J);
25
+ }
26
+ return sum;
27
+ }
28
+ // ─── Region 1 P(h,s) — 19 coefficients ─────────────────────────────────────
29
+ const R1_PHS = [
30
+ [0, 0, -0.691997014660582], [0, 1, -18.361254878756], [0, 2, -9.28332409297335],
31
+ [0, 4, 65.9639569909906], [0, 5, -16.2060388912024], [0, 6, 450.620017338667],
32
+ [0, 8, 854.68067822417], [0, 14, 6075.23214001161], [1, 0, 32.6487682621856],
33
+ [1, 1, -26.9408844582931], [1, 4, -319.9478483343], [1, 6, -928.35430704332],
34
+ [2, 0, 30.3634537455249], [2, 1, -65.0540422444146], [2, 10, -4309.1316516130],
35
+ [3, 4, -747.512324096068], [4, 1, 730.000345529245], [4, 4, 1142.84032569021],
36
+ [5, 0, -436.407041874559],
37
+ ];
38
+ function r1Phs(h, s) {
39
+ const mu = h / 3400;
40
+ const sig = s / 7.6;
41
+ return 100 * evalPoly(R1_PHS, -0.05, -0.05, mu, sig);
42
+ }
43
+ // ─── Region 2 P(h,s) — Subregions 2a, 2b, 2c ──────────────────────────────
44
+ /** Boundary between Region 2a and Region 2b in h-s plane. */
45
+ function b2abBoundary(s) {
46
+ return -3498.98083432139 + 2575.60716905876 * s - 421.073558227969 * s * s + 27.6349063799944 * s * s * s;
47
+ }
48
+ const R2A_PHS = [
49
+ [0, 1, -0.0182575361923032], [0, 3, -0.125229548799536], [0, 6, 0.592290437320145],
50
+ [0, 16, 6.04769706185122], [0, 20, 238.624965444474], [0, 22, -298.639090222922],
51
+ [1, 0, 0.051225081304075], [1, 1, -0.437266515606486], [1, 2, 0.413336902999504],
52
+ [1, 3, -5.16468254574773], [1, 5, -5.57014838445711], [1, 6, 12.8555037824478],
53
+ [1, 10, 11.414410895329], [1, 16, -119.504225652714], [1, 20, -2847.7798596156],
54
+ [1, 22, 4317.57846408006], [2, 3, 1.1289404080265], [2, 16, 1974.09186206319],
55
+ [2, 20, 1516.12444706087], [3, 0, 0.0141324451421235], [3, 2, 0.585501282219601],
56
+ [3, 3, -2.97258075863012], [3, 6, 5.94567314847319], [3, 16, -6236.56565798905],
57
+ [4, 16, 9659.86235133332], [5, 3, 6.81500934948134], [5, 16, -6332.07286824489],
58
+ [6, 3, -5.5891922446576], [7, 1, 0.0400645798472063],
59
+ ];
60
+ function r2aPhs(h, s) {
61
+ const mu = h / 4200;
62
+ const sig = s / 12;
63
+ const P = evalPoly(R2A_PHS, 0.5, 1.2, mu, sig);
64
+ return 4 * P * P * P * P;
65
+ }
66
+ const R2B_PHS = [
67
+ [0, 0, 0.0801496989929495], [0, 1, -0.543862807146111], [0, 2, 0.337455597421283],
68
+ [0, 4, 8.9055545115745], [0, 8, 313.840736431485], [1, 0, 0.797367065977789],
69
+ [1, 1, -1.2161697355624], [1, 2, 8.72803386937477], [1, 3, -16.9769781757602],
70
+ [1, 5, -186.552827328416], [1, 12, 95115.9274344237], [2, 1, -18.9168510120494],
71
+ [2, 6, -4334.0703719484], [2, 18, 543212633.012715], [3, 0, 0.144793408386013],
72
+ [3, 1, 128.024559637516], [3, 7, -67230.9534071268], [3, 12, 33697238.0095287],
73
+ [4, 1, -586.63419676272], [4, 16, -22140322476.9889], [5, 1, 1716.06668708389],
74
+ [5, 12, -570817595.806302], [6, 1, -3121.09693178482], [6, 8, -2078413.8463301],
75
+ [6, 18, 3056059461577.86], [7, 1, 3221.57004314333], [7, 16, 326810259797.295],
76
+ [8, 1, -1441.04158934487], [8, 3, 410.694867802691], [8, 14, 109077066873.024],
77
+ [8, 18, -24796465425889.3], [12, 10, 1888019068.65134], [14, 16, -123651009018773],
78
+ ];
79
+ function r2bPhs(h, s) {
80
+ const mu = h / 4100;
81
+ const sig = s / 7.9;
82
+ const P = evalPoly(R2B_PHS, 0.6, 1.01, mu, sig);
83
+ return 100 * P * P * P * P;
84
+ }
85
+ const R2C_PHS = [
86
+ [0, 0, 0.112225607199012], [0, 1, -3.39005953606712], [0, 2, -32.0503911730094],
87
+ [0, 3, -197.5973051049], [0, 4, -407.693861553446], [0, 8, 13294.3775222331],
88
+ [1, 0, 1.70846839774007], [1, 2, 37.3694198142245], [1, 5, 3581.44365815434],
89
+ [1, 8, 423014.446424664], [1, 14, -751071025.760063], [2, 2, 52.3446127607898],
90
+ [2, 3, -228.351290812417], [2, 7, -960652.417056937], [2, 10, -80705929.2526074],
91
+ [2, 18, 1626980172256.69], [3, 0, 0.772465073604171], [3, 5, 46392.9973837746],
92
+ [3, 8, -13731788.5134128], [3, 16, 1704703926305.12], [3, 18, -25110462818730.8],
93
+ [4, 18, 31774883083552.0], [5, 1, 53.8685623675312], [5, 4, -55308.9094625169],
94
+ [5, 6, -1028615.22421405], [5, 14, 2042494187562.34], [6, 8, 273918446.626977],
95
+ [6, 18, -2.63963146312685e15], [10, 7, -1078908541.08088], [12, 7, -29649262098.0124],
96
+ [16, 10, -1.11754907323424e15],
97
+ ];
98
+ function r2cPhs(h, s) {
99
+ const mu = h / 3500;
100
+ const sig = s / 5.9;
101
+ const P = evalPoly(R2C_PHS, 0.7, 1.1, mu, sig);
102
+ return 100 * P * P * P * P;
103
+ }
104
+ function r2Phs(h, s) {
105
+ const hBound = b2abBoundary(s);
106
+ if (h <= hBound)
107
+ return r2aPhs(h, s);
108
+ if (s >= 5.85)
109
+ return r2bPhs(h, s);
110
+ return r2cPhs(h, s);
111
+ }
112
+ // ─── Region 3 P(h,s) — Subregions 3a, 3b ───────────────────────────────────
113
+ const R3A_PHS = [
114
+ [0, 0, 7.70889828326934], [0, 1, -26.0835009128688], [0, 5, 267.416218930389],
115
+ [1, 0, 17.2221089496844], [1, 3, -293.54233214597], [1, 4, 614.135601882478],
116
+ [1, 8, -61056.2757725674], [1, 14, -65127225.1118219], [2, 6, 73591.9313521937],
117
+ [2, 16, -11664650591.4191], [3, 0, 35.5267086434461], [3, 2, -596.144543825955],
118
+ [3, 3, -475.842430145708], [4, 0, 69.6781965359503], [4, 1, 335.674250377312],
119
+ [4, 4, 25052.6809130882], [4, 5, 146997.380630766], [5, 28, 5.38069315091534e19],
120
+ [6, 28, 1.43619827291346e21], [7, 24, 3.64985866165990e19], [8, 1, -2547.41561156775],
121
+ [10, 32, 2.40120197096563e27], [10, 36, -3.93847464679496e29], [14, 22, 1.47073407024852e24],
122
+ [18, 28, -4.26391250432059e31], [20, 36, 1.94509340621077e38], [22, 16, 6.66212132114896e23],
123
+ [22, 28, 7.06777016552858e33], [24, 36, 1.75563621975576e41], [28, 16, 1.08408607429124e28],
124
+ [28, 36, 7.30872705175151e43], [32, 10, 1.5914584739887e24], [32, 28, 3.77121605943324e40],
125
+ ];
126
+ function r3aPhs(h, s) {
127
+ const mu = h / 2300;
128
+ const sig = s / 4.4;
129
+ return 99 * evalPoly(R3A_PHS, 1.01, 0.75, mu, sig);
130
+ }
131
+ const R3B_PHS = [
132
+ [-12, 2, 1.25244360717979e-13], [-12, 10, -0.0126599322553713], [-12, 12, 5.06878030140626],
133
+ [-12, 14, 31.7847171154202], [-12, 20, -391041.161399932], [-10, 2, -9.75733406392044e-11],
134
+ [-10, 10, -18.6312419488279], [-10, 14, 510.973543414101], [-10, 18, 373847.005822362],
135
+ [-8, 2, 2.99804024666572e-8], [-8, 8, 20.0544393820342], [-6, 2, -4.98030487662829e-6],
136
+ [-6, 6, -10.230180636003], [-6, 7, 55.2819126990325], [-6, 8, -206.211367510878],
137
+ [-5, 10, -7940.12232324823], [-4, 4, 7.82248472028153], [-4, 5, -58.6544326902468],
138
+ [-4, 8, 3550.73647696481], [-3, 1, -1.15303107290162e-4], [-3, 3, -1.75092403171802],
139
+ [-3, 5, 257.98168774816], [-3, 6, -727.048374179467], [-2, 0, 1.21644822609198e-4],
140
+ [-2, 1, 0.0393137871762692], [-1, 0, 7.04181005909296e-3], [0, 3, -82.910820069811],
141
+ [2, 0, -0.26517881813125], [2, 1, 13.7531682453991], [5, 0, -52.3940907530460],
142
+ [6, 1, 2405.56298941048], [8, 1, -22736.1631268929], [10, 1, 89074.6343932567],
143
+ [14, 3, -23923456.5822486], [14, 7, 5687958081.29714],
144
+ ];
145
+ function r3bPhs(h, s) {
146
+ const mu = h / 2800;
147
+ const sig = s / 5.3;
148
+ return 16.6 / evalPoly(R3B_PHS, 0.681, 0.792, mu, sig);
149
+ }
150
+ function r3Phs(h, s) {
151
+ if (s <= C.R3_S_CRT)
152
+ return r3aPhs(h, s);
153
+ return r3bPhs(h, s);
154
+ }
155
+ // ─── Region 4 Tsat(h,s) — Eq. 9 ────────────────────────────────────────────
156
+ const R4_THS = [
157
+ [0, 0, 0.179882673606601], [0, 3, -0.267507455199603], [0, 12, 1.1627672261266],
158
+ [1, 0, 0.147545428713616], [1, 1, -0.512871635973248], [1, 2, 0.421333567697984],
159
+ [1, 5, 0.56374952218987], [2, 0, 0.429274443819153], [2, 5, -3.3570455214214],
160
+ [2, 8, 10.8890916499278], [3, 0, -0.248483390456012], [3, 2, 0.30415322190639],
161
+ [3, 3, -0.494819763939905], [3, 4, 1.07551674933261], [4, 0, 0.0733888415457688],
162
+ [4, 1, 0.0140170545411085], [5, 1, -0.106110975998808], [5, 2, 0.0168324361811875],
163
+ [5, 4, 1.25028363714877], [5, 16, 1013.16840309509], [6, 6, -1.51791558000712],
164
+ [6, 8, 52.4277865990866], [6, 22, 23049.5545563912], [8, 1, 0.0249459806365456],
165
+ [10, 20, 2107964.67412137], [10, 36, 3.66836848613065e8], [12, 24, -1.44814105365163e8],
166
+ [14, 1, -1.7927637300359e-3], [14, 28, 4.89955602100459e9], [16, 12, 471.262212070518],
167
+ [16, 32, -8.29294390198652e10], [18, 14, -1715.45662263191], [18, 22, 3557776.82973575],
168
+ [18, 36, 5.86062760258436e11], [20, 24, -1.29887635078195e7], [28, 36, 3.17247449371057e10],
169
+ ];
170
+ function r4Ths(h, s) {
171
+ const mu = h / 2800;
172
+ const sig = s / 9.2;
173
+ return 550 * evalPoly(R4_THS, 0.119, 1.07, mu, sig);
174
+ }
175
+ // ─── Main HS Solver ─────────────────────────────────────────────────────────
176
+ /**
177
+ * Solve for thermodynamic state given H and S.
178
+ * @param h - Specific enthalpy [kJ/kg]
179
+ * @param s - Specific entropy [kJ/(kg·K)]
180
+ */
181
+ export function solveHS(h, s) {
182
+ const region = detectRegionHS(h, s);
183
+ switch (region) {
184
+ case Region.Region1: {
185
+ const P0 = r1Phs(h, s);
186
+ const sol = nelderMead((pair) => Math.abs(region1(pair[0], pair[1]).enthalpy - h) +
187
+ Math.abs(region1(pair[0], pair[1]).entropy - s), [P0, 400]);
188
+ return region1(sol.x[0], sol.x[1]);
189
+ }
190
+ case Region.Region2: {
191
+ const P0 = r2Phs(h, s);
192
+ const T0 = newtonRaphson((T) => region2(P0, T).enthalpy - h, 500);
193
+ const sol = nelderMead((pair) => Math.abs(region2(pair[0], pair[1]).enthalpy - h) +
194
+ Math.abs(region2(pair[0], pair[1]).entropy - s), [P0, T0]);
195
+ return region2(sol.x[0], sol.x[1]);
196
+ }
197
+ case Region.Region3: {
198
+ const P0 = r3Phs(h, s);
199
+ const init = solvePH(P0, h);
200
+ const rho0 = 1 / init.specificVolume;
201
+ const T0 = init.temperature;
202
+ const sol = nelderMead((pair) => Math.abs(region3ByRhoT(pair[0], pair[1]).enthalpy - h) +
203
+ Math.abs(region3ByRhoT(pair[0], pair[1]).entropy - s), [rho0, T0]);
204
+ return region3ByRhoT(sol.x[0], sol.x[1]);
205
+ }
206
+ case Region.Region4: {
207
+ // Critical point check
208
+ if (Math.abs(s - C.R3_S_CRT) < 1e-6 && Math.abs(h - C.R3_H_CRT) < 1e-6) {
209
+ return region3ByRhoT(C.RHOc, C.Tc);
210
+ }
211
+ let T = r4Ths(h, s);
212
+ T = Math.max(273.15, Math.min(T, C.Tc - 0.001));
213
+ const temperature = newtonRaphson((temperatureGuess) => {
214
+ const endpoints = saturationEndpointsAtTemperature(Math.max(273.15, Math.min(temperatureGuess, C.Tc - 0.001)));
215
+ const xh = qualityFromSaturationProperty(endpoints.liquid.enthalpy, endpoints.vapor.enthalpy, h);
216
+ const xs = qualityFromSaturationProperty(endpoints.liquid.entropy, endpoints.vapor.entropy, s);
217
+ return xh - xs;
218
+ }, T);
219
+ const finalTemperature = Math.max(273.15, Math.min(temperature, C.Tc - 0.001));
220
+ const endpoints = saturationEndpointsAtTemperature(finalTemperature);
221
+ const quality = (qualityFromSaturationProperty(endpoints.liquid.enthalpy, endpoints.vapor.enthalpy, h) +
222
+ qualityFromSaturationProperty(endpoints.liquid.entropy, endpoints.vapor.entropy, s)) / 2;
223
+ return mixSaturationState(saturationEndpointsAtPressure(endpoints.pressure), quality);
224
+ }
225
+ case Region.Region5: {
226
+ const sol = nelderMead((pair) => Math.abs(region5(pair[0], pair[1]).enthalpy - h) +
227
+ Math.abs(region5(pair[0], pair[1]).entropy - s), [1, 1400]);
228
+ return region5(sol.x[0], sol.x[1]);
229
+ }
230
+ default:
231
+ throw new IF97Error(`Cannot determine region for h=${h} kJ/kg, s=${s} kJ/(kg·K)`);
232
+ }
233
+ }
234
+ //# sourceMappingURL=hs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hs.js","sourceRoot":"","sources":["../../src/backward/hs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * IAPWS-IF97 Backward Equations: P-H → T, v
3
+ *
4
+ * Given pressure and specific enthalpy, compute temperature (and volume for R3).
5
+ * Uses backward equations for initial guess + Newton-Raphson refinement.
6
+ *
7
+ * Reference: IAPWS-IF97 Supplementary Release on Backward Equations
8
+ */
9
+ import type { BasicProperties } from '../types.js';
10
+ export declare function b2bc_H_P(h: number): number;
11
+ /** B3ab boundary: P → H */
12
+ export declare function b3ab_P_to_H(p: number): number;
13
+ /** R4: enthalpy → saturation pressure for PH boundary detection */
14
+ export declare function r4EnthalpyToPsat(h: number): number;
15
+ /**
16
+ * Solve for thermodynamic state given P and H.
17
+ * @param p - Pressure [MPa]
18
+ * @param h - Specific enthalpy [kJ/kg]
19
+ */
20
+ export declare function solvePH(p: number, h: number): BasicProperties;
21
+ //# sourceMappingURL=ph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ph.d.ts","sourceRoot":"","sources":["../../src/backward/ph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AA6CrE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1C;AA0ED,2BAA2B;AAC3B,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAkED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOlD;AAID;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CA+C7D"}