From 85468be0af29e1d936f7194e15c55b37a17ece56 Mon Sep 17 00:00:00 2001 From: Poulard Christine <christine.poulard@irstea.fr> Date: Thu, 8 Jul 2021 16:30:35 +0000 Subject: [PATCH] Delete ligne_d_eau-reservoir_avec_sliders_KetDh.py --- ligne_d_eau-reservoir_avec_sliders_KetDh.py | 221 -------------------- 1 file changed, 221 deletions(-) delete mode 100644 ligne_d_eau-reservoir_avec_sliders_KetDh.py diff --git a/ligne_d_eau-reservoir_avec_sliders_KetDh.py b/ligne_d_eau-reservoir_avec_sliders_KetDh.py deleted file mode 100644 index 4773443..0000000 --- a/ligne_d_eau-reservoir_avec_sliders_KetDh.py +++ /dev/null @@ -1,221 +0,0 @@ -###################################################### -# Céline Berni, Christine Poulard, INRAE -# juin 2021 -# Démo pour le cours HySL2 Sciences de l'Eau ENTPE 1èreA -###################################################### - -import numpy as np # Numpy for array computing - -import matplotlib.pyplot as plt -from matplotlib.widgets import Slider # widgets du module matplotlib ! -from matplotlib.patches import Rectangle -from matplotlib.collections import LineCollection - -## Calcul d'une ligne d'eau en fluvial -## pour un canal rectangulaire de grande largeur : -# calcul d'aval en amont - -## Données d'entrée -# débit -Q = 50 # m3/s -# Coefficient de Strickler -K_ini = 60 # m**(1/3)/s -# pente -I = 0.0012 -# largeur -b = 20 # m -# gravité -g = 9.81 # m/s² - -## point de départ -x0 = 0 # m -h0 = 1.5 # m -## pas de calcul -delta_h_ini = 0.025 # m - -# Fonctions (pour être éventuellement réutilisées dans un autre code) - -## calcul de la hauteur normale -def hauteur_normale(Q, K, b, I): - hn = (Q / (K * b * np.sqrt(I))) ** (3 / 5) - return hn - - -## calcul de la hauteur critique -def hauteur_critique(Q, b): - hc = (Q ** 2 / (g * b ** 2)) ** (1 / 3) - return hc - - -def calcul_x_de_proche_en_proche(Q, K, b, I, h0, delta_h): - hn = hauteur_normale(Q, K, b, I) - hc = hauteur_critique(Q, b) - print(f"hauteur normale : {hn:.2f}") - print(f"hauteur critique : {hc:.2f}") - liste_h = None - liste_x = None - if hn < hc: - print('le régime uniforme doit être fluvial : calcul impossible.') - elif hn > h0: - print('la hauteur normale doit être inférieure à la hauteur imposée par la réservoir : calcul impossible.') - else: - ## boucle de calcul pour calculer la hauteur d'eau par itération - # initialisation - hi = h0 - xi = x0 - - liste_h = [h0] - liste_x = [x0] - - while hi > hn: - dhi = min(delta_h, hi - hn) # pour ajuster le pas de calcul en dernière itération - hip1 = hi - dhi # hauteur d'eau au pas suivant i+1 - hm = hi - dhi / 2 # hauteur d'eau moyenne sur le segment i i+1 considéré - dhdxi = I * (1 - (hn / hm) ** (10 / 3)) / ( - 1 - (hc / hm) ** 3) # pente de la ligne d'eau (hyp grande largeur) - xip1 = xi - dhi / dhdxi # abscisse du point de hauteur d'eau hip1 - - # itération iplus1 - xi = xip1 - hi = hip1 - - print(f"itération : xi={xi:.3f} et hi={hi:.3f}") - - # stockage des valeurs de h et x dans un tableau - liste_h.append(hi) - liste_x.append(xi) - - return liste_h, liste_x - - -def update_from_sliders(val): - global plot_fb, ligne_normale - - # on prend comme valeur de K la valeur donnée par le slider, mais en convertissant en entier - K_slider = int(slider_K.val) - dh_slider = slider_dh.val - liste_h, liste_x = calcul_x_de_proche_en_proche(Q, K_slider, b, I, h0, dh_slider) - - try: - plot_fb.remove() - ligne_normale.remove() - except: - pass - hn = hauteur_normale(Q, K_slider, b, I) - xy_normale = (min_de_x, - I * min_de_x + hn), (max_de_x, - I * max_de_x + hn) - lcol_normale = LineCollection([xy_normale], color=["red"], lw=2, ls="--", label=f"Zf+ hn (pour K={K_slider})") - ligne_normale = ax.add_collection(lcol_normale) - - if liste_h is not None and liste_x is not None: - # on a pu calculer - x = np.asarray(liste_x) - h = np.asarray(liste_h) - # altitude du fond (on a besoin de tous les points pour le tracé) - zf = - I * x - # altitude de la surface libre - zsl = zf + h - # charge - H = zf + h + Q ** 2 / (2 * g * b ** 2 * h ** 2) - - plot_zsl.set_data(x, zsl) - plot_H.set_data(x, H) - plot_fb = ax.fill_between(x, y1=zf, y2=zsl, color="lightblue", alpha=0.75) - - fig.suptitle(f'profil en long, K={val:.2f}') - else: - # on n'a pas pu calculer - plot_zsl.set_data(x0, h0) - plot_H.set_data(x0, h0) - fig.suptitle(f'profil en long, K={val:.2f} ; calcul impossible') - - if hn < h_critique: - # print('le régime uniforme doit être fluvial : calcul impossible.') - plot_fb = ax.fill_between([-1000, 0], y1=0, y2=h0, color="pink", alpha=0.75) - - elif hn > h0: - # print('la hauteur normale doit être inférieure à la hauteur imposée par la réservoir : calcul impossible.') - - plot_fb = ax.fill_between([-1400, 0], y1=[1400 * I, 0], y2=[1400 * I + h0, h0], color="pink", alpha=0.75) - - # on retrace - plt.title(f'profil en long, K={K_slider}') - fig.canvas.draw_idle() - - -# CORPS DU PROGRAMME - -# initialisations - -liste_h, liste_x = calcul_x_de_proche_en_proche(Q, K_ini, b, I, h0, delta_h_ini) - -## pour la visualisation : on transforme les listes en vecteur numpy, pour ensuite travailler directement en VECTEURS -x = np.asarray(liste_x) -h = np.asarray(liste_h) -# vecteur des altitudes du fond -zf = - I * x # définition avec un point par point de x alors que 2 points suffisent pour définir la droite -min_de_x = min(x) -max_de_x = max(x) -xy_zfond = (min_de_x, - I * min_de_x) , (max_de_x, - I *max_de_x) -lcol_zfond = LineCollection([xy_zfond], color=["sienna"], lw=2, label = 'fond du canal') -# vecteur des altitudes de la surface libre -zsl = zf + h - -# vecteur des charges -H = zf + h + Q ** 2 / (2 * g * b ** 2 * h ** 2) - -h_critique = hauteur_critique(Q, b) -# Takes list of lines, where each line is a sequence of coordinates -xy_critique =(min_de_x, - I * min_de_x + h_critique), (max_de_x, - I * max_de_x+ h_critique) -lcol_critique = LineCollection([xy_critique], color=["orange"], lw=2, ls=":", label="z_fond + hc (indépendant de K)") - -h_normale = hauteur_normale(Q, K_ini, b, I) -xy_normale = (min_de_x, - I * min_de_x + h_normale), (max_de_x, - I * max_de_x+ h_normale) -lcol_normale = LineCollection([xy_normale], color=["red"], lw=2, ls="--", label = f"Zf+ hn (pour K={K_ini})") - - -## tracé du profil en long -# on crée une figure composée de 3 "vignettes" (subplots) -fig, (ax, ax_espace, ax_slider_K, ax_slider_dh) = plt.subplots(nrows=4, ncols=1, - gridspec_kw={'height_ratios': [10, 1, 1, 1]}) -# on ajoute les courbes si possible dans l'ordre haut vers bas (cas de l'exercice) -ax.plot(x0, h0, 'v', label='cote aval imposée par le réservoir') -plot_H, = ax.plot(x, H, '--', marker='.', label='ligne de charge', color='green') - -plot_zsl, = ax.plot(x, zsl, marker='.', label='surface libre', color='blue') -ligne_normale = ax.add_collection(lcol_normale) -# lignes fixes -ax.add_collection(lcol_critique) -ax.add_collection(lcol_zfond) -plot_fb = ax.fill_between(x, y1=zf, y2=zsl, color="lightblue", alpha=0.75) -rect = Rectangle((x0, -I * x0), 100, h0, color='darkblue') -ax.add_patch(rect) -ax.annotate("réservoir", (x0 + 10, h0 * 1.1), color="darkblue") -ax.set_xlabel('x (m)') -ax.set_ylabel('z (m)') -ax.legend() - -ax_espace.xaxis.set_visible(False) -ax_espace.yaxis.set_visible(False) -ax_espace.patch.set_alpha(0.01) #sinon cet axe peut cacher le titre de l'axe des x au-dessus ! - -for pos in ['right', 'top', 'bottom', 'left']: - ax_espace.spines[pos].set_visible(False) - ax_espace.spines[pos].set_visible(False) - -# K -slider_K = Slider( - ax_slider_K, "Rugosité de Strickler", valmin=0.01, valmax=100, valstep=1, valfmt='%0.0f', valinit=K_ini, color="sienna") -slider_K.on_changed(update_from_sliders) - -# dh -slider_dh = Slider( - ax_slider_dh, "Pas d'espace", valmin=0.001, valmax=0.5, valfmt='%0.3f', valinit=delta_h_ini, color="silver") -slider_dh.on_changed(update_from_sliders) - - - -fig.suptitle(f'profil en long') - - - -plt.show() -- GitLab