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)