Some checks failed
CI / check (push) Has been cancelled
Capture uncommitted solver robustness work (regularization, domain errors, linear solver lifecycle, tube DP/MSH), web workbench updates, and synced BMAD skills across IDE agent folders before starting BPHX pressure-drop. Co-authored-by: Cursor <cursoragent@cursor.com>
150 lines
5.9 KiB
Markdown
150 lines
5.9 KiB
Markdown
# FloodedEvaporator
|
||
|
||
Config type: `"FloodedEvaporator"`
|
||
Source: `crates/components/src/heat_exchanger/flooded_evaporator.rs`
|
||
Example: `crates/cli/examples/chiller_flooded_4port_watercooled.json` (DoF 19=19, COP ≈ 6.45)
|
||
|
||
---
|
||
|
||
## EN
|
||
|
||
### Purpose & physical model
|
||
|
||
Shell-and-tube **flooded** evaporator. Refrigerant boils on the shell side; secondary (water/brine) flows in the tubes. Heat duty uses **phase-change ε-NTU** (`C_min = C_sec`, `C_r → 0`):
|
||
|
||
```
|
||
ε = 1 − exp(−UA / C_sec)
|
||
Q = ε · C_sec · (T_sec,in − T_evap(P))
|
||
```
|
||
|
||
- `T_evap(P)` = saturation temperature of the refrigerant at edge pressure
|
||
- `C_sec` = secondary heat-capacity rate [W/K]
|
||
|
||
There is **no plate-geometry correlation** inside this component (unlike BPHX). UA is a **lumped parameter** (possibly scaled by calibration `z_ua` via the inner `HeatExchanger` calib API).
|
||
|
||
### Dual operating modes (both enter Newton residuals)
|
||
|
||
| Mode | How secondary is defined | Secondary Newton unknowns | When to use |
|
||
|------|--------------------------|---------------------------|-------------|
|
||
| **System (4-port)** | Live edges `secondary_inlet` / `secondary_outlet` (e.g. BrineSource → HX → BrineSink) | Yes (`n_secondary` = 1 or 2) | Closed water loop, real machine |
|
||
| **Rating** | Scalars `secondary_inlet_temp_*` + `C_sec` (`secondary_mass_flow_kg_s` × `cp` or `secondary_capacity_rate_w_per_k`) | No (`n_secondary` = 0) | Qualification / open-loop duty; still **coupled ε-NTU in residuals** |
|
||
|
||
`coupled_ready` = refrigerant indices ready **and** (live secondary edges **or** rating scalars).
|
||
Never falls through to generic four-port `HeatExchanger::inner` residuals for normal operation (seed path is local and finite).
|
||
|
||
**Rating residual energy:** uses full `Q` (not `α(ṁ)·Q`) so `ṁ = 0` is not a trivial root when `C_sec > 0`.
|
||
**System residual energy:** uses `effective_duty(Q, α_ref, α_sec)` from `flow_regularization` for zero-flow safety.
|
||
|
||
Also exposed: `rate(p_in)` open-loop rating API for sweeps (same ε-NTU formulas).
|
||
|
||
### Outlet closure (DoF-critical)
|
||
|
||
| Setting | Residual r2 | Typical use |
|
||
|---------|-------------|-------------|
|
||
| Default (`quality_control: false`) | `h_out − h_g(P)` saturated vapor | Compressor suction after disengagement |
|
||
| `quality_control: true` | `x_out − target_quality` | Legacy recirculation / two-phase outlet |
|
||
|
||
Both keep **the same** `n_equations` (quality replaces sat-vapor; it does not add an extra free residual by itself).
|
||
`quality_control: true` on a closed cycle often needs a **free actuator** elsewhere or the DoF gate rejects the graph.
|
||
|
||
### Residuals & `n_equations()`
|
||
|
||
| Row | Equation |
|
||
|-----|----------|
|
||
| r0 | `P_out − P_in` (no refrigerant ΔP by default) |
|
||
| r1 | `ṁ_ref · (h_out − h_in) − Q_eff` |
|
||
| r2 | sat-vapor **or** quality target (see above) |
|
||
| r_sec mass | `ṁ_sec,out − ṁ_sec,in` only if live edges and **not** same-branch |
|
||
| r_sec energy | live secondary energy + duty (blended at low ṁ) |
|
||
|
||
```
|
||
n_equations = 3 + n_secondary
|
||
n_secondary = 0 # rating (no live edges)
|
||
| 1 # live edges, same-branch ṁ
|
||
| 2 # live edges, independent ṁ in/out
|
||
```
|
||
|
||
### Ports
|
||
|
||
| Port | Index | Role |
|
||
|------|-------|------|
|
||
| `inlet` | 0 | Refrigerant from EXV |
|
||
| `outlet` | 1 | Refrigerant to compressor suction |
|
||
| `secondary_inlet` | 2 | Water/brine in |
|
||
| `secondary_outlet` | 3 | Water/brine out |
|
||
|
||
CLI aliases: `water_in` / `brine_in` → secondary_inlet, etc. (`resolve_port_index`).
|
||
|
||
### Calibration
|
||
|
||
| Factor | Effect | Default |
|
||
|--------|--------|---------|
|
||
| `z_ua` (BOLT `Z_UA`) | `UA_eff = z_ua · UA` via inner calib | **1.0** |
|
||
| `z_dp` | pressure-drop scale if ΔP model used | 1.0 |
|
||
|
||
Inverse calibration (CLI `controls[]` / UI Fixed checkboxes): impose a measure (e.g. SST = `saturationTemperature`) and free `z_ua`.
|
||
|
||
### JSON parameters
|
||
|
||
| Key | Meaning | Unit | Default |
|
||
|-----|---------|------|---------|
|
||
| `ua` | UA | W/K | **required** |
|
||
| `refrigerant` | refrigerant id | – | primary fluid |
|
||
| `secondary_fluid` | secondary fluid | – | Water / MEG |
|
||
| `quality_control` | quality residual instead of sat-vapor | bool | `false` |
|
||
| `target_quality` | x target if quality_control | – | 0.7 |
|
||
| `secondary_inlet_temp_c` / `_k` | rating T_sec,in | °C / K | – |
|
||
| `secondary_mass_flow_kg_s` | rating ṁ_sec | kg/s | – |
|
||
| `secondary_cp_j_per_kgk` | rating cp | J/(kg·K) | 4186 |
|
||
| `secondary_capacity_rate_w_per_k` | rating C_sec direct | W/K | – |
|
||
| calib `z_ua` / `z_dp` | Z-factors | – | 1.0 |
|
||
|
||
### energy_transfers / mass
|
||
|
||
When coupled: cooling `Q ≈ ṁ·(h_out − h_in)` (positive heat absorbed by refrigerant).
|
||
`port_mass_flows` reports 4-port signs without calling generic inner four-port.
|
||
|
||
### Zero flow
|
||
|
||
`flow_regularization` on system path: smooth `|ṁ|` for live `C_sec`, activity factors, secondary Δh hold. Seed residuals stay finite if P is non-physical.
|
||
|
||
---
|
||
|
||
## FR
|
||
|
||
### But & modèle
|
||
|
||
Évaporateur **noyé** tubes-calandre. Duty **ε-NTU** à changement de phase :
|
||
|
||
```
|
||
ε = 1 − exp(−UA / C_sec)
|
||
Q = ε · C_sec · (T_sec,in − T_evap(P))
|
||
```
|
||
|
||
Pas de corrélation géométrique type Longo/Shah (voir BPHX pour ça). UA est un **paramètre global**, modulable par `z_ua` (défaut **1**).
|
||
|
||
### Deux modes (tous deux dans le Newton)
|
||
|
||
| Mode | Secondaire | Inconnues eau | Usage |
|
||
|------|------------|---------------|--------|
|
||
| **Système** | Ports live Source → HX → Sink | oui | Machine fermée |
|
||
| **Rating** | Scalaires T + ṁ·cp (ou C_sec) | non | Qualification ; Q ε-NTU **dans** les résidus |
|
||
|
||
### Clôture de sortie
|
||
|
||
- Défaut : **vapeur saturée** `h_out = h_g(P)` (aspiration compresseur).
|
||
- `quality_control: true` : `x_out − x_cible` (même nombre d’équations).
|
||
|
||
### Résiduels
|
||
|
||
`n_equations = 3 + n_secondary` (0 / 1 / 2). Voir tableau EN.
|
||
|
||
### Calibration
|
||
|
||
Imposer une mesure (SST) et libérer `z_ua` (UI case Fixed, ou `controls[]`).
|
||
`z_ua = 1` = pas de correction.
|
||
|
||
### Ports / JSON
|
||
|
||
Identiques aux tableaux EN.
|