# 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.