iapws-if97 2.1.0 → 2.1.2

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 (108) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +22 -61
  3. package/dist/backward/hs.d.ts.map +1 -1
  4. package/dist/backward/hs.js +36 -43
  5. package/dist/backward/hs.js.map +1 -1
  6. package/dist/backward/objective-normalization.d.ts +7 -0
  7. package/dist/backward/objective-normalization.d.ts.map +1 -0
  8. package/dist/backward/objective-normalization.js +8 -0
  9. package/dist/backward/objective-normalization.js.map +1 -0
  10. package/dist/backward/ph.d.ts.map +1 -1
  11. package/dist/backward/ph.js +24 -5
  12. package/dist/backward/ph.js.map +1 -1
  13. package/dist/backward/ps.d.ts.map +1 -1
  14. package/dist/backward/ps.js +18 -3
  15. package/dist/backward/ps.js.map +1 -1
  16. package/dist/backward/solution-validation.d.ts.map +1 -1
  17. package/dist/backward/solution-validation.js +24 -16
  18. package/dist/backward/solution-validation.js.map +1 -1
  19. package/dist/backward/th.d.ts.map +1 -1
  20. package/dist/backward/th.js +5 -0
  21. package/dist/backward/th.js.map +1 -1
  22. package/dist/backward/tolerances.d.ts +6 -0
  23. package/dist/backward/tolerances.d.ts.map +1 -0
  24. package/dist/backward/tolerances.js +21 -0
  25. package/dist/backward/tolerances.js.map +1 -0
  26. package/dist/backward/ts.d.ts.map +1 -1
  27. package/dist/backward/ts.js +5 -0
  28. package/dist/backward/ts.js.map +1 -1
  29. package/dist/constants.d.ts +38 -12
  30. package/dist/constants.d.ts.map +1 -1
  31. package/dist/constants.js +47 -13
  32. package/dist/constants.js.map +1 -1
  33. package/dist/core/input-validation.d.ts +2 -0
  34. package/dist/core/input-validation.d.ts.map +1 -0
  35. package/dist/core/input-validation.js +7 -0
  36. package/dist/core/input-validation.js.map +1 -0
  37. package/dist/core/public-normalization.d.ts +2 -3
  38. package/dist/core/public-normalization.d.ts.map +1 -1
  39. package/dist/core/public-normalization.js +32 -9
  40. package/dist/core/public-normalization.js.map +1 -1
  41. package/dist/core/region-detector.d.ts.map +1 -1
  42. package/dist/core/region-detector.js +114 -56
  43. package/dist/core/region-detector.js.map +1 -1
  44. package/dist/core/region3-pt.d.ts.map +1 -1
  45. package/dist/core/region3-pt.js +6 -1
  46. package/dist/core/region3-pt.js.map +1 -1
  47. package/dist/core/solve-input-normalization.d.ts.map +1 -1
  48. package/dist/core/solve-input-normalization.js +4 -1
  49. package/dist/core/solve-input-normalization.js.map +1 -1
  50. package/dist/core/solver.d.ts.map +1 -1
  51. package/dist/core/solver.js +3 -0
  52. package/dist/core/solver.js.map +1 -1
  53. package/dist/index.d.ts +8 -8
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +7 -16
  56. package/dist/index.js.map +1 -1
  57. package/dist/regions/boundaries.d.ts +0 -9
  58. package/dist/regions/boundaries.d.ts.map +1 -1
  59. package/dist/regions/boundaries.js +8 -0
  60. package/dist/regions/boundaries.js.map +1 -1
  61. package/dist/regions/region3-subregions.d.ts +6 -2
  62. package/dist/regions/region3-subregions.d.ts.map +1 -1
  63. package/dist/regions/region3-subregions.js +22 -14
  64. package/dist/regions/region3-subregions.js.map +1 -1
  65. package/dist/regions/region3.d.ts +5 -1
  66. package/dist/regions/region3.d.ts.map +1 -1
  67. package/dist/regions/region3.js +12 -2
  68. package/dist/regions/region3.js.map +1 -1
  69. package/dist/regions/region4.d.ts +3 -1
  70. package/dist/regions/region4.d.ts.map +1 -1
  71. package/dist/regions/region4.js +9 -6
  72. package/dist/regions/region4.js.map +1 -1
  73. package/dist/saturation/common.d.ts +1 -0
  74. package/dist/saturation/common.d.ts.map +1 -1
  75. package/dist/saturation/common.js +53 -14
  76. package/dist/saturation/common.js.map +1 -1
  77. package/dist/saturation/region4-boundaries.d.ts +14 -0
  78. package/dist/saturation/region4-boundaries.d.ts.map +1 -0
  79. package/dist/saturation/region4-boundaries.js +79 -0
  80. package/dist/saturation/region4-boundaries.js.map +1 -0
  81. package/dist/saturation/region4-hs.d.ts +3 -0
  82. package/dist/saturation/region4-hs.d.ts.map +1 -0
  83. package/dist/saturation/region4-hs.js +165 -0
  84. package/dist/saturation/region4-hs.js.map +1 -0
  85. package/dist/saturation/two-phase.d.ts.map +1 -1
  86. package/dist/saturation/two-phase.js +9 -9
  87. package/dist/saturation/two-phase.js.map +1 -1
  88. package/dist/saturation.d.ts +6 -1
  89. package/dist/saturation.d.ts.map +1 -1
  90. package/dist/saturation.js +6 -1
  91. package/dist/saturation.js.map +1 -1
  92. package/dist/solvers/nelder-mead.d.ts +0 -4
  93. package/dist/solvers/nelder-mead.d.ts.map +1 -1
  94. package/dist/solvers/nelder-mead.js +29 -12
  95. package/dist/solvers/nelder-mead.js.map +1 -1
  96. package/dist/solvers/newton-raphson.d.ts +1 -4
  97. package/dist/solvers/newton-raphson.d.ts.map +1 -1
  98. package/dist/solvers/newton-raphson.js +15 -4
  99. package/dist/solvers/newton-raphson.js.map +1 -1
  100. package/dist/transport/properties.d.ts +1 -0
  101. package/dist/transport/properties.d.ts.map +1 -1
  102. package/dist/transport/properties.js +44 -4
  103. package/dist/transport/properties.js.map +1 -1
  104. package/dist/types.d.ts +2 -2
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js +1 -1
  107. package/dist/types.js.map +1 -1
  108. package/package.json +1 -1
@@ -1,11 +1,12 @@
1
- import { Region } from '../types.js';
2
- import { Pc, R2_T_MIN, RHOc } from '../constants.js';
1
+ import { IF97Error, Region } from '../types.js';
2
+ import { Pc, R2_T_MIN, RHOc, Tt } from '../constants.js';
3
3
  import { region1 } from '../regions/region1.js';
4
4
  import { region2 } from '../regions/region2.js';
5
5
  import { region3ByRhoT } from '../regions/region3.js';
6
6
  import { saturationPressure, saturationTemperature } from '../regions/region4.js';
7
7
  import { region3SatVolume } from '../regions/region3-subregions.js';
8
8
  import { newtonRaphson } from '../solvers/newton-raphson.js';
9
+ import { normalizeRegion4Pressure, normalizeRegion4Temperature, } from './region4-boundaries.js';
9
10
  /** Tag a single-phase state as Region 4 with the given vapour quality. */
10
11
  function withRegion4Metadata(state, quality) {
11
12
  return { ...state, region: Region.Region4, quality };
@@ -19,16 +20,36 @@ function withRegion4Metadata(state, quality) {
19
20
  */
20
21
  function solveR3Density(p, T, x) {
21
22
  const v0 = region3SatVolume(p, T, x);
22
- return newtonRaphson((rho) => region3ByRhoT(rho, T).pressure - p, 1 / v0);
23
+ return newtonRaphson((rho) => {
24
+ if (!Number.isFinite(rho) || rho <= 0) {
25
+ return Number.NaN;
26
+ }
27
+ return region3ByRhoT(rho, T).pressure - p;
28
+ }, 1 / v0);
23
29
  }
24
30
  /** Clamp vapour quality to [0, 1], snapping near-zero/one values to the boundary. */
25
31
  function clampQuality(x) {
32
+ if (!Number.isFinite(x))
33
+ return Number.NaN;
26
34
  if (x <= 1e-12)
27
35
  return 0;
28
36
  if (x >= 1 - 1e-12)
29
37
  return 1;
30
38
  return Math.max(0, Math.min(1, x));
31
39
  }
40
+ function qualitySpanTolerance(liquidValue, vaporValue, mixtureValue) {
41
+ return 1e-12 * Math.max(1, Math.abs(liquidValue), Math.abs(vaporValue), Math.abs(mixtureValue));
42
+ }
43
+ export function rawQualityFromSaturationProperty(liquidValue, vaporValue, mixtureValue) {
44
+ if (!Number.isFinite(liquidValue) || !Number.isFinite(vaporValue) || !Number.isFinite(mixtureValue)) {
45
+ return Number.NaN;
46
+ }
47
+ const span = vaporValue - liquidValue;
48
+ if (Math.abs(span) <= qualitySpanTolerance(liquidValue, vaporValue, mixtureValue)) {
49
+ return Number.NaN;
50
+ }
51
+ return (mixtureValue - liquidValue) / span;
52
+ }
32
53
  /**
33
54
  * Compute saturated liquid and vapour properties at a given pressure.
34
55
  *
@@ -38,24 +59,25 @@ function clampQuality(x) {
38
59
  * @param p - Saturation pressure [MPa]
39
60
  */
40
61
  export function saturationEndpointsAtPressure(p) {
41
- const temperature = saturationTemperature(p);
42
- if (Math.abs(p - Pc) < 1e-10) {
62
+ const pressure = normalizeRegion4Pressure(p);
63
+ const temperature = normalizeRegion4Temperature(saturationTemperature(pressure));
64
+ if (pressure === Pc) {
43
65
  const state = region3ByRhoT(RHOc, temperature);
44
- return { pressure: p, temperature, liquid: state, vapor: state };
66
+ return { pressure, temperature, liquid: state, vapor: state };
45
67
  }
46
68
  if (temperature > R2_T_MIN) {
47
69
  return {
48
- pressure: p,
70
+ pressure,
49
71
  temperature,
50
- liquid: region3ByRhoT(solveR3Density(p, temperature, 0), temperature),
51
- vapor: region3ByRhoT(solveR3Density(p, temperature, 1), temperature),
72
+ liquid: region3ByRhoT(solveR3Density(pressure, temperature, 0), temperature),
73
+ vapor: region3ByRhoT(solveR3Density(pressure, temperature, 1), temperature),
52
74
  };
53
75
  }
54
76
  return {
55
- pressure: p,
77
+ pressure,
56
78
  temperature,
57
- liquid: region1(p, temperature),
58
- vapor: region2(p, temperature),
79
+ liquid: region1(pressure, temperature),
80
+ vapor: region2(pressure, temperature),
59
81
  };
60
82
  }
61
83
  /**
@@ -63,7 +85,17 @@ export function saturationEndpointsAtPressure(p) {
63
85
  * @param T - Saturation temperature [K]
64
86
  */
65
87
  export function saturationEndpointsAtTemperature(T) {
66
- return saturationEndpointsAtPressure(saturationPressure(T));
88
+ const temperature = normalizeRegion4Temperature(T);
89
+ const pressure = normalizeRegion4Pressure(saturationPressure(temperature));
90
+ if (temperature < Tt) {
91
+ return {
92
+ pressure,
93
+ temperature,
94
+ liquid: region1(pressure, temperature),
95
+ vapor: region2(pressure, temperature),
96
+ };
97
+ }
98
+ return saturationEndpointsAtPressure(pressure);
67
99
  }
68
100
  /**
69
101
  * Compute vapour quality from any extensive saturation property.
@@ -75,7 +107,11 @@ export function saturationEndpointsAtTemperature(T) {
75
107
  * @param mixtureValue - Property value of the two-phase mixture
76
108
  */
77
109
  export function qualityFromSaturationProperty(liquidValue, vaporValue, mixtureValue) {
78
- return clampQuality((mixtureValue - liquidValue) / (vaporValue - liquidValue));
110
+ const quality = rawQualityFromSaturationProperty(liquidValue, vaporValue, mixtureValue);
111
+ if (!Number.isFinite(quality)) {
112
+ throw new IF97Error('Cannot determine vapor quality from degenerate saturation endpoints');
113
+ }
114
+ return clampQuality(quality);
79
115
  }
80
116
  /**
81
117
  * Linearly mix saturated liquid and vapour properties at a given quality.
@@ -88,6 +124,9 @@ export function qualityFromSaturationProperty(liquidValue, vaporValue, mixtureVa
88
124
  */
89
125
  export function mixSaturationState(endpoints, qualityInput) {
90
126
  const quality = clampQuality(qualityInput);
127
+ if (!Number.isFinite(quality)) {
128
+ throw new IF97Error('Region 4 quality must be finite');
129
+ }
91
130
  const { liquid, vapor, pressure, temperature } = endpoints;
92
131
  if (quality === 0) {
93
132
  return withRegion4Metadata(liquid, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/saturation/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/saturation/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare function normalizeRegion4Pressure(p: number): number;
2
+ export declare function normalizeRegion4Temperature(T: number): number;
3
+ export declare function clampRegion4TemperatureBelowCritical(T: number): number;
4
+ export declare function isRegion4CriticalPressure(p: number): boolean;
5
+ export declare function isRegion4CriticalTemperature(T: number): boolean;
6
+ export declare function assertRegion4PressureStateInput(p: number, solverName: string): number;
7
+ export declare function assertRegion4TemperatureStateInput(T: number, solverName: string): number;
8
+ export declare function assertRegion4StateAllowed(pressure: number, temperature: number, solverName: string): void;
9
+ export declare function isCriticalRegion4Enthalpy(h: number): boolean;
10
+ export declare function isCriticalRegion4Entropy(s: number): boolean;
11
+ export declare function assertCriticalRegion4PHInput(p: number, h: number, solverName: string): void;
12
+ export declare function assertCriticalRegion4PSInput(p: number, s: number, solverName: string): void;
13
+ export declare function assertCriticalRegion4HSInput(h: number, s: number, solverName: string): void;
14
+ //# sourceMappingURL=region4-boundaries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region4-boundaries.d.ts","sourceRoot":"","sources":["../../src/saturation/region4-boundaries.ts"],"names":[],"mappings":"AAGA,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED,wBAAgB,oCAAoC,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/D;AAMD,wBAAgB,+BAA+B,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CASrF;AAED,wBAAgB,kCAAkC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CASxF;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,IAAI,CAIN;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAI3F;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAI3F;AAED,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAI3F"}
@@ -0,0 +1,79 @@
1
+ import * as C from '../constants.js';
2
+ import { IF97Error, OutOfRangeError } from '../types.js';
3
+ export function normalizeRegion4Pressure(p) {
4
+ if (Math.abs(p - C.P_MIN) <= C.REGION4_PRESSURE_TOLERANCE)
5
+ return C.P_MIN;
6
+ if (Math.abs(p - C.Pt) <= C.REGION4_PRESSURE_TOLERANCE)
7
+ return C.Pt;
8
+ if (Math.abs(p - C.Pc) <= C.REGION4_PRESSURE_TOLERANCE)
9
+ return C.Pc;
10
+ return p;
11
+ }
12
+ export function normalizeRegion4Temperature(T) {
13
+ if (Math.abs(T - C.T_MIN) <= C.REGION4_TEMPERATURE_TOLERANCE)
14
+ return C.T_MIN;
15
+ if (Math.abs(T - C.Tt) <= C.REGION4_TEMPERATURE_TOLERANCE)
16
+ return C.Tt;
17
+ if (Math.abs(T - C.Tc) <= C.REGION4_TEMPERATURE_TOLERANCE)
18
+ return C.Tc;
19
+ return T;
20
+ }
21
+ export function clampRegion4TemperatureBelowCritical(T) {
22
+ return Math.max(C.Tt, Math.min(T, C.Tc - C.REGION4_SUBCRITICAL_TEMPERATURE_MARGIN));
23
+ }
24
+ export function isRegion4CriticalPressure(p) {
25
+ return normalizeRegion4Pressure(p) === C.Pc;
26
+ }
27
+ export function isRegion4CriticalTemperature(T) {
28
+ return normalizeRegion4Temperature(T) === C.Tc;
29
+ }
30
+ function criticalPointMessage(solverName) {
31
+ return `${solverName} does not support the critical point P=${C.Pc} MPa, T=${C.Tc} K as a Region 4 saturation state`;
32
+ }
33
+ export function assertRegion4PressureStateInput(p, solverName) {
34
+ const pressure = normalizeRegion4Pressure(p);
35
+ if (pressure < C.Pt || pressure > C.Pc) {
36
+ throw new OutOfRangeError('Pressure', p, C.Pt, C.Pc);
37
+ }
38
+ if (pressure === C.Pc) {
39
+ throw new IF97Error(criticalPointMessage(solverName));
40
+ }
41
+ return pressure;
42
+ }
43
+ export function assertRegion4TemperatureStateInput(T, solverName) {
44
+ const temperature = normalizeRegion4Temperature(T);
45
+ if (temperature < C.Tt || temperature > C.Tc) {
46
+ throw new OutOfRangeError('Temperature', T, C.Tt, C.Tc);
47
+ }
48
+ if (temperature === C.Tc) {
49
+ throw new IF97Error(criticalPointMessage(solverName));
50
+ }
51
+ return temperature;
52
+ }
53
+ export function assertRegion4StateAllowed(pressure, temperature, solverName) {
54
+ if (isRegion4CriticalPressure(pressure) || isRegion4CriticalTemperature(temperature)) {
55
+ throw new IF97Error(criticalPointMessage(solverName));
56
+ }
57
+ }
58
+ export function isCriticalRegion4Enthalpy(h) {
59
+ return Math.abs(h - C.R3_H_CRT) <= C.REGION4_CRITICAL_HS_TOLERANCE;
60
+ }
61
+ export function isCriticalRegion4Entropy(s) {
62
+ return Math.abs(s - C.R3_S_CRT) <= C.REGION4_CRITICAL_HS_TOLERANCE;
63
+ }
64
+ export function assertCriticalRegion4PHInput(p, h, solverName) {
65
+ if (isRegion4CriticalPressure(p) && isCriticalRegion4Enthalpy(h)) {
66
+ throw new IF97Error(criticalPointMessage(solverName));
67
+ }
68
+ }
69
+ export function assertCriticalRegion4PSInput(p, s, solverName) {
70
+ if (isRegion4CriticalPressure(p) && isCriticalRegion4Entropy(s)) {
71
+ throw new IF97Error(criticalPointMessage(solverName));
72
+ }
73
+ }
74
+ export function assertCriticalRegion4HSInput(h, s, solverName) {
75
+ if (isCriticalRegion4Enthalpy(h) && isCriticalRegion4Entropy(s)) {
76
+ throw new IF97Error(criticalPointMessage(solverName));
77
+ }
78
+ }
79
+ //# sourceMappingURL=region4-boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region4-boundaries.js","sourceRoot":"","sources":["../../src/saturation/region4-boundaries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BasicProperties } from '../types.js';
2
+ export declare function tryRegion4HSState(h: number, s: number): BasicProperties | null;
3
+ //# sourceMappingURL=region4-hs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region4-hs.d.ts","sourceRoot":"","sources":["../../src/saturation/region4-hs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAmMnD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAuD9E"}
@@ -0,0 +1,165 @@
1
+ import * as C from '../constants.js';
2
+ import { bracketedNewton } from '../solvers/bracketed-newton.js';
3
+ import { mixSaturationState, rawQualityFromSaturationProperty, saturationEndpointsAtTemperature, } from './common.js';
4
+ import { assertRegion4StateAllowed, clampRegion4TemperatureBelowCritical, } from './region4-boundaries.js';
5
+ const REGION4_QUALITY_TOLERANCE = 1e-6;
6
+ function isClose(a, b) {
7
+ return Math.abs(a - b) <= 1e-9 * Math.max(1, Math.abs(a), Math.abs(b));
8
+ }
9
+ function normalizeEndpointQuality(quality) {
10
+ if (!Number.isFinite(quality)) {
11
+ return Number.NaN;
12
+ }
13
+ if (Math.abs(quality) <= REGION4_QUALITY_TOLERANCE) {
14
+ return 0;
15
+ }
16
+ if (Math.abs(quality - 1) <= REGION4_QUALITY_TOLERANCE) {
17
+ return 1;
18
+ }
19
+ return quality;
20
+ }
21
+ function isAdmissibleQuality(quality) {
22
+ return Number.isFinite(quality)
23
+ && quality >= -REGION4_QUALITY_TOLERANCE
24
+ && quality <= 1 + REGION4_QUALITY_TOLERANCE;
25
+ }
26
+ function entropyResidual(h, s, temperatureGuess) {
27
+ const endpoints = saturationEndpointsAtTemperature(clampRegion4TemperatureBelowCritical(temperatureGuess));
28
+ const quality = rawQualityFromSaturationProperty(endpoints.liquid.enthalpy, endpoints.vapor.enthalpy, h);
29
+ if (!Number.isFinite(quality)) {
30
+ return Number.NaN;
31
+ }
32
+ return endpoints.liquid.entropy * (1 - quality) + endpoints.vapor.entropy * quality - s;
33
+ }
34
+ function finalizeRegion4HSState(h, s, temperature) {
35
+ const endpoints = saturationEndpointsAtTemperature(temperature);
36
+ const qualityFromEnthalpy = rawQualityFromSaturationProperty(endpoints.liquid.enthalpy, endpoints.vapor.enthalpy, h);
37
+ const qualityFromEntropy = rawQualityFromSaturationProperty(endpoints.liquid.entropy, endpoints.vapor.entropy, s);
38
+ const normalizedQualityFromEnthalpy = normalizeEndpointQuality(qualityFromEnthalpy);
39
+ const normalizedQualityFromEntropy = normalizeEndpointQuality(qualityFromEntropy);
40
+ if (!isAdmissibleQuality(normalizedQualityFromEnthalpy) || !isAdmissibleQuality(normalizedQualityFromEntropy)) {
41
+ return null;
42
+ }
43
+ if (Math.abs(normalizedQualityFromEnthalpy - normalizedQualityFromEntropy) > REGION4_QUALITY_TOLERANCE) {
44
+ return null;
45
+ }
46
+ if (Math.abs(entropyResidual(h, s, temperature)) > C.REGION4_HS_RESIDUAL_TOLERANCE) {
47
+ return null;
48
+ }
49
+ try {
50
+ assertRegion4StateAllowed(endpoints.pressure, endpoints.temperature, 'Region4HS');
51
+ }
52
+ catch {
53
+ return null;
54
+ }
55
+ return mixSaturationState(endpoints, normalizedQualityFromEnthalpy);
56
+ }
57
+ function endpointStateForPhase(h, s, temperature, phase) {
58
+ let endpoints;
59
+ try {
60
+ endpoints = saturationEndpointsAtTemperature(temperature);
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ const endpoint = endpoints[phase];
66
+ if (!isClose(endpoint.enthalpy, h) || !isClose(endpoint.entropy, s)) {
67
+ return null;
68
+ }
69
+ try {
70
+ assertRegion4StateAllowed(endpoints.pressure, endpoints.temperature, 'Region4HS');
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ return mixSaturationState(endpoints, phase === 'liquid' ? 0 : 1);
76
+ }
77
+ function endpointEnthalpyResidual(h, temperatureGuess, phase) {
78
+ let endpoints;
79
+ try {
80
+ endpoints = saturationEndpointsAtTemperature(clampRegion4TemperatureBelowCritical(temperatureGuess));
81
+ }
82
+ catch {
83
+ return Number.NaN;
84
+ }
85
+ return endpoints[phase].enthalpy - h;
86
+ }
87
+ function tryRegion4HSEndpointState(h, s) {
88
+ const lower = C.Tt;
89
+ const upper = clampRegion4TemperatureBelowCritical(C.Tc);
90
+ for (const phase of ['liquid', 'vapor']) {
91
+ const lowerState = endpointStateForPhase(h, s, lower, phase);
92
+ if (lowerState !== null) {
93
+ return lowerState;
94
+ }
95
+ const upperState = endpointStateForPhase(h, s, upper, phase);
96
+ if (upperState !== null) {
97
+ return upperState;
98
+ }
99
+ let previousTemperature = lower;
100
+ let previousResidual = endpointEnthalpyResidual(h, lower, phase);
101
+ for (let i = 1; i <= C.REGION4_HS_BRACKET_SEGMENTS; i++) {
102
+ const temperature = lower + (upper - lower) * (i / C.REGION4_HS_BRACKET_SEGMENTS);
103
+ const residual = endpointEnthalpyResidual(h, temperature, phase);
104
+ if (!Number.isFinite(previousResidual) || !Number.isFinite(residual)) {
105
+ previousTemperature = temperature;
106
+ previousResidual = residual;
107
+ continue;
108
+ }
109
+ if (isClose(previousResidual, 0)) {
110
+ return endpointStateForPhase(h, s, previousTemperature, phase);
111
+ }
112
+ if (isClose(residual, 0)) {
113
+ return endpointStateForPhase(h, s, temperature, phase);
114
+ }
115
+ if (previousResidual * residual < 0) {
116
+ const root = bracketedNewton((candidateTemperature) => endpointEnthalpyResidual(h, candidateTemperature, phase), previousTemperature, temperature, (previousTemperature + temperature) / 2, { tolerance: C.REGION4_HS_RESIDUAL_TOLERANCE });
117
+ return endpointStateForPhase(h, s, root, phase);
118
+ }
119
+ previousTemperature = temperature;
120
+ previousResidual = residual;
121
+ }
122
+ }
123
+ return null;
124
+ }
125
+ export function tryRegion4HSState(h, s) {
126
+ const endpointState = tryRegion4HSEndpointState(h, s);
127
+ if (endpointState !== null) {
128
+ return endpointState;
129
+ }
130
+ const lower = C.Tt;
131
+ const upper = clampRegion4TemperatureBelowCritical(C.Tc);
132
+ const lowerState = finalizeRegion4HSState(h, s, lower);
133
+ if (lowerState !== null) {
134
+ return lowerState;
135
+ }
136
+ const upperState = finalizeRegion4HSState(h, s, upper);
137
+ if (upperState !== null) {
138
+ return upperState;
139
+ }
140
+ let previousTemperature = lower;
141
+ let previousResidual = entropyResidual(h, s, lower);
142
+ for (let i = 1; i <= C.REGION4_HS_BRACKET_SEGMENTS; i++) {
143
+ const temperature = lower + (upper - lower) * (i / C.REGION4_HS_BRACKET_SEGMENTS);
144
+ const residual = entropyResidual(h, s, temperature);
145
+ if (!Number.isFinite(previousResidual) || !Number.isFinite(residual)) {
146
+ previousTemperature = temperature;
147
+ previousResidual = residual;
148
+ continue;
149
+ }
150
+ if (isClose(previousResidual, 0)) {
151
+ return finalizeRegion4HSState(h, s, previousTemperature);
152
+ }
153
+ if (isClose(residual, 0)) {
154
+ return finalizeRegion4HSState(h, s, temperature);
155
+ }
156
+ if (previousResidual * residual < 0) {
157
+ const root = bracketedNewton((candidateTemperature) => entropyResidual(h, s, candidateTemperature), previousTemperature, temperature, (previousTemperature + temperature) / 2, { tolerance: C.REGION4_HS_RESIDUAL_TOLERANCE });
158
+ return finalizeRegion4HSState(h, s, root);
159
+ }
160
+ previousTemperature = temperature;
161
+ previousResidual = residual;
162
+ }
163
+ return null;
164
+ }
165
+ //# sourceMappingURL=region4-hs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region4-hs.js","sourceRoot":"","sources":["../../src/saturation/region4-hs.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AAanD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAY7D;AAID;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAW7D"}
@@ -7,9 +7,10 @@
7
7
  * Reference: IAPWS-IF97, Region 4 (Saturation Line)
8
8
  */
9
9
  import { OutOfRangeError } from '../types.js';
10
- import { Pc, Tc, Pt, T_MIN } from '../constants.js';
10
+ import { assertFiniteNumber } from '../core/input-validation.js';
11
11
  import { saturationPressure } from '../regions/region4.js';
12
12
  import { mixSaturationState, saturationEndpointsAtPressure } from './common.js';
13
+ import { assertRegion4PressureStateInput, assertRegion4TemperatureStateInput, normalizeRegion4Pressure, } from './region4-boundaries.js';
13
14
  // ─── solvePx ────────────────────────────────────────────────────────────────
14
15
  /**
15
16
  * Solve for thermodynamic state given pressure and vapour quality.
@@ -17,13 +18,12 @@ import { mixSaturationState, saturationEndpointsAtPressure } from './common.js';
17
18
  * @param x - Vapour quality [0, 1]
18
19
  */
19
20
  export function solvePx(p, x) {
21
+ assertFiniteNumber('Pressure', p);
22
+ assertFiniteNumber('Quality', x);
20
23
  if (x < 0 || x > 1) {
21
24
  throw new OutOfRangeError('Quality', x, 0, 1);
22
25
  }
23
- if (p < Pt || p > Pc) {
24
- throw new OutOfRangeError('Pressure', p, Pt, Pc);
25
- }
26
- return mixSaturationState(saturationEndpointsAtPressure(p), x);
26
+ return mixSaturationState(saturationEndpointsAtPressure(assertRegion4PressureStateInput(p, 'solvePx')), x);
27
27
  }
28
28
  // ─── solveTx ────────────────────────────────────────────────────────────────
29
29
  /**
@@ -32,13 +32,13 @@ export function solvePx(p, x) {
32
32
  * @param x - Vapour quality [0, 1]
33
33
  */
34
34
  export function solveTx(T, x) {
35
+ assertFiniteNumber('Temperature', T);
36
+ assertFiniteNumber('Quality', x);
35
37
  if (x < 0 || x > 1) {
36
38
  throw new OutOfRangeError('Quality', x, 0, 1);
37
39
  }
38
- if (T < T_MIN || T > Tc) {
39
- throw new OutOfRangeError('Temperature', T, T_MIN, Tc);
40
- }
41
- const p = saturationPressure(T);
40
+ const temperature = assertRegion4TemperatureStateInput(T, 'solveTx');
41
+ const p = normalizeRegion4Pressure(saturationPressure(temperature));
42
42
  return solvePx(p, x);
43
43
  }
44
44
  //# sourceMappingURL=two-phase.js.map
@@ -1 +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"}
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,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EACL,+BAA+B,EAC/B,kCAAkC,EAClC,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,kBAAkB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAClC,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEjC,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;IAED,OAAO,kBAAkB,CACvB,6BAA6B,CAAC,+BAA+B,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAC5E,CAAC,CACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,kBAAkB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACrC,kBAAkB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEjC,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;IAED,MAAM,WAAW,GAAG,kCAAkC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,wBAAwB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;IACpE,OAAO,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvB,CAAC"}
@@ -1,5 +1,10 @@
1
1
  /**
2
- * Public saturation helper exports.
2
+ * Public low-level saturation helper exports.
3
+ *
4
+ * These functions expose the mathematical Region 4 boundary relations.
5
+ * They normalize values near Pt/Pc/Tt/Tc, but they are not state constructors:
6
+ * high-level solvers such as solvePx/solveTx apply stricter triple-point and
7
+ * critical-point rules.
3
8
  */
4
9
  export { saturationPressure, saturationTemperature } from './regions/region4.js';
5
10
  //# sourceMappingURL=saturation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"saturation.d.ts","sourceRoot":"","sources":["../src/saturation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"saturation.d.ts","sourceRoot":"","sources":["../src/saturation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,5 +1,10 @@
1
1
  /**
2
- * Public saturation helper exports.
2
+ * Public low-level saturation helper exports.
3
+ *
4
+ * These functions expose the mathematical Region 4 boundary relations.
5
+ * They normalize values near Pt/Pc/Tt/Tc, but they are not state constructors:
6
+ * high-level solvers such as solvePx/solveTx apply stricter triple-point and
7
+ * critical-point rules.
3
8
  */
4
9
  export { saturationPressure, saturationTemperature } from './regions/region4.js';
5
10
  //# sourceMappingURL=saturation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"saturation.js","sourceRoot":"","sources":["../src/saturation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"saturation.js","sourceRoot":"","sources":["../src/saturation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,7 +1,3 @@
1
- /**
2
- * Nelder-Mead (downhill simplex) minimizer.
3
- * Minimizes f(x) where x is an array of numbers.
4
- */
5
1
  export interface NelderMeadOptions {
6
2
  maxIterations?: number;
7
3
  nonZeroDelta?: number;
@@ -1 +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"}
1
+ {"version":3,"file":"nelder-mead.d.ts","sourceRoot":"","sources":["../../src/solvers/nelder-mead.ts"],"names":[],"mappings":"AAMA,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,CAqH/G"}