Add diagram workbench UI with Modelica DoF coaching and ISO glyphs.

Ship the Next.js cycle editor with CAD chrome, technical HX symbols, Fixed/Free boundary guidance, and secondary water/air pressure drop support in the solver stack.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-17 22:46:46 +02:00
parent 62efea0646
commit 3358b74342
275 changed files with 70187 additions and 5230 deletions

View File

@@ -0,0 +1,123 @@
# Evaporator / EvaporatorCoil
Config types: `"Evaporator"`, `"EvaporatorCoil"`
Source: `crates/components/src/heat_exchanger/evaporator.rs`
---
## EN
### Purpose & physical model
**DX (direct-expansion)** evaporator: refrigerant outlet is **superheated vapor** (not flooded two-phase). Phase-change ε-NTU against a hot secondary stream:
```
ε = 1 exp(UA / C_sec)
Q = ε · C_sec · (T_sec,in T_evap(P)) # heat absorbed by refrigerant
```
- Optional refrigerant ΔP = k·ṁ·|ṁ|
- `EvaporatorCoil` locks secondary side to **Air**
- **No plate correlation** (see BPHX / LongoShah for geometry-based UA)
Difference vs `FloodedEvaporator`: DX uses **superheat closure** (or regulated SH); flooded uses **saturated vapor** (or quality) by default.
### Dual secondary modes (Newton)
| Mode | Secondary | `n_secondary` |
|------|-----------|---------------|
| **System** | Live `secondary_inlet` / `secondary_outlet` | 1 or 2 |
| **Rating** | Scalars T_sec + C_sec (ṁ·cp) | 0 |
`coupled_ready` = refrigerant ready **and** (live edges **or** rating scalars).
`live_secondary_stream` = edges first, else rating scalars.
### Residuals & `n_equations()` (coupled emergent)
| Row | Equation |
|-----|----------|
| r0 | `P_out (P_in ΔP)` (optional skip) |
| r1 | `ṁ · (h_out h_in) Q` |
| r2 | `h_out h(P, T_evap+SH)` if superheat is imposed |
| r_mass | dropped if same-branch |
| r_sec | live secondary mass/energy if edges |
```
n_thermo = base (1 or 2) + 1 if imposes_superheat()
n_equations = n_thermo + mass? + n_secondary
```
### Superheat regulation (DoF)
| Setting | Effect |
|---------|--------|
| Default | SH residual active (`superheat_k` target) when emergent |
| `superheat_regulated: true` | **Drops** SH residual (1 eq) |
If SH residual is dropped, pair with a **free** EXV opening (and usually a control loop) so the system stays square. CLI DoF gate enforces balance.
### Ports
| Port | Index |
|------|-------|
| `inlet` / `outlet` | 0 / 1 refrigerant |
| `secondary_inlet` / `secondary_outlet` | 2 / 3 secondary |
### Calibration
| Factor | Default | Notes |
|--------|---------|-------|
| `z_ua` | **1.0** | UA scale |
| `z_dp` | 1.0 | ΔP scale |
UI Fixed: SST (`saturationTemperature`) + free `z_ua` for inverse calib.
### JSON parameters (main)
| Key | Meaning | Default |
|-----|---------|---------|
| `ua` | UA [W/K] | required |
| `emergent_pressure` | free P_evap | false |
| `superheat_k` | SH target [K] | 5 |
| `superheat_regulated` | drop SH residual | false |
| `secondary_fluid` / `secondary_*` | system edges or rating | |
| `skip_pressure_eq` | drop ΔP residual | false |
### energy_transfers
Coupled: `Q = ṁ·(h_out h_in)` as positive heat (cooling capacity).
### Zero flow
Smooth `|ṁ|` for live `C_sec`; no silent mass-index→pressure fallback.
---
## FR
### But & modèle
Évaporateur **DX** (sortie **surchauffée**). Duty ε-NTU :
```
Q = ε · C_sec · (T_sec,in T_evap(P))
```
Différence avec **FloodedEvaporator** : clôture **superheat**, pas vapeur saturée noyée.
### Modes secondaire
- **Système :** ports live
- **Rating :** scalaires T + ṁ·cp **dans le Newton**
### Régulation de surchauffe
`superheat_regulated: true` enlève le résidu SH → **libérer** louverture EXV (contrôle).
### Calibration
`z_ua = 1` par défaut. Fixed SST + Z_UA libre pour calage.
### Ports / JSON
Voir EN.