Ballon de stockage stratifié
Le modèle ThermodynamicCycles.Tank.StratifiedStorageTank simule un ballon
d’eau chaude stratifié à \(N\) couches (traduction Python d’un modèle
Modelica). Il combine advection (transport upwind entre couches),
conduction verticale et pertes ambiantes, avec une intégration temporelle
Euler explicite à sous-pas (critère CFL automatique).
Connecteurs (4 ports)
Port |
Position |
Rôle |
|---|---|---|
|
bas |
entrée froide (\(F>0\) entrant) |
|
haut |
entrée chaude |
|
haut |
sortie chaude |
|
bas |
sortie froide |
Les débits de sortie sont déduits par croisement (échangeur à contre-courant) :
ce qui entre en bas ressort en haut (port_hot_b.F = port_cold_a.F) et ce qui
entre en haut ressort en bas (port_cold_b.F = port_hot_a.F). Le bilan de
masse à volume constant est donc conservé par construction :
Bilan d’énergie par couche
Chaque couche \(i\) suit \(\rho\,V_i\,C\,\dfrac{dT_i}{dt} = P_i\), avec \(P_i\) la somme des flux :
advection externe (entrées/sorties) aux couches haut (1) et bas (N) ;
advection interne upwind (\(\dot m_+\) ascendant, \(\dot m_-\) descendant), sous forme conservative (télescopage → 0 sur l’ensemble) ;
conduction \(\lambda\) entre couches voisines ;
pertes \(U\,A_i\,(T_{amb}-T_i)\).
Le flux advectif interne étant conservatif, le bilan global d’énergie se réduit au flux enthalpique net (entrées − sorties) moins les pertes — vérifié numériquement à < 0,5 % (l’écart résiduel vient de l’intégration Euler et de l’approximation \(h \approx C\,T\)).
Paramètres configurables
Paramètre |
Défaut |
Description |
|---|---|---|
|
2,0 m / 1,784 m |
hauteur / diamètre du ballon |
|
10 |
nombre de couches (\(\ge 3\)) |
|
1,0 W/m²/K |
coefficient global de pertes |
|
12 °C |
température ambiante |
|
12 °C |
température initiale (uniforme) |
|
3600 s |
pas de temps global |
|
100 |
sous-pas Euler (minimum ; relevé par le critère CFL) |
Note
Les couches haut et bas sont volontairement plus épaisses (\(2\,H_{ball}/N\)) que les couches internes. La grille est donc non uniforme (les hauteurs et volumes somment bien à \(H_{ball}\) et \(V\)).
Sorties principales
T_degC: profil de température des \(N\) couches (stratification) ;Qstr_kWh/Qstr_kW: énergie / puissance échangée sur le pas (pondérées par les volumes réels des couches) ;cumul_Qstr_kWh: énergie cumulée depuis l’état initial (= variation réelle de l’énergie stockée) ;Delta_u_kWh: énergie stockée absolue par rapport à \(T_{init}\) ;P_ballon: puissance nette du ballon (W) = \(dU/dt\).
Utilisation
from ThermodynamicCycles.Tank import StratifiedStorageTank
from ThermodynamicCycles.FluidPort.FluidPort import ThermoPropsSI
ballon = StratifiedStorageTank.Object()
ballon.N = 10
ballon.Tinit_degC = 20 # ballon initialement à 20 °C
ballon.Tamb_degC = 12
ballon.t = 3600 # 1 h par pas
# Charge : eau chaude 70 °C injectée en haut (0,5 kg/s)
P = 3e5
ballon.port_hot_a.fluid = "water"
ballon.port_hot_a.P = P
ballon.port_hot_a.F = 0.5
ballon.port_hot_a.h = ThermoPropsSI("H", "P", P, "T", 70 + 273.15, "water")
for _ in range(6): # 6 h de charge
ballon.calculate()
print("Profil (°C) :", [round(t, 1) for t in ballon.T_degC])
print("Énergie stockée cumulée :", round(ballon.cumul_Qstr_kWh, 2), "kWh")
Note
Cohérence énergétique : l’énergie stockée absolue Delta_u_kWh est
pondérée par les volumes réels des couches (\(V_i\)), et non plus par
la moyenne \(V/N\). Elle est donc désormais cohérente avec
cumul_Qstr_kWh (intégrale de la puissance échangée) — les deux donnent la
même variation d’énergie stockée sur la grille non uniforme.