Pompe (Pump)
Le module ThermodynamicCycles.Pump modélise une pompe de circulation de
liquide. Selon les paramètres fournis, il fonctionne dans deux modes distincts
(chemin additif, sans redondance) :
un mode débit imposé / thermodynamique (compression liquide isentropique avec rendement), adapté aux cycles de puissance (Rankine, ORC) et aux essais à débit constant ;
un mode courbe caractéristique, où le point de fonctionnement est déterminé par régression polynomiale (scikit-learn) sur la courbe HMT / rendement de la pompe et son intersection avec la caractéristique du réseau.
Dans les deux cas la pompe est traitée comme isotherme côté fluide : une pompe liquide n’échauffe/ne refroidit pas de façon significative, la température d’aspiration est conservée et l’enthalpie de refoulement est recalculée à la pression de refoulement (voir plus bas).
La classe s’instancie via ThermodynamicCycles.Pump.Pump.Object().
Connecteurs
Port |
Type |
Rôle |
|---|---|---|
|
|
aspiration (fluide, pression \(P\), enthalpie \(h\), débit \(F\) en kg/s) |
|
|
refoulement ; porte un callback |
Mode 1 — Débit imposé / thermodynamique (isentropique + rendement)
Ce mode est actif dès que IsenEff est défini (cycle de puissance) ou
que F_impose (kg/s) est fourni (essai à débit constant). Il court-circuite
la courbe caractéristique : le débit est imposé, et la température de refoulement
est un résultat de la compression liquide isentropique.
Le rendement isentropique retenu est \(\eta = \text{IsenEff}\) (ou 0.7 par
défaut si seul F_impose est fourni). Avec \(HP\) la pression de
refoulement (Pdischarge ou, à défaut, Inlet.P) :
Le refoulement est écrit sur Outlet (Outlet.h = Ho, Outlet.P = HP,
Outlet.F = Inlet.F), le callback étant neutralisé pendant l’écriture de la
pression. En prime, une courbe de pompe idéale passant par le point de
fonctionnement \((Q^\*, HMT^\*)\) est proposée (centrifuge parabolique
\(HMT(Q) = H_0 - k\,Q^2\) avec \(H_0 = 1{,}25\,HMT^\*\), rendement maximal
au BEP), puis ajustée par régression : le même modèle sert ainsi au
dimensionnement et à la simulation.
Mode 2 — Courbe caractéristique (régression polynomiale)
En l’absence de IsenEff et de F_impose, la pompe utilise sa courbe
caractéristique. Les points de construction sont fournis via X_F (débit
volumique, m³/h), Y_hmt (hauteur manométrique, m) et Y_eta (rendement).
Valeurs par défaut si non renseignés :
X_F = [7, 50, 100, 150] # m³/h
Y_hmt = [12, 60, 80, 68] # m
Y_eta = [0.5, 0.7, 0.5, 0.4] # -
Une régression polynomiale LinearRegression sur PolynomialFeatures de
degré \(n = \text{len}(X\_F) - 1\) (interpolation exacte des points)
ajuste séparément HMT(Q) et η(Q). La qualité d’ajustement HMT est reportée
(rmse_hmt, r2_hmt).
Selon les données fournies, le point de fonctionnement est déterminé ainsi :
``Pdischarge`` donnée →
calculate_flow_rate(): la HMT cible est déduite du réseau (\(HMT = \Delta P / (\rho g)\)), puis le débit correspondant est trouvé sur la courbe HMT(Q) par minimisationL-BFGS-Bde \(|HMT_{pred}(Q) - HMT|\) ;``F_m3h`` donné, sans ``Pdischarge`` →
calculate_hmt(): la HMT est prédite par la corrélation au débit donné, puis \(\Delta P = \rho g\,HMT\).
Le rendement au point de fonctionnement provient de calculate_eta()
(prédiction η(Q)). La puissance absorbée vaut :
avec \(\dot V\) = F_m3s (débit volumique, m³/s) et \(\rho\) la masse
volumique du fluide à l’aspiration (ThermoPropsSI("D", ...)), \(g = 9{,}81\)
m/s².
Équations clés
Grandeur |
Relation |
|---|---|
HMT ↔ pression |
\(\Delta P = \rho\, g\, HMT\) ; réciproquement \(HMT = \Delta P/(\rho g)\) |
Rendement (mode courbe) |
\(\eta = \eta_{model}(Q)\) (corrélation polynomiale) |
Puissance (mode courbe) |
\(Q_{pump} = \dot V \,\Delta P / \eta\) |
Compression isentropique (mode thermo) |
\(h_o = h_{in} + (h_{o,is}-h_{in})/\eta\) |
Puissance (mode thermo) |
\(\dot W_{pump} = F\,(h_o - h_{in})\) |
Comportement réseau (couplage courbe ∩ réseau)
Le Outlet porte un callback on_pressure_change : lorsque le réseau aval
impose une nouvelle pression Outlet.P, la pompe recalcule automatiquement
son point de fonctionnement via calculate_from_network_pressure() :
\(\Delta P_{réseau} = Outlet.P - Inlet.P\) puis \(HMT = \Delta P_{réseau}/(\rho g)\) ;
le débit correspondant est cherché sur la courbe HMT(Q) par minimisation
L-BFGS-B— c’est l”intersection courbe pompe ∩ courbe réseau ;la masse est propagée :
Inlet.F = F_m3s·ρ,Outlet.F = Inlet.F(et le callback amontInlet.callbackest appelé si présent) ;isotherme : la température d’aspiration est conservée, l’enthalpie de refoulement est recalculée à la pression réseau
Outlet.h = ThermoPropsSI('H','P',Outlet.P,'T',Ti_degC+273.15,fluid);le rendement est réévalué par
calculate_eta().
Des garde-fous (attributs _calculating / _calculating_inverse) évitent les
boucles infinies pendant les phases de calcul.
Paramètres configurables
Paramètre |
Défaut |
Description |
|---|---|---|
|
|
rendement isentropique ; active le mode thermodynamique ( |
|
|
débit massique imposé (kg/s) ; active le mode débit imposé |
|
|
pression de refoulement (bar) ; convertie en |
|
|
pression de refoulement (Pa) |
|
|
rendement (renseigné/prédit selon le mode) |
|
|
points de débit volumique de la courbe (m³/h) |
|
|
points de hauteur manométrique (m) |
|
|
points de rendement (-) |
|
|
horodatage propagé dans le DataFrame résultat |
Sorties principales
df: DataFrame de synthèse. En mode courbe :pump_F_kgs,pump_F_m3h,hmt(m),delta_p (Pa),Qpump(KW),self.eta. En mode thermodynamique :P_aspiration_bar,P_refoulement_bar,T_refoulement_degC,eta_is,W_pump_kW.F_m3h/F_m3s: débit volumique au point de fonctionnement.hmt/delta_p: hauteur manométrique (m) et différence de pression (Pa).eta,Q_pump(mode courbe) ;W_pump,To,Ho,Ho_is(mode thermodynamique).rmse_hmt/r2_hmt: indicateurs d’ajustement de la corrélation HMT.
Exemple (Source → Pompe, courbe caractéristique)
from ThermodynamicCycles.Source import Source
from ThermodynamicCycles.Pump import Pump
from ThermodynamicCycles.Connect import Fluid_connect
# Source d'eau : 20 °C, 1 bar, 5 kg/s
source = Source.Object()
source.fluid = "water"
source.Ti_degC = 20
source.Pi_bar = 1.0
source.F = 5.0
source.calculate()
# Pompe alimentée par la source
pump = Pump.Object()
Fluid_connect(pump.Inlet, source.Outlet) # copie fluide, P, h, F
# Point de fonctionnement fixé par la pression de refoulement (mode courbe)
pump.Pdischarge_bar = 4.0
pump.calculate()
print(pump.df) # F_m3h, hmt, delta_p, Qpump, eta
pump.plot_pump_curve() # courbe HMT/ΔP + rendement, point de fonctionnement
Pour un cycle de puissance (mode thermodynamique), fixer plutôt
pump.IsenEff = 0.75 (et éventuellement pump.F_impose pour un débit
imposé) avant pump.calculate() : la température de refoulement To et la
puissance W_pump deviennent les résultats de la compression liquide
isentropique.
Méthodes
calculate()— Calcule le point de fonctionnement (aiguille automatiquement vers le bon mode)calculate_hmt()— HMT prédite par la corrélation au débitF_m3hcalculate_flow_rate()— Débit sur la courbe pour unPdischargeimposécalculate_eta()— Rendement prédit par la corrélation au débitF_m3hcalculate_from_network_pressure()— Recalcul du point sur pression réseau imposée (callback)plot_pump_curve(figsize=(14, 10))— Tracé de la courbe caractéristique (HMT/ΔP et rendement) avec point de fonctionnement