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
@@ -0,0 +1,112 @@
1
+ /**
2
+ * IAPWS-IF97 Region 3: Supercritical Fluid
3
+ *
4
+ * Basic equation for the specific Helmholtz free energy φ(δ,τ)
5
+ * Valid for: 623.15 K ≤ T ≤ T_B23(P), P_B23(T) ≤ P ≤ 100 MPa
6
+ *
7
+ * Reference: IAPWS-IF97, Section 7 (Equations for Region 3)
8
+ */
9
+ import { R } from '../constants.js';
10
+ import { Region } from '../types.js';
11
+ // ─── Coefficient Table (Table 30, IAPWS-IF97) ──────────────────────────────
12
+ const COEFFICIENTS = [
13
+ [0, 0, 1.0658070028513],
14
+ [0, 0, -0.15732845290239e2],
15
+ [0, 1, 0.20944396974307e2],
16
+ [0, 2, -0.76867707878716e1],
17
+ [0, 7, 0.26185947787954e1],
18
+ [0, 10, -0.28080781148620e1],
19
+ [0, 12, 0.12053369696517e1],
20
+ [0, 23, -0.84566812812502e-2],
21
+ [1, 2, -0.12654315477714e1],
22
+ [1, 6, -0.11524407806681e1],
23
+ [1, 15, 0.88521043984318],
24
+ [1, 17, -0.64207765181607],
25
+ [2, 0, 0.38493460186671],
26
+ [2, 2, -0.85214708824206],
27
+ [2, 6, 0.48972281541877e1],
28
+ [2, 7, -0.30502617256965e1],
29
+ [2, 22, 0.39420536879154e-1],
30
+ [2, 26, 0.12558408424308],
31
+ [3, 0, -0.27999329698710],
32
+ [3, 2, 0.13899799569460e1],
33
+ [3, 4, -0.20189915023570e1],
34
+ [3, 16, -0.82147637173963e-2],
35
+ [3, 26, -0.47596035734923],
36
+ [4, 0, 0.43984074473500e-1],
37
+ [4, 2, -0.44476435428739],
38
+ [4, 4, 0.90572070719733],
39
+ [4, 26, 0.70522450087967],
40
+ [5, 1, 0.10770512626332],
41
+ [5, 3, -0.32913623258954],
42
+ [5, 26, -0.50871062041158],
43
+ [6, 0, -0.22175400873096e-1],
44
+ [6, 2, 0.94260751665092e-1],
45
+ [6, 26, 0.16436278447961],
46
+ [7, 2, -0.13503372241348e-1],
47
+ [8, 26, -0.14834345352472e-1],
48
+ [9, 2, 0.57922953628084e-3],
49
+ [9, 26, 0.32308904703711e-2],
50
+ [10, 0, 0.80964802996215e-4],
51
+ [10, 1, -0.16557679795037e-3],
52
+ [11, 26, -0.44923899061815e-4],
53
+ ];
54
+ // Reduction constants for Region 3
55
+ const RHO_STAR = 322; // ρ* [kg/m³] (critical density)
56
+ const T_STAR = 647.096; // T* [K] (critical temperature)
57
+ /**
58
+ * Compute Region 3 thermodynamic properties from density and temperature.
59
+ *
60
+ * @param rho - Density [kg/m³]
61
+ * @param T - Temperature [K]
62
+ * @returns Basic thermodynamic properties
63
+ */
64
+ export function region3ByRhoT(rho, T) {
65
+ const delta = rho / RHO_STAR;
66
+ const tau = T_STAR / T;
67
+ const v = 1 / rho;
68
+ // First entry is the logarithmic term: n₁ · ln(δ)
69
+ const n1 = COEFFICIENTS[0][2];
70
+ let phi = n1 * Math.log(delta);
71
+ let phi_delta = n1 / delta;
72
+ let phi_deltadelta = -n1 / (delta * delta);
73
+ let phi_tau = 0;
74
+ let phi_tautau = 0;
75
+ let phi_deltatau = 0;
76
+ // Sum from i = 1 (skip index 0 which is the ln term)
77
+ for (let idx = 1; idx < COEFFICIENTS.length; idx++) {
78
+ const [I, J, N] = COEFFICIENTS[idx];
79
+ const deltaPow = Math.pow(delta, I);
80
+ const tauPow = Math.pow(tau, J);
81
+ phi += N * deltaPow * tauPow;
82
+ phi_delta += N * I * Math.pow(delta, I - 1) * tauPow;
83
+ phi_deltadelta += N * I * (I - 1) * Math.pow(delta, I - 2) * tauPow;
84
+ phi_tau += N * deltaPow * J * Math.pow(tau, J - 1);
85
+ phi_tautau += N * deltaPow * J * (J - 1) * Math.pow(tau, J - 2);
86
+ phi_deltatau += N * I * Math.pow(delta, I - 1) * J * Math.pow(tau, J - 1);
87
+ }
88
+ return {
89
+ region: Region.Region3,
90
+ pressure: rho * R * T * delta * phi_delta / 1000,
91
+ temperature: T,
92
+ specificVolume: v,
93
+ internalEnergy: R * T * tau * phi_tau,
94
+ entropy: R * (tau * phi_tau - phi),
95
+ enthalpy: R * T * (tau * phi_tau + delta * phi_delta),
96
+ cp: R * (-tau * tau * phi_tautau +
97
+ Math.pow(delta * phi_delta - delta * tau * phi_deltatau, 2) /
98
+ (2 * delta * phi_delta + delta * delta * phi_deltadelta)),
99
+ cv: R * (-tau * tau * phi_tautau),
100
+ speedOfSound: Math.sqrt(1000 * R * T * (2 * delta * phi_delta +
101
+ delta * delta * phi_deltadelta -
102
+ Math.pow(delta * phi_delta - delta * tau * phi_deltatau, 2) /
103
+ (tau * tau * phi_tautau))),
104
+ quality: null,
105
+ isobaricExpansion: (phi_delta - tau * phi_deltatau) /
106
+ (2 * phi_delta + delta * phi_deltadelta) / T,
107
+ isothermalCompressibility: 1 /
108
+ (2 * delta * phi_delta + delta * delta * phi_deltadelta) /
109
+ rho / R / T * 1000,
110
+ };
111
+ }
112
+ //# sourceMappingURL=region3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region3.js","sourceRoot":"","sources":["../../src/regions/region3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * IAPWS-IF97 Region 4: Saturation Line
3
+ *
4
+ * Saturation-pressure equation (Eq. 30) and saturation-temperature equation (Eq. 31)
5
+ * Valid for: 273.15 K ≤ T ≤ 647.096 K
6
+ *
7
+ * Reference: IAPWS-IF97, Section 8 (Equations for Region 4)
8
+ */
9
+ /**
10
+ * Saturation pressure for a given temperature.
11
+ * Equation 30 (pp. 33) of IAPWS-IF97.
12
+ *
13
+ * @param T - Temperature [K], 273.15 ≤ T ≤ 647.096
14
+ * @returns Saturation pressure [MPa]
15
+ * @throws {OutOfRangeError} if T is outside valid range
16
+ */
17
+ export declare function saturationPressure(T: number): number;
18
+ /**
19
+ * Saturation temperature for a given pressure.
20
+ * Equation 31 (pp. 34) of IAPWS-IF97.
21
+ *
22
+ * @param p - Pressure [MPa], Pt ≤ P ≤ Pc
23
+ * @returns Saturation temperature [K]
24
+ * @throws {OutOfRangeError} if P is outside valid range
25
+ */
26
+ export declare function saturationTemperature(p: number): number;
27
+ //# sourceMappingURL=region4.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region4.d.ts","sourceRoot":"","sources":["../../src/regions/region4.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqBH;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAWpD;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAcvD"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * IAPWS-IF97 Region 4: Saturation Line
3
+ *
4
+ * Saturation-pressure equation (Eq. 30) and saturation-temperature equation (Eq. 31)
5
+ * Valid for: 273.15 K ≤ T ≤ 647.096 K
6
+ *
7
+ * Reference: IAPWS-IF97, Section 8 (Equations for Region 4)
8
+ */
9
+ import { Tc, Pt, Pc } from '../constants.js';
10
+ import { OutOfRangeError } from '../types.js';
11
+ // ─── Saturation Line Coefficients (Table 34, IAPWS-IF97) ───────────────────
12
+ const n = [
13
+ 0, // n[0] unused (1-indexed)
14
+ 0.11670521452767e4,
15
+ -0.72421316703206e6,
16
+ -0.17073846940092e2,
17
+ 0.12020824702470e5,
18
+ -0.32325550322333e7,
19
+ 0.14915108613530e2,
20
+ -0.48232657361591e4,
21
+ 0.40511340542057e6,
22
+ -0.23855557567849e0,
23
+ 0.65017534844798e3,
24
+ ];
25
+ /**
26
+ * Saturation pressure for a given temperature.
27
+ * Equation 30 (pp. 33) of IAPWS-IF97.
28
+ *
29
+ * @param T - Temperature [K], 273.15 ≤ T ≤ 647.096
30
+ * @returns Saturation pressure [MPa]
31
+ * @throws {OutOfRangeError} if T is outside valid range
32
+ */
33
+ export function saturationPressure(T) {
34
+ if (T < 273.15 || T > Tc) {
35
+ throw new OutOfRangeError('Temperature', T, 273.15, Tc);
36
+ }
37
+ const theta = T + n[9] / (T - n[10]);
38
+ const A = theta * theta + n[1] * theta + n[2];
39
+ const B = n[3] * theta * theta + n[4] * theta + n[5];
40
+ const C = n[6] * theta * theta + n[7] * theta + n[8];
41
+ return Math.pow(2 * C / (-B + Math.sqrt(B * B - 4 * A * C)), 4);
42
+ }
43
+ /**
44
+ * Saturation temperature for a given pressure.
45
+ * Equation 31 (pp. 34) of IAPWS-IF97.
46
+ *
47
+ * @param p - Pressure [MPa], Pt ≤ P ≤ Pc
48
+ * @returns Saturation temperature [K]
49
+ * @throws {OutOfRangeError} if P is outside valid range
50
+ */
51
+ export function saturationTemperature(p) {
52
+ if (p < Pt || p > Pc) {
53
+ throw new OutOfRangeError('Pressure', p, Pt, Pc);
54
+ }
55
+ const beta = Math.pow(p, 0.25);
56
+ const E = beta * beta + n[3] * beta + n[6];
57
+ const F = n[1] * beta * beta + n[4] * beta + n[7];
58
+ const G = n[2] * beta * beta + n[5] * beta + n[8];
59
+ const D = 2 * G / (-F - Math.sqrt(F * F - 4 * E * G));
60
+ return (n[10] + D - Math.sqrt(Math.pow(n[10] + D, 2) - 4 * (n[9] + n[10] * D))) / 2;
61
+ }
62
+ //# sourceMappingURL=region4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region4.js","sourceRoot":"","sources":["../../src/regions/region4.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * IAPWS-IF97 Region 5: High-Temperature Steam
3
+ *
4
+ * Basic equation for the specific Gibbs free energy γ(π,τ) = γ°(π,τ) + γʳ(π,τ)
5
+ * Valid for: 1073.15 K < T ≤ 2273.15 K, P ≤ 50 MPa
6
+ *
7
+ * Reference: IAPWS-IF97, Section 9 (Equations for Region 5)
8
+ */
9
+ import type { BasicProperties } from '../types.js';
10
+ /**
11
+ * Compute Region 5 thermodynamic properties from pressure and temperature.
12
+ *
13
+ * @param p - Pressure [MPa]
14
+ * @param T - Temperature [K]
15
+ * @returns Basic thermodynamic properties
16
+ */
17
+ export declare function region5(p: number, T: number): BasicProperties;
18
+ //# sourceMappingURL=region5.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region5.d.ts","sourceRoot":"","sources":["../../src/regions/region5.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,aAAa,CAAC;AAyBrE;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAoE7D"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * IAPWS-IF97 Region 5: High-Temperature Steam
3
+ *
4
+ * Basic equation for the specific Gibbs free energy γ(π,τ) = γ°(π,τ) + γʳ(π,τ)
5
+ * Valid for: 1073.15 K < T ≤ 2273.15 K, P ≤ 50 MPa
6
+ *
7
+ * Reference: IAPWS-IF97, Section 9 (Equations for Region 5)
8
+ */
9
+ import { R } from '../constants.js';
10
+ import { Region } from '../types.js';
11
+ // ─── Ideal Part Coefficients (Table 37) ─────────────────────────────────────
12
+ const IDEAL_COEFFICIENTS = [
13
+ [0, -13.179983674201],
14
+ [1, 6.8540841634434],
15
+ [-3, -0.024805148933466],
16
+ [-2, 0.36901534980333],
17
+ [-1, -3.1161318213925],
18
+ [2, -0.32961626538917],
19
+ ];
20
+ // ─── Residual Part Coefficients (Table 38) ──────────────────────────────────
21
+ const RESIDUAL_COEFFICIENTS = [
22
+ [1, 1, 1.5736404855259e-3],
23
+ [1, 2, 9.0153761673944e-4],
24
+ [1, 3, -5.0270077677648e-3],
25
+ [2, 3, 2.2440037409485e-6],
26
+ [2, 9, -4.1163275453471e-6],
27
+ [3, 7, 3.7919454822955e-8],
28
+ ];
29
+ /**
30
+ * Compute Region 5 thermodynamic properties from pressure and temperature.
31
+ *
32
+ * @param p - Pressure [MPa]
33
+ * @param T - Temperature [K]
34
+ * @returns Basic thermodynamic properties
35
+ */
36
+ export function region5(p, T) {
37
+ const pi = p;
38
+ const tau = 1000 / T;
39
+ // ── Ideal part ──
40
+ let gi = Math.log(pi);
41
+ let gi_pi = 1 / pi;
42
+ // gi_pipi = -1/(pi*pi) — not needed for Region 5 properties
43
+ let gi_tau = 0;
44
+ let gi_tautau = 0;
45
+ for (const [J, N] of IDEAL_COEFFICIENTS) {
46
+ gi += N * Math.pow(tau, J);
47
+ gi_tau += N * J * Math.pow(tau, J - 1);
48
+ gi_tautau += N * J * (J - 1) * Math.pow(tau, J - 2);
49
+ }
50
+ // ── Residual part ──
51
+ let gr = 0;
52
+ let gr_pi = 0;
53
+ let gr_pipi = 0;
54
+ let gr_tau = 0;
55
+ let gr_tautau = 0;
56
+ let gr_pitau = 0;
57
+ for (const [I, J, N] of RESIDUAL_COEFFICIENTS) {
58
+ const piPow = Math.pow(pi, I);
59
+ const tauPow = Math.pow(tau, J);
60
+ gr += N * piPow * tauPow;
61
+ gr_pi += N * I * Math.pow(pi, I - 1) * tauPow;
62
+ gr_pipi += N * I * (I - 1) * Math.pow(pi, I - 2) * tauPow;
63
+ gr_tau += N * piPow * J * Math.pow(tau, J - 1);
64
+ gr_tautau += N * piPow * J * (J - 1) * Math.pow(tau, J - 2);
65
+ gr_pitau += N * I * Math.pow(pi, I - 1) * J * Math.pow(tau, J - 1);
66
+ }
67
+ const gp = gi_pi + gr_pi;
68
+ const gt = gi_tau + gr_tau;
69
+ const gtt = gi_tautau + gr_tautau;
70
+ return {
71
+ region: Region.Region5,
72
+ pressure: p,
73
+ temperature: T,
74
+ specificVolume: R * T * pi * gp / (1000 * p),
75
+ internalEnergy: R * T * (tau * gt - pi * gp),
76
+ entropy: R * (tau * gt - (gi + gr)),
77
+ enthalpy: R * T * tau * gt,
78
+ cp: -R * tau * tau * gtt,
79
+ cv: R * (-tau * tau * gtt -
80
+ Math.pow(1 + pi * gr_pi - tau * pi * gr_pitau, 2) /
81
+ (1 - pi * pi * gr_pipi)),
82
+ speedOfSound: Math.sqrt(1000 * R * T *
83
+ (1 + 2 * pi * gr_pi + pi * pi * gr_pi * gr_pi) /
84
+ ((1 - pi * pi * gr_pipi) +
85
+ Math.pow(1 + pi * gr_pi - tau * pi * gr_pitau, 2) /
86
+ (tau * tau * gtt))),
87
+ quality: null,
88
+ isobaricExpansion: (1 + pi * gr_pi - tau * pi * gr_pitau) / (1 + pi * gr_pi) / T,
89
+ isothermalCompressibility: (1 - pi * pi * gr_pipi) / (1 + pi * gr_pi) / p,
90
+ };
91
+ }
92
+ //# sourceMappingURL=region5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region5.js","sourceRoot":"","sources":["../../src/regions/region5.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { BasicProperties } from '../types.js';
2
+ export interface SaturationEndpoints {
3
+ pressure: number;
4
+ temperature: number;
5
+ liquid: BasicProperties;
6
+ vapor: BasicProperties;
7
+ }
8
+ export declare function saturationEndpointsAtPressure(p: number): SaturationEndpoints;
9
+ export declare function saturationEndpointsAtTemperature(T: number): SaturationEndpoints;
10
+ export declare function qualityFromSaturationProperty(liquidValue: number, vaporValue: number, mixtureValue: number): number;
11
+ export declare function mixSaturationState(endpoints: SaturationEndpoints, qualityInput: number): BasicProperties;
12
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/saturation/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAUnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;CACxB;AAoBD,wBAAgB,6BAA6B,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAuB5E;AAED,wBAAgB,gCAAgC,CAAC,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAE/E;AAED,wBAAgB,6BAA6B,CAC3C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,MAAM,CAER;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,mBAAmB,EAC9B,YAAY,EAAE,MAAM,GACnB,eAAe,CA2BjB"}
@@ -0,0 +1,75 @@
1
+ import { Region } from '../types.js';
2
+ import { Pc, R2_T_MIN, RHOc } from '../constants.js';
3
+ import { region1 } from '../regions/region1.js';
4
+ import { region2 } from '../regions/region2.js';
5
+ import { region3ByRhoT } from '../regions/region3.js';
6
+ import { saturationPressure, saturationTemperature } from '../regions/region4.js';
7
+ import { region3SatVolume } from '../regions/region3-subregions.js';
8
+ import { newtonRaphson } from '../solvers/newton-raphson.js';
9
+ function withRegion4Metadata(state, quality) {
10
+ return { ...state, region: Region.Region4, quality };
11
+ }
12
+ function solveR3Density(p, T, x) {
13
+ const v0 = region3SatVolume(p, T, x);
14
+ return newtonRaphson((rho) => region3ByRhoT(rho, T).pressure - p, 1 / v0);
15
+ }
16
+ function clampQuality(x) {
17
+ if (x <= 0 && x > -1e-12)
18
+ return 0;
19
+ if (x >= 1 && x < 1 + 1e-12)
20
+ return 1;
21
+ return Math.max(0, Math.min(1, x));
22
+ }
23
+ export function saturationEndpointsAtPressure(p) {
24
+ const temperature = saturationTemperature(p);
25
+ if (Math.abs(p - Pc) < 1e-10) {
26
+ const state = region3ByRhoT(RHOc, temperature);
27
+ return { pressure: p, temperature, liquid: state, vapor: state };
28
+ }
29
+ if (temperature > R2_T_MIN) {
30
+ return {
31
+ pressure: p,
32
+ temperature,
33
+ liquid: region3ByRhoT(solveR3Density(p, temperature, 0), temperature),
34
+ vapor: region3ByRhoT(solveR3Density(p, temperature, 1), temperature),
35
+ };
36
+ }
37
+ return {
38
+ pressure: p,
39
+ temperature,
40
+ liquid: region1(p, temperature),
41
+ vapor: region2(p, temperature),
42
+ };
43
+ }
44
+ export function saturationEndpointsAtTemperature(T) {
45
+ return saturationEndpointsAtPressure(saturationPressure(T));
46
+ }
47
+ export function qualityFromSaturationProperty(liquidValue, vaporValue, mixtureValue) {
48
+ return clampQuality((mixtureValue - liquidValue) / (vaporValue - liquidValue));
49
+ }
50
+ export function mixSaturationState(endpoints, qualityInput) {
51
+ const quality = clampQuality(qualityInput);
52
+ const { liquid, vapor, pressure, temperature } = endpoints;
53
+ if (quality === 0) {
54
+ return withRegion4Metadata(liquid, 0);
55
+ }
56
+ if (quality === 1) {
57
+ return withRegion4Metadata(vapor, 1);
58
+ }
59
+ return {
60
+ region: Region.Region4,
61
+ pressure,
62
+ temperature,
63
+ specificVolume: liquid.specificVolume * (1 - quality) + vapor.specificVolume * quality,
64
+ internalEnergy: liquid.internalEnergy * (1 - quality) + vapor.internalEnergy * quality,
65
+ entropy: liquid.entropy * (1 - quality) + vapor.entropy * quality,
66
+ enthalpy: liquid.enthalpy * (1 - quality) + vapor.enthalpy * quality,
67
+ cp: NaN,
68
+ cv: NaN,
69
+ speedOfSound: NaN,
70
+ quality,
71
+ isobaricExpansion: NaN,
72
+ isothermalCompressibility: NaN,
73
+ };
74
+ }
75
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/saturation/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * IAPWS-IF97 Two-Phase Saturation Solvers
3
+ *
4
+ * Compute thermodynamic state given pressure+quality (solvePx)
5
+ * or temperature+quality (solveTx).
6
+ *
7
+ * Reference: IAPWS-IF97, Region 4 (Saturation Line)
8
+ */
9
+ import type { BasicProperties } from '../types.js';
10
+ /**
11
+ * Solve for thermodynamic state given pressure and vapour quality.
12
+ * @param p - Pressure [MPa], Pt <= p <= Pc
13
+ * @param x - Vapour quality [0, 1]
14
+ */
15
+ export declare function solvePx(p: number, x: number): BasicProperties;
16
+ /**
17
+ * Solve for thermodynamic state given temperature and vapour quality.
18
+ * @param T - Temperature [K], T_MIN <= T <= Tc
19
+ * @param x - Vapour quality [0, 1]
20
+ */
21
+ export declare function solveTx(T: number, x: number): BasicProperties;
22
+ //# sourceMappingURL=two-phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"two-phase.d.ts","sourceRoot":"","sources":["../../src/saturation/two-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQnD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAS7D;AAID;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAU7D"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * IAPWS-IF97 Two-Phase Saturation Solvers
3
+ *
4
+ * Compute thermodynamic state given pressure+quality (solvePx)
5
+ * or temperature+quality (solveTx).
6
+ *
7
+ * Reference: IAPWS-IF97, Region 4 (Saturation Line)
8
+ */
9
+ import { OutOfRangeError } from '../types.js';
10
+ import { Pc, Tc, Pt, T_MIN } from '../constants.js';
11
+ import { saturationPressure } from '../regions/region4.js';
12
+ import { mixSaturationState, saturationEndpointsAtPressure } from './common.js';
13
+ // ─── solvePx ────────────────────────────────────────────────────────────────
14
+ /**
15
+ * Solve for thermodynamic state given pressure and vapour quality.
16
+ * @param p - Pressure [MPa], Pt <= p <= Pc
17
+ * @param x - Vapour quality [0, 1]
18
+ */
19
+ export function solvePx(p, x) {
20
+ if (x < 0 || x > 1) {
21
+ throw new OutOfRangeError('Quality', x, 0, 1);
22
+ }
23
+ if (p < Pt || p > Pc) {
24
+ throw new OutOfRangeError('Pressure', p, Pt, Pc);
25
+ }
26
+ return mixSaturationState(saturationEndpointsAtPressure(p), x);
27
+ }
28
+ // ─── solveTx ────────────────────────────────────────────────────────────────
29
+ /**
30
+ * Solve for thermodynamic state given temperature and vapour quality.
31
+ * @param T - Temperature [K], T_MIN <= T <= Tc
32
+ * @param x - Vapour quality [0, 1]
33
+ */
34
+ export function solveTx(T, x) {
35
+ if (x < 0 || x > 1) {
36
+ throw new OutOfRangeError('Quality', x, 0, 1);
37
+ }
38
+ if (T < T_MIN || T > Tc) {
39
+ throw new OutOfRangeError('Temperature', T, T_MIN, Tc);
40
+ }
41
+ const p = saturationPressure(T);
42
+ return solvePx(p, x);
43
+ }
44
+ //# sourceMappingURL=two-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"two-phase.js","sourceRoot":"","sources":["../../src/saturation/two-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAEhF,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,eAAe,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,kBAAkB,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Nelder-Mead (downhill simplex) minimizer.
3
+ * Minimizes f(x) where x is an array of numbers.
4
+ */
5
+ export interface NelderMeadOptions {
6
+ maxIterations?: number;
7
+ nonZeroDelta?: number;
8
+ zeroDelta?: number;
9
+ minErrorDelta?: number;
10
+ minTolerance?: number;
11
+ rho?: number;
12
+ chi?: number;
13
+ psi?: number;
14
+ sigma?: number;
15
+ }
16
+ export interface NelderMeadResult {
17
+ x: number[];
18
+ fx: number;
19
+ }
20
+ export declare function nelderMead(f: (x: number[]) => number, x0: number[], opts?: NelderMeadOptions): NelderMeadResult;
21
+ //# sourceMappingURL=nelder-mead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nelder-mead.d.ts","sourceRoot":"","sources":["../../src/solvers/nelder-mead.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,EAAE,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,gBAAgB,CAiG/G"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Nelder-Mead (downhill simplex) minimizer.
3
+ * Minimizes f(x) where x is an array of numbers.
4
+ */
5
+ export function nelderMead(f, x0, opts) {
6
+ const maxIter = opts?.maxIterations ?? x0.length * 200;
7
+ const nonZeroDelta = opts?.nonZeroDelta ?? 1.05;
8
+ const zeroDelta = opts?.zeroDelta ?? 0.001;
9
+ const minErrDelta = opts?.minErrorDelta ?? 1e-11;
10
+ const minTol = opts?.minTolerance ?? 1e-11;
11
+ const rho = opts?.rho ?? 1;
12
+ const chi = opts?.chi ?? 2;
13
+ const psi = opts?.psi ?? -0.5;
14
+ const sigma = opts?.sigma ?? 0.5;
15
+ const N = x0.length;
16
+ const simplex = new Array(N + 1);
17
+ // Initialize simplex
18
+ const v0 = [...x0];
19
+ v0.fx = f(x0);
20
+ simplex[0] = v0;
21
+ for (let i = 0; i < N; i++) {
22
+ const pt = [...x0];
23
+ pt[i] = pt[i] ? pt[i] * nonZeroDelta : zeroDelta;
24
+ pt.fx = f(pt);
25
+ simplex[i + 1] = pt;
26
+ }
27
+ const sortOrder = (a, b) => a.fx - b.fx;
28
+ function weightedSum(ret, w1, v1, w2, v2) {
29
+ for (let j = 0; j < ret.length; j++) {
30
+ ret[j] = w1 * v1[j] + w2 * v2[j];
31
+ }
32
+ return ret;
33
+ }
34
+ const centroid = [...x0];
35
+ const reflected = [...x0];
36
+ const contracted = [...x0];
37
+ const expanded = [...x0];
38
+ function updateSimplex(value) {
39
+ for (let i = 0; i < N; i++)
40
+ simplex[N][i] = value[i];
41
+ simplex[N].fx = value.fx;
42
+ }
43
+ for (let iter = 0; iter < maxIter; iter++) {
44
+ simplex.sort(sortOrder);
45
+ let maxDiff = 0;
46
+ for (let i = 0; i < N; i++) {
47
+ maxDiff = Math.max(maxDiff, Math.abs(simplex[0][i] - simplex[1][i]));
48
+ }
49
+ if (Math.abs(simplex[0].fx - simplex[N].fx) < minErrDelta && maxDiff < minTol)
50
+ break;
51
+ for (let i = 0; i < N; i++) {
52
+ centroid[i] = 0;
53
+ for (let j = 0; j < N; j++)
54
+ centroid[i] += simplex[j][i];
55
+ centroid[i] /= N;
56
+ }
57
+ const worst = simplex[N];
58
+ weightedSum(reflected, 1 + rho, centroid, -rho, worst);
59
+ reflected.fx = f(reflected);
60
+ if (reflected.fx < simplex[0].fx) {
61
+ weightedSum(expanded, 1 + chi, centroid, -chi, worst);
62
+ expanded.fx = f(expanded);
63
+ updateSimplex(expanded.fx < reflected.fx ? expanded : reflected);
64
+ }
65
+ else if (reflected.fx >= simplex[N - 1].fx) {
66
+ let shouldReduce = false;
67
+ if (reflected.fx > worst.fx) {
68
+ weightedSum(contracted, 1 + psi, centroid, -psi, worst);
69
+ contracted.fx = f(contracted);
70
+ if (contracted.fx < worst.fx)
71
+ updateSimplex(contracted);
72
+ else
73
+ shouldReduce = true;
74
+ }
75
+ else {
76
+ weightedSum(contracted, 1 - psi * rho, centroid, psi * rho, worst);
77
+ contracted.fx = f(contracted);
78
+ if (contracted.fx < reflected.fx)
79
+ updateSimplex(contracted);
80
+ else
81
+ shouldReduce = true;
82
+ }
83
+ if (shouldReduce) {
84
+ if (sigma >= 1)
85
+ break;
86
+ for (let i = 1; i < simplex.length; i++) {
87
+ weightedSum(simplex[i], 1 - sigma, simplex[0], sigma, simplex[i]);
88
+ simplex[i].fx = f(simplex[i]);
89
+ }
90
+ }
91
+ }
92
+ else {
93
+ updateSimplex(reflected);
94
+ }
95
+ }
96
+ simplex.sort(sortOrder);
97
+ return { fx: simplex[0].fx, x: simplex[0].slice(0, N) };
98
+ }
99
+ //# sourceMappingURL=nelder-mead.js.map