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)
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()
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()
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()
No hay comentarios.:
Publicar un comentario