127 lines
3.0 KiB
Markdown
127 lines
3.0 KiB
Markdown
# 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)
|