Outils d’analyse et diagrammes
Cette page regroupe les utilitaires de la bibliothèque : ce ne sont pas des composants thermodynamiques (pas de bilan de matière/énergie interne) mais des outils de comparaison, de tracé et d’orchestration qui s’appuient sur les modules de cycle. Quatre familles sont documentées :
l”analyse de cycle de Carnot (COP, EER, rendement vs limites théoriques) ;
le diagramme température-entropie (T-S) d’un fluide pur ;
les diagrammes thermodynamiques des couples d’absorption (Merkel, Oldham) ;
l”assemblage et la résolution de flowsheet (moteur séquentiel-modulaire).
Analyse de cycle de Carnot
Module ThermodynamicCycles.Carnot_Cycle_Analysis. Il fournit trois classes
qui positionnent les performances mesurées d’une machine réelle face aux
limites théoriques (Carnot, et Curzon-Ahlborn pour les moteurs). Chaque classe
accumule des points via add_machine(...), expose un DataFrame pandas
(.df), un tableau texte (summary()) et un tracé (plot()).
COP_Analysis — Pompes à chaleur
Compare le COP chauffage mesuré à la limite de Carnot \(COP_{Carnot} = T_h / (T_h - T_c)\).
Élément |
Description |
Défaut / unité |
|---|---|---|
|
Constructeur. |
|
|
Ajoute un point. |
°C, - |
|
Méthode statique : courbe Carnot pour un |
|
|
Tableau texte (Tc, Th, dT, COP, COP_Carnot, ratio) |
|
|
Trace COP vs ΔT (courbe Carnot, iso-ratios, points machines annotés) |
|
EER_Analysis — Machines frigorifiques
Compare l’EER (COP froid, \(Q_{froid}/W\)) à la limite de Carnot en mode froid \(EER_{Carnot} = T_c / (T_h - T_c)\).
EER_Analysis(delta_T_range=(10, 80), iso_ratios=[0.30, 0.40, 0.50, 0.60])add_machine(name, Tc, Th, EER)—Tc= température d’évaporation (°C),Th= température de condensation (°C),EERmesuré.eer_carnot_curve(Tc_celsius, delta_T)— méthode statique.summary(),plot(...)— mêmes signatures queCOP_Analysis.
Efficiency_Analysis — Moteurs thermiques
Compare le rendement mesuré à deux limites :
Carnot (réversible) : \(\eta_{Carnot} = 1 - T_c/T_h\) ;
Curzon-Ahlborn (endoréversible, puissance maximale) : \(\eta_{C\text{-}A} = 1 - \sqrt{T_c/T_h}\), borne plus réaliste.
Efficiency_Analysis(Th_range=(100, 800), iso_ratios=[0.30, 0.40, 0.50, 0.60])—Th_rangeen °C.add_machine(name, Tc, Th, eta)—eta= rendement thermique mesuré (0 à 1). Le point est enrichi deeta_carnot,eta_CA,ratio_carnot,ratio_CA.eta_carnot_curve(Tc_celsius, Th_array)eteta_curzon_ahlborn_curve(Tc_celsius, Th_array)— méthodes statiques.summary(),plot(...).
Exemple
from ThermodynamicCycles.Carnot_Cycle_Analysis import (
COP_Analysis, EER_Analysis, Efficiency_Analysis,
)
# Pompe à chaleur
a = COP_Analysis()
a.add_machine("R290 plancher", Tc=0, Th=35, COP=4.8)
print(a.df)
print(a.summary())
a.plot(savefig="cop.pdf") # met show=False pour un usage batch
# Machine frigorifique
e = EER_Analysis()
e.add_machine("Chiller R134a", Tc=-5, Th=35, EER=3.2)
e.plot(savefig="eer.pdf")
# Moteur thermique
m = Efficiency_Analysis()
m.add_machine("Turbine vapeur", Tc=30, Th=500, eta=0.38)
m.plot(savefig="eta.pdf")
L’argument savefig déduit le format du fichier de son extension (.pdf,
.svg, .png…). plot() renvoie (fig, ax) matplotlib.
Diagramme température-entropie (T-S)
Module ThermodynamicCycles.Temperature_Entropy_Chart. La classe Object
trace, pour un fluide pur (via CoolProp), le dôme de saturation (courbe
liquide en bleu, vapeur en rouge), un réseau d”isobares en pointillés
étiquetées en bar, et des points personnalisés éventuellement reliés par des
flèches (pour visualiser un cycle).
Élément |
Description |
Défaut / unité |
|---|---|---|
|
Instancie le diagramme. |
°C |
|
Surcharge la plage de température affichée |
°C |
|
Fixe les bornes de l’axe d’entropie ( |
J/kg·K |
|
Ajoute une liste de points |
|
|
Construit et affiche le diagramme ; |
Exemple
from ThermodynamicCycles.Temperature_Entropy_Chart import Object
chart = Object('R407C')
chart.add_points([
{'S': 1000, 'T': 12},
{'S': 666, 'T': 12},
{'S': 2000, 'T': 15},
])
chart.show(draw_arrows=True)
Note
C’est cet utilitaire qu’utilisent en interne les modules de cycle (par
exemple Chiller.plot(), cf. Chiller (Groupe froid / PAC)) pour tracer le diagramme T-S
du cycle.
Diagrammes des couples d’absorption (Merkel, Oldham)
Module ThermodynamicCycles.Diagrams.MerkelDiagram. Il génère, pour les
couples de machines à absorption, les diagrammes de référence : Merkel
(enthalpie-concentration \(h\)–\(X\)) et Oldham (\(\log P\)
vs température, iso-concentrations). Le rendu utilise le backend matplotlib
Agg (sans affichage) et sauvegarde un fichier image.
Couples supportés :
'LiBr'— LiBr-H₂O (absorbant non volatil, réfrigérant eau ; domaine liquide seul) ;'NH3H2O'— ammoniac-eau (deux constituants volatils ; lignes de saturation bulle/rosée en plus des isothermes).
Fonctions publiques
Fonction |
Description |
Retour |
|---|---|---|
|
Diagramme de Merkel (h–X). |
|
|
Diagramme d’Oldham (log P vs T). LiBr : |
|
pair accepte les alias insensibles à la casse ('LiBr', 'LiBr-H2O',
'LiBrH2O' d’une part ; 'NH3H2O', 'NH3-H2O', 'AMMONIA' d’autre
part). Un couple inconnu lève ValueError. La figure est sauvegardée en 110
dpi puis fermée.
Exemple
from ThermodynamicCycles.Diagrams import MerkelDiagram
# Diagramme de Merkel LiBr-H2O (isothermes de solution)
MerkelDiagram.plot_merkel(
"LiBr", "merkel_libr.png",
T_list_degC=[20, 40, 60, 80, 100, 120],
)
# Diagramme de Merkel NH3-H2O avec saturations à 2 et 10 bar
MerkelDiagram.plot_merkel(
"NH3H2O", "merkel_nh3h2o.png",
T_list_degC=[0, 40, 80, 120], P_list_bar=(2.0, 10.0),
)
# Diagramme d'Oldham LiBr-H2O (iso-concentrations)
MerkelDiagram.plot_oldham(
"LiBr", "oldham_libr.png",
X_list_pct=[40, 50, 60, 65],
)
Note
Le module s’appuie sur AbsorptionChiller.LiBrH2O (enthalpie ASHRAE,
pression, température réfrigérant) et sur AmmoniaWater (équilibre
liquide-vapeur, bulle/rosée) pour les propriétés des couples.
Assemblage de flowsheet
Module ThermodynamicCycles.Flowsheet. La classe FlowsheetSolver est un
moteur d’orchestration séquentiel-modulaire : à partir d’un graphe de
composants existants et de leurs connexions, il détecte automatiquement les
boucles de recyclage, choisit un flux de coupure (« tear stream ») par boucle,
calcule une séquence de résolution (tri topologique) et itère jusqu’à
convergence avec accélération de Wegstein (repli substitution directe).
Le moteur est additif : il ne modifie aucun composant, réutilise
Connect.Fluid_connect pour propager les flux et appelle les .calculate()
existants.
API principale
Élément |
Description |
Défaut |
|---|---|---|
|
Constructeur. |
|
|
Enregistre un composant (doté d’une méthode |
|
|
Déclare qu’un port de sortie alimente un port d’entrée aval (ex. |
|
|
Résout le flowsheet et renvoie un rapport de convergence (dict) |
Le dictionnaire renvoyé par solve() contient : converged (bool),
iterations, residual, sequence (ordre de calcul), tears (liste
des arêtes coupées) et history (résidu relatif max par itération). En cas de
non-convergence, une clé message est ajoutée.
Exemple
from ThermodynamicCycles.Flowsheet import FlowsheetSolver
solver = FlowsheetSolver(tol=1e-6, max_iter=50, verbose=True)
solver.add_unit("EVAP", EVAP)
solver.add_unit("COMP", COMP)
solver.add_unit("COND", COND)
solver.add_unit("DET", DET)
solver.connect("EVAP", "Outlet", "COMP", "Inlet")
solver.connect("COMP", "Outlet", "COND", "Inlet")
solver.connect("COND", "Outlet", "DET", "Inlet")
solver.connect("DET", "Outlet", "EVAP", "Inlet") # recyclage
report = solver.solve()
print(report["converged"], report["iterations"], report["residual"])
Note
FlowsheetSolver dépend de networkx (construction du graphe, détection
des cycles, tri topologique) et se place strictement au-dessus des composants
et de Fluid_connect existants.