Section 3 : Transformation de l’énergie (Utilités)

3.1. Cycles Thermodynamiques

Le module ThermodynamicCycles permet de modéliser les systèmes frigorifiques, pompes à chaleur et cycles thermodynamiques.

Composants de base

Source et Sink (Sources chaude et froide)

from energysystemmodels.ThermodynamicCycles import Source, Sink

# Source froide (évaporateur)
source_froide = Source(
    temperature_K=273.15 + 5,  # 5°C
    debit_massique_kg_s=1.0
)

# Source chaude (condenseur)
source_chaude = Sink(
    temperature_K=273.15 + 45,  # 45°C
    debit_massique_kg_s=1.0
)

Compresseur

from energysystemmodels.ThermodynamicCycles import Compressor

compresseur = Compressor(
    rendement_isentropique=0.75,
    rendement_volumetrique=0.85,
    puissance_nominale_kW=10.0
)

Évaporateur et Condenseur

from energysystemmodels.ThermodynamicCycles import Evaporator, Condenser

evaporateur = Evaporator(
    surface_echange_m2=5.0,
    coefficient_echange_W_m2K=1000,
    temperature_evaporation_K=273.15 + 5
)

condenseur = Condenser(
    surface_echange_m2=6.0,
    coefficient_echange_W_m2K=1200,
    temperature_condensation_K=273.15 + 45
)

Détendeur

from energysystemmodels.ThermodynamicCycles import ExpansionValve

detendeur = ExpansionValve(
    type_valve="thermostatique",
    coefficient_ouverture=0.8
)

Exemple complet : Cycle frigorifique à compression

from energysystemmodels.ThermodynamicCycles import (
    RefrigerationCycle, Source, Sink, Compressor,
    Evaporator, Condenser, ExpansionValve
)

# Définir les composants
source_froide = Source(temperature_K=273.15 + 7, debit_massique_kg_s=0.5)
source_chaude = Sink(temperature_K=273.15 + 40, debit_massique_kg_s=0.5)

compresseur = Compressor(
    rendement_isentropique=0.70,
    rendement_volumetrique=0.80,
    puissance_nominale_kW=5.0
)

evaporateur = Evaporator(
    surface_echange_m2=4.0,
    coefficient_echange_W_m2K=800,
    temperature_evaporation_K=273.15 + 5
)

condenseur = Condenser(
    surface_echange_m2=5.0,
    coefficient_echange_W_m2K=1000,
    temperature_condensation_K=273.15 + 42
)

detendeur = ExpansionValve(
    type_valve="thermostatique",
    coefficient_ouverture=0.75
)

# Créer le cycle
cycle = RefrigerationCycle(
    source=source_froide,
    sink=source_chaude,
    compressor=compresseur,
    evaporator=evaporateur,
    condenser=condenseur,
    expansion_valve=detendeur,
    refrigerant="R410A"
)

# Calculer les performances
resultats = cycle.calculate_performance()

print(f"Puissance frigorifique : {resultats['cooling_capacity_kW']:.2f} kW")
print(f"Puissance absorbée : {resultats['power_input_kW']:.2f} kW")
print(f"COP : {resultats['COP']:.2f}")
print(f"EER : {resultats['EER']:.2f}")

Exemple : Pompe à chaleur air-eau

from energysystemmodels.ThermodynamicCycles import HeatPump

# Configuration pompe à chaleur
pac = HeatPump(
    type_source="air",
    type_sink="eau",
    puissance_thermique_nominale_kW=12,
    temperature_source_K=273.15 + 7,
    temperature_sink_K=273.15 + 35,
    refrigerant="R32",
    rendement_compresseur=0.75
)

# Performances nominales
perf_nominale = pac.calculate_performance()

print(f"Puissance thermique : {perf_nominale['heating_capacity_kW']:.2f} kW")
print(f"Puissance électrique : {perf_nominale['power_input_kW']:.2f} kW")
print(f"COP : {perf_nominale['COP']:.2f}")

# Performances en fonction de la température extérieure
temperatures_ext = [-7, -2, 2, 7, 12]

print("\nPerformances selon température extérieure :")
for t_ext in temperatures_ext:
    pac.set_source_temperature(273.15 + t_ext)
    perf = pac.calculate_performance()
    print(f"  {t_ext:3.0f}°C : COP = {perf['COP']:.2f}, "
          f"Puissance = {perf['heating_capacity_kW']:.2f} kW")

Exemple issu des tests : Chiller complet

import CoolProp.CoolProp as CP
from ThermodynamicCycles.Evaporator import Evaporator
from ThermodynamicCycles.Compressor import Compressor
from ThermodynamicCycles.Desuperheater import Desuperheater
from ThermodynamicCycles.Expansion_Valve import Expansion_Valve
from ThermodynamicCycles.Condenser import Condenser
from ThermodynamicCycles.Connect import Fluid_connect

EVAP = Evaporator.Object()
COMP = Compressor.Object()
DESURCH = Desuperheater.Object()
COND = Condenser.Object()
DET = Expansion_Valve.Object()

fluid = "R134a"
EVAP.fluid = fluid
EVAP.Inlet.F = 1
EVAP.LP_bar = 2.930154
EVAP.surchauff = 2
EVAP.Inlet.h = CP.PropsSI('H', 'P', 1 * 1e5, 'T', 40 + 273.15, fluid)

COMP.Tcond_degC = 40
COMP.eta_is = 0.8
COMP.Tdischarge_target = 80

COND.subcooling = 2

EVAP.calculate()
Fluid_connect(COMP.Inlet, EVAP.Outlet)
COMP.calculate()
Fluid_connect(DESURCH.Inlet, COMP.Outlet)
DESURCH.calculate()
Fluid_connect(COND.Inlet, DESURCH.Outlet)
COND.calculate()
Fluid_connect(DET.Inlet, COND.Outlet)
Fluid_connect(DET.Outlet, EVAP.Inlet)
DET.calculate()
Fluid_connect(EVAP.Inlet, DET.Outlet)
EVAP.calculate()

EER = EVAP.Q_evap / COMP.Q_comp
Q_condTot = COND.Q_cond + DESURCH.Qdesurch
COP = Q_condTot / COMP.Q_comp

print("EER=" + str(round(EER, 1)))
print("Q_condTot=" + str(round(Q_condTot / 1000, 1)) + " kW")
print("COP=" + str(round(COP, 1)))