iapws-if97 2.0.0 → 2.0.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.
- package/CHANGELOG.md +11 -0
- package/README.md +75 -65
- package/dist/core/public-normalization.d.ts +5 -0
- package/dist/core/public-normalization.d.ts.map +1 -0
- package/dist/core/public-normalization.js +31 -0
- package/dist/core/public-normalization.js.map +1 -0
- package/dist/core/solve-input-normalization.d.ts +36 -0
- package/dist/core/solve-input-normalization.d.ts.map +1 -0
- package/dist/core/solve-input-normalization.js +71 -0
- package/dist/core/solve-input-normalization.js.map +1 -0
- package/dist/core/solver.d.ts +2 -1
- package/dist/core/solver.d.ts.map +1 -1
- package/dist/core/solver.js +13 -10
- package/dist/core/solver.js.map +1 -1
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -12
- package/dist/index.js.map +1 -1
- package/dist/regions/region3-data.d.ts +61 -0
- package/dist/regions/region3-data.d.ts.map +1 -0
- package/dist/regions/{region3-data-am.js → region3-data.js} +81 -1
- package/dist/regions/region3-data.js.map +1 -0
- package/dist/regions/region3-subregions.d.ts.map +1 -1
- package/dist/regions/region3-subregions.js +61 -62
- package/dist/regions/region3-subregions.js.map +1 -1
- package/dist/types.d.ts +26 -48
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/regions/region3-data-am.d.ts +0 -19
- package/dist/regions/region3-data-am.d.ts.map +0 -1
- package/dist/regions/region3-data-am.js.map +0 -1
- package/dist/regions/region3-data-nz.d.ts +0 -18
- package/dist/regions/region3-data-nz.d.ts.map +0 -1
- package/dist/regions/region3-data-nz.js +0 -53
- package/dist/regions/region3-data-nz.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## 2.0.2
|
|
6
|
+
|
|
7
|
+
- Consolidated Region 3 subregion coefficient tables into a single module.
|
|
8
|
+
- Simplified Region 3 dispatcher data access through a single aggregate lookup table.
|
|
9
|
+
- Added structural test coverage to ensure the full Region 3 subregion table remains intact.
|
|
10
|
+
|
|
11
|
+
## 2.0.1
|
|
12
|
+
|
|
13
|
+
- Added long-form aliases to `solve({ mode, ... })` inputs while keeping shorthand fields fully supported.
|
|
14
|
+
- Normalized tiny floating-point residue at the public API boundary.
|
|
15
|
+
|
|
5
16
|
## 2.0.0
|
|
6
17
|
|
|
7
18
|
- Narrowed the root export surface to the main solver API, core types, and error classes.
|
package/README.md
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
# `iapws-if97`
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Calculate industrial water and steam properties in Node.js and TypeScript, based on the [IAPWS-IF97](https://www.iapws.org/) standard (International Association for the Properties of Water and Steam — Industrial Formulation 1997).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The library provides forward and backward state solvers, saturation solvers, and transport-property helpers for engineering calculations involving water and steam.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
|
-
- IF97 Regions 1
|
|
10
|
-
- Forward, backward, and saturation solvers
|
|
11
|
-
- Transport properties
|
|
12
|
-
- Typed ESM package with bundled declarations
|
|
13
|
-
- `2.0
|
|
14
|
-
- Verified against IAPWS tables and published engineering references
|
|
9
|
+
- Covers IF97 Regions 1–5, including high-temperature Region 5
|
|
10
|
+
- Forward, backward, and saturation solvers behind a consistent API
|
|
11
|
+
- Transport properties: viscosity, thermal conductivity, surface tension, dielectric constant, and ionization constant
|
|
12
|
+
- Typed ESM package with bundled TypeScript declarations
|
|
13
|
+
- Clean export split in `2.0`: root import for main solvers, subpaths for advanced helpers
|
|
14
|
+
- Verified against official IAPWS tables and published engineering references
|
|
15
15
|
|
|
16
16
|
## Project Origin
|
|
17
17
|
|
|
18
|
-
> `iapws-if97` is the core calculation
|
|
18
|
+
> `iapws-if97` is the core calculation engine behind the WeChat Mini Program "汽水计算器" (`wxid: wx7201fd1713b524e5`). Since its launch in 2019, it has served nearly 20,000 users. With the help of AI, this edition has been updated to incorporate `R11-24 (2024)`. I am open-sourcing it in the hope that it will help others with similar engineering needs.
|
|
19
19
|
|
|
20
20
|
<p align="right">-- Retired Thermodynamic Engineer, Shuping</p>
|
|
21
21
|
|
|
@@ -51,7 +51,7 @@ console.log(c.quality); // 0.5
|
|
|
51
51
|
- `solveTx(T, x)` // `K`, quality `[0, 1]`
|
|
52
52
|
- `solve(input)` // same units as the selected `mode`
|
|
53
53
|
|
|
54
|
-
Use `solve({ mode, ... })` when the input pair
|
|
54
|
+
Use `solve({ mode, ... })` when the input pair is determined at runtime:
|
|
55
55
|
|
|
56
56
|
```ts
|
|
57
57
|
import { solve } from 'iapws-if97';
|
|
@@ -59,7 +59,14 @@ import { solve } from 'iapws-if97';
|
|
|
59
59
|
const state = solve({ mode: 'PT', p: 16, T: 823.15 });
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
-
|
|
62
|
+
`solve` accepts both short-form and long-form property names:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
const a = solve({ mode: 'PT', p: 16, T: 823.15 });
|
|
66
|
+
const b = solve({ mode: 'PT', pressure: 16, temperature: 823.15 });
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Supported modes:
|
|
63
70
|
|
|
64
71
|
```ts
|
|
65
72
|
type SolveInput =
|
|
@@ -73,10 +80,11 @@ type SolveInput =
|
|
|
73
80
|
| { mode: 'TS'; T: number; s: number };
|
|
74
81
|
```
|
|
75
82
|
|
|
83
|
+
You can use either form for each property. If you provide both, their values must match.
|
|
84
|
+
|
|
76
85
|
## Solver Return Value
|
|
77
86
|
|
|
78
|
-
All
|
|
79
|
-
For user-facing documentation, it is best understood as the solver return object. The exported TypeScript type name is `SteamState`.
|
|
87
|
+
All solvers return a `SteamState` object containing both thermodynamic and transport properties:
|
|
80
88
|
|
|
81
89
|
```ts
|
|
82
90
|
type SteamState = {
|
|
@@ -102,13 +110,15 @@ type SteamState = {
|
|
|
102
110
|
};
|
|
103
111
|
```
|
|
104
112
|
|
|
105
|
-
|
|
113
|
+
`SteamState` always uses canonical property names. Input aliases like `p`/`pressure` do not create duplicate fields.
|
|
114
|
+
|
|
115
|
+
**Notes:**
|
|
106
116
|
|
|
107
|
-
- `quality` is
|
|
108
|
-
- In two-phase
|
|
109
|
-
- `surfaceTension` is only
|
|
110
|
-
- `density` is
|
|
111
|
-
- `ionizationConstant` is
|
|
117
|
+
- `quality` is `null` for single-phase states — it is only defined on the saturation line.
|
|
118
|
+
- In two-phase mixtures (`0 < x < 1`), `cp`, `cv`, `speedOfSound`, `isobaricExpansion`, and `isothermalCompressibility` are `null`.
|
|
119
|
+
- `surfaceTension` is only available for Region 4 saturation states below the critical point; otherwise `null`.
|
|
120
|
+
- `density` is provided directly — no need to invert `specificVolume`.
|
|
121
|
+
- `ionizationConstant` is `null` outside the IAPWS validity range for that correlation.
|
|
112
122
|
|
|
113
123
|
## Units
|
|
114
124
|
|
|
@@ -119,7 +129,7 @@ Notes:
|
|
|
119
129
|
- Enthalpy, internal energy: `kJ/kg`
|
|
120
130
|
- Entropy, heat capacities: `kJ/(kg·K)`
|
|
121
131
|
- Speed of sound: `m/s`
|
|
122
|
-
- Quality: dimensionless, `0
|
|
132
|
+
- Quality: dimensionless, `0`–`1` (saturation line only)
|
|
123
133
|
- Viscosity: `Pa·s`
|
|
124
134
|
- Thermal conductivity: `W/(m·K)`
|
|
125
135
|
- Surface tension: `N/m`
|
|
@@ -128,12 +138,12 @@ Notes:
|
|
|
128
138
|
- Isobaric expansion coefficient: `1/K`
|
|
129
139
|
- Isothermal compressibility: `1/MPa`
|
|
130
140
|
|
|
131
|
-
|
|
141
|
+
Any field typed as `number | null` returns `null` when the property is undefined for the given state.
|
|
132
142
|
|
|
133
143
|
## Advanced Imports
|
|
134
144
|
|
|
135
|
-
The package root
|
|
136
|
-
Lower-level helpers are available
|
|
145
|
+
The package root exports only the main solver API, core types, and error classes.
|
|
146
|
+
Lower-level helpers are available through dedicated subpaths:
|
|
137
147
|
|
|
138
148
|
- `iapws-if97/transport`: `viscosity`, `thermalConductivity`, `surfaceTension`, `dielectricConstant`, `ionizationConstant`
|
|
139
149
|
- `iapws-if97/regions`: `region1`, `region2`, `region3ByRhoT`, `region5`
|
|
@@ -152,8 +162,8 @@ import { detectRegionPT } from 'iapws-if97/detect';
|
|
|
152
162
|
|
|
153
163
|
## Migration to 2.0
|
|
154
164
|
|
|
155
|
-
Version `2.0
|
|
156
|
-
If you imported lower-level helpers from the package root in `1.x`,
|
|
165
|
+
Version `2.0` limits the root export to the main solver API.
|
|
166
|
+
If you imported lower-level helpers from the package root in `1.x`, update them to use subpath imports:
|
|
157
167
|
|
|
158
168
|
- `import { viscosity } from 'iapws-if97'` → `import { viscosity } from 'iapws-if97/transport'`
|
|
159
169
|
- `import { region1 } from 'iapws-if97'` → `import { region1 } from 'iapws-if97/regions'`
|
|
@@ -162,54 +172,56 @@ If you imported lower-level helpers from the package root in `1.x`, move them to
|
|
|
162
172
|
|
|
163
173
|
## Advanced Usage Notes
|
|
164
174
|
|
|
165
|
-
- `region1`, `region2`, `region3ByRhoT`, and `region5` return core thermodynamic properties without transport-property enrichment.
|
|
166
|
-
- `detectRegion*` helpers return a `Region` enum value or `-1`
|
|
167
|
-
- `viscosity(T, rho)` and `dielectricConstant(T, rho)`
|
|
168
|
-
- `ionizationConstant(T, rho)` also
|
|
169
|
-
- `thermalConductivity(T, rho, cp?, cv?, drhodP_T?, mu?)` supports two levels:
|
|
170
|
-
-
|
|
171
|
-
-
|
|
172
|
-
- `surfaceTension(T)` returns `null` outside its valid temperature range
|
|
173
|
-
- `solveTH(T, h)` prefers the compressed-liquid branch when a subcritical liquid state and a two-phase state are
|
|
175
|
+
- `region1`, `region2`, `region3ByRhoT`, and `region5` return core thermodynamic properties **without** transport-property enrichment.
|
|
176
|
+
- `detectRegion*` helpers return a `Region` enum value, or `-1` if the input falls outside IF97 validity.
|
|
177
|
+
- `viscosity(T, rho)` and `dielectricConstant(T, rho)` take temperature and density directly — not a `SteamState`.
|
|
178
|
+
- `ionizationConstant(T, rho)` also takes temperature and density; returns `null` outside its validity range.
|
|
179
|
+
- `thermalConductivity(T, rho, cp?, cv?, drhodP_T?, mu?)` supports two calling levels:
|
|
180
|
+
- **Minimal:** pass `T` and `rho` for base conductivity.
|
|
181
|
+
- **Full:** additionally pass `cp`, `cv`, `drhodP_T`, and `mu` to include the IAPWS 2011 critical-enhancement term.
|
|
182
|
+
- `surfaceTension(T)` returns `null` outside its valid temperature range. It applies only along the saturation line.
|
|
183
|
+
- `solveTH(T, h)` prefers the compressed-liquid branch when both a subcritical liquid state and a two-phase state are possible at the same `T` and `h`. Exact saturation endpoints still return Region 4 metadata.
|
|
174
184
|
|
|
175
185
|
## Errors and Limits
|
|
176
186
|
|
|
177
|
-
The library throws typed errors
|
|
187
|
+
The library throws typed errors:
|
|
178
188
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
189
|
+
| Error | Meaning |
|
|
190
|
+
| --- | --- |
|
|
191
|
+
| `OutOfRangeError` | Input is outside the supported IF97 range |
|
|
192
|
+
| `ConvergenceError` | An internal iterative solve failed to converge |
|
|
193
|
+
| `IF97Error` | Base class for all library-specific errors |
|
|
182
194
|
|
|
183
|
-
|
|
195
|
+
**Boundary rules:**
|
|
184
196
|
|
|
185
|
-
- `solvePT(p, T)`
|
|
186
|
-
- The exact critical point (`22.064 MPa`, `647.096 K`) is rejected
|
|
187
|
-
- `solvePx(p, x)`
|
|
188
|
-
- `solveTx(T, x)`
|
|
189
|
-
- `solveTH(T, h)` and `solveTS(T, s)`
|
|
197
|
+
- `solvePT(p, T)` covers the IF97 industrial range up to `100 MPa` / `2273.15 K`. Region 5 is limited to `50 MPa`.
|
|
198
|
+
- The exact critical point (`22.064 MPa`, `647.096 K`) is rejected because derivative properties are singular there.
|
|
199
|
+
- `solvePx(p, x)` requires the saturation line: `Pt ≤ p ≤ Pc`.
|
|
200
|
+
- `solveTx(T, x)` requires the saturation line: `273.15 K ≤ T ≤ Tc`.
|
|
201
|
+
- `solveTH(T, h)` and `solveTS(T, s)` support Regions 1–5. Inputs within `0.001 K` of the critical temperature are rejected.
|
|
190
202
|
- `x` must be in `[0, 1]` for two-phase calculations.
|
|
191
|
-
-
|
|
203
|
+
- Undefined properties are returned as `null`, never `NaN`.
|
|
192
204
|
|
|
193
|
-
## Validity
|
|
205
|
+
## Validity Notes
|
|
194
206
|
|
|
195
|
-
- Thermodynamic
|
|
196
|
-
- Surface tension
|
|
207
|
+
- Thermodynamic properties follow IF97 validity ranges: up to `100 MPa` and `2273.15 K` (including Region 5).
|
|
208
|
+
- Surface tension applies only along the saturation line below the critical point.
|
|
197
209
|
- Thermal conductivity follows the IAPWS 2011 release.
|
|
198
|
-
- Ionization constant
|
|
210
|
+
- Ionization constant follows the IAPWS 2024 revised release, valid for stable fluid states from `273.15 K` to `1273.15 K` and up to `1000 MPa`.
|
|
199
211
|
|
|
200
212
|
## Verification
|
|
201
213
|
|
|
202
|
-
The test suite
|
|
214
|
+
The test suite covers:
|
|
203
215
|
|
|
204
|
-
- Official IF97 verification tables
|
|
205
|
-
- Backward-equation round
|
|
206
|
-
- Temperature-led backward round trips
|
|
207
|
-
- High-pressure Region 4
|
|
216
|
+
- Official IF97 verification tables (Regions 1–5)
|
|
217
|
+
- Backward-equation round-trip accuracy
|
|
218
|
+
- Temperature-led backward round trips (`TH` and `TS`)
|
|
219
|
+
- High-pressure Region 4 regressions
|
|
208
220
|
- IAPWS R11-24 ionization-constant verification values
|
|
209
|
-
- Coverage thresholds enforced
|
|
210
|
-
- ASME and GB/T steam-table
|
|
221
|
+
- Coverage thresholds enforced locally
|
|
222
|
+
- ASME and GB/T steam-table comparisons against published values
|
|
211
223
|
|
|
212
|
-
|
|
224
|
+
To run locally:
|
|
213
225
|
|
|
214
226
|
```bash
|
|
215
227
|
npm run build
|
|
@@ -220,8 +232,8 @@ npm run test:standards
|
|
|
220
232
|
|
|
221
233
|
### ASME Validation Snapshot
|
|
222
234
|
|
|
223
|
-
|
|
224
|
-
Each
|
|
235
|
+
Compares saturation states against *ASME International Steam Tables for Industrial Use*, 3rd ed., Table S-2 ("Properties of Saturated Water and Steam — Pressure").
|
|
236
|
+
Each case checks 7 values: saturation temperature, liquid/vapor specific volume, enthalpy, and entropy.
|
|
225
237
|
|
|
226
238
|
| ASME case | Pressure (MPa) | Points checked | Max relative error |
|
|
227
239
|
| --- | ---: | ---: | ---: |
|
|
@@ -237,8 +249,8 @@ The current ASME regression threshold is `maxRelativeError < 5e-4` (less than `0
|
|
|
237
249
|
|
|
238
250
|
### GB/T Validation Snapshot
|
|
239
251
|
|
|
240
|
-
|
|
241
|
-
Each
|
|
252
|
+
Compares superheated-steam states against *GB/T 34060-2017*, Table A.3(续), page 55.
|
|
253
|
+
Each case checks 4 values at `10 MPa`: specific volume, enthalpy, entropy, and speed of sound.
|
|
242
254
|
|
|
243
255
|
| GB/T case | Pressure (MPa) | Temperature (°C) | Points checked | Max relative error |
|
|
244
256
|
| --- | ---: | ---: | ---: | ---: |
|
|
@@ -254,7 +266,7 @@ The current GB/T regression threshold is `maxRelativeError < 5e-4` (less than `0
|
|
|
254
266
|
|
|
255
267
|
## TypeScript
|
|
256
268
|
|
|
257
|
-
The package ships with bundled declarations and ESM exports.
|
|
269
|
+
The package ships with bundled TypeScript declarations and ESM exports.
|
|
258
270
|
|
|
259
271
|
```ts
|
|
260
272
|
import type { SolveInput, SteamState } from 'iapws-if97';
|
|
@@ -283,6 +295,4 @@ MIT
|
|
|
283
295
|
|
|
284
296
|
## Disclaimer
|
|
285
297
|
|
|
286
|
-
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.
|
|
287
|
-
|
|
288
|
-
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.
|
|
298
|
+
This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability arising from the use of this software.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-normalization.d.ts","sourceRoot":"","sources":["../../src/core/public-normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAM/D,KAAK,WAAW,GAAG,eAAe,GAAG,UAAU,CAAC;AAsBhD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,WAAW,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAYvE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Only snap values that are effectively simple decimals plus machine-noise.
|
|
2
|
+
const SIMPLE_DECIMAL_PLACES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
|
|
3
|
+
const SNAP_ULPS = 8;
|
|
4
|
+
function snapSimpleDecimal(value) {
|
|
5
|
+
if (!Number.isFinite(value)) {
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
for (const decimals of SIMPLE_DECIMAL_PLACES) {
|
|
9
|
+
const factor = 10 ** decimals;
|
|
10
|
+
const candidate = Math.round(value * factor) / factor;
|
|
11
|
+
// Scale the acceptance window with magnitude so we only absorb
|
|
12
|
+
// binary floating-point residue, not meaningful engineering deltas.
|
|
13
|
+
const tolerance = SNAP_ULPS * Number.EPSILON * Math.max(1, Math.abs(value), Math.abs(candidate));
|
|
14
|
+
if (Math.abs(value - candidate) <= tolerance) {
|
|
15
|
+
return Object.is(candidate, -0) ? 0 : candidate;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return Object.is(value, -0) ? 0 : value;
|
|
19
|
+
}
|
|
20
|
+
export function normalizePublicState(state) {
|
|
21
|
+
const normalized = { ...state };
|
|
22
|
+
for (const [key, value] of Object.entries(state)) {
|
|
23
|
+
// Preserve enum/null fields exactly; only normalize exposed numeric outputs.
|
|
24
|
+
if (key === 'region' || value === null || typeof value !== 'number') {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
normalized[key] = snapSimpleDecimal(value);
|
|
28
|
+
}
|
|
29
|
+
return normalized;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=public-normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-normalization.js","sourceRoot":"","sources":["../../src/core/public-normalization.ts"],"names":[],"mappings":"AAEA,4EAA4E;AAC5E,MAAM,qBAAqB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;AACtE,MAAM,SAAS,GAAG,CAAC,CAAC;AAIpB,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,qBAAqB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;QACtD,+DAA+D;QAC/D,oEAAoE;QACpE,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAEjG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,SAAS,EAAE,CAAC;YAC7C,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAwB,KAAQ;IAClE,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,EAA8C,CAAC;IAE5E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,6EAA6E;QAC7E,IAAI,GAAG,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpE,SAAS;QACX,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,UAA0B,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { SolveInput } from '../types.js';
|
|
2
|
+
export type CanonicalSolveInput = {
|
|
3
|
+
mode: 'PT';
|
|
4
|
+
p: number;
|
|
5
|
+
T: number;
|
|
6
|
+
} | {
|
|
7
|
+
mode: 'PH';
|
|
8
|
+
p: number;
|
|
9
|
+
h: number;
|
|
10
|
+
} | {
|
|
11
|
+
mode: 'PS';
|
|
12
|
+
p: number;
|
|
13
|
+
s: number;
|
|
14
|
+
} | {
|
|
15
|
+
mode: 'HS';
|
|
16
|
+
h: number;
|
|
17
|
+
s: number;
|
|
18
|
+
} | {
|
|
19
|
+
mode: 'Px';
|
|
20
|
+
p: number;
|
|
21
|
+
x: number;
|
|
22
|
+
} | {
|
|
23
|
+
mode: 'Tx';
|
|
24
|
+
T: number;
|
|
25
|
+
x: number;
|
|
26
|
+
} | {
|
|
27
|
+
mode: 'TH';
|
|
28
|
+
T: number;
|
|
29
|
+
h: number;
|
|
30
|
+
} | {
|
|
31
|
+
mode: 'TS';
|
|
32
|
+
T: number;
|
|
33
|
+
s: number;
|
|
34
|
+
};
|
|
35
|
+
export declare function normalizeSolveInput(input: SolveInput): CanonicalSolveInput;
|
|
36
|
+
//# sourceMappingURL=solve-input-normalization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve-input-normalization.d.ts","sourceRoot":"","sources":["../../src/core/solve-input-normalization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA6BzC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,mBAAmB,CAuD1E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { IF97Error } from '../types.js';
|
|
2
|
+
function pickNumericAlias(input, shortKey, longKey, label) {
|
|
3
|
+
const shortValue = input[shortKey];
|
|
4
|
+
const longValue = input[longKey];
|
|
5
|
+
if (shortValue === undefined && longValue === undefined) {
|
|
6
|
+
throw new IF97Error(`solve input requires '${shortKey}' or '${longKey}' for ${label}`);
|
|
7
|
+
}
|
|
8
|
+
if (shortValue !== undefined &&
|
|
9
|
+
longValue !== undefined &&
|
|
10
|
+
!Object.is(shortValue, longValue)) {
|
|
11
|
+
throw new IF97Error(`solve input received conflicting values for '${shortKey}' and '${longKey}'`);
|
|
12
|
+
}
|
|
13
|
+
return (shortValue ?? longValue);
|
|
14
|
+
}
|
|
15
|
+
// Normalize public solve() aliases to the canonical short-key form used internally.
|
|
16
|
+
export function normalizeSolveInput(input) {
|
|
17
|
+
const raw = input;
|
|
18
|
+
switch (input.mode) {
|
|
19
|
+
case 'PT':
|
|
20
|
+
return {
|
|
21
|
+
mode: 'PT',
|
|
22
|
+
p: pickNumericAlias(raw, 'p', 'pressure', 'pressure'),
|
|
23
|
+
T: pickNumericAlias(raw, 'T', 'temperature', 'temperature'),
|
|
24
|
+
};
|
|
25
|
+
case 'PH':
|
|
26
|
+
return {
|
|
27
|
+
mode: 'PH',
|
|
28
|
+
p: pickNumericAlias(raw, 'p', 'pressure', 'pressure'),
|
|
29
|
+
h: pickNumericAlias(raw, 'h', 'enthalpy', 'enthalpy'),
|
|
30
|
+
};
|
|
31
|
+
case 'PS':
|
|
32
|
+
return {
|
|
33
|
+
mode: 'PS',
|
|
34
|
+
p: pickNumericAlias(raw, 'p', 'pressure', 'pressure'),
|
|
35
|
+
s: pickNumericAlias(raw, 's', 'entropy', 'entropy'),
|
|
36
|
+
};
|
|
37
|
+
case 'HS':
|
|
38
|
+
return {
|
|
39
|
+
mode: 'HS',
|
|
40
|
+
h: pickNumericAlias(raw, 'h', 'enthalpy', 'enthalpy'),
|
|
41
|
+
s: pickNumericAlias(raw, 's', 'entropy', 'entropy'),
|
|
42
|
+
};
|
|
43
|
+
case 'Px':
|
|
44
|
+
return {
|
|
45
|
+
mode: 'Px',
|
|
46
|
+
p: pickNumericAlias(raw, 'p', 'pressure', 'pressure'),
|
|
47
|
+
x: pickNumericAlias(raw, 'x', 'quality', 'quality'),
|
|
48
|
+
};
|
|
49
|
+
case 'Tx':
|
|
50
|
+
return {
|
|
51
|
+
mode: 'Tx',
|
|
52
|
+
T: pickNumericAlias(raw, 'T', 'temperature', 'temperature'),
|
|
53
|
+
x: pickNumericAlias(raw, 'x', 'quality', 'quality'),
|
|
54
|
+
};
|
|
55
|
+
case 'TH':
|
|
56
|
+
return {
|
|
57
|
+
mode: 'TH',
|
|
58
|
+
T: pickNumericAlias(raw, 'T', 'temperature', 'temperature'),
|
|
59
|
+
h: pickNumericAlias(raw, 'h', 'enthalpy', 'enthalpy'),
|
|
60
|
+
};
|
|
61
|
+
case 'TS':
|
|
62
|
+
return {
|
|
63
|
+
mode: 'TS',
|
|
64
|
+
T: pickNumericAlias(raw, 'T', 'temperature', 'temperature'),
|
|
65
|
+
s: pickNumericAlias(raw, 's', 'entropy', 'entropy'),
|
|
66
|
+
};
|
|
67
|
+
default:
|
|
68
|
+
throw new IF97Error(`Unsupported solve mode: ${input.mode ?? 'undefined'}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=solve-input-normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve-input-normalization.js","sourceRoot":"","sources":["../../src/core/solve-input-normalization.ts"],"names":[],"mappings":"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"}
|
package/dist/core/solver.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ import type { SteamState, SolveInput } from '../types.js';
|
|
|
13
13
|
export declare function solvePT(p: number, T: number): SteamState;
|
|
14
14
|
/**
|
|
15
15
|
* Unified solver: compute full thermodynamic state from any supported input pair.
|
|
16
|
-
* Routes to the correct solver based on input mode, enriches with transport properties
|
|
16
|
+
* Routes to the correct solver based on input mode, enriches with transport properties,
|
|
17
|
+
* and accepts either shorthand or long-form input field names.
|
|
17
18
|
*/
|
|
18
19
|
export declare function solve(input: SolveInput): SteamState;
|
|
19
20
|
//# sourceMappingURL=solver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../src/core/solver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAmB,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"solver.d.ts","sourceRoot":"","sources":["../../src/core/solver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAmB,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA4C3E;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAqCxD;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAenD"}
|
package/dist/core/solver.js
CHANGED
|
@@ -5,6 +5,7 @@ import { region2 } from '../regions/region2.js';
|
|
|
5
5
|
import { region5 } from '../regions/region5.js';
|
|
6
6
|
import { detectRegionPT } from './region-detector.js';
|
|
7
7
|
import { solveRegion3PTBasic } from './region3-pt.js';
|
|
8
|
+
import { normalizeSolveInput } from './solve-input-normalization.js';
|
|
8
9
|
import { viscosity, thermalConductivity, surfaceTension, dielectricConstant, ionizationConstant } from '../transport/properties.js';
|
|
9
10
|
import { solvePH } from '../backward/ph.js';
|
|
10
11
|
import { solvePS } from '../backward/ps.js';
|
|
@@ -77,18 +78,20 @@ export function solvePT(p, T) {
|
|
|
77
78
|
}
|
|
78
79
|
/**
|
|
79
80
|
* Unified solver: compute full thermodynamic state from any supported input pair.
|
|
80
|
-
* Routes to the correct solver based on input mode, enriches with transport properties
|
|
81
|
+
* Routes to the correct solver based on input mode, enriches with transport properties,
|
|
82
|
+
* and accepts either shorthand or long-form input field names.
|
|
81
83
|
*/
|
|
82
84
|
export function solve(input) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
case '
|
|
86
|
-
case '
|
|
87
|
-
case '
|
|
88
|
-
case '
|
|
89
|
-
case '
|
|
90
|
-
case '
|
|
91
|
-
case '
|
|
85
|
+
const normalized = normalizeSolveInput(input);
|
|
86
|
+
switch (normalized.mode) {
|
|
87
|
+
case 'PT': return solvePT(normalized.p, normalized.T);
|
|
88
|
+
case 'PH': return enrichState(solvePH(normalized.p, normalized.h));
|
|
89
|
+
case 'PS': return enrichState(solvePS(normalized.p, normalized.s));
|
|
90
|
+
case 'HS': return enrichState(solveHS(normalized.h, normalized.s));
|
|
91
|
+
case 'Px': return enrichState(solvePx(normalized.p, normalized.x));
|
|
92
|
+
case 'Tx': return enrichState(solveTx(normalized.T, normalized.x));
|
|
93
|
+
case 'TH': return enrichState(solveTH(normalized.T, normalized.h));
|
|
94
|
+
case 'TS': return enrichState(solveTS(normalized.T, normalized.s));
|
|
92
95
|
default:
|
|
93
96
|
throw new IF97Error(`Unsupported solve mode: ${input.mode ?? 'undefined'}`);
|
|
94
97
|
}
|
package/dist/core/solver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../../src/core/solver.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"solver.js","sourceRoot":"","sources":["../../src/core/solver.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Public API exports.
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export
|
|
12
|
-
export
|
|
6
|
+
import type { BasicProperties, SteamState, SolveInput } from './types.js';
|
|
7
|
+
export declare function solvePT(p: number, T: number): SteamState;
|
|
8
|
+
export declare function solve(input: SolveInput): SteamState;
|
|
9
|
+
export declare function solvePH(p: number, h: number): BasicProperties;
|
|
10
|
+
export declare function solvePS(p: number, s: number): BasicProperties;
|
|
11
|
+
export declare function solveHS(h: number, s: number): BasicProperties;
|
|
12
|
+
export declare function solveTH(T: number, h: number): BasicProperties;
|
|
13
|
+
export declare function solveTS(T: number, s: number): BasicProperties;
|
|
14
|
+
export declare function solvePx(p: number, x: number): BasicProperties;
|
|
15
|
+
export declare function solveTx(T: number, x: number): BasicProperties;
|
|
13
16
|
export type { SteamState, SolveInput } from './types.js';
|
|
14
17
|
export { Region, IF97Error, OutOfRangeError, ConvergenceError } from './types.js';
|
|
15
18
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAqB1E,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,UAAU,CAExD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEnD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,eAAe,CAE7D;AAGD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,15 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { solve as solveAny, solvePT as solvePTInternal } from './core/solver.js';
|
|
2
|
+
import { normalizePublicState } from './core/public-normalization.js';
|
|
3
|
+
import { solvePH as solvePHInternal } from './backward/ph.js';
|
|
4
|
+
import { solvePS as solvePSInternal } from './backward/ps.js';
|
|
5
|
+
import { solveHS as solveHSInternal } from './backward/hs.js';
|
|
6
|
+
import { solveTH as solveTHInternal } from './backward/th.js';
|
|
7
|
+
import { solveTS as solveTSInternal } from './backward/ts.js';
|
|
8
|
+
import { solvePx as solvePxInternal, solveTx as solveTxInternal } from './saturation/two-phase.js';
|
|
9
|
+
function normalizeBasicState(state) {
|
|
10
|
+
return normalizePublicState(state);
|
|
11
|
+
}
|
|
12
|
+
function normalizeSteamState(state) {
|
|
13
|
+
return normalizePublicState(state);
|
|
14
|
+
}
|
|
6
15
|
// Core solvers
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
export
|
|
13
|
-
|
|
16
|
+
// Normalize only at the public package boundary so internal solver math
|
|
17
|
+
// keeps full raw precision during iteration and region transitions.
|
|
18
|
+
export function solvePT(p, T) {
|
|
19
|
+
return normalizeSteamState(solvePTInternal(p, T));
|
|
20
|
+
}
|
|
21
|
+
export function solve(input) {
|
|
22
|
+
return normalizeSteamState(solveAny(input));
|
|
23
|
+
}
|
|
24
|
+
export function solvePH(p, h) {
|
|
25
|
+
return normalizeBasicState(solvePHInternal(p, h));
|
|
26
|
+
}
|
|
27
|
+
export function solvePS(p, s) {
|
|
28
|
+
return normalizeBasicState(solvePSInternal(p, s));
|
|
29
|
+
}
|
|
30
|
+
export function solveHS(h, s) {
|
|
31
|
+
return normalizeBasicState(solveHSInternal(h, s));
|
|
32
|
+
}
|
|
33
|
+
export function solveTH(T, h) {
|
|
34
|
+
return normalizeBasicState(solveTHInternal(T, h));
|
|
35
|
+
}
|
|
36
|
+
export function solveTS(T, s) {
|
|
37
|
+
return normalizeBasicState(solveTSInternal(T, s));
|
|
38
|
+
}
|
|
39
|
+
export function solvePx(p, x) {
|
|
40
|
+
return normalizeBasicState(solvePxInternal(p, x));
|
|
41
|
+
}
|
|
42
|
+
export function solveTx(T, x) {
|
|
43
|
+
return normalizeBasicState(solveTxInternal(T, x));
|
|
44
|
+
}
|
|
14
45
|
export { Region, IF97Error, OutOfRangeError, ConvergenceError } from './types.js';
|
|
15
46
|
//# sourceMappingURL=index.js.map
|