# 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 / Longo–Shah 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** l’ouverture EXV (contrôle).

### Calibration

`z_ua = 1` par défaut. Fixed SST + Z_UA libre pour calage.

### Ports / JSON

Voir EN.
