Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
“UM PROGRAMA DIDÁTICO PARA ANÁLISE DE DIFERENTES CICLOS DE
POTÊNCIA”
Bernardo Garcia de Sousa Lima
Rio de Janeiro
Junho de 2018
Projeto de Graduação apresentado ao Curso de
Engenharia Mecânica da Escola Politécnica,
Universidade Federal do Rio de Janeiro, como
parte dos requisitos necessários à obtenção do
título de Engenheiro.
Orientador: Marcelo J. Colaço
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO Departamento de Engenharia Mecânica
DEM/POLI/UFRJ
UM PROGRAMA DIDÁTICO PARA ANÁLISE DE DIFERENTES CICLOS DE
POTÊNCIA
Bernardo Garcia de Sousa Lima
PROJETO FINAL SUBMETIDO AO CORPO DOCENTE DO DEPARTAMENTO DE
ENGENHARIA MECÂNICA DA ESCOLA POLITÉCNICA DA UNIVERSIDADE
FEDERAL DO RIO DE JANEIRO COMO PARTE DOS REQUISITOS
NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE ENGENHEIRO MECÂNICO.
Aprovado por:
________________________________________________
Prof. Marcelo José Colaço
________________________________________________
Prof. Hélcio Rangel Barreto Orlande
________________________________________________
Prof. Manuel Ernani de Carvalho Cruz
RIO DE JANEIRO, RJ - BRASIL
JUNHO DE 2018
iii
Lima, Bernardo Garcia de Sousa
Um Programa Didático para Análise de Diferentes Ciclos
de Potência/ Bernardo Garcia de Sousa Lima. — Rio de
Janeiro: UFRJ/ Escola Politécnica, 2018.
VII, 108 p.: il.; 29,7 cm.
Orientador: Marcelo José Colaço.
Projeto de Graduação — UFRJ/ Escola Politécnica/
Curso de Engenharia Mecânica, 2018.
Referências Bibliográficas: p. 50-51.
1. Programa. 2. Ciclo Combinado. 3. Rankine. 4. Bray-
ton. 5. ORC. I. Colaço, Marcelo José. II. Universidade Fe-
deral do Rio de Janeiro, Escola Politécnica, Curso de Enge-
nharia Mecânica. III. Um Programa Didático para Análise
de Diferentes Ciclos de Potência.
iv
Agradecimentos
Agradeço à minha família, em especial aos meus padrinhos e à minha mãe, quesempre me apoiou.
Ao meu orientador, Prof. Marcelo José Colaço, pela dedicação, pela paciência epela oportunidade de realizar este projeto.
Aos Profs. Hélcio Rangel Barreto Orlande e Manuel Ernani de Carvalho Cruz, peladisponibilidade de compor a banca examinadora.
Aos meus amigos, dentro e fora da UFRJ, pelos inúmeros momentos de felicidade.
v
Resumo do Projeto de Graduação apresentado à Escola Plitécnica/UFRJ como partedos requisitos necessários para a obtenção do grau de Engenheiro Mecânico.
Um Programa Didático para Análise de Diferentes Ciclos de Potência
Bernardo Garcia de Sousa Lima
Junho/2018
Orientador: Marcelo José Colaço
Curso: Engenharia Mecânica
As usinas termelétricas desepenham um papel de relevância na geração de energia.O projeto de uma termelétrica eficiente envolve um aprofundado conhecimento deciclos de potência, em especial o de Rankine e o de Brayton. Neste trabalho foi desen-volvido um programa que permite a análise de diferentes ciclos de potência ideais emodificados, dentre os quais o Brayton com injeção de vapor no combustor, o Rankineregenerativo, o Rankine orgânico e ciclos combinados. A partir do programa, foi feitoum estudo de casos, com o intuito de melhorar os parâmetros de saída.
Palavras-chave: Programa, Ciclo Combinado, Rankine, Brayton, ORC.
vi
Abstract of Undergraduate Project presented to POLI/UFRJ as a partial fulfillment ofthe requirements for the degree of Engineer.
A Didactic Program for Analyzing Different Power Cycles
Bernardo Garcia de Sousa Lima
June/2018
Advisor: Marcelo José Colaço
Course: Mechanical Engineering
The thermoelectric plants play a significant role in the generation of energy. The de-sign of an efficient thermoelectric plant involves an in-depth knowledge of powercycles, especially Rankine and Brayton ones. In this work a program was developedthat allows the analysis of different ideal and modified power cycles, among whichBrayton with steam injection in the combustor, regenerative Rankine, organic Rankineand combined cycles. From the program, a case study was done with the intention ofimproving the output parameters.
Keywords: Program, Combined Cycle, Rankine, Brayton, ORC.
vii
Sumário
1 Introdução 11.1 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Revisão da literatura 3
3 Fundamentação teórica 63.1 Ciclo Brayton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 Ciclo Rankine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.3 Ciclo Rankine Orgânico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.4 Ciclo combinado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203.5 Ciclo combinado orgânico . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4 Resultados 244.1 Verificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.2 Estudo de casos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5 Conclusão 49
Bibliografia 50
A Telas do programa 52
B Código do programa 57B.1 AltClass.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57B.2 GasIdeal.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58B.3 Water.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61B.4 Brayton.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69B.5 Rankine.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77B.6 Organic.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92B.7 Combinado.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105B.8 CombinadoOrg.cs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
1
Capítulo 1
Introdução
As termelétricas desempenham um papel fundamental na matriz energética brasi-leira. De acordo com o Operador Nacional do Sistema Elétrico (2018), são a segundafonte de energia elétrica mais importante no Brasil, gerando quase 12% da carga total.Elas ficam atrás somente das hidrelétricas, com 83% — os 5% restantes estão distri-buidos por diversas fontes, como eólica e nuclear. Seu funcionamento consiste emconverter calor em trabalho mecânico e, em seguida, em energia elétrica. Portanto,o cerne dessas usinas é um ciclo termodinâmico, responsável pela transformação docalor em potência mecânica.
O tipo de ciclo produz impacto direto em diversos parâmetros da usina, comoeficiência, potências (líquida e específica) e curva de carga, além da própria estruturafísica, orientando a necessidade de diferentes equipamentos. Nas termelétricas, osciclos mais comuns são o Rankine e o Brayton, geralmente com modificações e/oucombinações. A escolha da configuração é largamente influenciada pela demandado cliente. No Brasil, essa demanda é definida nos editais dos leilões de geração deenergia realizados pela Agência Nacional de Energia Elétrica (2018). Eles especificam,entre outros fatores, a potência gerada, a disponibilidade e o preço pago pela energiaem R$/MWh.
Atendidas as exigências contratuais, cabe à empresa dona da usina diminuir seuscustos, de modo a obter o maior lucro possível. Nesse contexto, surge a necessidadede otimização do ciclo, em relação a um parâmetro determinado. O grande desafio doengenheiro projetista é combinar as otimizações para os diversos parâmetros deseja-dos, dentro dos limites orçamentários e dos prazos. Esse tipo de problema, denomi-nado otimização multiobjetivo, muitas vezes não apresenta solução única, de formaque outros critérios devem ser considerados para resolver os conflitos.
1.1 Objetivo
O objetivo deste trabalho é criar um programa que permita a análise quantitativade diferentes ciclos de potência baseados em turbina, em função dos parâmetros deentrada.
O programa, desenvolvido em C#, ofere cinco tipos de ciclo, os quais podem serclassificados em duas categorias: simples ou combinados. Na primeira, há três opções:Brayton (com ou sem injeção de vapor no combustor), Rankine (com ou sem regene-ração) e Rankine orgânico (semelhante ao Rankine comum, mas utilizando um fluido
Capítulo 1. Introdução 2
orgânico). Na segunda categoria, há os ciclos combinado comum (Brayton associadoa Rankine) e combinado orgânico (Brayton associado a Rankine orgânico).
Desse modo, o usuário pode avaliar o efeito das modificações nos resultados glo-bais e compará-los com os de outros tipos de ciclo.
Em seus cálculos, o programa usa as tabelas de propriedades termodinâmicas degases ideais de Bathie (1996), para o ciclo Brayton, e de Harvey (1998), para o Rankine,as quais foram digitalizadas por Sami M. Ayad. A partir delas foram desenvolvidasfunções de interpolação. O ciclo Rankine orgânico baseia-se na biblioteca "CoolProp",de Bell et al. (2014), que não utiliza tabelas, dispensando tais funções.
Para demonstrar algumas das possibilidades do usuário, este trabalho inclui aindaum estudo de casos utilizando o programa desenvolvido, na seção 4.2. A partir dele,conclui-se que a injeção de vapor no ciclo Brayton melhora tanto o rendimento quantoa potência. Contudo, essa mesma modificação em um ciclo combinado aumenta ape-nas a potência, reduzindo o rendimento. Nesse caso, se é desejada a otimização daeficiência, podem-se adicionar regeneradores ao ciclo Rankine, preferencialmente decontato. Ademais, é demonstrado que, para temperaturas da fonte quente do cicloRankine suficientemente baixas, a água deixa de ser operacionalmente viável comofluido de trabalho, e os fluidos orgânicos passam a ser uma boa alternativa.
Com o intuito de familiarizar o leitor com o programa, foram inseridas algumastelas no apêndice A. Por se tratar de um programa relativamente extenso, optou-sepela inclusão dos trechos mais importantes de código, relativos ao cálculo dos ciclostermodinâmicos. Tais trechos encontram-se no apêndice B.
3
Capítulo 2
Revisão da literatura
Neste capítulo serão apresentados alguns estudos relacionados a este Projeto Final.Jakobsen, Rasmussen e Andersen (1999) desenvolveram o programa "CoolPack",
que se tornou referência no ensino de termodinâmica, com ênfase na área de refrigera-ção. Ele consiste em uma coleção de modelos de simulação, que permitem a análise deciclos termodinâmicos, o dimensionamento de sistemas e o cálculo de propriedadesde fluidos refrigerantes.
Em relação aos ciclos de potência, El Hefni, Bouskela e Lebreton (2011) desenvol-veram a biblioteca open source "ThermoSysPro". Com base na linguagem Modelica, elafoi projetada para a modelagem estática ou dinâmica de plantas de potência, mas tam-bém pode ser usada em outros sistemas energéticos. Um exemplo dessa versatilidadeé a modelagem de uma planta de energia solar concentrada, realizada por El Hefni(2014).
Existem diversas bibliotecas para cálculos de ciclos de potência a gás ou a vapor,como a ThermoSysPro. Todavia, poucas oferecem a possibilidade de trabalhar comfluidos orgânicos, como a biblioteca open source "ThermoCycle", de Quoilin et al. (2014).Baseada na linguagem Modelica, ela utiliza — tal qual o programa desenvolvido nestetrabalho — a biblioteca CoolProp no cálculo das propriedades termodinâmicas dessesfluidos.
Será demonstrado no capítulo 3 que os cálculos de todos os cinco ciclos considera-dos neste trabalho baseiam-se em dois: o Brayton e o Rankine — os ciclos combinadospodem ser entendidos como uma expansão do Brayton. Desse modo, convém analisaras principais diferenças entre os dois.
O ciclo Brayton apresenta algumas vantagens em relação ao Rankine, dentre asquais destacam-se:
• maior eficiência — normalmente apresenta maior eficiência de 1a lei, pois traba-lha com uma diferença de temperatura superior;
• menor necessidade de espaço — a turbina a gás acomoda compressor e combus-tor, ao passo que no Rankine esses componentes são separados;
• menor custo de instalação;
• maior facilidade de controle — por ser um sistema aberto, é mais simples variara vazão mássica em circulação;
• menor tempo de inicialização — o sistema atinge a capacidade máxima rapida-mente, podendo ser usado para geração de pico;
Capítulo 2. Revisão da literatura 4
• maior disponibilidade do fluido de trabalho — o ar pode ser obtido com facili-dade, o que não é sempre verdadeiro para os fluidos de trabalho do ciclo Rankine(água, geralmente).
Todavia, possui algumas desvantagens, que incluem:
• menor robustez — a turbina a gás, por trabalhar com temperaturas muito ele-vadas, possui diversos componentes sensíveis, que necessitam de resfriamentoe manutenção constante;
• vazamento de gás nas tubulações;
• menor flexibilidade de combustível — exige um gás com propriedades muitoespecíficas (na prática, usa-se quase sempre gás natural), ao passo que a caldeirado Rankine admite diversos combustíveis.
Um aspecto que vem ganhando cada vez mais importância no campo da geraçãode energia é a emissão de gases do efeito estufa. Nesse sentido, Busch e Gimon (2014)comparam os impactos climáticos de usinas a carvão (ciclo Rankine) e a gás natural(ciclo Brayton). O vazamento de metano nas tubulações de plantas a gás contrapõe-seà sua vantagem na emissão de CO2. Num horizonte de 20 anos, o metano possui umGWP1 de 84. Isso significa que o impacto relativo desse gás é 84 vezes maior que ode uma massa equivalente de CO2. Contudo, alterando-se a escala temporal para 100anos, o GWP cai para 28. Dessa forma, eles concluem que a melhor opção de planta,em termos de mitigação do efeito estufa, depende da intensidade do vazamento demetano e do escopo temporal considerado.
Avaliados alguns aspectos gerais dos dois principais ciclos, propõem-se mudançasespecíficas, com vista a aumentar a eficiência e a potência produzidas. Nesse contexto,destaca-se a inclusão de regeneradores no ciclo Rankine. Mies (2015) analisa um ciclocom dois regeneradores. Ele conclui que existem pontos ótimos das pressões de extra-ção para eficiência e para a potência líquida seperadamente, mas não para esses doisparâmetros em conjunto.
Outra modificação importante é a regeneração no ciclo Brayton. De Paepe e Dick(2000) estudam a injeção de vapor gerado a partir da recuperação do calor dos gasesde exaustão. Esse vapor — injetado no combustor ou entre as turbinas de alta e debaixa pressão — melhora a eficiência, pois recupera parte do calor descartado. Alémdisso, aumenta a potência específica, já que mais massa entra na turbina.
Em adição a esses, Bathie (1996) e Colaço (2017) citam outros aspectos positivos dainjeção de vapor:
• redução na emissão de NOx;
• fácil implementação no ciclo;
• custo de implementação menor que o de um ciclo combinado;
• possibilidade de conversão em um ciclo combinado.
1Do inglês, "Global Warming Potential".
Capítulo 2. Revisão da literatura 5
Assim, o ciclo Brayton com injeção de vapor pode ser considerado um interme-diário entre o Brayton simples e o ciclo combinado. Este último apresenta os maioresvalores de potência e eficiência, além do menor custo por energia produzida. Con-tudo, ele é menos flexível e possui um custo inicial maior. Portanto, é indicados parageração de base, que requer alta potência e não exige variações abruptas na carga.
Usualmente os ciclos combinados apresentam um Rankine utilizando vapor deágua. Porém, quando os gases de exaustão do ciclo Brayton estão a uma temperaturamuito baixa, esta configuração torna-se inviável — como será explicado posterior-mente. Nessa situação, uma alternativa é implementar um Rankine orgânico, comopropõem Clemente et al. (2013).
O programa desenvolvido neste projeto toma como base os ciclos Brayton (cominjeção de vapor no combustor) e Rankine (com regeneração) analisados por Bezerra(2013) e Mies (2015), respectivamente. Além da combinação desses ciclos, são pro-postas modificações no combustível, no fluido de trabalho e nos renegeradores, entreoutras. Desse modo, o programa possibilita ao usuário a análise diversas configu-rações de ciclos de potência, tal qual as bibliotecas já disponíveis em Modelica. Nãoobstante, ele se diferencia delas por ser mais leve e mais prático, não requerendo umhardware robusto e propiciando uma curva de aprendizagem mais inclinada - empoucos segundos já é possível obter resultados, intuitivamente.
6
Capítulo 3
Fundamentação teórica
3.1 Ciclo Brayton
O ciclo de Brayton ideal consiste em dois processos de transferência de calor iso-báricos, no combustor e no condensador, e dois processos adiabáticos reversíveis —portanto, isentrópicos —, no compressor e na turbina. Contudo, para uma maior apro-ximação com a realidade, devem-se levar em conta as irreversibilidades nos compo-nentes. Segundo Borgnakke e Sonntag (2013), as perdas com maior impacto no rendi-mento do ciclo são as da turbina e do compressor. Dessa forma, o programa desenvol-vido neste trabalho permite ao usuário considerar a eficiência isentrópica desses equi-pamentos. Além disso, de acordo com Bezerra (2013), a injeção de vapor na câmarade combustão pode aumentar a eficiência e a potência específica deste ciclo, estandotambém disponível essa opção no programa desenvolvido.
Desse modo, o ciclo proposto assume a forma ilustrada na figura 3.1. Inicialmente,ar entra no sistema no estado 1 e é comprimido até o estado 2. Na câmara de com-bustão, ele reage com o combustível, e a mistura sai no estado 3 (pré-definido). Naprimeira turbina a mistura é expandida até o estado 4, a ser determinado - atendendoa condição de que a potência gerada nela será igual à consumida pelo compressor. Nasegunda turbina, a expansão se dá até o estado 5. Se houver injeção de vapor, estedeverá ser bombeado e, posteriormente, aquecido até o estado desejado. A bombaatua de forma independente e o aquecimento é feito no gerador de vapor (HRSG1),utilizando o calor da mistura efluente da turbina.
Deseja-se calcular ultimamente a eficiência e a potência líquida do ciclo. Para tal, énecessário determinar a razão ar-combustível e os estados dos fluidos na entrada e nasaída dos componentes.
3.1.1 Equacionamento
No programa desenvolvido, os seguintes dados devem ser fornecidos pelo usuá-rio:
• tipo de combustível (metano, n-octano ou etanol);
• mar [kg/s] : vazão mássica de ar na entrada do compressor;
• T1 [K] : temperatura na entrada do compressor;
1Do inglês, "Heat Recovery Steam Generator".
Capítulo 3. Fundamentação teórica 7
• P1 [kPa] : pressão na entrada do compressor;
• P2 [kPa] : pressão na saída do compressor;
• T3 [K] : temperatura na entrada da turbina;
• P5 [kPa] : pressão na saída da turbina de potência;
• ηc [%] : eficiência do compressor;
• ηt [%] : eficiência da turbina;
• ηtp [%] : eficiência da turbina de potência.
Havendo injeção de vapor no combustor, pedem-se também:
• Tvap [K] : temperatura do vapor injetado no combustor;
• Pvap [kPa] : pressão do vapor injetado no combustor;
• ivap [%] : vazão mássica do vapor injetado no combustor, como porcentagem davazão de ar que entra no combustor (mar).
FIGURA 3.1: Esquema do ciclo Brayton.
Capítulo 3. Fundamentação teórica 8
Cálculos
Para os cálculos dos processos envolvedo fluido de trabalho gasoso, foram utiliza-das as tabelas de gases ideais de Bathie (1996), salvo explicitado.
Bomba
Por ter um impacto muito menor no ciclo em relação aos outros componentes, abomba foi considerada ideal e o estado do fluido a montante foi fixado. Assim, águaentra na bomba a 101,3 kPa — tomando como referência um reservatório externo aonível do mar — e 298,15 K — em conformidade com a temperatura do combustível,como será visto adiante. Obtém-se em seguida a entalpia de entrada na bomba apartir das tabelas de líquido comprimido de Harvey (1998). Assumindo um processoisentrópico,
sb out = sb in (3.1)
onde:
sb out [kJ/kg · K] : entropia na saída da bomba;
sb in [kJ/kg · K] : entropia na entrada da bomba.
Tendo a pressão (Pvap) e a entropia (sb out), o estado de saída está definido. Obtém-se em seguida a entalpia de saída. O trabalho específico da bomba é a diferença entreas entalpias de saída (hb out) e de entrada (hb in):
wb = hb out − hb in (3.2)
Compressor
Na entrada do compressor, considerou-se o ar como gás ideal. Dada a temperaturaT1, obtêm-se a pressão relativa Pr1 e a entalpia h1 das tabelas para gás termicamenteperfeito (Cp(T)). Para uma compressão isentrópica,
Pr2i = RC · Pr1 (3.3)
onde:
RC = P2/P1 : razão de compressão.
Em seguida, a partir da pressão relativa Pr2i, obtém-se a entalpia h2i - correspon-dente a um processo isentrópico - das tabelas termodinâmicas interpoladas. Conside-rando-se uma eficiência isentrópica ηc, o trabalho específico do compressor é
wc =h2i − h1
ηc(3.4)
Logo, a entalpia real no estado 2 pode ser calculada por
h2 = wc + h1 (3.5)
Como se trata de um gás ideal, obtém-se T2 a partir de h2, usando-se as tabelastermodinâmicas.
Capítulo 3. Fundamentação teórica 9
Combustor
Para maior exatidão nos cálculos, será considerada uma mistura de gases comoproduto da combustão, ao invés do conceito de ar-equivalente. Assim, devem-se fazeros balanços estequiométrico e entálpico para obter a pressão parcial de cada produto.
Na entrada da câmara têm-se:
• N2, O2 e ar em excesso a T2;
• combustível à temperatura fixa de 298, 15 K;
• vapor superaquecido (opcional).
As entalpias dos gases foram obtidas com base nas tabelas de Bathie (1996). Emrelação ao combustível, considerou-se a entalpia padrão de formação, obtida de Borg-nakke e Sonntag (2013) - cuja temperatura de referência é de 298,15 K. Se houver inje-ção de vapor, este entrará na turbina com entalpia hvap, referente ao estado (Tvap, Pvap),obtido das tabelas de vapor superaquecido de Harvey (1998).
Na saída da câmara, todos os produtos foram considerados gases ideais, com pres-são P3 = P2 e temperatura T3, ambas definidas pelo usuário do programa. Dessa forma,o balanço de energia na base molar (kJ / kmol de combustível) fica
∑P
hout = ∑R
hin (3.6)
Simplificadamente, ocorre no combustor a seguinte reação:
Comb.+ a Ar + b (O2 + 3, 76 N2) + c H2O→ d CO2 + e H2O + f Ar + 3, 76 b N2 (3.7)
A massa de vapor injetada está atrelada à massa de ar que entra no combustor pormeio da relação
a MAr + b (MO2 + 3, 76 MN2) = ivap c MH2O (3.8)
onde:
MX [kg/kmol] : massa molecular da substância X.
Resolvendo-se o sistema composto das equações (3.6), (3.7) e (3.8), obtêm-se oscoeficientes estequiométricos. A partir deles, calculam-se as frações molares yi dosprodutos:
yi =ni
nP(3.9)
onde:nP = ∑
Pni = d + e + f + 3, 76 b (3.10)
Logo, a razão combustível-ar FAR2 [kg/kg] fica:
FAR =Mcomb
a MAr + b (MO2 + 3, 76 MN2)(3.11)
2Do inglês, "Fuel-Air Ratio".
Capítulo 3. Fundamentação teórica 10
Pela lei de Dalton, com base nas frações molares, obtêm-se as pressões parciais e,em seguida, a entalpia (h3) e a entropia (s 0
T3) da mistura de produtos da combustão:
h3(ni, T3) = ∑P
ni hi(T3) (3.12)
s 0T3(yi, T3) = ∑
Pyi s 0
T, i(T3) (3.13)
onde:
h3 [kJ/kmol de combustível];
s 0T3 [kJ/K · kmol de produtos da combustão].
Os parâmetros ni e yi são, respectivamente, os coeficientes estequiométricos e asfrações molares dos produtos da combustão. Como eles já foram calculados, a partirde agora a entalpia e a entropia da mistura dependem somente da temperatura.
Utilizando o poder calorífico inferior do combustível (PCI), obtido de Borgnakke eSonntag (2013), pode-se calcular a taxa de calor QH adicionada ao ciclo, em kW:
QH = mar · PCI · FAR (3.14)
Turbina a gás
Essa turbina alimenta o compressor, de modo que a potência produzida pela pri-meira (Wt) é igual à consumida pelo segundo (Wc):
Wt = Wc (3.15)
Pode-se obter o trabalho da turbina a gás em base molar:
wt = wcMcomb
FAR(3.16)
Logo, a entalpia na saída da turbina é
h4 = h3 − wt (3.17)
O cálculo direto das tabelas de gás ideal fornece as propriedades em função datemperatura. No entato, deseja-se obter a própria temperatura a partir de outras pro-priedades (processo inverso). No caso da turbina, sendo h4 conhecida, define-se umafunção f (T) tal que
f (T) = h4 − h(T) (3.18)
O problema consiste em achar a temperatura T tal que f (T) = 0, ou seja, encontrara raiz da função. Existem alguns métodos númericos conhecidos que podem realizaresse serviço. Para o programa desenvolvido neste trabalho, foram criadas funçõesque implementam o método de Brent (1972). Ele é um híbrido entre os métodos dabisseção, da secante e da interpolação quadrática inversa. Dentro de uma faixa de
Capítulo 3. Fundamentação teórica 11
valores de T definida, a cada iteração ele decide qual dos três métodos produzirá omelhor resultado, escolhendo-o. Esse procedimento é repetido até a convergência.
Assim, calcula-se a temperatura de saída T4 em função de h4. Em seguida, pode-seobter diretamente s 0
T4 (referente a T4) das tabelas termodinâmicas. De maneira análogaà equação (3.13),
s 0T4(T4) = ∑
Pyi s 0
T, i(T4) (3.19)
Considerando um processo ideal na turbina a gás, obtêm-se o trabalho (wt,i) e aentalpia (h4i) de saída ideais:
wt,i =wt
ηt(3.20)
h4i = h3 − wt,i (3.21)
Novamente por iteração, obtém-se a temperatura de saída ideal T4i em função deh4i. A partir de T4i, calcula-se s 0
T4i :
s 0T4i(T4i) = ∑
Pyi s 0
T, i(T4i) (3.22)
Como o processo ideal é isentrópico, tem-se para uma mistura (Bathie, 1996):
s 0T4i − s 0
T3 = R ln(
P4
P3
)(3.23)
A única variável desconhecida é a pressão na saída da turbina, P4. Pode-se obtê-larearranjando a equação (3.23):
P4 = P3 exp
(s 0
T4i − s 0T3
R
)(3.24)
Turbina de potência
Essa turbina é independente da anterior e produz a potência útil do ciclo — que éposteriormente convertida em energia elétrica em um gerador.
Para uma compressão isentrópica, a entropia ideal da mistura na saída da turbinade potência (s 0
T5i) pode ser calculada por (Bathie, 1996):
s 0T5i = s 0
T4 + R ln(
P5
P4
)(3.25)
De forma análoga à turbina a gás, utiliza-se uma função para calcular a tempera-tura ideal de saída da mistura T5i , dessa vez a partir da entropia s 0
T5i. Sabendo-se T5i ,obtém-se a entalpia correspondente, h5i . Em seguida, calcula-se o trabalho ideal wtp,i :
wtp,i = h4 − h5i (3.26)
Capítulo 3. Fundamentação teórica 12
Considerando a eficiência isentrópica da turbina a gás — ηtp, fornecida pelo usuá-rio do programa —, o trabalho real wtp fica
wtp = wtpi ηtp (3.27)
Passando para a base mássica (kJ / kg de ar que entra no compressor):
wtp = wtpFAR
Mcomb(3.28)
A entalpia real de saída na base molar é
h5 = h4 − wtp (3.29)
Ou, na base mássica:
h5 = h5FAR
Mcomb(3.30)
De forma idêntica à utilizada para encontrar T4, determina-se a temperatura realde saída da mistura T5 correspondente a h5.
Gerador de vapor (HRSG)
Os cálculos desse componente só serão utilizados em caso de injeção de vapor nocombustor ou nos ciclos combinados.
Neste trocador de calor, a mistura efluente da turbina de potência pode ser utili-zada para gerar vapor. Esse vapor pode voltar para o combustor (ciclo Brayton cominjeção) ou ir para um outro processo, como um ciclo Rankine (ciclo combinado). Osegundo caso será apresentado posteriormente.
Quando houver injeção de vapor na câmara de combustão, o balanço de energiano trocador, considerando um proceeso ideal, será dado por
mar (h5 − h6) = ivap mar (hvap − hb out) (3.31)
Com isso, determina-se a entalpia h6 de descarte da mistura no ambiente. Nasequência, converte-se h6 para a base molar:
h6 = h6Mcomb
FAR(3.32)
A partir de h6, calcula-se iterativamente a temperatura T6 correspondente, pelomesmo procedimento utilizado em relação a T5.
As restrições no gerador de vapor são:
T5 > Tvap (3.33)T6 > Tb out (3.34)
Portanto, se: i) a temperatura Tb out na saída da bomba não for menor que T6; ou ii)a temperatura Tvap definida pelo usuário não for menor que T5; o programa retornaráum erro.
Capítulo 3. Fundamentação teórica 13
No HRSG não é desejável a condensação da água na mistura dos produtos de com-bustão, pois ela usualmente contém alguns gases dissolvidos, podendo ser corrosiva(Borgnakke e Sonntag, 2013). Logo, a temperatura T6 deve ser superior ao ponto deorvalho Torv da mistura. Dessa forma, foi definida uma margem de segurança de 30 Kem relação a Torv. Se Torv < T6 < Torv + 30, o programa avisará o usuário sobre apossibilidade de condensação. Se T6 ≤ Torv, o programa retornará um erro.
A potência líquida produzida pelo ciclo, em kW, é
Wliq = mar (wtp − wb ivap) (3.35)
Outra medida de produtividade do ciclo é a potência específica, que considera ocalor específico do ar à temperatura T1:
Wesp =Wliq
mar Cp,ar(T1) T1(3.36)
Finalmente, considerando a taxa de calor fornecido pela equação (3.14), o rendi-mento do ciclo é dado por
ηciclo =Wliq
QH(3.37)
3.2 Ciclo Rankine
O ciclo de Rankine ideal assemelha-se ao de Brayton, com quatro processos emregime permanente. Entretanto, há diferenças importantes. A principal é o fato de ofluido de trabalho ser o mesmo durante todo o ciclo, não sofrendo reações químicas,pois ocorrem apenas mudanças de fase. Ademais, ao final dos processos, o estadotermodinâmico e a composição química do fluido são os mesmos que no início, carac-terizando um ciclo fechado - o ciclo Brayton da seção 3.1 é aberto.
O esquema do ciclo Rankine pode ser visto na figura 3.2. O fluido de trabalhoé a água. No evaporador e no condensador ocorrem transferências de calor isobári-cas. Na turbina e na bomba, há, respectivamente, expansão e compressão isentrópicas.Assim como na seção 3.1, o programa desenvolvido pode considerar o efeito das irre-versibilidades nos processos envolvendo trabalho mecânico, por meio das eficiênciasisentrópicas da turbina e da bomba.
3.2.1 Equacionamento
No programa desenvolvido, os seguintes dados devem ser fornecidos pelo usuá-rio:
• m [kg/s] : vazão mássica de água na entrada do evaporador;
• Pev [kPa] : pressão de evaporação;
• Tev [K] : temperatura de evaporação (calculada automaticamente com Pev);
• ∆Tsh [K] acréscimo de temperatura em relação a Tev;
Capítulo 3. Fundamentação teórica 14
FIGURA 3.2: Esquema do ciclo Rankine.
• ηb [%] : eficiência da bomba;
• ηtv [%] : eficiência da turbina a vapor;
• parâmetro de projeto na saída da turbina - pressão (Pb [kPa]) ou título (xb).
Havendo regeneração, pedem-se também:
• o tipo de aquecedor;
• o número de aquecedores;
• a pressão em cada linha de extração da turbina, em kPa;
• a eficiência dos aquecedores (opcional).
Cálculos
Para os cálculos dos processos de todos componentes do ciclo, foram utilizadas astabelas de água (saturação, líquido comprimido e vapor superaquecido) de Harvey(1998).
Capítulo 3. Fundamentação teórica 15
Turbina
A perda de carga no evaporador não foi levada em conta, de modo que a pressão Pana entrada da turbina é igual a Pev. Considerando o superaquecimento ∆Tsh definidopelo usuário, a temperatura Ta na entrada da turbina é dada por
Ta = Tev + ∆Tsh (3.38)
Definido o estado a, podem-se obter a entalpia ha e a entropia sa específicas.O usuário pode escolher entre duas opções de parâmetros de projeto para a tur-
bina: pressão ou título.
I) Pressão
A pressão Pb de saída da turbina é definida. Uma compressão isentrópica fornecea entalpia de saída ideal hb,i em função de Pb e sb (= sa). A água pode sair da turbinaem estado bifásico ou como vapor superaquecido, mas, de qualquer forma, a entalpiareal é dada por
hb = (hb,i − ha) · ηtv + ha (3.39)
II) Título
Neste caso, água sai da turbina necessariamente na região de saturação, com títuloxb especificado. O processo direto de cálculo na turbina permite obter o estado desaída em função da pressão Pb e da eficiência ηtv; após isso, encontra-se o título xb.Para fazer o processo inverso, é necessário um método iterativo, de maneira análoga àdescrita na seção 3.1. Para uma dada pressão P, pode-se calcular a entalpia h′ de saídada turbina pela equação (3.39), como no caso I. Das tabelas de saturação, encontra-seo título correspondente a P e h′. Como ηtv é constante e conhecida, consegue-se obtero título x(P) na sáida da turbina como função somente de P. Em seguida, define-seuma função semelhante à da equação (3.18):
f (P) = xb − x(P) (3.40)
Utilizando-se novamente o método de Brent, criou-se uma função para encontrar araíz de f (P). Desse modo, obtém-se Pb a partir de xb e ηtv. Definidos Pb e Xb, obtém-sea entalpia de saída hb.
Bombas
O funcionamento de todas as bombas neste ciclo é assumido igual. Água entracomo líquido saturado e sai como líquido comprimido. O estado de entrada e a pres-são de saída são sempre dados previamente. Assim, assumindo um processo isentró-pico,
sbomba in = sbomba out (3.41)
Capítulo 3. Fundamentação teórica 16
Conhecendo-se a pressão e entropia ideal de saída, obtém-se a entalpia de saídaideal hbomba out,i das tabelas de propriedades interpoladas. A entalpia de saída real édada por
hbomba out =hbomba out,i − hbomba in
ηb+ hbomba in (3.42)
E o trabalho específico é
wb = hbomba out − hbomba in (3.43)
Condensador
O estado de saída do condensador (ponto c) foi fixado como líquido saturado àpressão Pc = Pb. Portanto, as demais propriedades desse ponto são facilmente obtidas.
Aquecedores
O programa desenvolvido neste projeto disponibiliza dois tipos de aquecedores:de contato e de superfície.
a) Aquecedor de contato
Nele, o vapor da turbina e o líquido comprimido da bomba misturam-se. Suaprincipal desvantagem é a necessidade de uma bomba adicional para cada unidadeintroduzida na planta, como pode ser observado na figura 3.3. Considerou-se nesteprojeto uma mistura ideal, em que os afluentes atingem a mesma temperatura e saemcomo líquido saturado. Dessa forma, o balanço energético em cada aquecedor é dadopor
mlinha hturb + mbomba hbomba out = mac hac out (3.44)
onde:
mlinha [kg/s] : vazão mássica na linha de extração da turbina;
hturb [kJ/kg] : entalpia do vapor extraído da turbina;
mbomba [kg/s] : vazão mássica do afluente vindo da bomba;
hb out [kJ/kg] : entalpia do afluente vindo da bomba;
mac [kg/s] : vazão mássica efluente do aquecedor;
hac out [kJ/kg] : entalpia do efluente do aquecedor.
E o blanço mássico é
mlinha + mbomba = mac (3.45)
Capítulo 3. Fundamentação teórica 17
FIGURA 3.3: Esquema do Rankine com aquecedores de contato.
b) Aquecedor de superfície
Nesse tipo de aquecedor, não há mistura entre os fluidos. Embora tenha uma efi-ciência menor, ele apresenta duas vantagens: pode operar com fluidos a pressões di-ferentes e dispensa a inclusão de bombas adicionais.
O primeiro aquecedor do ciclo - de mais alta pressão - funciona de maneira sim-ples, como demonstrado na figura 3.4. Em um compartimento, passa o líquido com-primido (fluido frio). Este é aquecido pelo vapor da turbina (fluido quente), que passapor fora e condensa, saindo como líquido saturado. Idealmente, o fluido frio sai coma mesma temperatura do fluido quente.
Do segundo aquecedor em diante, se houver mais de um, há uma entrada adici-onal. Ao fluido quente junta-se o líquido saturado do aquecedor imediatamente su-perior (de pressão superior), formando um sistema em cascata. Entre os aquecedoreshá uma válvula, cujo processo de expansão foi considerado isentálpico. Essa misturasai novamente como líquido saturado, em direção ao aquecedor inferior — no últimoaquecedor, ela volta para o condensador.
A especificação da eficiência dos aquecedores de superfície é opcional. Se não fordada, será considerada eficiência máxima. Caso contrário, há dois modos possíveis:
• approach [K] — definido aqui como a diferença entre as temperaturas de satu-ração do fluido quente e de saída do fluido frio.
Capítulo 3. Fundamentação teórica 18
FIGURA 3.4: Esquema do Rankine com aquecedores de superfície.
• efetividade [%] — definida aqui como a razão entre d1 (diferença entre as tem-peraturas de saída e de entrada do fluido frio) e d2 (diferença entre as temperatu-ras de saturação do fluido quente e de entrada do fluido frio), em porcentagem.
De maneira geral, para todos os aquecedores, o balanço energético é
∑entrada
mi hi = ∑saıda
mj hj (3.46)
e o balanço mássico é
∑entrada
mi = ∑saıda
mj (3.47)
Resolvendo-se o sistema composto pelas equações (3.46) e (3.47) para cada aquece-dor, é possível determinar as vazões mássicas nas linhas de extração da turbina e, porconseguinte, na(s) bomba(s) e nos aquecedores. Após isso, fica determinado tambémo estado na entrada do evaporador (ponto d).
Capítulo 3. Fundamentação teórica 19
Evaporador
Esse equipamento é responsável por transformar água líquida (ponto d) em vapor(ponto a), utilizando o calor de um processo externo (uma caldeira, por exemplo).Assim como no condensador, considerou-se uma troca de calor ideal e sem perda decarga. A taxa de calor QH, em kW, a ser fornecida é dada por
QH = m (ha − hd) (3.48)
Determinados todos os pontos e vazões, podem-se calcular os parâmetros de pro-dutividade do ciclo. A soma das potências em todas as bombas, em kW, é
Wb = ∑ mbomba wb (3.49)
A potência na turbina fica
Wtv =
[n
∑i=1
mi (ha − hi)
]+
[m−
(n
∑i=1
mi
)](ha − hb) (3.50)
onde:
n : número de aquecedores;
mi : vazão mássica na linha de extração i da turbina
hi : entalpia específica na linha de extração i (na saída da turbina).
Logo, a potência líquida é
Wliq = Wtv − Wb (3.51)
Por último, a eficiência de 1ª lei do ciclo é
ηciclo =Wliq
QH(3.52)
3.3 Ciclo Rankine Orgânico
Este ciclo é idêntico ao Rankine da seção 3.2, porém utiliza outros fluidos de tra-balho, com massa molecular superior à da água. A uma dada pressão, esses fluidosapresentam pontos de ebulição inferiores, o que permite o uso de fontes de calor atemperaturas mais baixas. Por esse motivo, é mais conveniente neste caso especificaros pontos em termos das temperaturas de saturação (como em sistemas de refrigera-ção), ao invés das pressões.
3.3.1 Equacionamento
No programa desenvolvido, os seguintes dados devem ser fornecidos pelo usuá-rio:
Capítulo 3. Fundamentação teórica 20
• tipo de fluido de trabalho (amônia, butano, ciclopropano, ciclopentano, ciclo-hexano, decano, dióxido de carbono, etano, heptano, hexano, isobutano, iso-buteno, iso-hexano, isopentano, nonano, octano, pentano, propano, R-123, R-1234yf, R-134a, R-22, R-410a ou SES36);
• m [kg/s] vazão mássica na entrada do evaporador;
• Tev [K] temperatura de evaporação;
• ∆Tsh [K] acréscimo de temperatura em relação a Tev;
• Tcond [K] temperatura de condensação;
• ηb [%] eficiência da bomba;
• ηtv [%] eficiência da turbina a vapor.
Havendo regeneração, pedem-se também:
• o tipo de aquecedor;
• o número de aquecedores;
• a temperatura de condensação em cada linha de extração da turbina, em K;
• a eficiência dos aquecedores (opcional).
Cálculos
Todas as propriedades dos fluidos orgânicos foram obtidas a partir da bibliotecaCoolProp, de Bell et al. (2014). Ela não utiliza tabelas, mas funções para gerar as pro-priedades. Esse procedimento é encapsulado, ou seja, o programa desenvolvido nãotem acesso direto a essas funções.
A principal diferença entre os cálculos do ciclo Rankine orgânico e os do Rankinecomum está no fato de o primeiro basear-se nas temperaturas de saturação, não naspressões. Assim, as pressões Pa e Pb correspondem às temperaturas de saturação doevaporador (Tev) e do condensador (Tcond), respectivamente.
Os demais pontos são obtidos por esse mesmo raciocínio: encontra-se a pressãocom base na temperatura de saturação correspondente. A partir daí, os cálculos se-guem de maneira semelhante aos do Rankine comum.
3.4 Ciclo combinado
Este ciclo, como o nome sugere, é uma união de outros dois. Com ele, é possívelaproveitar a alta temperatura de descarte dos gases ao final do ciclo Brayton por meiode um gerador de vapor (HRSG). O vapor gerado alimenta um ciclo Rankine, comodemonstrado na figura 3.5.
Como se baseia nos ciclos das seções 3.1 e 3.2, as possíveis alterações implemen-tadas no programa continuam válidas. Assim, o usuário pode adicionar injeção devapor na câmara de combustão e/ou aquecedores no Rankine.
Capítulo 3. Fundamentação teórica 21
FIGURA 3.5: Esquema do ciclo combinado.
Caso haja injeção de vapor no combustor, são necessárias algumas alterações nociclo Rankine. O estado do vapor injetado será igual ao da saída do HRSG, sendodesviado da turbina. Isso acarretará uma perda na massa de água em circulação, queserá reposta no condensador. Essa água de reposição vem de um reservatório externoa temperatura fixa e à mesma pressão do condensador.
3.4.1 Equacionamento
No programa desenvolvido, os seguintes dados devem ser fornecidos pelo usuá-rio:
• todos os dados fornecidos aos ciclo Brayton da seção 3.1, com adição da tempe-ratura T6 de descarte, em K;
• todos os dados fornecidos aos ciclo Rankine da seção 3.2, com exceção de m(vazão mássica de água na entrada do evaporador).
Cálculos
Em relação aos cálculos, a principal mudança está no evaporador do ciclo Rankine,que passa a chamar-se HRSG. Nesse trocador de calor, as restrições são
Ta < T5 (3.53)Td < T6 (3.54)
Capítulo 3. Fundamentação teórica 22
e o balanço energético é
mar(h5 − h6) = m (ha − hd) (3.55)
Essa equação assemelha-se à (3.31). Contudo, agora o valor de h6 é conhecido (emfunção de T6, fornecida pelo usuário), e deseja-se determinar m, a vazão principal nociclo no Rankine. Além disso, se houver desvio de vapor para injeção no combustor, ocálculo da potência da turbina deverá ser corrigido, levando-se em conta a nova vazãode entrada m′:
m′ = m− ivap mar (3.56)
onde o produto ivap mar indica a vazão mássica de vapor desviada para o combus-tor, em kg/s. Se esse produto for maior ou igual à vazão calculada m, o programaretornará um erro.
Feito isso, a potência na turbina permanece sendo calculada por meio da equação(3.50), agora com no m′ lugar de m.
Após o cálculo dos ciclos separados, obtêm-se os parâmetros combinados. A po-tência líquida total é a soma das potências líquidas de cada ciclo:
(Wliq)Combinado = (Wliq)Brayton + (Wliq)Rankine (3.57)
O calor da fonte quente é o mesmo do ciclo Brayton. Assim, a eficiência combinadaé
(ηciclo)Combinado =(Wliq)Combinado
(QH)Brayton(3.58)
3.5 Ciclo combinado orgânico
Tal como o ciclo da seção 3.4, este é a união dos ciclos de Brayton e de RankineOrgânico, das seções 3.1 e 3.3, respectivamente. A principal diferença em relação aocombinado comum, indicada na figura 3.6, ocorre em caso de injeção de vapor nocombustor. Como o fluido de trabalho do Rankine não é mais a água, esse vapor temde vir de um processo externo.
3.5.1 Equacionamento
No programa desenvolvido, os seguintes dados devem ser fornecidos pelo usuá-rio:
• todos os dados fornecidos aos ciclo Brayton da seção 3.1, com adição da tempe-ratura T6 de descarte, em K;
• todos os dados fornecidos aos ciclo Rankine orgânico da seção 3.3, com exceçãode m (vazão mássica de água na entrada do evaporador).
Capítulo 3. Fundamentação teórica 23
Cálculos
Como o vapor injetado na câmara de combustão é proveniente de um processo ex-terno, não há desvio de vapor do ciclo Rankine orgânico. Assim, a única novidade emrelação aos ciclos separados é a troca do evaporador pelo gerador de vapor (HRSG),de modo que a vazão mássica principal (m) no Rankine orgânico é obtida pela equação(3.55). Analogamente, os parâmetros combinados são obtidos pelas equações (3.57) e(3.58), em que, no lugar do ciclo Rankine, há agora o Rankine orgânico.
FIGURA 3.6: Esquema do ciclo combinado orgânico.
24
Capítulo 4
Resultados
4.1 Verificação
Para avaliar o funcionamento do programa, foram realizados cálculos manuaispara os três ciclos-base — Brayton, Rankine e Rankine orgânico. Os parâmetros ini-ciais e a comparação com o resultado do programa para cada caso estão nas seçõesseguintes.
4.1.1 Brayton
Dados iniciais
O ciclo proposto apresenta o esquema ilustrado na figura 4.1. Seus dados iniciaisforam:
• combustível: metano;
• mar = 1 kg/s;
• T1 = 298,15 K;
• P1 = 100 kPa;
• P2 = 2000 kPa;
• T3 = 1400 K;
• P5 = 100 kPa;
• ηc = 88 % ;
• ηt = 90 % ;
• ηtp = 90 % ;
• ivap = 3 [% mar];
• Tvap = 703,15 K;
• Pvap = 2100 kPa.
Capítulo 4. Resultados 25
FIGURA 4.1: Esquema do ciclo Brayton.
Comparação
A tabela 4.1 mostra a comparação entre os resultados obtidos manualmente e osdo programa. As unidades são: T[K], P[kPa], W[kW] e η[%]. Como explicado na se-ção 3.1.1, o cálculo das temperaturas da mistura dos produtos de combustão envolveprocedimentos iterativos. Por esse motivo, essas temperaturas — T4, T5 e T6 — têm re-solução limitada a 1 K. Apesar disso, há uma concordância satisfatória entre os valoresobservados, com todos os erros relativos inferiores a 0,6 %.
TABELA 4.1: Validação dos cálculos do ciclo Brayton.
T2 T4 P4 T5 T6 FAR Wliq ηcicloManual 739,74 1055 508,08 741 661 0,0176 394,13 44,79
Programa 739,74 1056,27 509,75 741,60 661,73 0,0176 396,24 44,90
Capítulo 4. Resultados 26
4.1.2 Rankine
Dados iniciais
FIGURA 4.2: Esquema do ciclo Rankine.
O ciclo proposto apresenta o esquema ilustrado na figura 4.2. Seus dados iniciaisforam:
• m = 1 kg/s;
• Pev = 4000 kPa;
• ∆Tsh = 249,65 K;
• Pb = 10 kPa;
• ηb = 95 % ;
• ηtv = 95 % ;
• número de aquecedores: 2;
Capítulo 4. Resultados 27
• tipo de aquecedor: superfície;
• approach: 5 K;
• pressão na linha 1: 1000 kPa;
• pressão na linha 2: 130 kPa.
Comparação
A tabela 4.2 mostra a comparação entre os resultados obtidos manualmente e osdo programa. As unidades são: m[kg/s], W[kW] e η[%]. Nota-se a igualdade de aomenos 3 algarismos significativos para quase todos os valores apresentados, o quemostra uma boa concordância entre eles.
TABELA 4.2: Validação dos cálculos do ciclo Rankine.
mlinha 1 mlinha 2 Wb Wtv Wliq ηcicloManual 0,1358 0,0870 4,26 1007,10 1002,84 37,09
Programa 0,1358 0,0870 4,26 1006,98 1002,72 37,08
4.1.3 Rankine Orgânico
Dados iniciais
O ciclo proposto apresenta o esquema ilustrado na figura 4.3. Seus dados iniciaisforam:
• fluido de trabalho: amônia;
• m = 1 kg/s;
• Tev = 383,15 K;
• ∆Tsh = 30 K;
• Tcond = 278,15 K;
• ηb = 100 % ;
• ηtv = 100 % ;
• número de aquecedores: 2;
• tipo de aquecedor: contato;
• temperatura de condensação na linha 1: 303,15 K;
• temperatura de condensação na linha 2: 288,15 K.
Capítulo 4. Resultados 28
FIGURA 4.3: Esquema do ciclo Rankine orgânico.
Comparação
Conforme descrito na seção 3.3.1, o método pelo qual o programa obtém as pro-priedades dos fluidos orgânicos não pode ser reproduzido manualmente. Dessa ma-neira, foram utlizadas para a verificação as tabelas de amônia de Borgnakke e Sonntag(2013), as quais não incluem os estados de líquido comprimido. Assim, foi necessárioalterar o equacionamento das bombas.
Primeiramente, aproximou-se o volume específico na saída da bomba para o es-tado de líquido saturado. Em seguida, definiu-se o volume específico médio v nabomba:
v ≡ vin + vout
2Por fim, como o processo foi considerado isentrópico (ηb = 100%) e desprezando-
se as variações de energia potencial e cinética, o trabalho consumido na bomba pôdeser representado por:
wb = v (Pout − Pin)
Capítulo 4. Resultados 29
Outro problema dessas tabelas está na região de vapor superaquecido. O espaça-mento entre os valores — que diminui a acurácia da interpolação — aumenta com apressão, afetando os cálculos das bombas e, principalmente, da turbina.
Os resultados estão na tabela 4.3. As unidades são: m[kg/s], W[kW] e η[%]. Nota-se que, como esperado, as discrepâncias são superiores às das seções 4.1.1 e 4.1.2.Apesar disso, o erro relativo do rendimento do ciclo ηciclo é inferior a 4 % .
TABELA 4.3: Validação dos cálculos do ciclo Rankine orgânico.
mlinha 1 mlinha 2 Wb Wtv Wliq ηcicloManual 0,0657 0,0405 13,90 306,93 293,03 24,00
Programa 0,0655 0,0403 11,70 318,62 306,92 24,79
Capítulo 4. Resultados 30
4.2 Estudo de casos
4.2.1 Ciclo Brayton — caso A0
Verificado o programa, realizou-se um estudo de casos hipotéticos, com o intuitode aferir o impacto de diversos parâmetros nos resultados finais. O cenário inicial éum ciclo Brayton, esquematizado na figura 4.4. Foram adotados os seguintes dadosiniciais:
• combustível: metano;
• mar = 1 kg/s;
• T1 = 293,15 K;
• P1 = 101,3 kPa;
• P2 = 1800 kPa;
• T3 = 1400 K;
• P5 = 101,3 kPa;
• ηc = 88 % ;
• ηt = 90 % ;
• ηtp = 90 % .
FIGURA 4.4: Esquema do ciclo Brayton.
Este ciclo, sem injeção de vapor (ivap = 0%), foi denominado A0 e serviu comoreferência. Ele produziu os seguintes resultados:
• Wesp = 1,243;
• ηciclo = 41,88 % .
Capítulo 4. Resultados 31
4.2.2 Ciclo Brayton com injeção de vapor — caso A1
FIGURA 4.5: Esquema do ciclo Brayton com injeção de vapor.
No caso teste A1 — esquematizado na figura 4.5 —, estudaram-se os efeitos dainjeção de vapor no combustor do ciclo do caso A0.
Para garantir a entrada na câmara de combustão, a pressão Pvap do vapor injetadodeve ser maior que a pressão P2 na própria câmara. Desse modo, adotou-se Pvap =1850 kPa.
Em relação à temperatura do vapor inejtado, definiu-se um valor de referência,correspondente ao estado de vapor saturado a pressão Pvap :
Tre f ≡ Tsat(1850 kPa) = 481, 619 K (4.1)
Em seguida, foram analisados seis cenários, com diferentes temperaturas de vaporinjetado, todas em relação a Tre f :
1) Tvap = Tre f ;
2) Tvap = 1, 1 Tre f ;
3) Tvap = 1, 2 Tre f ;
4) Tvap = 1, 3 Tre f ;
5) Tvap = 1, 4 Tre f ;
Capítulo 4. Resultados 32
6) Tvap = 1, 5 Tre f .
Para cada um desses cenários, variou-se a vazão mássica ivap de vapor injetado —de 0 % a 5 % da vazão mássica de ar (mar) —, produzindo 6 curvas no total.
Os resultados para a potência específica (Wesp) e para a eficiência (ηciclo) estão, res-pectivamente, nas figuras 4.6 e 4.7. A primeira indica que a relação entre ivap e Wesp édireta e aproximadamente linear. Além disso, Tvap praticamente não influi em Wesp -na realidade, Wesp cai levemente com um aumento de Tvap. Esse comportamento nãose repete na figura 4.7, pois ηciclo é visivelmente alterada por Tvap. Chama atenção so-bretudo o salto entre as curvas Tre f e 1, 1 Tre f , que demonstra o ganho de eficiência aosuperaquecer o vapor injetado.
A explicação para os comportamentos apresentados nas figuras 4.6 e 4.7 reside nofato de que um elevação em Tvap provoca um decréscimo na quantidade de combustí-vel requerida e, por conseguinte, na razão combustível-ar (FAR), já que mar permanececonstante. Como tanto o calor QH fornecido ao ciclo quanto as potências Wliq e Wespsão diretamente proporcionais a FAR, os três parâmetros caem. Entretanto, o impactode FAR é maior em QH, de modo que ηciclo aumenta, apesar da queda de Wliq.
FIGURA 4.6: Diagrama Wesp x ivap para o ciclo Brayton.
Capítulo 4. Resultados 33
FIGURA 4.7: Diagrama ηciclo x ivap para o ciclo Brayton.
Capítulo 4. Resultados 34
4.2.3 Ciclo combinado simples — caso A2
FIGURA 4.8: Esquema do ciclo combinado.
No caso teste A2 — ilustrado na figura 4.8 —, desejou-se aumentar a eficiência e apotência líquida do ciclo Brayton de referência (caso A0, sem injeção de vapor). Paraisso, a ele é associado um ciclo Rankine, com as seguintes espeficações:
• Pev = 1850 kPa;
• Pb = 10 kPa;
• ηb = 90 % ;
• ηtv = 90 % ;
• número de aquecedores: 0.
Embora ainda seja necessário definir outros estados do ciclo, já é possível calcular atemperatura de saída da bomba, Td = 319,07 K. Do ciclo Brayton já calculado, tem-se T5= 756,23 K. Respeitando-se a condição de não condensação do vapor d’água discutidana seção 3.1.1, fixou-se a temperatura T6 em 360 K. Como visto na seção 3.4.1, restadeterminar Ta para finalizar o acoplamento dos ciclos. As figuras 4.9 e 4.10 mostramalguns parâmetros em função de Ta. Observa-se que, apesar da diminuição da vazãomássica m no ciclo Rankine, tanto a eficiência ηciclo quanto a potência específica Wespaumentam — praticamente da mesma forma — com Ta. Isso ocorre pois a elevaçãodo trabalho específico na turbina a vapor — em função de uma maior entalpia dovapor de entrada — supera o decréscimo na vazão. Outra consequência importante
Capítulo 4. Resultados 35
FIGURA 4.9: Curvas de m∗ e xb em função de Ta.(m∗ ≡ m/mar)
do superaquecimento é o crescimento do título xb na saída da turbina. Valores acimade 0,9 — usualmente o mínimo necessário para o bom funcionamento da turbina —são obtidos a partir de 652,4 K, como indicado na figura 4.9.
A análise das figuras 4.9 e 4.10 mostra que o superaquecimento melhora todosos parâmetos desejados. Nesse sentido, a princípio, a escolha de Ta deveria ser pelomaior valor possível, ou seja, T5. Contudo, isso seria inviável na prática, porque oHRSG necessitaria de uma área infinita. Esse fenômeno pode ser entendido pela ob-servação da equação da taxa de transferência de calor em um trocador (Shah e Sekulic,2003):
A =Q
U · F · ∆Tlm(4.2)
onde:
A : área de troca, em m2;
Q : taxa de transferência de calor, em kW;
U : coeficiente global de transferência de calor, em kW/(m2 · K);
F : fator de correção MTD;
Capítulo 4. Resultados 36
FIGURA 4.10: Curvas de Wesp e ηciclo em função de Ta.
∆Tlm : diferença de temperatura média logarítmica (LMTD1), em K.
Como os estados nos pontos 5 e 6 do ciclo Brayton são conhecidos, a taxa de calorQ — igual ao lado esquerdo da equação (3.55) — está determinada.
O coeficiente U não pode ser conhecido a priori, pois depende de diversos fatores,inclusive da geometria do trocador de calor, a qual influencia a área A. Contudo, osfabricantes costumam fornecer faixas de valores para uma estimativa inicial. Nessecaso, pode-se considerar U conhecido.
A LMTD é definida por
∆Tlm ≡∆T1 − ∆T2
ln
(∆T1
∆T2
) (4.3)
Considerando-se um trocador de calor com configuração contracorrente,
∆T1 = T5 − Ta (4.4)∆T2 = T6 − Td (4.5)
F = 1 (4.6)
1Do inglês, "Log Mean Temperature Difference".
Capítulo 4. Resultados 37
Com T6 e Td conhecidas, é possível calcular a LMTD como função somente de ∆T1.A figura 4.11 mostra a curva dessa função. Nota-se que, à medida que ∆T1 diminui, aLMTD tende abruptamente a zero. Nesse cenário, pela equação (4.2), percebe-se quea área A de troca tenderá ao infinito. Para contornar esse problema, estabeleceu-seum limite mínimo para ∆T1 de 30 K. Pelos mesmos motivos, esse valor também seráválido para ∆T2. Satisfazendo essa nova condição limite, definiu-se um valor de 100 Kpara ∆T1. Logo, pela equação (4.4), Ta = 656,23 K (para uma pressão de 1850 kPa, tem-se ∆Tsh = 174,61 K). Esse valor produz xb = 0,9, o que atende à recomendação de títulomínimo na turbina. Analogamente, pela equação (4.5), o novo valor de T6 é 419,07 K,que também respeita a condição de não condensação.
FIGURA 4.11: Diagrama LMTD x ∆T1 para o HRSG.
Capítulo 4. Resultados 38
4.2.4 Ciclo combinado com regeneração
1 aquecedor — caso A3
FIGURA 4.12: Esquema do ciclo combinado com 1 aquecedor de con-tato.
FIGURA 4.13: Esquema do ciclo combinado com 1 aquecedor de super-fície.
Capítulo 4. Resultados 39
No caso teste A3, avaliou-se o impacto de 1 regenerador no ciclo combinado. Fo-ram considerados os dois tipos de aquecedor: contato e superfície, este último semineficiências. Os esquemas desses dois cenários estão representados nas figuras 4.12 e4.13, respectivamente.
Respeitando-se as restrições impostas por (3.53) e (3.54), variou-se a pressão nalinha de extração da turbina de vapor (Plinha 1). Os resultados são exibidos nas figuras4.14 e 4.15. Analisando-as, algumas conclusões podem ser tomadas:
• o aquecedor de contato apresenta valores superiores, tanto de ηciclo quanto deWesp, para toda a faixa de pressão analizada;
• a partir de cerca de 170 kPa (linhas pontilhadas), a condição de approach mínimode 30 K não é respeitada em nenhum dos dois cenários, pois Td aumenta direta-mente com Plinha 1.
• os dois tipos de aquecedor apresentam pontos ótimos de ηciclo e de Wesp;
• a pressão ótima — tanto em relação a ηciclo quanto a Wesp — para o aquecedor decontato é de 250 kPa, fora da condição de approach mínimo;
• a pressão ótima — tanto em relação a ηciclo quanto a Wesp — para o aquecedor desuperfície é de 143 kPa, dentro da condição de approach mínimo;
• no geral, o cenário que prodziu os melhores resultados dentro das recomenda-ções foi o ciclo com aquecedor de contato, com Plinha 1 = 173 kPa.
FIGURA 4.14: Diagrama ηciclo x Plinha 1.
Capítulo 4. Resultados 40
FIGURA 4.15: Diagrama Wesp x Plinha 1.
Capítulo 4. Resultados 41
2 aquecedores — caso A4
FIGURA 4.16: Esquema do ciclo combinado com 2 aquecedores de con-tato.
Para melhorar ainda mais o rendimento do ciclo, no caso teste A4 avaliou-se aregeneração com 2 aquecedores, ambos do mesmo tipo. Seu esquema é apresentadona figura 4.16. Foram considerados três cenários (C1, C2 e C3), variando-se a pressãona linha 2 (Plinha 2) e com a pressão na linha 1 (Plinha 1) fixa:
C1) Aqucedores de contato. Plinha 1 = 173 kPa (melhor valor dentro das recomenda-ções no caso A3 — 1 aquecedor de contato).
C2) Aqucedores de superfície. Plinha 1 = 174 kPa (valor máximo permitido pelo crité-rio do approach mínimo no caso A3 — 1 aquecedor de superfície).
C3) Aqucedores de superfície. Plinha 1 = 143 kPa (valor ótimo do caso A3 — 1 aque-cedor de superfície).
A figura 4.17 mostra o efeito de Plinha 2 em ηciclo, para cada um dos três cenários.Analisando-a, podem-se fazer algumas observações:
• À semelhança do caso A3, a configuração com aquecedores de contato (C1) pro-duziu os melhores resultados, para a todos os valores de Plinha 2.
• Uma notável mudança ocorreu em relação à forma das curvas. Todos os cenárioscontinuam apresentando pontos ótimos; entretanto, esses pontos podem agoraser mais facilmente visualizados, uma vez que as curvas estão mais acentuadas.Esse fato indica que o segundo aquecedor é mais sensível a variações na pressãode extração que o primeiro.
Capítulo 4. Resultados 42
• Em relação às configurações com aquecedores de contato, o cenário de pontoótimo do caso A3 (C3) apresentou valores de ηciclo inferiores aos do cenário demáxima pressão na linha 1 (C2).
A figura 4.18 mostra os efeitos de pressão na linha 2 na potência específica Wesp,nos dois cenários. A semelhança com a figura 4.17 não é casual. As modificações nosregeneradores só alteram o ciclo Rankine. Como QH depende do Brayton e mantém-se constante, essas alterações somente influenciam a potência líquida global. Dessaforma, de acordo com as equações (3.57) e (3.58), a relação entre ηciclo e Wesp é, nessaconfiguração, linear.
FIGURA 4.17: Diagrama ηciclo x Plinha 2 com aquecedores de contato.
Capítulo 4. Resultados 43
FIGURA 4.18: Diagrama Wesp x Plinha 2 com aquecedores de contato.
Capítulo 4. Resultados 44
4.2.5 Ciclo combinado com regeneração e injeção de vapor — caso A5
FIGURA 4.19: Esquema do ciclo combinado com regeneração e injeçãode vapor.
No caso A5 — esquematizado na figura 4.19 —, desejou-se estudar como a injeçãode vapor no combustor atua no ciclo combinado. Para tal, foram mantidos os dadosiniciais do ciclo combinado da seção 4.2.4. Além deles, definiu-se a regeneração comdois aquecedores de contato. As pressões nas linhas de extração foram escolhidas combase na figura 4.17, de modo a produzir o maior rendimento possível. Desse modo,seus valores foram de 173 e 47 kPa.
Os resultados em função da vazão mássica de vapor injetado (ivap) são apresenta-dos na figura 4.20. Percebe-se que, apesar de aumentar a potência específica, a injeçãode vapor diminui o rendimento global. Esse fato é entendido com o auxílio da figura4.21. Observa-se um aumento de QH, pois mais massa entra no combustor, o que re-quer mais combustível. Adicionalmente, a contribuição do ciclo Rankine diminuiu —devido ao desvio de vapor para o ciclo Brayton —, afetando negativamente a potên-cia global. Desse modo, o crescimento de Wliq(combinada) não acompanhou o de QH,provocando uma queda na eficiência global.
Capítulo 4. Resultados 45
FIGURA 4.20: Curvas de ηciclo e de Wesp em função de ivap.
FIGURA 4.21: Curvas de Wliq e de QH em função de ivap.
Capítulo 4. Resultados 46
4.2.6 Ciclo combinado orgânico — caso B0
Para este caso hipotético, considerou-se o ciclo Brayton do caso A2, desta vez as-sociado a um Rankine orgânico, cujo fluido de trabalho é o pentano. Conforme men-cionado na seção 3.3, sua principal vantagem é trabalhar com fontes quentes a tem-peraturas inferiores. Dessa forma, fixou-se a temperatura de evaporação Tev a 439,7K — portanto, 30 K abaixo da temperatura crítica. A temperatura de condensação foidefinida como 293,15 K. Com isso, os dados de entrada foram:
• fluido de trabalho: pentano;
• Tev = 439,7 K;
• ∆Tsh = 0 K;
• Tcond = 293,15 K;
• ηb = 90 % ;
• ηtv = 90 % ;
• número de aquecedores: 0.
Admtiu-se, para efeito de comparação, um outro ciclo combinado, desta vez ope-rando com um Rankine comum. Nesse caso, as pressões de evaporação e de condensa-ção, Pev e Pb, repectivamente, são equivalentes às temperaturas Tev e Tcond do Rankineorgânico. Assim, têm-se os dados iniciais deste ciclo:
• Pev = Psat(439,7 K) = 728,325 kPa;
• ∆Tsh = 0 K;
• Pb = Psat(293,15 K) = 2,34 kPa;
• ηb = 90 % ;
• ηtv = 90 % .
TABELA 4.4: Comparação entre os ciclos combinados orgânico e co-mum.
xb m Wesp ηcicloOrgânico - 0,6387 1,509 50,84Comum 0,80 0,1399 1,588 53,47
Ao analisar a tabela 4.4, nota-se que, apesar da maior vazão mássica m em circu-lação no Rankine orgânico — em razão de uma entalpia de vaporização inferior à daágua —, seu ciclo combinado produz menos potência e, por conseguinte, um menorrendimento. Contudo, uma grande qualidade desse ciclo é a capacidade de trabalharsem superaquecimento. Isso se deve ao fato de muitos fluídos orgânicos apresentarem
Capítulo 4. Resultados 47
um comportamento diferente do da água na região de vapor superaquecido. Suas cur-vas de saturação possuem inclinação oposta à da água, permitindo que, mesmo numaexpansão isentrópica, um vapor que entra na turbina saturado saia superaquecido.Quando o fluido de trabalho é a água, porém, a tendência é uma diminuição no tí-tulo. Nessa configuração, o título na saída da turbina está abaixo do mínimo aceitável,tornando inviável o ciclo combinado comum.
4.2.7 Ciclo combinado orgânico com regeneração — caso B1
Pretendeu-se neste caso avaliar o efeito da regeneração no ciclo combinado orgâ-nico do caso B0. Nesse sentido, foi considerado apenas um aquecedor, de contato.
O rendimento global em função da temperatura de saturação na linha de extraçãoda turbina está representado na figura 4.22. Para efeito de comparação, foi incluidoum ciclo combinado com Rankine comum, cujas pressões são equivalentes às tem-peraturas de saturação, como descrito na seção 4.2.6. Para a faixa de Tsat adotada,nota-se uma variação de ηciclo de aproximadamente um ponto percentual no orgânico,contra apenas meio ponto no comum. Além disso, em sintonia com o caso B0 (semregeneração), a eficiência do ciclo combinado orgânico é inferior à de seu equivalentecomum.
FIGURA 4.22: Diagrama ηciclo x Tsat na linha 1.
Capítulo 4. Resultados 48
4.2.8 Resumo dos casos
A tabela 4.5 mostra os resultados em função das escolhas dos parâmetros variáveisem cada caso, incluindo os cenários iniciais, A0 e B0.
TABELA 4.5: Resumo dos resultados dos casos.
Caso Escolha Wesp ηciclo [%]A0 - 1,243 41,88
A1ivap = 5 %Tvap = 1,5 Tre f
1,476 45,44
A2∆Tsh = 174,61 KT6 = 419,07 K
1,607 54,13
A31 aquecedor de contatoLinha 1: Psat = 173 kPa
1,626 54,76
A42 aquecedores de contatoLinha 1: Psat = 173 kPaLinha 2: Psat = 47 kPa
1,630 54,90
A5* ivap = 0 % 1,630 54,90A5** ivap = 5 % 1,766 53,93B0 - 1,509 50,84
B11 aquecedor de contatoLinha 1: Tsat = 370 K
1,546 52,06
*otimização de ηciclo**otimização de Wesp
49
Capítulo 5
Conclusão
O programa desenvolvido tem o intuito de ser uma ferramenta rápida e práticapara cálculos de ciclos relativamente simples. Ele se destina a estudantes de engenha-ria mecânica e, por isso, espera-se do usuário um conhecimento mínimo de termodi-nâmica. Dessa forma, ele conseguirá realizar inúmeras comparações, para diversosparâmetros de entrada e modificações, como demonstrado brevemente no capítulo 4.
Do estudo de casos apresentado, é possível obter algumas conclusões. Tomandocomo referência um ciclo Brayton simples, percebe-se que a injeção de vapor produzuma forte melhora nos resultados. Se o ciclo for combinado, entretanto, seu efeito po-derá ser benéfico apenas em relação à potência. Nesse caso, é mais interessante optarpela regeneração, dando preferância aos aquecedores de contato. Ademais, a influên-cia dos regeneradores cai conforme seu número aumenta. Se a temperatura da fontequente for suficientemente pequena, deve-se optar por um ciclo orgânico, pois, apesarde menos eficiente energeticamente, será o único viável em termos operacionais.
A simplicidade do programa confere a ele robustez e facilita seu uso. Todavia,para uma maior aproximação com os ciclos de potência da realidade, algumas funcio-nalidades seriam de grande valor. Assim, para trabalhos futuros, sugere-se adicionaralgumas opções ao usuário:
• perda de carga nos equipamentos;
• múltiplos estágios de compressão;
• reaquecimento.
50
Bibliografia
Agência Nacional de Energia Elétrica (2018). Editais de Geração. Acesso: 24/02/201814:50h. URL: http://www.aneel.gov.br/geracao4.
Bathie, W. (1996). Fundamentals of Gas Turbine. 2ª ed. John Wiley & Sons.Bell, Ian H. et al. (2014). «Pure and Pseudo-pure Fluid Thermophysical Property Eva-
luation and the Open-Source Thermophysical Property Library CoolProp». Em:Industrial & Engineering Chemistry Research 53.6, pp. 2498–2508. DOI: 10 . 1021 /ie4033999. eprint: http://pubs.acs.org/doi/pdf/10.1021/ie4033999. URL:http://pubs.acs.org/doi/abs/10.1021/ie4033999.
Bezerra, Renata Cardoso (2013). Análise e Otimização de um Ciclo Brayton com Injeção deVapor.
Borgnakke, C. e R.E. Sonntag (2013). Fundamentos da Termodinâmica. 8ª ed. Blucher.Brent, Richard P. (1972). Algorithms for Minimization without Derivatives (Automatic Com-
putation). Prentice Hall.Busch, Chris e Eric Gimon (2014). «Natural Gas versus Coal: Is Natural Gas Better
for the Climate?» Em: The Electricity Journal 27.7, pp. 97 –111. ISSN: 1040-6190.DOI: https://doi.org/10.1016/j.tej.2014.07.007. URL: http://www.sciencedirect.com/science/article/pii/S1040619014001687.
Clemente, Stefano et al. (2013). «Bottoming organic Rankine cycle for a small scale gasturbine: A comparison of different solutions». Em: Applied Energy 106, pp. 355 –364.ISSN: 0306-2619. DOI: https://doi.org/10.1016/j.apenergy.2013.02.004. URL:http://www.sciencedirect.com/science/article/pii/S0306261913001128.
Colaço, Marcelo J. (2017). «Turbinas». Notas de aula.De Paepe, Michel e Erik Dick (2000). «Cycle Improvements to steam injected gas tur-
bines». Em: 24, pp. 1081 –1107.El Hefni, Baligh (2014). «Dynamic Modeling of Concentrated Solar Power Plants with
the ThermoSysPro Library (Parabolic Trough Collectors, Fresnel Reflector and Solar-Hybrid)». Em: Energy Procedia 49. Proceedings of the SolarPACES 2013 Internati-onal Conference, pp. 1127 –1137. ISSN: 1876-6102. DOI: https://doi.org/10.1016/j.egypro.2014.03.122. URL: http://www.sciencedirect.com/science/article/pii/S1876610214005761.
El Hefni, Baligh, Daniel Bouskela e Grégory Lebreton (2011). Dynamic Modelling of aCombined Cycle Power Plant with ThermoSysPro. Eletricité de France. URL: https://www.modelica.org/events/modelica2011/Proceedings/pages/papers/15_2_ID_115_a_fv.pdf.
Harvey, A. H. (1998). «Thermodynamic Properties of Water: Tabulation from the IAPWSFormulation 1995 for the Thermodynamic Properties of Ordinary Water Substancefor General and Scientific Use». Em: NISTIR 5078. Acessado em 02/02/2018.
Jakobsen, Arne, Bjarne D. Rasmussen e Simon Engedal Andersen (1999). «CoolPack –Simulation tools for refrigeration system». Em: Scan Ref 28.4, pp. 7–10.
BIBLIOGRAFIA 51
Mies, Edoardo Giovanni Jasmin (2015). Otimização de Ciclo de Turbina a Vapor com TrêsExtrações.
Operador Nacional do Sistema Elétrico (2018). Carga e Geração. Acesso: 24/02/201814:24h. URL: http://www.ons.org.br/pt/paginas/energia-agora/carga-e-geracao.
Quoilin, Sylvain et al. (2014). «ThermoCycle: A Modelica library for the simulation ofthermodynamic systems». Em: Proceedings of the 10th International Modelica Confe-rence; March 10-12; 2014; Lund; Sweden. 96. Linköping University Electronic Press;Linköpings universitet, pp. 683–692.
Shah, Ramesh K. e Dušan P. Sekulic (2003). Fundamentals of Heat Exchanger Design. JohnWiley & Sons.
52
Apêndice A
Telas do programa
FIGURA A.1: Tela do ciclo Brayton.
Apêndice A. Telas do programa 53
FIGURA A.2: Tela do ciclo Rankine.
Apêndice A. Telas do programa 54
FIGURA A.3: Tela do relatório produzido pelo ciclo da figura A.2.
Apêndice A. Telas do programa 55
FIGURA A.4: Tela da 1a parte do ciclo combinado orgânico.
Apêndice A. Telas do programa 56
FIGURA A.5: Tela da 2a parte do ciclo combinado orgânico.
57
Apêndice B
Código do programa
B.1 AltClass.cs
Nesta seção são apresentados trechos do arquivo AltClass.cs, que contém a funçãode interpolação (Interp1) e a classe de aviso (Warning).
1 using Newtonsoft.Json;2 using System;3 using System.Collections.Generic;4 using System.Globalization;5 using System.IO;6 using System.Linq;7
8 namespace Cycles9 {
10 public static class AltClass11 {12 static public double Interp1(List<double> c1, List<double> c2,
double x)↪→
13 {14 int size = c1.Count;15 if (x < c1[0] || x > c1[size - 1]) throw new
ArgumentOutOfRangeException();↪→
16 int ind = 0;17 int sign1 = Math.Sign(c1[0]-x);18 int sign2;19 for (int i=1; i<size; ++i)20 {21 sign2 = Math.Sign(c1[i] - x);22 if (sign2 != sign1)23 {24 double ans = (c2[i] - c2[i - 1]) / (c1[i] - c1[i -
1]) * (x - c1[i - 1]) + c2[i - 1];↪→
25 return ans;26 }27 }28 ind = size - 1;
Apêndice B. Código do programa 58
29 double y = (c2[ind] - c2[ind - 1]) / (c1[ind] - c1[ind - 1])* (x - c1[ind - 1]) + c2[ind - 1];↪→
30 return y;31 }32
33 public class Warning34 {35 public int Indice { get; set; }36 public string ShortMsg { get; set; }37 public string FullMsg { get; set; }38
39 public Warning(int indice, string shortMsg, string fullMsg)40 {41 Indice = indice;42 ShortMsg = shortMsg;43 FullMsg = fullMsg;44 }45 }46 }
B.2 GasIdeal.cs
Nesta seção são apresentados trechos do arquivo GasIdeal.cs, que contém as fun-ções relativas aos gases ideais.
1 using System;2 using System.Collections.Generic;3 using System.IO;4 using MathNet.Numerics.LinearAlgebra;5 using Newtonsoft.Json;6
7 namespace Cycles8 {9 class GasIdeal
10 {11 public const double MAr = 28.965; // kg/kmol12 public const double MH2O = 18.015;13 public const double MN2 = 28.013;14 public const double MO2 = 31.999;15 public const double MCO2 = 44.01;16 public const double R_mol = 8.31451; // kJ/kmol K17 public const double Cp0Ar = 1.004; // [kJ/kg K] @(25°C,100 kPa)18
19 public List<List<double>> Ar { get; set; }20 public List<List<double>> CO2 { get;set; }21 public List<List<double>> H2O { get; set; }
Apêndice B. Código do programa 59
22 public List<List<double>> N2 { get; set; }23 public List<List<double>> O2 { get; set; }24
25 public static GasIdeal Load(string path)26 {27 string conv = File.ReadAllText(path);28 return JsonConvert.DeserializeObject<GasIdeal>(conv);29 }30
31 public double PrAr(double T)32 {33 double y = AltClass.Interp1(Ar[0], Ar[4], T);34 return y;35 }36 public double h_PrAr(double Pr)37 {38 double y = AltClass.Interp1(Ar[4], Ar[2], Pr);39 return y;40 }41 public double T_hAr(double h)42 {43 double y = AltClass.Interp1(Ar[2], Ar[0], h);44 return y;45 }46 public double hAr(double T)47 {48 double y = AltClass.Interp1(Ar[0], Ar[2], T);49 return y;50 }51 public double sAr(double T)52 {53 double y = AltClass.Interp1(Ar[0], Ar[3], T);54 return y;55 }56 public double hH2O(double T)57 {58 double y = AltClass.Interp1(H2O[0], H2O[2], T);59 return y;60 }61 public double sH2O(double T)62 {63 double y = AltClass.Interp1(H2O[0], H2O[3], T);64 return y;65 }66 public double hN2(double T)67 {
Apêndice B. Código do programa 60
68 double y = AltClass.Interp1(N2[0], N2[2], T);69 return y;70 }71 public double sN2(double T)72 {73 double y = AltClass.Interp1(N2[0], N2[3], T);74 return y;75 }76 public double hCO2(double T)77 {78 double y = AltClass.Interp1(CO2[0], CO2[2], T);79 return y;80 }81 public double sCO2(double T)82 {83 double y = AltClass.Interp1(CO2[0], CO2[3], T);84 return y;85 }86 public double hO2(double T)87 {88 double y = AltClass.Interp1(O2[0], O2[2], T);89 return y;90 }91 public double sO2(double T)92 {93 double y = AltClass.Interp1(O2[0], O2[3], T);94 return y;95 }96 public double hMistura(double[] y, double T)97 {98 double[] hMix = { hCO2(T), hH2O(T), MAr * hAr(T), hN2(T) };99 var yVec = Vector<double>.Build.DenseOfArray(y);
100 var MixVec = Vector<double>.Build.DenseOfArray(hMix);101 double ans = yVec.DotProduct(MixVec);102 return ans;103 }104 public double sMistura(double[] y, double T)105 {106 double[] sMix = { sCO2(T), sH2O(T), MAr * sAr(T), sN2(T) };107 var yVec = Vector<double>.Build.DenseOfArray(y);108 var MixVec = Vector<double>.Build.DenseOfArray(sMix);109 double ans = yVec.DotProduct(MixVec);110 return ans;111 }112 public double ThMistura(double[] y, double h, double Tminus,
double Tplus)↪→
Apêndice B. Código do programa 61
113 {114 double fun(double T)115 {116 double hMix = hMistura(y, T) - h;117 return hMix;118 }119
120 Root.FunctionOfOneVariable dlg;121 dlg = new Root.FunctionOfOneVariable(fun);122 double ans = Root.RootFinding.Brent(fun, Tminus,Tplus);123 return ans;124 }125 public double TsMistura(double[] y, double s, double Tminus,
double Tplus)↪→
126 {127 double fun(double T)128 {129 double hMix = sMistura(y, T) - s;130 return hMix;131 }132
133 Root.FunctionOfOneVariable dlg;134 dlg = new Root.FunctionOfOneVariable(fun);135 double ans = Root.RootFinding.Brent(fun, Tminus, Tplus);136 return ans;137 }138 }139 }
B.3 Water.cs
Nesta seção são apresentados trechos do arquivo Water.cs, que contém as funçõesrelativas à água.
1 using Newtonsoft.Json;2 using System;3 using System.Collections.Generic;4 using System.IO;5 using System.Linq;6
7 namespace Cycles8 {9 class Water
10 {11 public List<double> PValues { get; set; }12 public List<List<List<double>>> Tabelas { get; set; }
Apêndice B. Código do programa 62
13 public List<List<double>> SatP { get; set; }14 public List<List<double>> SatT { get; set; }15
16 public static Water Load(string path)17 {18 string conv = File.ReadAllText(path);19 return JsonConvert.DeserializeObject<Water>(conv);20 }21
22 public double hsat_sp(double s, double p)23 {24 double ans;25 double sl = AltClass.Interp1(SatP[0], SatP[7], p);26 double sv = AltClass.Interp1(SatP[0], SatP[8], p);27 if (s>=sl && s <= sv)28 {29 double hlv = AltClass.Interp1(SatP[0], SatP[6], p);30 double hl = AltClass.Interp1(SatP[0], SatP[4], p);31 double x = (s-sl) / (sv-sl);32 ans = x * hlv + hl;33 }34 else35 {36 ans = h_sp(s,p);37 }38 return ans;39 }40 public double hsat_xt(double x, double t)41 {42 if (x < 0.0 || x > 1.0) throw new
ArgumentOutOfRangeException();↪→
43 double hlv = AltClass.Interp1(SatT[0], SatT[6], t);44 double hl = AltClass.Interp1(SatT[0], SatT[4], t);45 double ans = x * hlv + hl;46 return ans;47 }48 public double hsat_xp(double x, double p)49 {50 if (x < 0.0 || x > 1.0) throw new
ArgumentOutOfRangeException();↪→
51 double hlv = AltClass.Interp1(SatP[0], SatP[6], p);52 double hl = AltClass.Interp1(SatP[0], SatP[4], p);53 double ans = x * hlv + hl;54 return ans;55 }56 public double ssat_xt(double x, double t)
Apêndice B. Código do programa 63
57 {58 if (x < 0.0 || x > 1.0) throw new
ArgumentOutOfRangeException();↪→
59 double slv = AltClass.Interp1(SatT[0], SatT[9], t);60 double sl = AltClass.Interp1(SatT[0], SatT[7], t);61 double ans = x * slv + sl;62 return ans;63 }64 public double[] hs_pliqsat(double p)65 {66 double[] ans = { 0.0, 0.0 };67 ans[0] = AltClass.Interp1(SatP[0], SatP[4], p);68 ans[1] = AltClass.Interp1(SatP[0], SatP[7], p);69 return ans;70 }71 public double Tsat_p(double p)72 {73 double ans = AltClass.Interp1(SatP[0], SatP[1], p);74 return ans;75 }76 public bool IsSat(double h, double p)77 {78 double hl = hsat_xp(0.0, p);79 double hv = hsat_xp(1.0, p);80 if ((h>=hl) && (h<=hv))81 {82 return true;83 }84 else85 {86 return false;87 }88 }89 public double XSat(double h, double p)90 {91 double hl = hsat_xp(0.0, p);92 double hv = hsat_xp(1.0, p);93 double x = (h - hl) / (hv - hl);94 return x;95 }96 public double h_spGen(double s, double p)97 {98 double ans;99 double sl = AltClass.Interp1(SatP[0], SatP[7], p);
100 double sv = AltClass.Interp1(SatP[0], SatP[8], p);101 if (s <= sv || s >= sl)
Apêndice B. Código do programa 64
102 {103 ans = hsat_sp(s, p);104 }105 else106 {107 ans = h_sp(s, p);108 }109 return ans;110 }111 public double h_sp(double s, double p)112 {113 double ans;114 int size = PValues.Count;115 int i = 0;116 for (int j = 1; j < size; ++j)117 {118 //if (PValues[i] == p)119 //{120 // ans = AltClass.Interp1(Tabelas[i][3],
Tabelas[i][2], s);↪→
121 // break;122 //}123 if (PValues[j] >= p)124 {125 i = j;126 break;127 }128
129 }130 double h1 = AltClass.Interp1(Tabelas[i][3], Tabelas[i][2],
s);↪→
131 double h0 = AltClass.Interp1(Tabelas[i - 1][3], Tabelas[i -1][2], s);↪→
132 double p1 = PValues[i];133 double p0 = PValues[i - 1];134 ans = (h1 - h0) * (p - p0) / (p1 - p0) + h0;135 return ans;136 }137 public double h_Tp(double T, double p)138 {139 if (p < PValues.First() || p > PValues.Last())140 {141 throw new ArgumentOutOfRangeException();142 }143 if (Math.Abs(T-Tsat_p(p)) < 0.001)144 {
Apêndice B. Código do programa 65
145 throw new Exception();146 }147 double ans;148 int size = PValues.Count;149 int i = 0;150 for (int j = 1; j < size; ++j)151 {152 if (PValues[j] >= p)153 {154 i = j;155 break;156 }157
158 }159 double h1, h0;160 double p1 = PValues[i];161 double p0 = PValues[i - 1];162 if (T > Tsat_p(p))163 {164 h0 = AltClass.Interp1(Tabelas[i - 1][0], Tabelas[i -
1][2], T);↪→
165 if (T <= Tsat_p(p1))166 {167 h1 = hsat_xt(1.0, T);168 p1 = AltClass.Interp1(SatT[0], SatT[1], T);169 }170 else171 {172 h1 = AltClass.Interp1(Tabelas[i][0], Tabelas[i][2],
T);↪→
173 }174 }175 else176 {177 h1 = AltClass.Interp1(Tabelas[i][0], Tabelas[i][2], T);178 if (T >= Tsat_p(p0))179 {180 h0 = hsat_xt(1.0, T);181 p0 = AltClass.Interp1(SatT[0], SatT[1], T);182 }183 else184 {185 h0 = AltClass.Interp1(Tabelas[i - 1][0], Tabelas[i -
1][2], T);↪→
186 }187 }
Apêndice B. Código do programa 66
188 ans = (h1 - h0) * (p - p0) / (p1 - p0) + h0;189 return ans;190 }191 public double s_Tp(double T, double p)192 {193 if (p < PValues.First() || p > PValues.Last())194 {195 throw new ArgumentOutOfRangeException();196 }197 if (Math.Abs(T - Tsat_p(p)) < 0.001)198 {199 throw new Exception();200 }201 double ans;202 int size = PValues.Count;203 int i = 0;204 for (int j = 1; j < size; ++j)205 {206 if (PValues[j] >= p)207 {208 i = j;209 break;210 }211
212 }213 double s1, s0;214 double p1 = PValues[i];215 double p0 = PValues[i - 1];216 if (T > Tsat_p(p))217 {218 s0 = AltClass.Interp1(Tabelas[i - 1][0], Tabelas[i -
1][3], T);↪→
219 if (T <= Tsat_p(p1))220 {221 s1 = ssat_xt(1.0, T);222 p1 = AltClass.Interp1(SatT[0], SatT[1], T);223 }224 else225 {226 s1 = AltClass.Interp1(Tabelas[i][0], Tabelas[i][3],
T);↪→
227 }228 }229 else230 {231 s1 = AltClass.Interp1(Tabelas[i][0], Tabelas[i][3], T);
Apêndice B. Código do programa 67
232 if (T >= Tsat_p(p0))233 {234 s0 = ssat_xt(1.0, T);235 p0 = AltClass.Interp1(SatT[0], SatT[1], T);236 }237 else238 {239 s0 = AltClass.Interp1(Tabelas[i - 1][0], Tabelas[i -
1][3], T);↪→
240 }241 }242 ans = (s1 - s0) * (p - p0) / (p1 - p0) + s0;243 return ans;244 }245 public double T_hp(double h, double p)246 {247 if (p < PValues.First() || p > PValues.Last())248 {249 throw new ArgumentOutOfRangeException();250 }251 double ans;252 int size = PValues.Count;253 int i = 0;254 for (int j = 1; j < size; ++j)255 {256 if (PValues[j] >= p)257 {258 i = j;259 break;260 }261
262 }263 double T1 = AltClass.Interp1(Tabelas[i][2], Tabelas[i][0],
h);↪→
264 double T0 = AltClass.Interp1(Tabelas[i - 1][2], Tabelas[i -1][0], h);↪→
265 double p1 = PValues[i];266 double p0 = PValues[i - 1];267 ans = (T1 - T0) * (p - p0) / (p1 - p0) + T0;268 return ans;269 }270 public double TurbVap0( double T0,271 double P0,272 double Pminus,273 double Pplus,274 double eta,
Apêndice B. Código do programa 68
275 double x_turb)276 {277 double ans;278 double h0 = h_Tp(T0, P0);279 double s0 = s_Tp(T0, P0);280 Root.FunctionOfOneVariable dlg;281 dlg = new Root.FunctionOfOneVariable(fun);282 double fun(double p)283 {284 double local = x_tv(p, eta, h0, s0) - x_turb;285 return local;286 }287 ans = Root.RootFinding.Brent(fun, Pminus, Pplus);288 return ans;289 }290 public double TurbVap(double h0,291 double s0,292 double Pminus,293 double Pplus,294 double eta,295 double x_turb)296 {297 double ans;298 Root.FunctionOfOneVariable dlg;299 dlg = new Root.FunctionOfOneVariable(fun);300 double fun(double p)301 {302 double local = x_tv(p, eta, h0, s0) - x_turb;303 return local;304 }305 ans = Root.RootFinding.Brent(fun, Pminus, Pplus);306 return ans;307 }308 private double x_tv(double P, double eta, double h0, double s0)309 {310 double ans;311 double hv = AltClass.Interp1(SatP[0], SatP[5], P);312 double hi = hsat_sp(s0, P);313 double h2 = (hi - h0) * eta + h0;314 if (h2 > hv) ans = 1.0;315 else316 {317 double hl = AltClass.Interp1(SatP[0], SatP[4], P);318 ans = (h2 - hl) / (hv - hl);319 }320 return ans;
Apêndice B. Código do programa 69
321 }322 }323 }
B.4 Brayton.cs
Nesta seção são apresentados trechos do arquivo Brayton.cs, que contém os cálcu-los do ciclo Brayton.
1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.IO;5
6 namespace Cycles7 {8 public enum Comb9 {
10 metano,11 octano,12 etanol,13 }14
15 [Serializable()]16 public class ErrorException : Exception17 {18 public ErrorException(string msg) : base(msg)19 {20 }21 }22
23 public class Brayton : INotifyPropertyChanged24 {25 public event PropertyChangedEventHandler PropertyChanged;26
27 // T(K) ; P(kPa) ; h(kJ/kg) ; s(kJ/kg K)28
29 double a, b, c, d, e, e0; // coeficientes estequiométricos nocombustor↪→
30 double t3, Mcomb, hcomb, PCI;31 double hvap; // entalpia do vapor injetado no combustor32 double q_vap; // calor requerido pelo vapor no HRSG33 public double Qh { get; private set; } // calor gerado no
combustor↪→
34 double wc; // kJ/kg (potência do compressor)35 double wb = 0; // kJ/kg (potência da bomba)
Apêndice B. Código do programa 70
36 double wtp; // kJ/kg (potência da 2ª turbina)37 double eta_c, eta_t, eta_tp;38 public List<Warning> WarnList { get; private set; } // lista de
avisos↪→
39
40 public double Tb_out { get; private set; } // temp. daágua na saída da bomba↪→
41 public double T2 { get; private set; } // temp. do ar na entradado combustor↪→
42 public double P3 { get; private set; } // pressão na saída docombustor↪→
43 public double T4 { get; private set; } // temp. na saída daprimeira turbina↪→
44 public double P4 { get; private set; } // pressão na saída daprimeira turbina↪→
45 public double T5 { get; private set; } // temp. na saída daturbina de potência↪→
46 public double P6 { get; private set; } // temp. de descarte dosgases de exaustão no ambiente↪→
47 double[] vazoes = new double[6]; // vazão nos pontos do ciclo48
49 public double FA { get; private set; } // razão combustível-arem base mássica↪→
50 public double FAst { get; private set; } // razão combustível-arestequiométrica em base mássica↪→
51 public double Wliq { get; private set; } // [kW] potêncialíquida do ciclo↪→
52 public double Wesp { get; private set; } // potência específicado ciclo↪→
53 public double Rend { get; private set; } // eficiência de 1ª leido ciclo↪→
54 public double Quti { get; private set; } // [kW] taxa de calorno RHSG (p/ ciclo combinado)↪→
55
56 // Dados fornecidos pelo usuário57
58 public double Pct_vapor { get; set; } // procentagem de vapor emrelação à vazão mássica↪→
59 public double Tvap { get; set; } // temp. do vapor injetado nocombustor↪→
60 public double Pvap {get; set;} // pressão do vapor injetado nocombustor↪→
61
62 public double Txm { get; set; } // kg/s (vazão mássica de ar queentra no compressor)↪→
63 public double T1 { get; set; } // temp. do ar na entrada docompressor↪→
Apêndice B. Código do programa 71
64 public double P1 { get; set; } // pressão do ar na entrada docompressor↪→
65 public double P2 { get; set; } // pressão do ar na entrada docombustor↪→
66 public double T3 // temp. na saída do combustor67 {68 get { return t3; }69 set70 {71 if (value > 2500.0 || value < 298.15)72 {73 throw new ErrorException("The value of 'T3' is out
of range.");↪→
74 }75 else76 {77 t3 = value;78 }79 }80 }81 public double P5 { get; set; } // pressão de saída da turbina de
potência↪→
82 public double T6 { get; set; } // temp. de descarte dos gases deexaustão no ambiente↪→
83 //public double Rc { get; set; } // razão de compressão84 public double Eta_c // eficiência do compressor85 {86 get { return eta_c; }87 set88 {89 if (value > 0.0)90 {91 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
92 eta_c = value / 100.0;93 }94 else95 {96 throw new ErrorException("Efficiencies must be above
0 %.");↪→
97 }98 }99 }
100 public double Eta_t //eficiência da turbina de alimentação101 {
Apêndice B. Código do programa 72
102 get { return eta_t; }103 set104 {105 if (value > 0.0)106 {107 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
108 eta_t = value / 100.0;109 }110 else111 {112 throw new ErrorException("Efficiencies must be above
0 %.");↪→
113 }114 }115 }116 public double Eta_tp // eficiência da turbina de potência117 {118 get119 {120 return eta_tp;121 }122 set123 {124 if (value > 0.0)125 {126 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
127 eta_tp = value / 100.0;128 }129 else130 {131 throw new ErrorException("Efficiencies must be above
0 %.");↪→
132 }133 }134 }135 public bool IsCombined { get; set; } // o ciclo Brayton alimenta
um Rankine?↪→
136
137 public Brayton()138 {139 this.Pct_vapor = 0.0;140 }
Apêndice B. Código do programa 73
141
142 public void SetComb(Comb comb)143 {144 switch (comb)145 {146 case Comb.metano:147 this.b = 2.0; this.d = 1.0; this.e0 = 2.0;148 this.hcomb = -74873.0;149 this.Mcomb = 16.043;150 this.PCI = 50010.0;151 break;152 case Comb.octano:153 this.b = 12.5; this.d = 8.0; this.e0 = 9.0;154 this.hcomb = -250105.0;155 this.Mcomb = 114.232;156 this.PCI = 44425.0;157 break;158 case Comb.etanol:159 this.b = 3.0; this.d = 2.0; this.e0 = 3.0;160 this.hcomb = -277380.0;161 this.Mcomb = 46.069;162 this.PCI = 26811.0;163 break;164 }165 }166
167 private void SetVapor()168 {169 string path = Directory.GetCurrentDirectory() +
"//Water.json";↪→
170 Water wt = Water.Load(path);171 double Tsat = wt.Tsat_p(Pvap);172 if (Tvap < Tsat)173 {174 string msg = String.Format("Superheated steam is
recommended. 'Tvap' must be above {0} K.", Tsat);↪→
175 throw new ErrorException(msg);176 }177 double hvap0 = wt.h_Tp(Tvap, Pvap);178 hvap = hvap0 * GasIdeal.MH2O - 285830.0;179
180 // Bomba181 if (!IsCombined)182 {183 double h_0 = wt.h_Tp(298, 101.3);184 double s = wt.s_Tp(298, 101.3);
Apêndice B. Código do programa 74
185 double h_1 = wt.h_sp(s, Pvap);186 Tb_out = wt.T_hp(h_1, Pvap);187 q_vap = hvap0 - h_1;188 wb = h_1 - h_0;189 }190 }191
192 private void CheckVapor(double T, double P)193 {194 string path = Directory.GetCurrentDirectory() +
"//Water.json";↪→
195 Water wt = Water.Load(path);196 double Tov = wt.Tsat_p(P);197 if (T <= Tov)198 {199 var cultura =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US");↪→
200 throw new ErrorException(String.Format(cultura, "'T6'must be above the dew point ({0:f2} K)", Tov));↪→
201 }202 else if (T < Tov + 30.0)203 {204 string f = (IsCombined)? "Ta" : "Tvap";205 WarnList.Add(new Warning(1, "'T6' is too low", $"There
might be condensation at point '6'. We recommendlowering '{f}'." ));
↪→
↪→
206 }207 }208
209 public void Calcular()210 {211 // Carregar as propriedades de gases ideais212 string path = Directory.GetCurrentDirectory() +
"//GasIdeal.json";↪→
213 GasIdeal gi = GasIdeal.Load(path);214
215 WarnList = new List<Warning>(); // limpa a lista de avisos216
217 // Compressor218 double Pr1 = gi.PrAr(T1);219 double Pr2 = (P2 / P1) * Pr1;220 double h2i = gi.h_PrAr(Pr2);221 double h1 = gi.hAr(T1);222 wc = (h2i - h1) / eta_c;223 double h2 = wc + h1;224 T2 = gi.T_hAr(h2);
Apêndice B. Código do programa 75
225
226 // Combustor227 double c0;228 double c1;229 double pro = d * gi.hCO2(T3) + e0 * gi.hH2O(T3) + 3.76 * b *
gi.hN2(T3);↪→
230 double rea = b * gi.hO2(T2) + 3.76 * b * gi.hN2(T2) + hcomb;231 double dif_ar = (gi.hAr(T2) - gi.hAr(T3)) * GasIdeal.MAr;232 double dif_vap;233 if (Pct_vapor == 0.0)234 {235 c0 = 0.0;236 c1 = 0.0;237 dif_vap = -gi.hH2O(T3);238 }239 else240 {241 SetVapor();242 if (Pvap < P2) WarnList.Add(new Warning(0, "Psteam <
P2", "'Psteam' should be higher than 'P2'."));↪→
243 c0 = Pct_vapor * b * (GasIdeal.MO2 + 3.76 *GasIdeal.MN2) / GasIdeal.MH2O;↪→
244 c1 = Pct_vapor * GasIdeal.MAr / GasIdeal.MH2O;245 dif_vap = hvap - gi.hH2O(T3);246 }247 a = (pro - rea - c0 * dif_vap) / (dif_ar + c1 * dif_vap);248 c = c0 + c1 * a; // kmol vapor/ kmol comb249 e = c + e0;250 FA = Mcomb / (a * GasIdeal.MAr + b * (GasIdeal.MO2 + 3.76 *
GasIdeal.MN2));↪→
251 FAst = Mcomb / (b * (GasIdeal.MO2 + 3.76 * GasIdeal.MN2));252 double nr = d + e + a + 3.76 * b;253 double[] nmix = { d, e, a, 3.76 * b };254 // frações molares dos componentes da mistura255 double[] ymix = { d / nr, e / nr, a / nr, 3.76 * b / nr };256 double h3_mol = gi.hMistura(nmix, T3); // kJ/kmol comb257 double s3_mol = gi.sMistura(ymix, T3); // kJ/K kmol mistura258 P3 = P2;259 Qh = Txm * FA * PCI;260
261 // Turbina a gás (alimenta o compressor)262 double fator1 = Mcomb / FA; // base kg ar -> base kmol comb263 double wt_mol = wc * fator1; // kJ/kmol comb264 double h4_mol = h3_mol - wt_mol;265 T4 = (wt_mol == 0.0)? T3 : gi.ThMistura(nmix, h4_mol,
298.15, T3);↪→
Apêndice B. Código do programa 76
266 double s4_mol = gi.sMistura(ymix, T4);267 double wti_mol = wt_mol / eta_t;268 double h4i_mol = h3_mol - wti_mol;269 double T4i = gi.ThMistura(nmix, h4i_mol, 298.15, T4 + 1.0);270 double s4i_mol = gi.sMistura(ymix, T4i);271 P4 = P3 * Math.Exp((s4i_mol - s3_mol) / GasIdeal.R_mol);272
273
274 // Turbina de potência275 double s5i_mol = s4_mol + GasIdeal.R_mol * Math.Log(P5 /
P4);↪→
276 double T5i = gi.TsMistura(ymix, s5i_mol, 298.15, T4 + 1.0);277 double h5i_mol = gi.hMistura(nmix, T5i);278 double wtpi_mol = h4_mol - h5i_mol;279 double wtp_mol = wtpi_mol * eta_tp; // kJ/kmol comb280 wtp = wtp_mol / fator1; // kJ/kg ar281 Wliq = Txm * wtp;282 if (!IsCombined) Wliq -= Txm * wb * Pct_vapor;283 double h5_mol = h4_mol - wtp_mol;284 double h5 = h5_mol / fator1; // kJ/kg ar285 T5 = gi.ThMistura(nmix, h5_mol, T5i - 1.0, T4 + 1.0);286
287 if ((Pct_vapor != 0) && (!IsCombined))288 {289 if (Tvap >= T5)290 {291 throw new ErrorException("'Tvap' is too high. It
must be below 'T5'.");↪→
292 }293 else if (Tvap > T5 - 30.0)294 {295 WarnList.Add(new Warning(3, "'Tvap' is too high",
"'Tvap' is too close to 'T5'."));↪→
296 }297
298 }299
300 double m3 = Txm * (1 + FA + Pct_vapor);301 vazoes = new double[] { Txm, Txm, m3, m3, m3, m3 };302
303 Wesp = Wliq / (Txm * GasIdeal.Cp0Ar * T1);304 Rend = Wliq / Qh;305 double h6 = 0.0;306 P6 = P5;307 if (IsCombined)308 {
Apêndice B. Código do programa 77
309 h6 = gi.hMistura(nmix, T6) / fator1;310 Quti = Txm * (h5 - h6);311 P6 = P5;312 }313 else if (Pct_vapor != 0.0)314 {315 h6 = h5 - Pct_vapor * q_vap;316 T6 = gi.ThMistura(nmix, h6 * fator1, 298.15, T5 + 1.0);317 if (Tb_out >= T6)318 {319 throw new ErrorException("An error has occurred at
the HRSG. 'T6' is too low.");↪→
320 }321 }322 if (Pct_vapor != 0.0) CheckVapor(T6, ymix[1] * P5);323 OnPropertyChanged("Rend");324 }325
326 protected void OnPropertyChanged(string name)327 {328 PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(name));↪→
329 }330 }331 }
B.5 Rankine.cs
Nesta seção são apresentados trechos do arquivo Rankine.cs, que contém os cálcu-los do ciclo Rankine.
1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.IO;5 using System.Linq;6
7 namespace Cycles8 {9 public class Rankine : INotifyPropertyChanged
10 {11 public event PropertyChangedEventHandler PropertyChanged;12 public event PropertyChangedEventHandler Property2Changed;13
14 // T[K] ; P[kPa] ; h[kJ/kg] ; s[kJ/kg K]15
Apêndice B. Código do programa 78
16 private double pa, eta_b, eta_tv, x_tv, rHef;17 private List<double> prelist;18 private Water wt; // propriedades da água19
20 public List<Warning> WarnList { get; private set; } // lista deavisos↪→
21 public bool HasRH { get; set; } // Há aquecedor(es)?22 public bool IsContact { get; set; } // tipo de aquecedor -
Contato(default) ou Superfície↪→
23 public int QtRHs { get; set; } // quantidade de aquecedores (até10)↪→
24 public double RHef // efetividade do(s) aquecedor(es)25 {26 get { return RHef; }27 set28 {29 if (value > 0.0)30 {31 if (value > 100.0) throw new
ErrorException("Effectiveness must not be above100 %.");
↪→
↪→
32 rHef = value / 100.0;33 }34 else35 {36 throw new ErrorException("Effectiveness must be
above 0 %.");↪→
37 }38 }39 }40 public double RHap { get; set; } // approach do(s) aquecedor(es)41 public bool IsApp { get; set; } // define o método de cálculo da
ineficiência do(s) aquecedor(es)↪→
42
43 public List<double> Pext { get; set; } // pressões nas linhas deextração da turbina a vapor↪→
44 public bool IsCombined { get; set; } // o ciclo Rankine éalimentado por um Brayton?↪→
45 public bool IsPb { get; set; } // a pressão no condensador édefinida?↪→
46
47 public double Txm { get; set; } // kg/s (vazão mássica de águana saída do condensador)↪→
48 public double[] Yn { get; private set; } // kg/s (vazão mássicaem cada linha de extração)↪→
49 double[] vazoes = new double[4]; // kg/s (vazão nos pontosprincipais do ciclo)↪→
Apêndice B. Código do programa 79
50 public double Txvap { get; set; } // kg/s (vazão mássica devapor destinada ao ciclo Brayton)↪→
51 public double Ta { get; set; } // temp. na entrada da turbina52 public double Pa // pressão na entrada da turbina = pressão de
evaporação↪→
53 {54 get { return pa; }55 set56 {57 if (value > 22064.0 || value < 0.612)58 {59 Tev = -1.0;60 OnProperty2Changed("Tev");61 throw new ErrorException("The value of 'Pev' is out
of range.");↪→
62 }63 else64 {65 pa = value;66 Tev = wt.Tsat_p(value);67 OnProperty2Changed("Tev");68 }69 }70 }71 public double Tev { get; private set; } // temp. de evaporação72 public double Tsh { get; set; } // acréscimo de temp.
(superaquecimento)↪→
73 public double Pb { get; set; } // pressão na entrada docondensador↪→
74 public double Eta_b // eficiência da(s) bomba(s)75 {76 get { return eta_b; }77 set78 {79 if (value > 0.0)80 {81 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
82 eta_b = value / 100.0;83 }84 else85 {86 throw new ErrorException("Efficiencies must be above
0 %.");↪→
87 }
Apêndice B. Código do programa 80
88 }89 }90 public double Eta_tv // eficiência da turbina91 {92 get { return eta_tv; }93 set94 {95 if (value > 0.0)96 {97 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
98 eta_tv = value / 100.0;99 }
100 else101 {102 throw new ErrorException("Efficiencies must be above
0 %.");↪→
103 }104 }105 }106 public double X_tv // título mínimo na turbina107 {108 get { return x_tv; }109 set110 {111 if (value > 0.0)112 {113 if (value > 1.0) throw new ErrorException("Vapour
quality must not be above 1.0.");↪→
114 x_tv = value;115 }116 else117 {118 throw new ErrorException("Vapour quality must be
above 0.");↪→
119 }120 }121 }122 public double Wtv { get; private set; } // kW123 public double Wb { get; private set; } // kW124 public double Qh { get; set; } // kW calor fornecido pelo ciclo
Brayton (ciclo combinado)↪→
125
126 public double Tb { get; private set; } // temp. na entrada docondensador↪→
Apêndice B. Código do programa 81
127 public double Tc { get; private set; } // temp. na saída docondensador↪→
128 public double Pc { get; private set; } // pressão na saída docondensador↪→
129 public double Td { get; private set; } // temp. na entrada doevaporador↪→
130 public double Pd { get; private set; } // pressão na entrada doevaporador↪→
131 double[] xs = { -1.0, -1.0, 0.0, -1.0 }; // títulos nos pontos132
133 public double Wliq { get; private set; } // [kW] potêncialíquida do ciclo↪→
134 public double Rend { get; private set; } // eficiência de 1ª leido ciclo↪→
135
136 public Rankine()137 {138 this.wt = Water.Load(Directory.GetCurrentDirectory() +
"\\Water.json");↪→
139 this.HasRH = false;140 this.IsContact = true;141 this.IsApp = true;142 this.QtRHs = 0;143 this.RHap = 0.0;144 this.RHef = 100.0;145 this.IsPb = false;146 this.x_tv = 0.0;147 }148
149 public void CalcGen()150 {151 WarnList = new List<Warning>();152 if (QtRHs == 0)153 {154 CalcWater();155 }156 else157 {158 CheckList(prelist);159 if (IsContact)160 {161 CalcWaterContact();162 }163 else164 {165 CalcWaterSurf();
Apêndice B. Código do programa 82
166 }167 }168 }169
170 public double FindPb()171 {172 double ans = wt.TurbVap(Ta, Pa, 0.7, Pa, eta_tv, x_tv);173 return ans;174 }175
176 private void CheckList(List<double> lista)177 {178 for (int i = 0; i < lista.Count; i++)179 {180 if (lista[i] >= Pa) throw new Exception();181 if (i > 0)182 {183 if (lista[i] >= lista[i - 1]) throw new Exception();184 }185 }186 Pext = new List<double>(lista);187 Pext.Insert(0, Pa);188 }189
190 public void SetLista(List<double> list)191 {192 prelist = new List<double>(list);193 }194
195 public void CalcWater()196 {197 // turbina a vapor198 double ha, sa;199 Ta = Tev + Tsh;200 if (Tsh == 0)201 {202 ha = wt.hsat_xp(1.0, Pa);203 sa = AltClass.Interp1(wt.SatP[0], wt.SatP[8], Pa);204 xs[0] = 1.0;205 }206 else207 {208 ha = wt.h_Tp(Ta, Pa);209 sa = wt.s_Tp(Ta, Pa);210 xs[0] = -1.0;211 }
Apêndice B. Código do programa 83
212 double wtv; // kJ/kg água213 if (IsPb)214 {215 double hbi = wt.h_spGen(sa, Pb);216 double hb = (hbi - ha) * eta_tv + ha;217 wtv = ha - hb;218 if (wt.IsSat(hb, Pb))219 {220 Tb = wt.Tsat_p(Pb);221 xs[1] = wt.XSat(hb, Pb);222 x_tv = xs[1];223 }224 else225 {226 Tb = wt.T_hp(hb, Pb);227 xs[1] = -1.0;228 x_tv = xs[1];229 }230 }231 else232 {233 Pb = wt.TurbVap(ha, sa, 0.7, Pa, eta_tv,
x_tv);↪→
234 Tb = wt.Tsat_p(Pb);235 xs[1] = x_tv;236 wtv = (ha - wt.hsat_xp(x_tv, Pb));237 }238
239 // condensador240 Pc = Pb;241 double[] hs_c = wt.hs_pliqsat(Pc);242 Tc = wt.Tsat_p(Pc);243
244 // bomba245 double hdi = wt.h_spGen(hs_c[1], Pa);246 double hd = (hdi - hs_c[0]) / eta_b + hs_c[0];247 Pd = Pa;248 double hdsat = wt.hsat_xp(0.0, Pd);249 if (hd < hdsat)250 {251 Td = wt.T_hp(hd, Pd);252 xs[3] = -1.0;253 }254 else if (hd == hdsat)255 {256 Td = wt.Tsat_p(Pd);
Apêndice B. Código do programa 84
257 xs[3] = 0.0;258 }259 else260 {261 throw new Exception();262 }263 double wb = hd - hs_c[0];264
265 // Evaporador266 if (IsCombined)267 {268 Txm = Qh / (ha - hd);269 }270 else271 {272 Qh = Txm * (ha - hd);273 }274
275 vazoes = new double[] { (Txm - Txvap), (Txm - Txvap), Txm,Txm };↪→
276 Wtv = (Txm - Txvap) * wtv;277 Wb = Txm * wb;278 Wliq = Wtv - Wb;279 Rend = Wliq / Qh;280 CheckWarning();281 OnPropertyChanged("Rend");282 }283
284 public void CalcWaterContact()285 {286 double ha, sa;287 Ta = Tev + Tsh;288 if (Tsh == 0.0)289 {290 ha = wt.hsat_xp(1.0, Pa);291 sa = AltClass.Interp1(wt.SatP[0], wt.SatP[8], Pa);292 xs[0] = 1.0;293 }294 else295 {296 ha = wt.h_Tp(Ta, Pa);297 sa = wt.s_Tp(Ta, Pa);298 xs[0] = -1.0;299 }300
301 // saída da turbina
Apêndice B. Código do programa 85
302 double hb; // kJ/kg água303
304 if (IsPb)305 {306 double hbi = wt.h_spGen(sa, Pb);307 hb = (hbi - ha) * eta_tv + ha;308 if (wt.IsSat(hb, Pb))309 {310 Tb = wt.Tsat_p(Pb);311 xs[1] = wt.XSat(hb, Pb);312 x_tv = xs[1];313 }314 else315 {316 Tb = wt.T_hp(hb, Pb);317 xs[1] = -1.0;318 x_tv = xs[1];319 }320 }321 else322 {323 Pb = wt.TurbVap(ha, sa, 0.7, Pa, eta_tv, x_tv);324 Tb = wt.Tsat_p(Pb);325 hb = wt.hsat_xp(x_tv, Pb);326 xs[1] = x_tv;327 }328 if (Pext.Any(x => x <= Pb)) throw new Exception();329
330 // condensador331 Pc = Pb;332 double[] hs_c = wt.hs_pliqsat(Pc); // kJ/kg água333 Tc = wt.Tsat_p(Pc);334
335 double[] TRHs = new double[QtRHs + 2];336 double[] sRHs = new double[QtRHs + 2];337 double[,] hRHs = new double[QtRHs + 2,5];338 double[] wbs = new double[QtRHs + 1];339 double[] wtvs = new double[QtRHs + 1];340 hRHs[0, 4] = ha;341 hRHs[QtRHs + 1, 2] = hs_c[0];342 sRHs[QtRHs + 1] = hs_c[1];343
344 // entalpia na turbina345 for (int i=0; i<QtRHs; ++i)346 {347 hRHs[i + 1, 3] = wt.h_spGen(sa, Pext[i + 1]);
Apêndice B. Código do programa 86
348 hRHs[i + 1, 4] = ha + eta_tv * (hRHs[i + 1, 3] - ha);349 wtvs[i] = hRHs[i, 4] - hRHs[i + 1, 4];350 }351 wtvs[QtRHs] = hRHs[QtRHs, 4] - hb;352
353 // bombas e aquecedores354 double svar = hs_c[1];355 double[] dummy = new double[2];356 for (int i=QtRHs; i>=0; --i)357 {358 hRHs[i, 0] = wt.h_spGen(svar, Pext[i]); // ideal359 hRHs[i, 1] = hRHs[i + 1, 2] + (hRHs[i, 0] - hRHs[i + 1,
2]) / eta_b; // real↪→
360 dummy = wt.hs_pliqsat(Pext[i]);361 if (hRHs[i, 1] > dummy[0])362 {363 throw new Exception();364 }365 hRHs[i, 2] = dummy[0]; // saída do aquecedor366 svar = dummy[1];367 wbs[i] = hRHs[i, 1] - hRHs[i + 1, 2];368 }369
370 // Evaporador371 double hd = hRHs[0, 1];372 Pd = Pa;373 if (wt.IsSat(hd, Pd))374 {375 Td = wt.Tsat_p(Pd);376 xs[3] = wt.XSat(hd, Pd);377 }378 else379 {380 Td = wt.T_hp(hd, Pd);381 xs[3] = -1.0;382 }383
384 if (IsCombined)385 {386 Txm = Qh / (ha - hd);387 }388 else389 {390 Qh = Txm * (ha - hd);391 }392
Apêndice B. Código do programa 87
393 double[] txyn = new double[QtRHs]; // vazões que saem daturbina↪→
394 double[] txbs = new double[QtRHs + 1]; // vazões que passampelas bombas↪→
395 txbs[0] = Txm;396 double soma = 0.0;397 double dH;398 for (int i=0; i<QtRHs; ++i)399 {400 dH = (hRHs[i+1, 4] - hRHs[i+1, 2]) / (hRHs[i+1, 2] -
hRHs[i+1, 1]);↪→
401 if (i > 0)402 {403 soma += txyn[i - 1];404 }405 txyn[i] = (Txm - soma) / (1 + dH);406 txbs[i + 1] = Txm - (soma+txyn[i]);407 }408
409 double dWb = 0.0, dWtv = 0.0;410
411 for (int i=0; i<=QtRHs; ++i)412 {413 dWb += txbs[i] * wbs[i];414 dWtv += (txbs[i] - Txvap) * wtvs[i];415 }416
417 Wb = dWb;418 Wtv = dWtv;419
420 Yn = txyn;421 vazoes = new double[] { (Txm - Txvap), (Txm - Txvap -
txyn.Sum()), (Txm - txyn.Sum()), Txm };↪→
422 Wliq = Wtv - Wb;423 Rend = Wliq / Qh;424 CheckWarning();425 OnPropertyChanged("Rend");426 }427
428 public void CalcWaterSurf()429 {430 double ha, sa;431 Ta = Tev + Tsh;432 if (Tsh == 0.0)433 {434 ha = wt.hsat_xp(1.0, Pa);
Apêndice B. Código do programa 88
435 sa = AltClass.Interp1(wt.SatP[0], wt.SatP[8], Pa);436 xs[0] = 1.0;437 }438 else439 {440 ha = wt.h_Tp(Ta, Pa);441 sa = wt.s_Tp(Ta, Pa);442 xs[0] = -1.0;443 }444
445 // saída da turbina446 double hb; // kJ/kg água447
448 if (IsPb)449 {450 double hbi = wt.h_spGen(sa, Pb);451 hb = (hbi - ha) * eta_tv + ha;452 if (wt.IsSat(hb, Pb))453 {454 Tb = wt.Tsat_p(Pb);455 xs[1] = wt.XSat(hb, Pb);456 x_tv = xs[1];457 }458 else459 {460 Tb = wt.T_hp(hb, Pb);461 xs[1] = -1.0;462 x_tv = xs[1];463 }464 }465 else466 {467 Pb = wt.TurbVap(ha, sa, 0.7, Pa, eta_tv, x_tv);468 Tb = wt.Tsat_p(Pb);469 hb = wt.hsat_xp(x_tv, Pb);470 xs[1] = x_tv;471 }472 if (Pext.Any(x => x <= Pb)) throw new Exception();473
474 // condensador475 Pc = Pb;476 double[] hs_c = wt.hs_pliqsat(Pc); // kJ/kg água477 Tc = wt.Tsat_p(Pc);478
479 double[] Tturb = new double[QtRHs];480 double[,] hturb = new double[QtRHs + 1,2];
Apêndice B. Código do programa 89
481 double[] wtvs = new double[QtRHs + 1];482 hturb[0,1] = ha;483
484 // entalpia na turbina485 for (int i=0; i<QtRHs; ++i)486 {487 hturb[i + 1, 0] = wt.h_spGen(sa, Pext[i + 1]);488 hturb[i + 1, 1] = ha + eta_tv * (hturb[i + 1, 0] - ha);489 wtvs[i] = hturb[i, 1] - hturb[i + 1, 1];490 Tturb[i] = wt.Tsat_p(Pext[i + 1]);491 }492 wtvs[QtRHs] = hturb[QtRHs, 1] - hb;493
494 // bomba495 double h_bombi = wt.h_spGen(hs_c[1], Pa); // saída da bomba,
ideal↪→
496 double h_bomb = (h_bombi - hs_c[0])/eta_b + hs_c[0]; //saída da bomba, real↪→
497 double hdsat = wt.hsat_xp(0.0, Pa);498 if (h_bomb > hdsat)499 {500 throw new Exception();501 }502 double wb = h_bomb - hs_c[0];503
504 // aquecedores505 double[] hRHs = new double[QtRHs + 1];506 hRHs[QtRHs] = h_bomb;507
508 double Tvar;509 if (IsApp)510 {511 for (int i = (QtRHs-1); i >= 0; --i)512 {513 Tvar = wt.Tsat_p(Pext[i+1]) - RHap;514 hRHs[i] = wt.h_Tp(Tvar, Pa);515 }516 }517 else518 {519 double Tant = wt.T_hp(h_bomb, Pa);520 double Ttarg;521 for (int i = (QtRHs - 1); i >= 0; --i)522 {523 Ttarg = wt.Tsat_p(Pext[i + 1]);524 Tvar = (Ttarg - Tant) * rHef + Tant;
Apêndice B. Código do programa 90
525 hRHs[i] = wt.h_Tp(Tvar, Pa);526 Tant = Tvar;527 }528 }529
530 // Evaporador531 double hd = hRHs[0];532 Pd = Pa;533 if (wt.IsSat(hd, Pd))534 {535 Td = wt.Tsat_p(Pd);536 xs[3] = wt.XSat(hd, Pd);537 }538 else539 {540 Td = wt.T_hp(hd, Pd);541 xs[3] = -1.0;542
543 }544
545 if (IsCombined)546 {547 Txm = Qh / (ha - hd);548 }549 else550 {551 Qh = (ha - hd);552 }553
554 double[] txyn = new double[QtRHs]; // vazões que saem nasturbinas↪→
555 double[] txs = new double[QtRHs + 1]; // vazões que ficamnas turbinas↪→
556 double tx0 = Txm - Txvap; // vazão que entra na turbina557 txs[0] = tx0;558 double soma = 0.0;559 double[] dummy1;560 double[] dummy2;561 for (int i=0; i<QtRHs; ++i)562 {563 if (i == 0) dummy1 = new double[]{ 0.0 , 0.0};564 else dummy1 = wt.hs_pliqsat(Pext[i]);565 dummy2 = wt.hs_pliqsat(Pext[i + 1]);566 double num = Txm * (hRHs[i + 1] - hRHs[i]) + soma *
(dummy1[0]-dummy2[0]);↪→
567 double den = dummy2[0] - hturb[i + 1, 1];
Apêndice B. Código do programa 91
568 txyn[i] = num / den;569 soma += txyn[i];570 txs[i + 1] = tx0 - soma;571 }572
573 double dWtv = 0.0;574 for (int i=0; i<=QtRHs; ++i)575 {576 dWtv += txs[i] * wtvs[i];577 }578 Wtv = dWtv;579
580 Yn = txyn;581 vazoes = new double[] { (Txm - Txvap), (Txm - Txvap -
txyn.Sum()), (Txm - txyn.Sum()), Txm };↪→
582 Wb = Txm * wb;583 Wliq = Wtv - Wb;584 Rend = Wliq / Qh;585 CheckWarning();586 OnPropertyChanged("Rend");587 }588
589 protected void OnPropertyChanged(string name)590 {591 PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(name));↪→
592 }593
594 protected void OnProperty2Changed(string name)595 {596 Property2Changed?.Invoke(this, new
PropertyChangedEventArgs(name));↪→
597 }598
599 public void CheckWarning()600 {601 bool cond = (Rend < 0) || (Pb < 0.612) || (Pb >= Pa) || (Pa
> 22064.0);↪→
602 if (cond) throw new Exception();603 if ((x_tv > 0) && (x_tv < 0.8995))604 {605 WarnList.Add(new Warning(3, "xb < 0.9", "We recommend a
minimum vapour quality of 0.9 at the steamturbine."));
↪→
↪→
606 }607 }
Apêndice B. Código do programa 92
608 }609 }
B.6 Organic.cs
Nesta seção são apresentados trechos do arquivo Organic.cs, que contém os cálcu-los do ciclo Rankine orgânico.
1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Linq;5
6 namespace Cycles7 {8 public class OrganicRankine : INotifyPropertyChanged9 {
10 public event PropertyChangedEventHandler PropertyChanged;11
12 // T(K) , P(Pa), h (J/kg), s(J/kg K)13
14 private double eta_b, eta_tv, rHef;15
16 public string Fluid { get; set; }17 public List<Warning> WarnList { get; private set; } // lista de
avisos↪→
18
19 public bool HasRH { get; set; } // Há aquecedor(es)?20 public bool IsContact { get; set; } // tipo de aquecedor -
Contato(default) ou Superfície↪→
21 public int QtRHs { get; set; } // quantidade de aquecedores (até10)↪→
22 public double RHef // efetividade do(s) aquecedor(es)23 {24 get { return RHef; }25 set26 {27 if (value > 1)28 {29 if (value > 100) throw new Exception();30 rHef = value / 100.0;31 }32 else33 {34 rHef = value;35 }
Apêndice B. Código do programa 93
36 }37 }38 public double RHap { get; set; } // approach do(s) aquecedor(es)39 public bool IsApp { get; set; } // define o método de cálculo da
ineficiência do(s) aquecedor(es)↪→
40
41 public List<double> Pext { get; set; } // pressão nas linhas deextração da turbina a vapor↪→
42 private List<double> Text; // Tsat nas linhas de extração daturbina a vapor↪→
43 public bool IsCombined { get; set; } // o ciclo Rankine éalimentado por um Brayton?↪→
44 public bool IsPb { get; set; } // a pressão no condensador édefinida?↪→
45
46 public double Txm { get; set; } // kg/s (vazão mássica de águana saída do condensador)↪→
47 public double[] Yn { get; private set; } // kg/s (vazão mássicaem cada linha de extração)↪→
48 double[] vazoes = new double[4]; // kg/s (vazão nos pontosprincipais do ciclo)↪→
49 public double Ta { get; set; } // temp. na entrada da turbina50 public double Pa { get; set; } // pressão na entrada da turbina51 public double Pb { get; set; } // pressão na entrada do
condensador↪→
52 public double Eta_b // eficiência da(s) bomba(s)53 {54 get { return eta_b; }55 set56 {57 if (value > 0.0)58 {59 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
60 eta_b = value / 100.0;61 }62 else63 {64 throw new ErrorException("Efficiencies must be above
0 %.");↪→
65 }66 }67 }68 public double Eta_tv // eficiência da turbina69 {
Apêndice B. Código do programa 94
70 get { return eta_tv; }71 set72 {73 if (value > 0.0)74 {75 if (value > 100.0) throw new
ErrorException("Efficiencies must not be above100 %.");
↪→
↪→
76 eta_tv = value / 100.0;77 }78 else79 {80 throw new ErrorException("Efficiencies must be above
0 %.");↪→
81 }82 }83 }84 public double X_tv { get; set; } // título mínimo na turbina85 public double Wtv { get; private set; } // W86 public double Wb { get; private set; } // W87 public double Qh { get; set; } // W calor fornecido pelo ciclo
Brayton↪→
88
89 public double Tb { get; private set; } // temp. na entrada docondensador↪→
90 public double Tc { get; private set; } // temp. na saída docondensador↪→
91 public double Pc { get; private set; } // pressão na saída docondensador↪→
92 public double Td { get; private set; } // temp. na entrada doevaporador↪→
93 public double Pd { get; private set; } // pressão na entrada doevaporador↪→
94 double[] xs = { -1.0, -1.0, 0.0, -1.0 }; // títulos nos pontos95
96 public double Wliq { get; private set; } // [kW] potêncialíquida do ciclo↪→
97 public double Rend { get; private set; } // eficiência de 1ª leido ciclo↪→
98
99 public double Tev { get; set; } // temp. de evaporação100 public double Tcond { get; set; } // temp. de condensação101 public double Tsh { get; set; } // acréscimo de temp.
(superaquecimento)↪→
102
103 public OrganicRankine()
Apêndice B. Código do programa 95
104 {105 this.HasRH = false;106 this.IsContact = true;107 this.IsApp = true;108 this.QtRHs = 0;109 this.RHap = 0.0;110 this.rHef = 100.0;111 this.IsPb = false;112 this.Tsh = 0.0;113 this.X_tv = 0.0;114 }115
116 public void CalcGen()117 {118 WarnList = new List<Warning>();119 if (QtRHs == 0)120 {121 Calc();122 }123 else124 {125 CheckList(Text);126 if (IsContact)127 {128 CalcContact();129 }130 else131 {132 CalcSurf();133 }134 }135 }136
137 private void CheckList(List<double> lista)138 {139 for (int i=0; i<lista.Count; i++)140 {141 if (lista[i] < Tcond || lista[i] >= Tev) throw new
Exception();↪→
142 if (i > 0)143 {144 if (lista[i] >= lista[i-1]) throw new Exception();145 }146 }147 SetListaP(lista);148 }
Apêndice B. Código do programa 96
149
150 public void SetListaT(List<double> Tlist)151 {152 Text = new List<double>(Tlist);153 }154
155 private void SetListaP(List<double> Tlist)156 {157 List<double> lista = new List<double>(Tlist);158 lista.Insert(0, Tev);159 for (int i = 0; i < lista.Count; i++)160 {161 lista[i] = CoolProp.PropsSI("P", "T", lista[i], "Q",
1.0, Fluid);↪→
162 }163 Pext = lista;164 }165
166 public double FindTcrit()167 {168 double ans = CoolProp.Props1SI(Fluid, "Tcrit");169 return ans;170 }171
172 public void Calc()173 {174
175 // turbina a vapor176 Pa = CoolProp.PropsSI("P", "T", Tev, "Q", 1.0, Fluid);177 Pb = CoolProp.PropsSI("P", "T", Tcond, "Q", 1.0, Fluid);178 Pc = Pb;179 Pd = Pa;180 double ha, sa, hb, hbi, wtv;181
182 if (Tsh == 0.0)183 {184 ha = CoolProp.PropsSI("H", "T", Tev, "Q", 1.0, Fluid);185 sa = CoolProp.PropsSI("S", "T", Tev, "Q", 1.0, Fluid);186 Ta = Tev;187 xs[0] = 1.0;188 }189 else190 {191 Ta = Tev + Tsh;192 ha = CoolProp.PropsSI("H", "T", Ta, "P", Pa, Fluid);193 sa = CoolProp.PropsSI("S", "T", Ta, "P", Pa, Fluid);
Apêndice B. Código do programa 97
194 xs[0] = -1.0;195 }196
197 hbi = CoolProp.PropsSI("H", "S", sa, "P", Pb, Fluid);198 hb = (hbi - ha) * eta_tv + ha;199 double hbsatv = CoolProp.PropsSI("H", "Q", 1.0, "P", Pb,
Fluid);↪→
200 if (hb <= hbsatv)201 {202 Tb = Tcond;203 xs[1] = CoolProp.PropsSI("Q", "H", hb, "P", Pb, Fluid);204 X_tv = xs[1];205 }206 else207 {208 Tb = CoolProp.PropsSI("T", "H", hb, "P", Pb, Fluid);209 xs[1] = -1.0;210 X_tv = xs[1];211 }212 wtv = ha - hb;213
214 // condensador215 double hc = CoolProp.PropsSI("H", "Q", 0, "P", Pb, Fluid);216 double sc = CoolProp.PropsSI("S", "Q", 0, "P", Pb, Fluid);217 Tc = Tcond;218
219 // bomba220 double hdi = CoolProp.PropsSI("H", "S", sc, "P", Pa, Fluid);221 double hd = (hdi - hc) / eta_b + hc;222 double hdsatl = CoolProp.PropsSI("H", "Q", 0.0, "P", Pa,
Fluid);↪→
223 if (hd < hdsatl)224 {225 Td = CoolProp.PropsSI("T", "H", hd, "P", Pa, Fluid);226 xs[3] = -1.0;227 }228 else if (hd == hdsatl)229 {230 Td = Tev;231 xs[3] = 0.0;232 }233 else234 {235 throw new Exception();236 }237 double wb = hd - hc;
Apêndice B. Código do programa 98
238
239 // Evaporador240 if (IsCombined)241 {242 Txm = Qh / (ha - hd);243 }244 else245 {246 Qh = Txm * (ha - hd);247 }248
249 vazoes = new double[] { Txm, Txm, Txm, Txm };250 Wtv = Txm * wtv;251 Wb = Txm * wb;252 Wliq = Wtv - Wb;253 Rend = Wliq / Qh;254 CheckWarning();255 OnPropertyChanged("Rend");256 }257
258 public void CalcContact()259 {260
261 // turbina a vapor262 Pa = CoolProp.PropsSI("P", "T", Tev, "Q", 1.0, Fluid);263 Pb = CoolProp.PropsSI("P", "T", Tcond, "Q", 1.0, Fluid);264 double ha, sa, hb, hbi;265
266 if (Tsh == 0.0)267 {268 ha = CoolProp.PropsSI("H", "T", Tev, "Q", 1.0, Fluid);269 sa = CoolProp.PropsSI("S", "T", Tev, "Q", 1.0, Fluid);270 Ta = Tev;271 xs[0] = 1.0;272 }273 else274 {275 Ta = Tev + Tsh;276 ha = CoolProp.PropsSI("H", "T", Ta, "P", Pa, Fluid);277 sa = CoolProp.PropsSI("S", "T", Ta, "P", Pa, Fluid);278 xs[0] = -1.0;279 }280
281 hbi = CoolProp.PropsSI("H", "S", sa, "P", Pb, Fluid);282 hb = (hbi - ha) * eta_tv + ha;283 double hbsatv = CoolProp.PropsSI("H", "Q", 1.0, "P", Pb,
Fluid);↪→
Apêndice B. Código do programa 99
284 if (hb <= hbsatv)285 {286 Tb = Tcond;287 xs[1] = CoolProp.PropsSI("Q", "H", hb, "P", Pb, Fluid);288 X_tv = xs[1];289 }290 else291 {292 Tb = CoolProp.PropsSI("T", "H", hb, "P", Pb, Fluid);293 xs[1] = -1.0;294 X_tv = xs[1];295 }296
297 // condensador298 double hc = CoolProp.PropsSI("H", "Q", 0, "P", Pb, Fluid);299 double sc = CoolProp.PropsSI("S", "Q", 0, "P", Pb, Fluid);300 Tc = Tcond;301
302 double[] TRHs = new double[QtRHs + 2];303 double[] sRHs = new double[QtRHs + 2];304 double[,] hRHs = new double[QtRHs + 2, 5];305 double[] wbs = new double[QtRHs + 1];306 double[] wtvs = new double[QtRHs + 1];307 hRHs[0, 4] = ha;308 hRHs[QtRHs + 1, 2] = hc;309 sRHs[QtRHs + 1] = sc;310
311 // entalpia na turbina312 for (int i = 0; i < QtRHs; ++i)313 {314 hRHs[i + 1, 3] = CoolProp.PropsSI("H", "S", sa, "P",
Pext[i+1], Fluid);↪→
315 hRHs[i + 1, 4] = ha + eta_tv * (hRHs[i + 1, 3] - ha);316 wtvs[i] = hRHs[i, 4] - hRHs[i + 1, 4];317 }318 wtvs[QtRHs] = hRHs[QtRHs, 4] - hb;319
320 // bombas e aquecedores321 double svar = sc;322 for (int i = QtRHs; i >= 0; --i)323 {324 hRHs[i, 0] = CoolProp.PropsSI("H", "S", svar, "P",
Pext[i], Fluid);// ideal↪→
325 hRHs[i, 1] = hRHs[i + 1, 2] + (hRHs[i, 0] - hRHs[i + 1,2]) / eta_b; // real↪→
326 hRHs[i, 2] = CoolProp.PropsSI("H", "Q", 0.0, "P",Pext[i], Fluid); // saída do aquecedor↪→
Apêndice B. Código do programa 100
327 if (hRHs[i, 1] > hRHs[i, 2])328 {329 throw new Exception();330 }331 svar = CoolProp.PropsSI("S", "Q", 0.0, "P", Pext[i],
Fluid); ;↪→
332 wbs[i] = hRHs[i, 1] - hRHs[i + 1, 2];333 }334
335 // Evaporador336 double hd = hRHs[0, 1];337 double hdsatl = CoolProp.PropsSI("H", "Q", 0.0, "P", Pa,
Fluid);↪→
338 if (hd >= hdsatl)339 {340 Td = Tev;341 xs[3] = CoolProp.PropsSI("Q", "H", hd, "P", Pa, Fluid);342 }343 else344 {345 Td = CoolProp.PropsSI("T", "H", hd, "P", Pa, Fluid);346 xs[3] = -1.0;347 }348 if (IsCombined)349 {350 Txm = Qh / (ha - hd);351 }352 else353 {354 Qh = Txm * (ha - hd);355 }356
357 double[] txyn = new double[QtRHs]; // vazões que saem daturbina↪→
358 double[] txbs = new double[QtRHs + 1]; // vazões que passampelas bombas↪→
359 txbs[0] = Txm;360 double soma = 0.0;361 double dH;362 for (int i = 0; i < QtRHs; ++i)363 {364 dH = (hRHs[i + 1, 4] - hRHs[i + 1, 2]) / (hRHs[i + 1, 2]
- hRHs[i + 1, 1]);↪→
365 if (i > 0)366 {367 soma += txyn[i - 1];
Apêndice B. Código do programa 101
368 }369 txyn[i] = (Txm - soma) / (1 + dH);370 txbs[i + 1] = Txm - (soma + txyn[i]);371 }372
373 double dWb = 0.0, dWtv = 0.0;374
375 for (int i = 0; i <= QtRHs; ++i)376 {377 dWb += txbs[i] * wbs[i];378 dWtv += txbs[i] * wtvs[i];379 }380
381 Wb = dWb;382 Wtv = dWtv;383
384 Yn = txyn;385 vazoes = new double[] { Txm, (Txm - txyn.Sum()), (Txm -
txyn.Sum()), Txm };↪→
386 Wliq = Wtv - Wb;387 Rend = Wliq / Qh;388 CheckWarning();389 OnPropertyChanged("Rend");390 }391
392 public void CalcSurf()393 {394 // turbina a vapor395 Pa = CoolProp.PropsSI("P", "T", Tev, "Q", 1.0, Fluid);396 Pb = CoolProp.PropsSI("P", "T", Tcond, "Q", 1.0, Fluid);397 Pc = Pb;398 Pd = Pa;399 double ha, sa, hb, hbi;400
401 if (Tsh == 0.0)402 {403 ha = CoolProp.PropsSI("H", "T", Tev, "Q", 1.0, Fluid);404 sa = CoolProp.PropsSI("S", "T", Tev, "Q", 1.0, Fluid);405 Ta = Tev;406 xs[0] = 1.0;407 }408 else409 {410 Ta = Tev + Tsh;411 ha = CoolProp.PropsSI("H", "T", Ta, "P", Pa, Fluid);412 sa = CoolProp.PropsSI("S", "T", Ta, "P", Pa, Fluid);
Apêndice B. Código do programa 102
413 xs[0] = -1.0;414 }415
416 hbi = CoolProp.PropsSI("H", "S", sa, "P", Pb, Fluid);417 hb = (hbi - ha) * eta_tv + ha;418 double hbsatv = CoolProp.PropsSI("H", "Q", 1.0, "P", Pb,
Fluid);↪→
419 if (hb <= hbsatv)420 {421 Tb = Tcond;422 xs[1] = CoolProp.PropsSI("Q", "H", hb, "P", Pb, Fluid);423 X_tv = xs[1];424 }425 else426 {427 Tb = CoolProp.PropsSI("T", "H", hb, "P", Pb, Fluid);428 xs[1] = -1.0;429 X_tv = xs[1];430 }431
432 // condensador433 double hc = CoolProp.PropsSI("H", "Q", 0, "P", Pb, Fluid);434 double sc = CoolProp.PropsSI("S", "Q", 0, "P", Pb, Fluid);435 Tc = Tcond;436
437 double[] Tturb = new double[QtRHs];438 double[,] hturb = new double[QtRHs + 1, 2];439 double[] wtvs = new double[QtRHs + 1];440 hturb[0, 1] = ha;441
442 // entalpia na turbina443 for (int i = 0; i < QtRHs; ++i)444 {445 hturb[i + 1, 0] = CoolProp.PropsSI("H", "S", sa, "P",
Pext[i + 1], Fluid);↪→
446 hturb[i + 1, 1] = ha + eta_tv * (hturb[i + 1, 0] - ha);447 wtvs[i] = hturb[i, 1] - hturb[i + 1, 1];448 Tturb[i] = CoolProp.PropsSI("H", "Q", 1.0, "P", Pext[i +
1], Fluid);↪→
449 }450 wtvs[QtRHs] = hturb[QtRHs, 1] - hb;451
452 // bomba453 double h_bombi = CoolProp.PropsSI("H", "S", sc, "P", Pa,
Fluid); // saída da bomba, ideal↪→
454 double h_bomb = (h_bombi - hc) / eta_b + hc; // saída dabomba, real↪→
Apêndice B. Código do programa 103
455 double hdsat = CoolProp.PropsSI("H", "Q", 0.0, "P", Pa,Fluid);↪→
456 if (h_bomb > hdsat)457 {458 throw new Exception();459 }460 double wb = h_bomb - hc;461
462 // aquecedores463 double[] hRHs = new double[QtRHs + 1];464 hRHs[QtRHs] = h_bomb;465
466 double Tvar;467 if (IsApp)468 {469 for (int i = (QtRHs - 1); i >= 0; --i)470 {471 Tvar = CoolProp.PropsSI("T", "Q", 0, "P", Pext[i +
1], Fluid) - RHap;↪→
472 hRHs[i] = CoolProp.PropsSI("H", "T", Tvar, "P", Pa,Fluid);↪→
473 }474 }475 else476 {477 double Tant = CoolProp.PropsSI("T", "H", h_bomb, "P",
Pa, Fluid);↪→
478 double Ttarg;479 for (int i = (QtRHs - 1); i >= 0; --i)480 {481 Ttarg = CoolProp.PropsSI("T", "Q", 0, "P", Pext[i +
1], Fluid);↪→
482 Tvar = (Ttarg - Tant) * rHef + Tant;483 hRHs[i] = CoolProp.PropsSI("H", "T", Tvar, "P", Pa,
Fluid);↪→
484 Tant = Tvar;485 }486 }487
488 // Evaporador489 double hd = hRHs[0];490 double hdsatl = CoolProp.PropsSI("H", "Q", 0.0, "P", Pa,
Fluid);↪→
491 if (hd >= hdsatl)492 {493 Td = Tev;
Apêndice B. Código do programa 104
494 xs[3] = CoolProp.PropsSI("Q", "H", hd, "P", Pa, Fluid);495 }496 else497 {498 Td = CoolProp.PropsSI("T", "H", hd, "P", Pa, Fluid);499 xs[3] = -1.0;500 }501 if (IsCombined)502 {503 Txm = Qh / (ha - hd);504 }505 else506 {507 Qh = Txm * (ha - hd);508 }509
510 double[] txyn = new double[QtRHs]; // vazões que saem nasturbinas↪→
511 double[] txs = new double[QtRHs + 1]; // vazões que ficamnas turbinas↪→
512 double tx0 = Txm; // vazão que entra na turbina513 txs[0] = tx0;514 double soma = 0.0;515 double dummy1, dummy2;516 for (int i = 0; i < QtRHs; ++i)517 {518 if (i == 0) dummy1 = 0.0;519 else dummy1 = CoolProp.PropsSI("H", "Q", 0, "P",
Pext[i], Fluid);↪→
520 dummy2 = CoolProp.PropsSI("H", "Q", 0, "P", Pext[i + 1],Fluid);↪→
521 double num = Txm * (hRHs[i + 1] - hRHs[i]) + soma *(dummy1 - dummy2);↪→
522 double den = dummy2 - hturb[i + 1, 1];523 txyn[i] = num / den;524 soma += txyn[i];525 txs[i + 1] = tx0 - soma;526 }527
528 double dWtv = 0.0;529 for (int i = 0; i <= QtRHs; ++i)530 {531 dWtv += txs[i] * wtvs[i];532 }533 Wtv = dWtv;534
Apêndice B. Código do programa 105
535 Yn = txyn;536 vazoes = new double[] { Txm, (Txm - txyn.Sum()), (Txm -
txyn.Sum()), Txm };↪→
537 Wb = Txm * wb;538 Wliq = Wtv - Wb;539 Rend = Wliq / Qh;540 CheckWarning();541 OnPropertyChanged("Rend");542 }543
544 protected void OnPropertyChanged(string name)545 {546 PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(name));↪→
547 }548
549 public void CheckWarning()550 {551 if (Rend < 0) throw new Exception();552 if ((X_tv > 0) && (X_tv < 0.9))553 {554 WarnList.Add(new Warning(3, "Xb < 0.9", "We recommend a
minimum vapour quality of 0.9 at the steamturbine."));
↪→
↪→
555 }556 }557 }558 }
B.7 Combinado.cs
Nesta seção são apresentados trechos do arquivo Combinado.cs, que contém os cál-culos do ciclo combinado.
1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4
5 namespace Cycles6 {7 [Serializable()]8 public class CustomException : Exception9 {
10 public CustomException(string msg) : base(msg)11 {12 }
Apêndice B. Código do programa 106
13 }14
15 public class Combinado : INotifyPropertyChanged16 {17 public Brayton br;18 public Rankine rk;19 public double Wliq { get; private set; }20 public double Wesp { get; private set; }21 public double Rend { get; private set; }22 public List<Warning> WarnList { get; private set; }23
24 public event PropertyChangedEventHandler PropertyChanged;25
26 public void Calc()27 {28 WarnList = new List<Warning>();29 br.Pvap = rk.Pa;30 br.Tvap = rk.Ta;31 br.Calcular();32 if (br.Quti <= 0.0)33 {34 string str = "'T6' must be below 'T5'.";35 throw new ErrorException(str);36 }37 rk.Qh = br.Quti;38 rk.Txvap = br.Txm * br.Pct_vapor;39 rk.CalcGen();40 if (rk.Td >= br.T6)41 {42 string str = "'T6' must be above 'Td'.";43 throw new ErrorException(str);44 }45
46 if (rk.Ta >= br.T5)47 {48 string str = "'Ta' must be below 'T5'.";49 throw new ErrorException(str);50 }51
52 if (rk.Txvap >= rk.Txm)53 {54 string str = "The mass flow rate of steam injected is
too high. It must be below that at point 'd'.";↪→
55 throw new CustomException(str);56 }57
Apêndice B. Código do programa 107
58 Wliq = br.Wliq + rk.Wliq;59 Wesp = Wliq / (br.Txm * GasIdeal.Cp0Ar * br.T1);60 Rend = Wliq / br.Qh;61 WarnList.AddRange(br.WarnList);62 WarnList.AddRange(rk.WarnList);63 OnPropertyChanged("Rend");64 }65
66 protected void OnPropertyChanged(string name)67 {68 PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(name));↪→
69 }70 }71 }
B.8 CombinadoOrg.cs
Nesta seção são apresentados trechos do arquivo CombinadoOrg.cs, que contém oscálculos do ciclo combinado orgânico.
1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4
5 namespace Cycles6 {7 public class CombinadoOrg : INotifyPropertyChanged8 {9 public Brayton br;
10 public OrganicRankine ork;11 public double Wliq { get; private set; }12 public double Wesp { get; private set; }13 public double Rend { get; private set; }14 public List<Warning> WarnList { get; private set; }15
16 public event PropertyChangedEventHandler PropertyChanged;17
18 public void Calc()19 {20 WarnList = new List<Warning>();21 br.Calcular();22 if (br.Quti <= 0.0)23 {24 string str = "'T6' must be below 'T5'.";25 throw new ErrorException(str);
Apêndice B. Código do programa 108
26 }27 ork.Qh = br.Quti * 1000.0; // kW -> W28 ork.CalcGen();29 if (ork.Td >= br.T6)30 {31 string str = "'T6' must be above 'Td'.";32 throw new ErrorException(str);33 }34
35 if (ork.Ta >= br.T5)36 {37 string str = "'Ta' must be below 'T5'.";38 throw new ErrorException(str);39 }40
41 Wliq = br.Wliq + (ork.Wliq / 1000.0);42 Wesp = Wliq / (br.Txm * GasIdeal.Cp0Ar * br.T1);43 Rend = Wliq / br.Qh;44 WarnList.AddRange(br.WarnList);45 WarnList.AddRange(ork.WarnList);46 OnPropertyChanged("Rend");47 }48
49 protected void OnPropertyChanged(string name)50 {51 PropertyChanged?.Invoke(this, new
PropertyChangedEventArgs(name));↪→
52 }53 }54 }