Froid à absorption (LiBr-H2O, NH3-H2O)
Le froid à absorption est piloté par la chaleur (chaleur fatale, eau chaude, vapeur) plutôt que par l’électricité : c’est la clé de la trigénération et de la valorisation de chaleur fatale. La vapeur de réfrigérant n’est pas comprimée mécaniquement mais absorbée par une solution absorbante, puis régénérée par apport de chaleur au générateur.
Les modules d”EnergySystemModels couvrant ce domaine sont :
Absorber — l’absorbeur (composant modulaire, tout couple) ;
Desorber — le désorbeur / générateur (composant modulaire, tout couple) ;
AbsorptionChiller — la machine complète simple effet LiBr-H2O ;
AmmoniaWater — les propriétés du mélange zéotrope NH3-H2O.
Les composants Absorber et Desorber s’appuient sur un fournisseur de
couple (WorkingPairs) qui abstrait le couple absorbant-réfrigérant. Tout est
exprimé en fraction massique de réfrigérant w (uniforme quel que soit le
couple), de sorte que le même composant fonctionne à l’identique pour LiBr-H2O,
NH3-H2O ou NH3-LiNO3.
Convention de port : dans ces composants, la solution circulant entre absorbeur et
générateur porte un attribut supplémentaire .w_refrig (fraction massique de
réfrigérant) sur le FluidPort, en plus de .F (débit, kg/s), .T (K) et
.h (J/kg).
Bilans génériques d’un couple (absorbant non volatil conservé, vapeur ≈ réfrigérant pur) :
Absorber (absorbeur)
Rôle
La solution pauvre en réfrigérant absorbe la vapeur issue de l’évaporateur et
redevient riche, en rejetant la chaleur d’absorption \(Q_a\). Le module
fonctionne pour n’importe quel couple via l’attribut pair.
Connecteurs
Port |
Sens |
Contenu |
|---|---|---|
|
entrée |
solution pauvre (porte |
|
entrée |
réfrigérant vapeur venant de l’évaporateur ( |
|
sortie |
solution riche ( |
Équations
Bilan de masse (le réfrigérant absorbé enrichit la solution) et titre riche imposé par la conservation de l’absorbant :
Chaleur rejetée à l’absorbeur (enthalpies en kJ/kg, convertie en W) :
où \(h_{poor} = h_{sol}(T_{in}, w_{poor})\), \(h_{rich} = h_{sol}(T_{abs}, w_{rich})\)
et \(h_{vap}\) provient du port vapeur (Vapor_Inlet.h) sinon de
pair.h_vap(T_vap). Le titre d’équilibre initial w_rich est d’abord évalué par
pair.w_rich(T_abs, P_evap) puis réajusté par le bilan de masse ci-dessus.
Paramètres
Paramètre |
Description |
Défaut / Unité |
|---|---|---|
|
Fournisseur de couple ( |
|
|
Température d’absorption |
35.0 °C |
|
Pression de l’évaporateur (sert au titre d’équilibre) |
None (kPa) |
|
Fraction massique de réfrigérant de la solution pauvre (requis) |
— (0..1) |
|
Horodatage optionnel |
None |
Sorties : w_poor, w_rich, mdot_poor, mdot_refrig, mdot_rich,
Qa_W (W) et le DataFrame df (T_abs_C, w_poor, w_rich,
mdot_rich_kgs, Qa_kW).
Exemple
from ThermodynamicCycles.Absorber.Absorber import Object as Absorber
abs = Absorber()
abs.T_abs_degC = 35.0
abs.P_evap_kPa = 0.87 # ~ évaporateur à 5 °C
abs.Solution_Inlet.w_refrig = 0.40 # solution pauvre en eau (riche en LiBr)
abs.Solution_Inlet.F = 0.9 # kg/s
abs.Solution_Inlet.T = 40 + 273.15
abs.Vapor_Inlet.F = 0.1 # kg/s de vapeur d'eau (évaporateur)
abs.Vapor_Inlet.T = 5 + 273.15
abs.calculate()
print(abs.df)
Desorber (désorbeur / générateur)
Rôle
Chauffe la solution riche en réfrigérant par un apport \(Q_g\) : une partie
du réfrigérant se vaporise et la solution restante devient pauvre. C’est
l’organe où entre la chaleur motrice. Fonctionne pour tout couple via pair.
Connecteurs
Port |
Sens |
Contenu |
|---|---|---|
|
entrée |
solution riche (porte |
|
sortie |
solution pauvre ( |
|
sortie |
réfrigérant vapeur à |
Équations
Le titre pauvre w_poor est donné par l’équilibre pair.w_poor(T_gen, P_cond).
Le débit de solution pauvre vient de la conservation de l’absorbant, la vapeur
désorbée de la différence :
Chaleur motrice au générateur :
avec \(h_{rich} = h_{sol}(T_{in}, w_{rich})\), \(h_{poor} = h_{sol}(T_{gen}, w_{poor})\) et \(h_{vap} = h_{vap}(T_{gen})\).
Paramètres
Paramètre |
Description |
Défaut / Unité |
|---|---|---|
|
Fournisseur de couple |
|
|
Température du générateur (chaleur motrice) |
90.0 °C |
|
Pression du condenseur (titre d’équilibre pauvre) |
None (kPa) |
|
Fraction massique de réfrigérant de la solution riche (requis) |
— (0..1) |
|
Horodatage optionnel |
None |
Sorties : w_rich, w_poor, mdot_rich, mdot_poor, mdot_refrig,
Qg_W (W) et le DataFrame df (T_gen_C, w_rich, w_poor,
mdot_refrig_kgs, Qg_kW).
Exemple
from ThermodynamicCycles.Desorber.Desorber import Object as Desorber
des = Desorber()
des.T_gen_degC = 90.0
des.P_cond_kPa = 5.63 # ~ condenseur à 35 °C
des.Inlet.w_refrig = 0.45 # solution riche en eau
des.Inlet.F = 1.0 # kg/s
des.Inlet.T = 70 + 273.15
des.calculate()
print(des.df)
Choix du couple
Absorbeur et désorbeur acceptent n’importe quel fournisseur de couple. La fabrique
get_pair (module WorkingPairs) instancie le bon fournisseur par son nom :
from ThermodynamicCycles.AbsorptionChiller.WorkingPairs import get_pair
des.pair = get_pair("NH3-H2O") # ou "LiBr-H2O", "NH3-LiNO3"
Couples disponibles : LiBr-H2O (réfrigérant = eau, absorbant LiBr non volatil),
NH3-H2O (réfrigérant = ammoniac, rectifieur idéal supposé, enthalpies via
AmmoniaWater) et NH3-LiNO3 (modèle simplifié
Raoult idéal, non quantitatif — le module le documente explicitement et renvoie
aux corrélations d’Infante Ferreira 1984 / Sun 1998 pour du quantitatif).
AbsorptionChiller (machine complète LiBr-H2O, simple effet)
Rôle
Machine frigorifique à absorption LiBr-H2O simple effet complète. Le cycle enchaîne évaporateur (effet de froid), absorbeur (la solution diluée absorbe la vapeur), générateur (la chaleur motrice désorbe l’eau) et condenseur (rejet). La différence de titre \(X_{concentre} - X_{dilue}\) est la plage de dégazage qui pilote la circulation.
Connecteurs
Port |
Sens |
Contenu |
|---|---|---|
|
entrée |
eau glacée (retour chaud) — |
|
sortie |
eau glacée (départ froid) |
Le générateur (chaleur motrice) et les rejets sont exprimés en flux scalaires
(Q_gen, Q_reject), pas en ports fluide.
Équations
Le COP réversible d’un frigo à absorption est le produit d’un COP de Carnot (frigo) et d’un rendement de Carnot (moteur), en températures absolues :
avec \(\eta_{II} \approx 0{,}4\)–\(0{,}5\) pour un simple effet
(\(COP \approx 0{,}7\)). Si COP est imposé, il prime sur eta_II.
La géométrie du cycle est calculée rigoureusement depuis l’équilibre LiBr-H2O
(module LiBrH2O) : pressions de saturation de l’eau à \(T_{evap}\) et
\(T_{cond}\), températures de réfrigérant, puis titres d’équilibre :
Bilan d’énergie (pompe négligée) :
L’effet de froid \(Q_{evap}\) est soit la capacité imposée Q_evap_W, soit
calculé depuis l’eau glacée si T_chilled_out_degC et ChilledWater_Inlet.F
sont fournis :
\(Q_{evap} = \dot m\,c_p\,(T_{in} - T_{chilled\_out})\).
Note
Le module documente honnêtement une limite : un bilan enthalpique complet
\(Q_{gen} = f(h_{vapeur}, h_{solution})\) exigerait un même datum d’enthalpie
entre l’eau (CoolProp Water) et la solution (INCOMP::LiBr), qui diffèrent.
Il n’est donc pas fait ici dans ce module de haut niveau : \(Q_{froid}\) est
calculé rigoureusement, mais le COP passe par \(\eta_{II}\,COP_{rev}\)
(valide ~0,7). Les composants Absorber/Desorber utilisent, eux,
l’enthalpie ASHRAE référencée eau (enthalpy_ashrae) pour un bilan cohérent.
Paramètres
Paramètre |
Description |
Défaut |
|---|---|---|
|
Température évaporateur (froid produit) |
5.0 °C |
|
Température condenseur (rejet) |
35.0 °C |
|
Température absorbeur (rejet) |
35.0 °C |
|
Température générateur (chaleur motrice) |
90.0 °C |
|
Rendement 2nd principe (simple effet ~0,4–0,5) |
0.46 |
|
COP imposé (prioritaire sur |
None |
|
Capacité de froid (W) — ignorée si l’eau glacée pilote |
100 000 W |
|
Consigne de départ d’eau glacée (si |
None |
Sorties : COP_rev, COP_out, Q_gen, Q_reject, Q_evap (W),
P_evap_kPa, P_cond_kPa, X_dilute, X_concentrated,
degassing_range, circulation_ratio et le DataFrame df (Q_froid_kW,
Q_generateur_kW, Q_rejet_kW, COP, COP_reversible, P_evap_kPa,
P_cond_kPa, X_dilue_pct, X_concentre_pct, Plage_degazage_pct,
Taux_circulation).
Exemple
from ThermodynamicCycles.AbsorptionChiller.AbsorptionChiller import Object as AbsorptionChiller
ac = AbsorptionChiller()
ac.T_evap_degC = 5
ac.T_cond_degC = 35
ac.T_abs_degC = 35
ac.T_gen_degC = 90
ac.eta_II = 0.46
ac.Q_evap_W = 100e3 # 100 kW de froid
ac.calculate()
print(ac.df)
Couple LiBr-H2O — domaine de validité (module LiBrH2O)
L’équilibre repose sur les équations ASHRAE (support Thermoptim, MINES ParisTech) :
où \(t\) est la température de solution (°C), \(t'\) la température d’équilibre du réfrigérant (eau), et \(X\) le titre massique en LiBr (%).
Domaine de validité : \(-15 < t' < 110\)°C, \(5 < t < 175\)°C,
\(45 < X < 70\)% (titre LiBr). L’enthalpie ASHRAE de la solution
(enthalpy_ashrae, référencée eau liquide 0 °C) est valide ~40–70 % LiBr,
~15–165 °C.
AmmoniaWater (propriétés du mélange NH3-H2O)
Rôle
Propriétés thermodynamiques du mélange ammoniac-eau (NH3-H2O), un mélange zéotrope : à pression donnée, ébullition et condensation se font avec un glissement de température (les compositions du liquide et de la vapeur diffèrent). C’est la propriété qui fait fonctionner les cycles à absorption NH3-H2O, le cycle de Kalina et les cycles binaires eau/ammoniac. CoolProp (pseudo-pur) ne traite pas correctement ce mélange, d’où ce module dédié.
Corrélations
Corrélations de Pátek & Klomfar (1995), « Simple functions for fast calculations of selected thermodynamic properties of the ammonia-water system », Int. J. Refrig. 18(4):228-234 — référence reprise par R. Gicquel, Energy Systems, chap. 13/14. Composition en fraction molaire d’ammoniac (\(x\) liquide, \(y\) vapeur ; 0 = eau pure, 1 = ammoniac pur) :
Les jeux de coefficients \((m_i, n_i, a_i)\) sont ceux de Pátek-Klomfar 1995
(tables _BUBBLE, _DEW, _HLIQ, _HVAP du module).
La fraction molaire d’ammoniac de la vapeur en équilibre avec un liquide \(x\)
est résolue par bissection en imposant \(T_{dew}(p, y) = T_{bubble}(p, x)\)
(fonction equilibrium_vapor_mole_fraction). Conversions
mass_to_mole / mole_to_mass via \(M_{NH_3} = 17{,}0305\)g/mol,
\(M_{H_2O} = 18{,}0153\)g/mol.
Domaine de validité
Référence d’enthalpie Pátek-Klomfar : \(h = 0\) pour l’eau liquide saturée à 273,16 K (cohérent avec les tables vapeur ; l’eau liquide à 100 °C donne ~419 kJ/kg). Corrélations valables pour les états saturés (liquide à saturation / vapeur à saturation). Conventions internes : \(p\) en Pa (converti en MPa), \(T\) en K, enthalpies en J/kg dans les fonctions bas niveau.
Paramètres (classe Object)
Paramètre |
Description |
Unité |
|---|---|---|
|
Pression (requis) |
bar |
|
Fraction molaire d’ammoniac du liquide (ou déduite de |
— (0..1) |
|
Fraction massique d’ammoniac (alternative à |
— (0..1) |
|
Horodatage optionnel |
None |
Sorties : T_bubble_degC, T_dew_degC, y_NH3_mole (vapeur à l’équilibre),
h_liquid_kJ_kg, h_vapor_kJ_kg, glide_K (glissement bulle→rosée) et le
DataFrame df.
Exemple
from ThermodynamicCycles.AmmoniaWater.AmmoniaWater import Object as AmmoniaWater
aw = AmmoniaWater()
aw.P_bar = 10.0
aw.x_NH3_mole = 0.40 # 40 % molaire d'ammoniac dans le liquide
aw.calculate()
print(aw.df)
# -> T_bubble_C, T_dew_C, glide_K (glissement), y_NH3_mole, h_liquid/h_vapor
Fonctions bas niveau utilisables directement :
from ThermodynamicCycles.AmmoniaWater import AmmoniaWater as AW
p = 10e5 # Pa
x = 0.40 # fraction molaire NH3 (liquide)
Tb = AW.T_bubble(p, x) # K, température de bulle
y = AW.equilibrium_vapor_mole_fraction(p, x)
Td = AW.T_dew(p, y) # K, température de rosée
h_liq = AW.h_liquid(Tb, x) # J/kg
h_vap = AW.h_vapor(Td, y) # J/kg