sábado, 21 de junio de 2025

Tespy, Sistemas termicos en Python, Ciclo Rankine

 

Rankine ciclo

Topology of the rankine cycle              

Configuración del ciclo

Modelaremos el ciclo, incluido el agua de enfriamiento del condensador. Para esto empezar con el Network Configurar que ya sabemos.

>>from tespy.networks import Network

>># create a network object with R134a as fluid
>>my_plant = Network()
>>my_plant.set_attr(T_unit='C', p_unit='bar', h_unit='kJ / kg')

A continuación, creamos los componentes y los conectamos. El Condenser tiene Una entrada y salida laterales calientes, así como una entrada y salida lateral fría. El caliente El lado se indica utilizando el índice 1 para la entrada y la salida in1y out1, el lado frío usa el índice 2 ( in2y out2).

Nuevamente, para el ciclo termodinámico cerrado tenemos que insertar un ciclo más cercano. El La entrada de agua de enfriamiento y la salida de agua de enfriamiento del condensador son directamente conectado a un Source y un Sink respectivamente.

>>from tespy.components import (
    CycleCloser, Pump, Condenser, Turbine, SimpleHeatExchanger, Source, Sink
)

>>cc = CycleCloser('cycle closer')
>>sg = SimpleHeatExchanger('steam generator')
>>mc = Condenser('main condenser')
>>tu = Turbine('steam turbine')
>>fp = Pump('feed pump')

>>cwso = Source('cooling water source')
>>cwsi = Sink('cooling water sink')

>>from tespy.connections import Connection

>>c1 = Connection(cc, 'out1', tu, 'in1', label='1')
>>c2 = Connection(tu, 'out1', mc, 'in1', label='2')
>>c3 = Connection(mc, 'out1', fp, 'in1', label='3')
>>c4 = Connection(fp, 'out1', sg, 'in1', label='4')
>>c0 = Connection(sg, 'out1', cc, 'in1', label='0')

>>my_plant.add_conns(c1, c2, c3, c4, c0)

>>c11 = Connection(cwso, 'out1', mc, 'in2', label='11')
>>c12 = Connection(mc, 'out2', cwsi, 'in1', label='12')

>>my_plant.add_conns(c11, c12)

Para los parámetros, predefinimos las pérdidas de presión en los intercambiadores de calor. Para el condensador, se descuidan las pérdidas de presión lateral caliente pr1=1, Para el lado del agua de enfriamiento asumimos una pérdida de presión del 2 % pr2=0.98. El El generador de vapor inflige una pérdida de presión del 10 %.

La turbina y la bomba de alimentación tendrán la eficiencia isentrópica especificada. Para Los parámetros de conexión, el fluido debe definirse tanto en el ciclo principal y el sistema de agua de enfriamiento. Además, la temperatura del vapor vivo, la presión y se establecen flujo de masa. Por último, establecemos el nivel de presión de condensación y el La temperatura de flujo de alimentación y retorno del agua de enfriamiento, así como su alimento presión. 

>>mc.set_attr(pr1=1, pr2=0.98)
>>sg.set_attr(pr=0.9)
>>tu.set_attr(eta_s=0.9)
>>fp.set_attr(eta_s=0.75)

>>c11.set_attr(T=20, p=1.2, fluid={'water': 1})
>>c12.set_attr(T=30)
>>c1.set_attr(T=600, p=150, m=10, fluid={'water': 1})
>>c2.set_attr(p=0.1)

>>my_plant.solve(mode='design')
>>my_plant.print_results()

Después de ejecutar la simulación, por ejemplo, podemos observar la temperatura Diferencias en el condensador. En lugar de establecer directamente un valor de presión para condensación, también podríamos establecer la diferencia de temperatura terminal superior ttd_u en cambio. Se define como la temperatura de condensación para enfriar Temperatura de flujo de retorno de agua.

Consejo

Encontrará la documentación de cada ecuación de los componentes en el respectivo Seccion de la documentación de la API. Por ejemplo, el condensador tespy.components.heat_exchangers.condenser.Condenser.

>>mc.set_attr(ttd_u=4)
>>c2.set_attr(p=None)

>>my_plant.solve(mode='design')
>>my_plant.print_results()

Después de volver a sincero, veremos que la temperatura y la presión de la condensación ambos se calculan automáticamente por el valor de temperatura terminal especificado. 

Generación del diagrama TS

Para visualizar el ciclo Rankine, generamos una temperatura (t) versus entropía (s) Diagrama utilizando el paquete FluProdia (Diagrama de propiedad de fluido). 

 

>># Adding feature to plot the T-s Diagram using fluprodia library
>># Importing necessary library
>>import matplotlib.pyplot as plt
>>import numpy as np
>>from fluprodia import FluidPropertyDiagram

>># Initial Setup
>>diagram = FluidPropertyDiagram('water')
>>diagram.set_unit_system(T='°C', p='bar', h='kJ/kg')

>># Storing the model result in the dictionary
>>result_dict = {}
>>result_dict.update(
    {cp.label: cp.get_plotting_data()[1] for cp in my_plant.comps['object']
     if cp.get_plotting_data() is not None})

>># Iterate over the results obtained from TESPy simulation
>>for key, data in result_dict.items():
>>    # Calculate individual isolines for T-s diagram
>>    result_dict[key]['datapoints'] = diagram.calc_individual_isoline(**data)

>># Create a figure and axis for plotting T-s diagram
>>fig, ax = plt.subplots(1, figsize=(20, 10))
>>isolines = {
    'Q': np.linspace(0, 1, 2),
    'p': np.array([1, 2, 5, 10, 20, 50, 100, 300]),
    'v': np.array([]),
    'h': np.arange(500, 3501, 500)
}

>># Set isolines for T-s diagram
>>diagram.set_isolines(**isolines)
>>diagram.calc_isolines()

>># Draw isolines on the T-s diagram
>>diagram.draw_isolines(fig, ax, 'Ts', x_min=0, x_max=7500, y_min=0, y_max=650)

>># Adjust the font size of the isoline labels
>>for text in ax.texts:
>>    text.set_fontsize(10)

>># Plot T-s curves for each component
>>for key in result_dict.keys():
>>    datapoints = result_dict[key]['datapoints']
>>    _ = ax.plot(datapoints['s'], datapoints['T'], color='#ff0000', linewidth=2)
>>    _ = ax.scatter(datapoints['s'][0], datapoints['T'][0], color='#ff0000')

>># Set labels and title for the T-s diagram
>>ax.set_xlabel('Entropy, s in J/kgK', fontsize=16)
>>ax.set_ylabel('Temperature, T in °C', fontsize=16)
>>ax.set_title('T-s Diagram of Rankine Cycle', fontsize=20)

>># Set font size for the x-axis and y-axis ticks
>>ax.tick_params(axis='x', labelsize=12)
>>ax.tick_params(axis='y', labelsize=12)
>>plt.tight_layout()

>># Save the T-s diagram plot as an SVG file
>>fig.savefig('rankine_ts_diagram.svg')

 

Los pasos involucrados en la generación del diagrama TS son los siguientes:

  • Importar el paquete: importar fluProdia y crear un objeto pasando el Alias ​​del fluido.

  • Especifique el sistema de la unidad: configure el sistema unitario para todas las propiedades de fluido.

  • Especifique los aislados personalizados: defina los aislines personalizados para el diagrama.

  • Calcule y dibuje los isolinas: calcule y dibuje las isolinas de fondo.

  • Calcular y dibujar puntos de proceso y cambio de estado

  • Guarde y exporte el diagrama: guarde y exporte el diagrama TS completo.

Diagrama TS del ciclo de Rankine  
Figura: Diagrama TS del ciclo de Rankine

Además de la visualización, esta característica también es útil para fines de análisis. Por ejemplo, si el diagrama TS forma un circuito cerrado, validando la precisión de El modelo y que el fluido operativo completa un ciclo exitoso de Rankine. Por Aplicando FluProdia, podemos crear y personalizar diferentes tipos de diagramas para Todos los fluidos puros y pseudo pure disponibles en Coolprop. Para más información sobre fluProdia, remitimos a los usuarios al Documentación de Fluprodia .


Evaluar la energía eléctrica

Para evaluar la potencia de salida eléctrica, queremos considerar la potencia generada por la turbina, así como la potencia requerida para conducir la bomba de alimentación. Es posible incluir ambos valores de potencia del componente en un solo electricidad Bus. Podemos hacer esto importando el tespy.connections.bus.Bus clase, crear una instancia y agregar Ambos componentes del bus.


>>from tespy.connections import Bus

>>powergen = Bus("electrical power output")

>>powergen.add_comps(
    {"comp": tu, "char": 0.97, "base": "component"},
    {"comp": fp, "char": 0.97, "base": "bus"},
)

>>my_plant.add_busses(powergen)

>>my_plant.solve(mode='design')
>>my_plant.print_results()

Nota

El Bus pueden tomar componentes que producen o consumen energía. Especificación 'base': 'bus' significa que el valor de eficiencia es referenciado a la energía eléctrica 

`W =`Welec * n 

Mientras especifica 'base': 'component' (predeterminado) toma el componente potencia como valor base. 

 `Welec = `W * n

Los resultados para el bus se imprimen por separado. Observe que el vapor Producción de energía eléctrica de la turbina ( bus value) es más bajo que el component valuemientras está invertido para la bomba de alimentación.

También puede establecer la producción total deseada de energía del sistema, por ejemplo Reemplazo de la especificación de flujo de masa en la conexión 1: 

>>powergen.set_attr(P=-10e6)
>>c1.set_attr(m=None)

>>my_plant.solve(mode='design')
>>my_plant.print_results()

 

 

Analizar la eficiencia y la generación de energía

En esta sección, analizaremos la producción de energía y la eficiencia del ciclo, dado el flujo de masa de vapor constante y con valores variables para el

  • presión de vapor viva,

  • temperatura de vapor vivo y

  • Nivel de temperatura del agua de enfriamiento.

Para hacer eso, estamos utilizando una configuración muy similar como se ha utilizado en el Tutorial de la bomba de calor . Para el agua de alimentación Nivel de temperatura queremos establecer el cambio de temperatura en el condensador a un valor constante. Además, tenemos que desastar la especificación de generación de energía de nuevo y use un flujo de masa constante en su lugar. Con iterinfo=False nosotros puede deshabilitar la impresión de la historia de convergencia. 

>>my_plant.set_attr(iterinfo=False)
>>c1.set_attr(m=20)
>>powergen.set_attr(P=None)

>># make text reasonably sized
>>plt.rc('font', **{'size': 18})

>>data = {
    'T_livesteam': np.linspace(450, 750, 7),
    'T_cooling': np.linspace(15, 45, 7),
    'p_livesteam': np.linspace(75, 225, 7)
}
>>eta = {
    'T_livesteam': [],
    'T_cooling': [],
    'p_livesteam': []
}
>>power = {
    'T_livesteam': [],
    'T_cooling': [],
    'p_livesteam': []
}

>>for T in data['T_livesteam']:
>>    c1.set_attr(T=T)
>>    my_plant.solve('design')
>>    eta['T_livesteam'] += [abs(powergen.P.val) / sg.Q.val * 100]
>>    power['T_livesteam'] += [abs(powergen.P.val) / 1e6]

>># reset to base temperature
>>c1.set_attr(T=600)

>>for T in data['T_cooling']:
>>    c12.set_attr(T=T)
>>    c11.set_attr(T=T - 10)
>>    my_plant.solve('design')
>>    eta['T_cooling'] += [abs(powergen.P.val) / sg.Q.val * 100]
>>    power['T_cooling'] += [abs(powergen.P.val) / 1e6]

>># reset to base temperature
>>c12.set_attr(T=30)
c11.set_attr(T=20)

>>for p in data['p_livesteam']:
>>    c1.set_attr(p=p)
>>    my_plant.solve('design')
>>    eta['p_livesteam'] += [abs(powergen.P.val) / sg.Q.val * 100]
>>    power['p_livesteam'] += [abs(powergen.P.val) / 1e6]

>># reset to base pressure
>>c1.set_attr(p=150)


>>fig, ax = plt.subplots(2, 3, figsize=(16, 8), sharex='col', sharey='row')

>>ax = ax.flatten()
>>[a.grid() for a in ax]

>>i = 0
>>for key in data:
>>    ax[i].scatter(data[key], eta[key], s=100, color="#1f567d")
>>    ax[i + 3].scatter(data[key], power[key], s=100, color="#18a999")
>>    i += 1

>>ax[0].set_ylabel('Efficiency in %')
>>ax[3].set_ylabel('Power in MW')
>>ax[3].set_xlabel('Live steam temperature in °C')
>>ax[4].set_xlabel('Feed water temperature in °C')
>>ax[5].set_xlabel('Live steam pressure in bar')
>>plt.tight_layout()
>>fig.savefig('rankine_parametric-darkmode.svg')
>>plt.close()

Análisis paramétrico de la eficiencia y potencia de salida 

Figura: Análisis paramétrico de la eficiencia y potencia de salida

Simulación de carga de pieza

En la parte de simulación de carga de pieza, estamos comenzando con un diseño específico de la plante y calcule el rendimiento de la carga de piezas con algunos supuestos sobre el comportamiento individual del componente. La siguiente tabla resume los supuestos, que mantendremos lo más simple posible en este momento. Para más ideas Eche un vistazo al paso a paso Tutorial de la bomba de calor o en el Documentación de red .

Componente

Suposiciones

Ajustes

Turbina

Se aplica la ley de cono

presión de entrada no Aplicar la ley de cono

Condensador

transferencia de calor constante coeficiente

temperatura terminal no diferencia y calentar el calor coeficiente de transferencia

Enfriamiento agua

flujo volumétrico constante

Temperatura de retorno no establecida valor y establecer flujo volumétrico

Con estas especificaciones, la siguiente física se aplica al modelo:

  • Debido al flujo volumétrico constante de agua, la temperatura del enfriamiento El agua que regresa del condensador reaccionará al calor total transferido En la condensación: el aumento de la transferencia de calor significa aumentar la temperatura, La disminución de la transferencia de calor significa disminución de la temperatura.

  • El coeficiente de transferencia de calor constante del condensador calculará el temperatura de condensación (y por lo tanto presión) basada en la temperatura régimen en el lado del agua de enfriamiento:

    • El aumento de la temperatura para el agua de enfriamiento conduce al aumento de Temperatura de condensación (a transferencia de calor constante).

    • Aumento de la transferencia de calor significa aumentar la temperatura necesaria diferencia en el condensador (a temperatura de entrada de agua de enfriamiento constante).

  • La ley del cono es un modelo matemático para predecir la presión en la turbina Entrada basada en la desviación de las condiciones de diseño. Generalmente, El aumento del flujo de masa conduce a una mayor presión de entrada (en la entrada constante temperatura y presión de salida constante). Sin embargo, esta ecuación es más complejo, ya que hay muchos más parámetros involucrados en comparación con el otro Ecuaciones aplicadas.

Para aplicar estas especificaciones, podemos usar el designy offdesign Palabras clave. La palabra clave design desastres el especificado Datos en la lista en un cálculo de diseño fuera de lugar. La palabra clave offdesign Establece automáticamente el parámetro respectivo para el cálculo de designación. En Caso La especificación se refiere a un valor, el valor se toma del diseño Cálculo de modo. En el ejemplo, se calcula el valor KA del condensador principal en la simulación de diseño y su valor se mantendrá constante a través del Simulaciones de designación.

>>mc.set_attr(design=["ttd_u"], offdesign=["kA"])
>>c11.set_attr(offdesign=["v"])
>>c12.set_attr(design=["T"])
>>c1.set_attr(design=["p"])
>>tu.set_attr(offdesign=["cone"])

Tenemos que guardar el estado de diseño de la red y ejecutar el solve método con el design_path especificado.

>>my_plant.solve("design")
>>my_plant.save("rankine_design.json")

Finalmente, podemos alterar el flujo de masa desde su valor de diseño de 20 kg/s hasta solo 50 % de su valor. En este ejemplo, calculamos la eficiencia y la presentamos.

>>partload_efficiency = []
>>partload_m_range = np.linspace(20, 10, 11)

>>for m in partload_m_range:
>>    c1.set_attr(m=m)
>>    my_plant.solve("offdesign", design_path="rankine_design.json")
>>    partload_efficiency += [abs(powergen.P.val) / sg.Q.val * 100]


>>fig, ax = plt.subplots(1, figsize=(16, 8))
>>ax.grid()
>>ax.scatter(partload_m_range, partload_efficiency, s=100, color="#1f567d")
>>ax.set_xlabel("Mass flow in kg/s")
>>ax.set_ylabel("Plant electrical efficiency in %")

>>plt.tight_layout()
>>fig.savefig('rankine_partload.svg')
>>plt.close()
Parte de eficiencia eléctrica de carga del ciclo Rankine

Figura: carga de carga eficiencia eléctrica del ciclo Rankine 

 


 

 

No hay comentarios.:

Publicar un comentario

Entradas recientes

Tespy, Sistemas termicos en Python, Ciclo Rankine

  Rankine ciclo                Configuración del ciclo Modelaremos el ciclo, incluido el agua de enfriamiento del condensador. Para esto em...

Entradas Populares