# -*- coding: utf-8 -*- """ Created on Sun Jul 13 11:03:38 2014 @author: Matthieu """ from matplotlib import pyplot from CoolProp.Plots import PropsPlot from CoolProp.State import State from matplotlib.patches import Ellipse import CoolProp.CoolProp as CP # Les if True: ou if False: permettent de tracer tout # ou partie du graphique sans avoir à commenter les lignes une à une # On commence par tracer le diagramme Ts fluid = 'Water' fig = pyplot.figure() ax = pyplot.subplot(1,1,1) Ts = PropsPlot(fluid, 'Ts', axis=ax) Ts._draw_graph() Ts.title('Centrale géothermique') Ts.xlabel('Entropie massique $s$ (kJ.kg$^{-1}$.K$^{-1}$)') Ts.ylabel('Température $T$ (K)') # on trace les isoP et isoT intéressantes Ts.draw_isolines('Q', [0.1, 0.9],num=9) Ts.draw_isolines('P', [10, 10]) Ts.axis.text(8.5*1000,375,"P=0,1 bar",fontsize=9,horizontalalignment='center',verticalalignment='center') Ts.draw_isolines('P', [100, 100]) Ts.axis.text(8*1000,525,"P=1,0 bar",fontsize=9,horizontalalignment='center',verticalalignment='center') Ts.draw_isolines('P', [700, 700]) Ts.axis.text(7.5*1000,600,"P=7,0 bar",fontsize=9,horizontalalignment='center',verticalalignment='center') Ts.draw_isolines('T', [413, 413]) Ts.axis.text(0.8*1000,413,"T=140 °C",fontsize=9,horizontalalignment='center',verticalalignment='center') Ts.set_axis_limits([0.0, 9.0, 250.0, 700.0]) # les grandeurs pertinentes # ATTENTION les pression sont en kPa p_max = 7e2 p_inter = 1e2 p_fin = 0.1e2 Q1=0.25 T_surchauffe=140+273 # définition des différents états S1 = State(fluid, dict(P=p_max, Q=Q1)) S2 = State(fluid, dict(P=p_max, Q=1)) S3 = State(fluid, dict(P=p_fin, S=S2.s)) S4 = State(fluid, dict(P=p_max, Q=0)) S5 = State(fluid, dict(P=p_inter, H=S4.h)) S6 = State(fluid, dict(P=p_inter, Q=1)) S7 = State(fluid, dict(P=p_inter, T=T_surchauffe)) S8 = State(fluid, dict(P=p_fin, S=S7.s)) S9 = State(fluid, dict(P=p_inter, Q=0)) S10 = State(fluid, dict(P=p_fin, Q=0)) # on rajoute l'isoH # bug étrange si dans axis_limits on met [[2.00,2.5],[250.0,700.0]] if False: Ts.draw_isolines('H', [S4.h,S4.h],axis_limits=[[1.99, 2.5], [250.0, 700.0]]) # et les deux isoS if False: Ts.draw_isolines('S', [S2.s,S2.s],axis_limits=[[0, 10], [S3.T, S2.T]]) Ts.draw_isolines('S', [S7.s,S7.s],axis_limits=[[0, 10], [S8.T, S7.T]]) # On affiche les grandeurs pertinentes def affich(etat,nom): print("*************") print("Pour l'état",nom,":") print("P =",etat.p*1000,"Pa") print("T =",etat.T-273,"°C") print("x =",etat.Q) print("h =",etat.h,"kJ/kg") print("s =",etat.s,"kJ/kg/K") affich(S1,1) affich(S2,2) affich(S3,3) affich(S4,4) affich(S5,5) affich(S6,6) affich(S7,7) affich(S8,8) affich(S9,9) affich(S10,10) # calcul des débits M1= 1000 # en kg/s M2=S1.Q*M1 M3=(1-S1.Q)*M1 M4=(S4.h-S2.h)*S5.Q*M3/(S4.h-S2.h+S5.Q*(S7.h-S6.h)) M5=-(S7.h-S6.h)*S5.Q*M3/(S4.h-S2.h+S5.Q*(S7.h-S6.h)) R1= (1-S5.Q)*(M3+M5) R2=M4+M2 print("M1 =",M1) print("M2 =",M2) print("M3 =",M3) print("M4 =",M4) print("M5 =",M5) print("R1 =",R1) print("R2 =",R2) print("rejet =",R1+R2) # calcul des puissances P1=(M2-M5)*(S3.h-S2.h) P2=M4*(S8.h-S7.h) Ptot=P1+P2 print("P_turbine_1 =",-P1/1000,"MW") print("P_turbine_2 =",-P2/1000,"MW") print("P_tot =",-Ptot/1000,"MW") Pperte_1=R1*(S9.h-S1.h) Pperte_2=R2*(S10.h-S1.h) Pperte_tot=Pperte_1+Pperte_2 print("P_perte_1 =",-Pperte_1/1000,"MW") print("P_perte_2 =",-Pperte_2/1000,"MW") print("P_perte_tot =",-Pperte_tot/1000,"MW") print("rendement =",Ptot/Pperte_tot) P_condenseur=(M2-M5)*(S10.h-S3.h)+M4*(S10.h-S8.h) print("P_condenseur =",P_condenseur) # les transformations, avec les points à adapter à chaque cas if True: Ts.draw_process([S1, S4, S5, S9],line_opts={'color': 'b', 'lw': 1.5}) # On rajoute les points de base. Oui, je sais, c'est moche de les rajouter # un à un mais c'est parce que tous les labels ne vont pas au même endroit if True: pt1 = Ellipse((S1.s*1000,S1.T), 80,8,color='k') Ts.axis.add_patch(pt1) Ts.axis.text(S1.s*1000,S1.T+10,"1",fontsize=15,horizontalalignment='center') pt2 = Ellipse((S2.s*1000,S2.T), 80,8,color='k') Ts.axis.add_patch(pt2) Ts.axis.text(S2.s*1000,S2.T+10,"2",fontsize=15,horizontalalignment='center') pt4 = Ellipse((S4.s*1000,S4.T), 80,8,color='k') Ts.axis.add_patch(pt4) Ts.axis.text(S4.s*1000,S4.T+10,"4",fontsize=15,horizontalalignment='right') pt6 = Ellipse((S6.s*1000,S6.T), 80,8,color='k') Ts.axis.add_patch(pt6) Ts.axis.text(S6.s*1000,S6.T-10,"6",fontsize=15,horizontalalignment='right',verticalalignment='top') pt7 = Ellipse((S7.s*1000,S7.T), 80,8,color='k') Ts.axis.add_patch(pt7) Ts.axis.text(S7.s*1000,S7.T+10,"7",fontsize=15,horizontalalignment='center') pt9 = Ellipse((S9.s*1000,S9.T), 80,8,color='k') Ts.axis.add_patch(pt9) Ts.axis.text(S9.s*1000,S9.T+10,"9",fontsize=15,horizontalalignment='right') pt10 = Ellipse((S10.s*1000,S10.T), 80,8,color='k') Ts.axis.add_patch(pt10) Ts.axis.text(S10.s*1000,S10.T-10,"10",fontsize=15,horizontalalignment='left',verticalalignment='top') # on rajoute le point de sortie du détendeur if True: pt5 = Ellipse((S5.s*1000,S5.T), 80,8,color='k') Ts.axis.add_patch(pt5) Ts.axis.text(S5.s*1000,S5.T-10,"5",fontsize=15,horizontalalignment='center',verticalalignment='top') # on rajoute les points de sortie des turbines if True: pt3 = Ellipse((S3.s*1000,S3.T), 80,8,color='k') Ts.axis.add_patch(pt3) Ts.axis.text(S3.s*1000,S3.T-10,"3",fontsize=15,horizontalalignment='center',verticalalignment='top') pt8 = Ellipse((S8.s*1000,S8.T), 80,8,color='k') Ts.axis.add_patch(pt8) Ts.axis.text(S8.s*1000,S8.T-10,"8",fontsize=15,horizontalalignment='center',verticalalignment='top') # boite de description # pyplot.figtext(0.5,0.8,'diagramme $T=f(s)$\naxe vertical linéaire', # bbox=dict(facecolor='white', alpha=0.9)) pyplot.show()