File size: 4,109 Bytes
f553444 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
import math
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import fsolve
import gradio as gr
def mach_from_area_ratio(area_ratio, gama) -> float:
def equation(M):
return (1 / M) * ((2 / (gama + 1)) * (1 + (gama - 1) / 2 * M ** 2)) ** ((gama + 1) / (2 * (gama - 1))) - area_ratio
M_initial_guess = 1.3
M_solution, = fsolve(equation, M_initial_guess)
return M_solution
def calculate_and_plot(gama, R, p, T, rt, raio_garganta, raio_saida, v):
# Área da garganta e da saída
A_star = math.pi * raio_garganta ** 2
A_saida = math.pi * raio_saida ** 2
max_area_ratio = A_saida / A_star
area_ratios = list(np.linspace(1.0, max_area_ratio, num=50))
# Condições totais
Tt = T * (1 + ((gama - 1) / 2))
pt = p * (1 + (gama - 1) / 2) ** (gama / (gama - 1))
# Calculo da velocidade do som e Mach na entrada
a = math.sqrt(gama * R * T)
M1 = v / a
# Relações após onda de choque
P1 = p
P2 = P1 * ((gama + 1) / (2 * M1 ** 2)) / (1 + (gama - 1) / (2 * M1 ** 2))
T2 = T * (1 + (gama - 1) / (2 * M1 ** 2)) / (1 + (gama - 1) / 2)
ro2 = rt * (P2 / P1) ** (1 / gama)
v2 = math.sqrt(2 * R * (Tt - T2))
# Cálculo na seção divergente
mach_numbers = []
pressures = []
temperatures = []
densities = []
velocities = []
for area_ratio in area_ratios:
M = mach_from_area_ratio(area_ratio, gama)
T = Tt / (1 + (gama - 1) / 2 * M ** 2)
p = pt / (1 + (gama - 1) / 2 * M ** 2) ** (gama / (gama - 1))
rho = p / (R * T)
v = M * math.sqrt(gama * R * T)
mach_numbers.append(M)
pressures.append(p)
temperatures.append(T)
densities.append(rho)
velocities.append(v)
# Cria DataFrame para armazenar resultados na seção divergente
df_divergente = pd.DataFrame({
"Área Relativa (A/A*)": area_ratios,
"Mach": mach_numbers,
"Pressão (Pa)": pressures,
"Temperatura (K)": temperatures,
"Densidade (kg/m³)": densities,
"Velocidade (m/s)": velocities
})
# Plotando os resultados na seção divergente
fig, axs = plt.subplots(3, 2, figsize=(10, 12))
fig.suptitle("Parâmetros do Escoamento na Seção Divergente com Relação de Área")
parameters = ["Mach", "Pressão (Pa)", "Temperatura (K)", "Densidade (kg/m³)", "Velocidade (m/s)"]
for i, param in enumerate(parameters):
ax = axs[i // 2, i % 2]
ax.plot(df_divergente["Área Relativa (A/A*)"], df_divergente[param], label=param)
ax.set_xlabel("Área Relativa (A/A*)")
ax.set_ylabel(param)
ax.set_ylim(df_divergente[param].min() * 0.95, df_divergente[param].max() * 1.05)
ax.legend()
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
return fig, P2, T2, ro2, v2
# Definir a interface do Gradio com as novas sintaxes de inputs e outputs
interface = gr.Interface(
fn=calculate_and_plot,
inputs=[
gr.Number(label="Gama"),
gr.Number(label="R (Constante do gás)"),
gr.Number(label="Pressão inicial (Pa)"),
gr.Number(label="Temperatura inicial (K)"),
gr.Number(label="Densidade inicial (kg/m³)"),
gr.Number(label="Raio da garganta (m)"),
gr.Number(label="Raio da saída (m)"),
gr.Number(label="Velocidade inicial (m/s)")
],
outputs=[
gr.Plot(label="Gráficos dos Parâmetros na Seção Divergente"),
gr.Textbox(label="Pressão após a onda de choque (Pa)"),
gr.Textbox(label="Temperatura após a onda de choque (K)"),
gr.Textbox(label="Densidade após a onda de choque (kg/m³)"),
gr.Textbox(label="Velocidade na saída (m/s)")
],
title="Análise de Escoamento em Tubeira",
description="Digite os valores dos parâmetros iniciais para calcular os parâmetros na seção divergente de uma tubeira padrão."
)
interface.launch()
interface.launch(share=True) |