# Story 11.3: FloodedEvaporator

**Epic:** 11 - Advanced HVAC Components  
**Priorité:** P0-CRITIQUE  
**Estimation:** 6h  
**Statut:** backlog  
**Dépendances:** Story 11.2 (Drum)

---

## Story

> En tant qu'ingénieur chiller,  
> Je veux un composant FloodedEvaporator,  
> Afin de simuler des chillers avec évaporateurs noyés.

---

## Contexte

L'évaporateur flooded est un échangeur où le réfrigérant liquide inonde complètement les tubes via un récepteur basse pression. La sortie est un mélange diphasique typiquement à 50-80% de vapeur.

**Différence avec évaporateur DX:**
- DX: Sortie surchauffée (x ≥ 1)
- Flooded: Sortie diphasique (x ≈ 0.5-0.8)

---

## Ports

```
Réfrigérant (flooded):
  refrigerant_in:  Entrée liquide sous-refroidi ou diphasique
  refrigerant_out: Sortie diphasique (titre ~0.5-0.8)

Fluide secondaire:
  secondary_in:  Entrée eau/glycol (chaud)
  secondary_out: Sortie eau/glycol (refroidi)
```

---

## Équations

```
1. Transfert thermique:
   Q = UA × ΔT_lm  (ou ε-NTU)

2. Bilan énergie réfrigérant:
   Q = ṁ_ref × (h_ref_out - h_ref_in)

3. Bilan énergie fluide secondaire:
   Q = ṁ_fluid × cp_fluid × (T_fluid_in - T_fluid_out)

4. Titre de sortie (calculé, pas imposé):
   x_out = (h_out - h_sat_l) / (h_sat_v - h_sat_l)
```

---

## Fichiers à Créer/Modifier

| Fichier | Action |
|---------|--------|
| `crates/components/src/flooded_evaporator.rs` | Créer |
| `crates/components/src/lib.rs` | Ajouter module |

---

## Implémentation

```rust
// crates/components/src/flooded_evaporator.rs

use entropyk_core::{Power, Calib};
use entropyk_fluids::{FluidBackend, FluidId};
use crate::heat_exchanger::{HeatTransferModel, LmtdModel, EpsNtuModel};
use crate::{Component, ComponentError, ConnectedPort, SystemState};

pub struct FloodedEvaporator {
    model: Box<dyn HeatTransferModel>,
    refrigerant_id: String,
    secondary_fluid_id: String,
    refrigerant_inlet: ConnectedPort,
    refrigerant_outlet: ConnectedPort,
    secondary_inlet: ConnectedPort,
    secondary_outlet: ConnectedPort,
    fluid_backend: Arc<dyn FluidBackend>,
    calib: Calib,
    target_outlet_quality: f64,
}

impl FloodedEvaporator {
    pub fn with_lmtd(
        ua: f64,
        refrigerant: impl Into<String>,
        secondary_fluid: impl Into<String>,
        // ... ports
        backend: Arc<dyn FluidBackend>,
    ) -> Self { /* ... */ }
    
    pub fn with_target_quality(mut self, quality: f64) -> Self {
        self.target_outlet_quality = quality.clamp(0.0, 1.0);
        self
    }
    
    pub fn outlet_quality(&self, state: &SystemState) -> f64 { /* ... */ }
}
```

---

## Critères d'Acceptation

- [ ] Support modèles LMTD et ε-NTU
- [ ] Sortie réfrigérant diphasique (x ∈ [0, 1])
- [ ] `outlet_quality()` retourne le titre
- [ ] Calib factors (f_ua, f_dp) applicables
- [ ] Corrélation Longo (2004) par défaut pour BPHX
- [ ] n_equations() = 4

---

## Références

- [Epic 11 Technical Specifications](../planning-artifacts/epic-11-technical-specifications.md)
