Files
Entropyk/docs/components/flooded-evaporator.md
sepehr 5bd180b5b8
Some checks failed
CI / check (push) Has been cancelled
Snapshot WIP: solver HP epic progress, BPHX/HX physics, BMAD skill refresh.
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>
2026-07-19 16:35:31 +02:00

150 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.