To upload files, please first save the app
import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
import streamlit as st
from PIL import Image
import tempfile
import io
# Configuration Streamlit
st.set_page_config(layout="wide")
st.title("💧 Simulation de Coup de Bélier - Système Réservoir-Conduite-Vanne")
# Constantes physiques
g = 9.81
rho = 1000
# Entrées utilisateur
L = st.number_input("Longueur de la conduite (m)", value=3750.0)
D = st.number_input("Diamètre de la conduite (m)", value=0.4)
a = st.number_input("Vitesse de l'onde (m/s)", value=1240.0)
n = st.number_input("Nombre de segments", value=3)
Q0 = st.number_input("Débit initial Q0 (m³/s)", value=0.176)
K = st.number_input("Coefficient de perte de charge singulière K", value=0.5)
f = st.number_input("Coefficient de frottement f", value=0.05)
T = st.number_input("Temps de fermeture de la vanne (s)", value=4.0)
H0 = st.number_input("Hauteur du réservoir H0 (m)", value=80.0)
# Paramètres calculés
dx = L / n
dt = dx / a
A = np.pi * D**2 / 4
Ca = (g * A) / a
R = f * dx / (2 * D * A**2)
# Durée totale de simulation
t_max = 10
n_steps = int(t_max / dt) + 1
# Initialisation des matrices
Q = np.zeros((n + 1, n_steps))
H = np.zeros((n + 1, n_steps))
Q[:, 0] = Q0
H[:, 0] = H0
# --- Fonctions de mise à jour selon la méthode des caractéristiques ---
def update_amont(QB, HB, Hres, dt, A, a, R): #resoir
Cn = QB - (g * A / a) * HB - R * dt * QB * abs(QB)
k = a * dt / (g * A)
QP = 0.5 * ((1 + k) * Hres - Cn + (g * A / a) * Hres)
HP = Hres
return QP, HP
def update_interm(QA, QB, HA, HB, dt, A, a, R):
Cp = QA + (g * A / a) * HA - R * dt * QA * abs(QA)
Cn = QB - (g * A / a) * HB - R * dt * QB * abs(QB)
QP = 0.5 * (Cp + Cn)
HP = (Cp - Cn) / (2 * g * A / a)
return QP, HP
def update_aval(QA, HA, dt, A, a, R): #vanne
Cp = QA + (g * A / a) * HA - R * dt * QA * abs(QA)
Cv = 0 # vanne totalement fermée
QP = 0.5 * (-Cv + np.sqrt(Cv**2 + 4 * Cv * Cp)) if Cp > 0 else 0
HP = (Cp - QP) / (g * A / a)
return QP, HP
# --- Simulation principale ---
for j in range(1, n_steps):
t = j * dt
# Point amont
Q[0, j], H[0, j] = update_amont(Q[1, j - 1], H[1, j - 1], H0, dt, A, a, R)
# Points intermédiaires
for i in range(1, n):
Q[i, j], H[i, j] = update_interm(Q[i - 1, j - 1], Q[i + 1, j - 1], H[i - 1, j - 1], H[i + 1, j - 1], dt, A, a, R)
# Point aval (vanne)
if t <= T:
Q[n, j], H[n, j] = update_aval(Q[n - 1, j - 1], H[n - 1, j - 1], dt, A, a, R)
else:
Q[n, j] = 0
H[n, j] = H[n - 1, j - 1] # pression statique en l'aval
# --- Affichage des résultats ---
st.subheader("📈 Résultats")
# Choix de la position à afficher
pos = st.slider("Choisir l'indice de position (0 = amont, n = aval)", 0, n, 0)
time = np.linspace(0, t_max, n_steps)
fig1, ax1 = plt.subplots()
ax1.plot(time, H[pos, :])
ax1.set_title(f"Évolution de la hauteur de pression à la position {pos}")
ax1.set_xlabel("Temps (s)")
ax1.set_ylabel("Hauteur de pression (m)")
ax1.grid()
fig2, ax2 = plt.subplots()
ax2.plot(time, Q[pos, :])
ax2.set_title(f"Évolution du débit à la position {pos}")
ax2.set_xlabel("Temps (s)")
ax2.set_ylabel("Débit (m³/s)")
ax2.grid()
st.pyplot(fig1)
st.pyplot(fig2)
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?