Entropyk/_bmad-output/implementation-artifacts/11-3-flooded-evaporator.md

3.0 KiB
Raw Blame History

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

// 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