lunes, 23 de junio de 2025

Tespy: Modelado de sistemas termicos basicos, Turbina de gas

 

Turbina de gas

Topología de la turbina de gas  

Figura: Topología de la turbina de gas

Este tutorial presenta un nuevo componente, la cámara de combustión. Vas a Aprender a usar el componente y configure una turbina de gas de ciclo abierto simple: Comprime aire y quema combustible en la cámara de combustión. Lo caliente y El gas de combustión presurizado se expande en la turbina, lo que impulsa el compresor y el generador. También aprenderá cómo usar la composición del fluido como una variable en su simulación.

Descargue el guion completo aquí: gas_turbine.py

Configuración de la cámara de combustión

Estamos configurando nuestro sistema paso a paso. Especialmente para sistemas más grandes, se recomienda que siga este enfoque, ya que Tespy se basa mucho en un conjunto de Buenos valores iniciales para una buena convergencia. Puedes aprender más sobre esto en el de tutorial avanzado de la línea documentación.

Nota

Hay dos tipos diferentes de cámaras de combustión disponibles:

Ambos pueden manejar composiciones de fluidos variables para el aire y el combustible y Calcule la composición del fluido del gas de combustión. Por lo tanto, es posible Por ejemplo, especifique la fracción de masa de oxígeno en el gas de combustión en un cálculo. La diferencia entre los componentes radica en el hecho de que el CombustionChamber no considera pérdidas de calor o presión , mientras DiabaticCombustionChamber lo hace.

En este tutorial, usaremos el tespy.components.combustion.diabatic.DiabaticCombustionChamber. Primero, configuramos una red y los componentes.

>>from tespy.networks import Network
>>from tespy.components import (
    DiabaticCombustionChamber, Turbine, Source, Sink, Compressor
)
>>from tespy.connections import Connection, Ref, Bus

>># define full fluid list for the network"s variable space
>>nw = Network(p_unit="bar", T_unit="C")

>>cp = Compressor("Compressor")
>>cc = DiabaticCombustionChamber("combustion chamber")
>>tu = Turbine("turbine")
>>air = Source("air source")
>>fuel = Source("fuel source")
>>fg = Sink("flue gas sink")

En el primer paso, no conectamos la entrada de la cámara de combustión con el compresor pero con la fuente de aire en su lugar. Del mismo modo, la salida del La cámara de combustión está directamente conectada al fregadero de gases de combustión.

>>c2 = Connection(air, "out1", cc, "in1", label="2")
>>c3 = Connection(cc, "out1", fg, "in1", label="3")
>>c5 = Connection(fuel, "out1", cc, "in2", label="5")
>>nw.add_conns(c2, c3, c5)
Hay muchas especificaciones posibles. Para la cámara de combustión Especifique su cordero de relación aire a aire de aire estequiométrico y la entrada térmica ( LHV * 'mf)

Además, especificamos la eficiencia eta del componente que determina la pérdida de calor como relación de la entrada térmica. eta=1 medio, Sin pérdidas de calor, por lo tanto, comportamiento adiabático.

La relación de presión pr describe la relación de la presión en el Salida a la presión en la entrada 1 . El valor de presión en la entrada 2 se separa de los otros valores de presión, debe ser el resultado de una Especificación de parámetros. En este ejemplo, lo establecemos directamente. Inicialmente, nosotros asumir el comportamiento adiabático eta=1 y no hay pérdidas de presión pr=1.

Se definen las condiciones ambientales y la temperatura de la entrada de gas de combustible en el siguiente paso. Los vectores para el aire y la composición del gas de combustible tienen que ser especificado utilizando los fluidos individuales. El componente no puede manejar el "aire" como fluido de entrada. Podemos ejecutar el código después de las especificaciones.

>>cc.set_attr(pr=1, eta=1, lamb=1.5, ti=10e6)

>>c2.set_attr(
    p=1, T=20,
    fluid={"Ar": 0.0129, "N2": 0.7553, "CO2": 0.0004, "O2": 0.2314}
)
>>c5.set_attr(p=1, T=20, fluid={"CO2": 0.04, "CH4": 0.96, "H2": 0})

>>nw.solve(mode="design")
>>nw.print_results()

Por supuesto, puede cambiar la parametrización de cualquier manera deseada. Por ejemplo En lugar de declarar la entrada térmica, puede elegir cualquiera de los flujos de masa:

>>cc.set_attr(ti=None)
>>c5.set_attr(m=1)
>>nw.solve(mode="design")

o en lugar de la relación aire a aire estequiométrico, puede especificar el FULE temperatura del gas.

>>cc.set_attr(lamb=None)
>>c3.set_attr(T=1400)
>>nw.solve(mode="design")

También es posible hacer modificaciones en la composición del fluido, para Ejemplo, podemos agregar hidrógeno a la mezcla de combustible.

>>c5.set_attr(fluid={"CO2": 0.03, "CH4": 0.92, "H2": 0.05})
>>nw.solve(mode="design")

La forma más conveniente de acceder a la composición fluida es acceder a Resultados de datos de datos para las conexiones.

>>print(nw.results["Connection"])

Nota1.

Todos los resultados de componentes y de conexión están disponibles en el results dict de la Network instancia. Las claves del diccionario son las Nombres de clase respectivos. 

Configuración del sistema completo

Después de aprender más sobre el componente, vamos a agregar el restante Componentes: la turbina, el compresor y el generador. Para hacer eso, eliminar las conexiones existentes desde la red, cree las nuevas conexiones y Agréguelos a la red nuevamente. También agregamos un Bus representando el Generador, suponiendo 98 % de eficiencia mecánica-eléctrica.

>>nw.del_conns(c2, c3)
>>c1 = Connection(air, "out1", cp, "in1", label="1")
>>c2 = Connection(cp, "out1", cc, "in1", label="2")
>>c3 = Connection(cc, "out1", tu, "in1", label="3")
>>c4 = Connection(tu, "out1", fg, "in1", label="4")
>>nw.add_conns(c1, c2, c3, c4)

>>generator = Bus("generator")
>>generator.add_comps(
    {"comp": tu, "char": 0.98, "base": "component"},
    {"comp": cp, "char": 0.98, "base": "bus"},
)
>>nw.add_busses(generator)

Dado que eliminamos la conexión 2 y 3, todas las especificaciones para aquellos Las conexiones deben agregarse nuevamente. La composición del fluido de aire se especifica en Conexión 1 con presión ambiental y temperatura. La presión del compresor La relación se establece en 15 bar. Finalmente, establezca la presión de la salida de la turbina de gas en ambiente presión, así como la eficiencia del compresor y turbina. Empezamos con simulación que especifica un valor fijo para el flujo de masa de gas de combustión para generar buenos valores iniciales. Después de eso, la temperatura de entrada de la turbina se establece en 1200 ° C.

>>cp.set_attr(eta_s=0.85, pr=15)
>>tu.set_attr(eta_s=0.90)
>>c1.set_attr(
    p=1, T=20,
    fluid={"Ar": 0.0129, "N2": 0.7553, "CO2": 0.0004, "O2": 0.2314}
)
>>c3.set_attr(m=30)
>>c4.set_attr(p=Ref(c1, 1, 0))
>>nw.solve("design")
>>c3.set_attr(m=None, T=1200)
>>nw.solve("design")
>>nw.print_results()

Tenga en cuenta que la presión del combustible es menor que la presión del aire en el cámara de combustión ya que no cambiamos la presión de la conexión 5. A La advertencia respectiva se imprime después del cálculo. Podemos arreglarlo así:

>># unset the value, set Referenced value instead
>>c5.set_attr(p=None)
>>c5.set_attr(p=Ref(c2, 1.05, 0))
>>nw.solve("design")

Podemos investigar cómo la temperatura de entrada de la turbina y el compresor La relación de presión afecta la eficiencia térmica y la generación de energía. Además, nosotros Suponga pérdidas de calor del 2 % y pérdidas de presión del 3 % en la cámara de combustión.

>>cc.set_attr(pr=0.97, eta=0.98)
>>nw.set_attr(iterinfo=False)
>>import matplotlib.pyplot as plt
>>import numpy as np

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

>>data = {
    'T_3': np.linspace(900, 1400, 11),
    'pr': np.linspace(10, 30, 11)
}
>>power = {
    'T_3': [],
    'pr': []
}
>>eta = {
    'T_3': [],
    'pr': []
}

>>for T in data['T_3']:
>>    c3.set_attr(T=T)
>>    nw.solve('design')
>>    power['T_3'] += [abs(generator.P.val) / 1e6]
>>    eta['T_3'] += [abs(generator.P.val) / cc.ti.val * 100]

>># reset to base value
>>c3.set_attr(T=1200)

>>for pr in data['pr']:
>>    cp.set_attr(pr=pr)
>>    nw.solve('design')
>>    power['pr'] += [abs(generator.P.val) / 1e6]
>>    eta['pr'] += [abs(generator.P.val) / cc.ti.val * 100]

>># reset to base value
>>cp.set_attr(pr=15)

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

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

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

>>ax[0].set_ylabel('Efficiency in %')
>>ax[2].set_ylabel('Power in MW')
>>ax[2].set_xlabel('Turbine inlet temperature °C')
>>ax[3].set_xlabel('Compressure pressure ratio')

>>plt.tight_layout()
>>fig.savefig('gas_turbine_parametric.svg')
>>plt.close()

 Rendimiento de la turbina de gas a diferentes relaciones de presión del compresor y temperaturas de entrada de turbina 

Figura: rendimiento de la turbina de gas en diferentes relaciones de presión del compresor y temperaturas de entrada de turbina

Especificaciones de composición fluida

En esta sección aprenderá cómo la composición de fluido se puede usar como un variable en tales sistemas. Para comenzar, podemos establecer la fracción de masa de oxígeno en el Gas de combustión en lugar de la presión de entrada de la turbina, ya que determina la participación de oxígeno que no se requiere en la combustión. Podemos ver cómo la turbina La temperatura de entrada se correlaciona con la fracción de masa de oxígeno.

>>c3.set_attr(T=None)

>>data = np.linspace(0.1, 0.2, 6)
>>T3 = []

>>for oxy in data[::-1]:
>>    c3.set_attr(fluid={"O2": oxy})
>>    nw.solve('design')
>>    T3 += [c3.T.val]

>>T3 = T3[::-1]

>># reset to base value
>>c3.fluid.is_set.remove("O2")
>>c3.set_attr(T=1200)

>>fig, ax = plt.subplots(1, figsize=(16, 8))

>>ax.scatter(data * 100, T3, s=100, color="#1f567d")
>>ax.grid()
>>ax.set_axisbelow(True)

>>ax.set_ylabel('Turbine inlet temperature in °C')
>>ax.set_xlabel('Oxygen mass fraction in flue gas in %')

>>plt.tight_layout()
>>fig.savefig('gas_turbine_oxygen.svg')
>>plt.close()

Temperatura de entrada de la turbina a diferentes niveles de oxígeno en el gas de combustión 

Figura: temperatura de entrada de la turbina a diferentes niveles de oxígeno en el Gas de combustión

Supongamos ahora, tenemos una acción desconocida de hidrógeno y metano dentro de Nuestra mezcla de combustible. Con el flujo de masa conocido del combustible y un térmico general Entrada, podemos calcular ambas fracciones eliminando sus valores respectivos de los parámetros de entrada y utilizando el fluid_balance palabra clave en su lugar, que calcula automáticamente la suma de todas las fracciones de masa de fluido como 1.

Investigar cómo cambiar la entrada térmica requiere una mezcla diferente de hidrógeno y metano.

Atención

Con esta configuración, una entrada térmica debajo del valor de calentamiento más bajo del metano o por encima del valor de calentamiento más bajo del hidrógeno (cada uno multiplicado con el El flujo de masa de 1 kg/s) no tiene sentido como especificación de entrada. Esto es individuo de cada fluido que use como combustible, y no puede abstraer fácilmente los valores a cualquier otra combinación.

>># fix mass fractions of all potential fluids except combustion gases
>>c5.set_attr(fluid={"CO2": 0.03, "O2": 0, "H2O": 0, "Ar": 0, "N2": 0, "CH4": None, "H2": None})
>>c5.set_attr(fluid_balance=True)


>>data = np.linspace(50, 60, 11)

>>CH4 = []
>>H2 = []

>>for ti in data:
>>    cc.set_attr(ti=ti * 1e6)
>>    nw.solve('design')
>>    CH4 += [c5.fluid.val["CH4"] * 100]
>>    H2 += [c5.fluid.val["H2"] * 100]

>>nw.assert_convergence()

>>fig, ax = plt.subplots(1, figsize=(16, 8))

>>ax.scatter(data, CH4, s=100, color="#1f567d", label="CH4 mass fraction")
>>ax.scatter(data, H2, s=100, color="#18a999", label="H2 mass fraction")
>>ax.grid()
>>ax.set_axisbelow(True)
>>ax.legend()

>>ax.set_ylabel('Mass fraction of the fuel in %')
>>ax.set_xlabel('Thermal input in MW')
>>ax.set_ybound([0, 100])

>>plt.tight_layout()
>>fig.savefig('gas_turbine_fuel_composition.svg')
>>plt.close()

 Fracciones de masa de H2 y CH4 en la mezcla de combustible a una entrada térmica diferente 

Figura: fracciones de masa de H2 y CH4 en una mezcla de combustible a diferentes térmicos entrada y flujo de masa de combustible constante  

No hay comentarios.:

Publicar un comentario

Entradas recientes

Scipy: Tutorial Basico estadistico

Fuente: https://xiaoganghe-github-io.translate.goog/python-climate-visuals/chapters/data-analytics/scipy-basic.html?_x_tr_sl=en&_x_tr_t...

Entradas Populares