|
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):
|
|
|
|
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))
|
|
|
|
|
|
Tt = T * (1 + ((gama - 1) / 2))
|
|
pt = p * (1 + (gama - 1) / 2) ** (gama / (gama - 1))
|
|
|
|
|
|
a = math.sqrt(gama * R * T)
|
|
M1 = v / a
|
|
|
|
|
|
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))
|
|
|
|
|
|
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)
|
|
|
|
|
|
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
|
|
})
|
|
|
|
|
|
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
|
|
|
|
|
|
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() |