✅ Modèle Résolu Thermodynamiquement avec succès en {} itérations de Newton-Raphson.
", converged.iterations)); diff --git a/crates/vendors/Cargo.toml b/crates/vendors/Cargo.toml index 253e6a9..7314055 100644 --- a/crates/vendors/Cargo.toml +++ b/crates/vendors/Cargo.toml @@ -6,6 +6,7 @@ edition.workspace = true description = "Vendor equipment data backends for Entropyk (Copeland, SWEP, Danfoss, Bitzer)" [dependencies] +csv = "1.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" thiserror = "1.0" diff --git a/crates/vendors/data/bitzer/compressors/4HES-5Y.csv b/crates/vendors/data/bitzer/compressors/4HES-5Y.csv new file mode 100644 index 0000000..a0c7b4c --- /dev/null +++ b/crates/vendors/data/bitzer/compressors/4HES-5Y.csv @@ -0,0 +1,2 @@ +model,manufacturer,refrigerant,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,t_suction_min,t_suction_max,t_discharge_min,t_discharge_max +4HES-5Y,Bitzer,R410A,12000.0,220.0,-65.0,1.8,1.0,-2.2,0.025,0.012,-0.008,0.004,3200.0,75.0,28.0,0.7,0.45,0.7,0.01,0.006,0.004,0.002,-15.0,12.0,30.0,55.0 diff --git a/crates/vendors/data/bitzer/compressors/4NFC-20Y.csv b/crates/vendors/data/bitzer/compressors/4NFC-20Y.csv new file mode 100644 index 0000000..d2e2e97 --- /dev/null +++ b/crates/vendors/data/bitzer/compressors/4NFC-20Y.csv @@ -0,0 +1,2 @@ +model,manufacturer,refrigerant,c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,t_suction_min,t_suction_max,t_discharge_min,t_discharge_max +4NFC-20Y,Bitzer,R134a,32000.0,580.0,-150.0,4.2,2.5,-5.0,0.06,0.03,-0.02,0.01,8200.0,180.0,70.0,1.8,1.2,1.8,0.025,0.015,0.01,0.006,-10.0,15.0,25.0,60.0 diff --git a/crates/vendors/src/compressors/bitzer.rs b/crates/vendors/src/compressors/bitzer.rs new file mode 100644 index 0000000..833a331 --- /dev/null +++ b/crates/vendors/src/compressors/bitzer.rs @@ -0,0 +1,418 @@ +//! Bitzer compressor data backend. +//! +//! Loads AHRI 540 compressor coefficients from CSV files in the +//! `data/bitzer/compressors/` directory. The CSV columns `c0`..`c9` (capacity) +//! and `p0`..`p9` (power) are in AHRI 540 standard polynomial order: +//! Ts, Td, Ts², Ts·Td, Td², Ts³, Td·Ts², Ts·Td², Td³ (see [`CompressorCoefficients`]). + +use std::collections::HashMap; +use std::path::PathBuf; + +use crate::error::VendorError; +use crate::vendor_api::{ + BphxParameters, CompressorCoefficients, CompressorValidityRange, UaCalcParams, VendorBackend, +}; + +/// Backend for Bitzer compressor data. +/// +/// Discovers compressor models by scanning `*.csv` files in `data/bitzer/compressors/` +/// and uses the file stem (e.g. `4NFC-20Y`) as the model id. Each CSV row is mapped +/// to AHRI 540 `CompressorCoefficients`. +/// +/// # CSV format +/// +/// Header row with columns: `model`, `manufacturer`, `refrigerant`, `c0`..`c9` (capacity), +/// `p0`..`p9` (power), `t_suction_min`, `t_suction_max`, `t_discharge_min`, `t_discharge_max`. +/// One data row per file (one model per CSV file). +/// +/// # Example +/// +/// ```no_run +/// use entropyk_vendors::compressors::bitzer::BitzerBackend; +/// use entropyk_vendors::VendorBackend; +/// +/// let backend = BitzerBackend::new().expect("load bitzer data"); +/// let models = backend.list_compressor_models().unwrap(); +/// println!("Available: {:?}", models); +/// ``` +#[derive(Debug)] +pub struct BitzerBackend { + /// Root path to the Bitzer data directory. + data_path: PathBuf, + /// Pre-loaded compressor coefficients keyed by model name. + compressor_cache: HashMapLe solveur Newton-Raphson a calculé la racine d'un système couplé (MIMO) contenant à la fois les équations résiduelles des puces physiques et les variables du contrôle :
✅ Modèle Résolu Thermodynamiquement avec succès en 1 itérations de Newton-Raphson.
| Connexion | Pression absolue (bar) | Température de Saturation (°C) | Enthalpie (kJ/kg) |
|---|---|---|---|
| Compresseur → Condenseur | 13.50 | 10.26 | 479.23 |
| Condenseur → Détendeur | 13.50 | 10.26 | 260.00 |
| Détendeur → Évaporateur | 3.50 | -19.44 | 254.23 |
| Évaporateur → Compresseur | 3.50 | -19.44 | 404.23 |
| Variable / Contrainte | Valeur Optimisée par le Solveur |
|---|---|
| 🎯 Superheat calculé à l'Évaporateur | 400.73 K (Cible atteinte) |
| 🔧 Ouverture Vanne de Détente (Actionneur) | 0.3846 (entre 0 et 1) |
Note : La surchauffe (Superheat) est calculée numériquement d'après l'enthalpie de sortie de l'évaporateur et la pression d'évaporation. L'ouverture de la vanne a été automatiquement calibrée par la Jacobienne Newton-Raphson pour satisfaire cette contrainte exacte !
\ No newline at end of file +Le solveur Newton-Raphson a calculé la racine d'un système couplé (MIMO) contenant à la fois les équations résiduelles des puces physiques et les variables du contrôle :
✅ Modèle Résolu Thermodynamiquement avec succès en 1 itérations de Newton-Raphson.
| Connexion | Pression absolue (bar) | Température de Saturation (°C) | Enthalpie (kJ/kg) |
|---|---|---|---|
| Compresseur → Condenseur | 13.50 | 10.26 | 479.23 |
| Condenseur → Détendeur | 13.50 | 10.26 | 260.00 |
| Détendeur → Évaporateur | 3.50 | -19.44 | 254.23 |
| Évaporateur → Compresseur | 3.50 | -19.44 | 404.23 |
| Variable / Contrainte | Valeur Optimisée par le Solveur |
|---|---|
| 🎯 Superheat calculé à l'Évaporateur | 400.73 K (Cible atteinte) |
| 🔧 Ouverture Vanne de Détente (Actionneur) | 0.3846 (entre 0 et 1) |
Note : La surchauffe (Superheat) est calculée numériquement d'après l'enthalpie de sortie de l'évaporateur et la pression d'évaporation. L'ouverture de la vanne a été automatiquement calibrée par la Jacobienne Newton-Raphson pour satisfaire cette contrainte exacte !
\ No newline at end of file