Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib

introduction

Un isocourant est un écoulement dans lequel la forme de la section transversale, le gradient du lit de la rivière, la profondeur de l'eau et le débit ne changent pas dans le temps et le lieu, et dans les relations fluviales, il est souvent analysé à l'aide de la formule de vitesse d'écoulement moyenne de Manning. La formule suivante est utilisée pour l'analyse.

v=\cfrac{1}{n} R^{2/3} I^{1/2} \qquad R=\cfrac{A}{S} \qquad Q=A \cdot v

Étant donné que la section transversale de l'eau courante et du côté humide sont des fonctions de la profondeur de l'eau, la méthode consistant à supposer d'abord la profondeur de l'eau $ h $ (ou l'altitude du niveau d'eau) et à calculer le débit descendant $ Q $ à cette profondeur d'eau est un processus de calcul simple. y a-t-il.

Script Shell pour l'exécution

Dans le script d'exécution, les trois programmes suivants sont exécutés.

Le texte du script d'exécution est le suivant.

a_py_uni.txt


python3 py_eng_uniflow.py inp_sec1.txt > out_PSHQ1.txt

python3 py_eng_uni_figHQ.py out_PSHQ1.txt fig_PSHQ1.png

python3 py_eng_uni_figsec.py inp_sec1.txt fig_sec1_PS.png n=0.04,i=0.001 79.4

Des données d'entrée

1ère ligne: coefficient de rugosité de la 1ère colonne $ n $, pente du lit de la 2ème colonne $ I $ 2e ligne et suivantes: 1ère colonne coordonnée x du lit de la rivière (de la rive gauche à la rive droite), coordonnée y (élévation)

inp_sec1.txt


0.04 0.001
-138 100
-114  90
 -70  80
 -45  70
 -32  62
   0  61.5
  32  62
  60  70
  80  80
  98  84
 120  84

des données de sortie

La séquence des données de sortie est la suivante. Pour l'analyse isocinétique uniquement, il suffit de connaître la relation entre le débit et l'altitude ou la profondeur de l'eau, mais dans le but de créer des conditions d'entrée pour l'analyse d'écoulement inégal, la section transversale de l'eau qui coule, le côté humide et la largeur de la surface de l'eau sont également sorties. À propos, la largeur de la surface de l'eau est l'information nécessaire pour calculer la profondeur limite de l'eau.

out_PSHQ1.txt


         Q         WL          h          A          S        wsw
     0.000     61.500      0.000      0.000      0.000      0.000
     0.069     61.600      0.100      0.640     12.802     12.800
     0.436     61.700      0.200      2.560     25.603     25.600
     1.285     61.800      0.300      5.760     38.405     38.400
     2.768     61.900      0.400     10.240     51.206     51.200
     5.019     62.000      0.500     16.000     64.008     64.000
     8.760     62.100      0.600     22.426     64.563     64.513
..........      ..........

Programme d'analyse isocurrent

Dans le programme, l'aire transversale $ A $ et la marge $ S $ sont calculées. Cela se fait en suivant le segment de ligne représentant le terrain d'entrée depuis la rive gauche (côté gauche) en référence à la figure ci-dessous, et en calculant la zone et la longueur de la ligne de terrain de la partie entourée par la ligne d'élévation (el) et la ligne de terrain spécifiées. J'essaye de le faire.

fig_test.png

py_eng_uniflow.py


import numpy as np
from math import *
import sys
import matplotlib.pyplot as plt

def INTERSEC(x1,y1,x2,y2,el):
    xx=1.0e10
    if 0.0<abs(y2-y1):
        a=(y2-y1)/(x2-x1)
        b=(x2*y1-x1*y2)/(x2-x1)
        xx=(el-b)/a
    return xx

# Main routine
param=sys.argv
fnameR=param[1]

# Input data
x=[]
y=[]
fin=open(fnameR,'r')
text=fin.readline()
text=text.strip()
text=text.split()
rn=float(text[0]) # Manning roughness coefficient
gi=float(text[1]) # Gradient of river bed
while 1:
    text=fin.readline()
    if not text: break
    text=text.strip()
    text=text.split()
    x=x+[float(text[0])]
    y=y+[float(text[1])]
fin.close()
nn=len(x)

print('{0:>10s} {1:>10s} {2:>10s} {3:>10s} {4:>10s} {5:>10s}'.format('Q','WL','h','A','S','wsw'))
ymin=min(y)
ymax=max(y)
dy=0.1
yy=np.arange(ymin,ymax+dy,dy)
for el in yy:
    S=0.0
    A=0.0
    xxl=0.0
    xxr=0.0
    for i in range(0,nn-1):
        x1=x[i]
        y1=y[i]
        x2=x[i+1]
        y2=y[i+1]
        xx=INTERSEC(x1,y1,x2,y2,el)
        dS=0.0
        dA=0.0
        if y1<el and y2<el:
            dS=sqrt((x2-x1)**2+(y2-y1)**2)
            dA=0.5*(2.0*el-y1-y2)*(x2-x1)
        if x1<=xx and xx<=x2:
            if y2<=el and el<=y1:
                dS=sqrt((x2-xx)**2+(y2-el)**2)
                dA=0.5*(x2-xx)*(el-y2)
                xxl=xx
            if y1<=el and el<=y2:
                dS=sqrt((xx-x1)**2+(el-y1)**2)
                dA=0.5*(xx-x1)*(el-y1)
                xxr=xx
        S=S+dS
        A=A+dA
    if 0.0<S:
        R=A/S
        v=1.0/rn*R**(2/3)*sqrt(gi)
        Q=A*v
    else:
        R=0.0
        v=0.0
        Q=0.0
    h=el-ymin
    wsw=xxr-xxl
    print('{0:10.3f} {1:10.3f} {2:10.3f} {3:10.3f} {4:10.3f} {5:10.3f}'.format(Q,el,h,A,S,wsw))

Programme de dessin de courbe niveau-débit d'eau

Ceci suit la procédure standard de création de graphe bidimensionnel.

py_eng_uni_figHQ.py


import numpy as np
import matplotlib.pyplot as plt
import sys

def DINP(fnameR):
    data=np.loadtxt(fnameR,skiprows=1,usecols=(0,1))
    QQ=data[:,0]
    EL=data[:,1]
    return QQ,EL

# Parameter setting
param=sys.argv
fnameR=param[1]     # input filename
fnameF=param[2]     # output image file name

qmin=0.0;qmax=10000.0;dq=1000
emin=60.0;emax=90.0;de=2.0
# Input data
QQ,EL=DINP(fnameR)
# Plot
fig=plt.figure()
plt.plot(QQ,EL,color='black',lw=2.0,label='PS (n=0.04, i=0.001)')
plt.xlabel('Discharge (m$^3$/s)')
plt.ylabel('Elevation (EL.m)')
plt.xlim(qmin,qmax)
plt.ylim(emin,emax)
plt.xticks(np.arange(qmin,qmax+dq,dq))
plt.yticks(np.arange(emin,emax+de,de))
plt.grid()
plt.legend(shadow=True,loc='upper left',handlelength=3)
plt.savefig(fnameF,dpi=200,, bbox_inches="tight", pad_inches=0.2)
plt.show()
plt.close()

Image de sortie

fig_PSHQ1.png

Programme de dessin de coupe calculée

Bien que ce soit une question d'apparence, la surface sous-marine est remplie de bleu clair en utilisant fill_between.

py_eng_uni_figsec.py


import numpy as np
#from math import *
import sys
import matplotlib.pyplot as plt

# Main routine
param=sys.argv
fnameR=param[1]     # input filename
fnameF=param[2]     # output image file name
strt=param[3]       # graph title (strings)
fwl=float(param[4]) # target flood water level

# Input data
x=[]
y=[]
fin=open(fnameR,'r')
text=fin.readline()
text=text.strip()
text=text.split()
rn=float(text[0])
gi=float(text[1])
while 1:
    text=fin.readline()
    if not text: break
    text=text.strip()
    text=text.split()
    x=x+[float(text[0])]
    y=y+[float(text[1])]
fin.close()
xx=np.array(x)
yy=np.array(y)

# plot
xmin=-150
xmax=150.0
ymin=50.0
ymax=100
fig = plt.figure()
ax=fig.add_subplot(111)
ax.plot(xx,yy,color='black',lw=1.0,label='ground surface')
ax.fill_between(xx,yy,fwl,where=yy<=fwl,facecolor='cyan',alpha=0.3,interpolate=True)
ax.text(0,fwl,'10,000 years flood (EL.'+str(fwl)+')',fontsize=10,color='black',ha='center',va='top')
ax.set_title(strt)
ax.set_xlabel('Distance (m)')
ax.set_ylabel('Elevation (EL.m)')
ax.set_xlim(xmin,xmax)
ax.set_ylim(ymin,ymax)
aspect=1.0*(ymax-ymin)/(xmax-xmin)*(ax.get_xlim()[1] - ax.get_xlim()[0]) / (ax.get_ylim()[1] - ax.get_ylim()[0])
ax.set_aspect(aspect)
plt.savefig(fnameF,dpi=200,, bbox_inches="tight", pad_inches=0.2)
plt.show()
plt.close()

Image de sortie

fig_sec1_PS.png

c'est tout

Recommended Posts

Effectuer une analyse isocurrent des canaux en eau libre avec Python et matplotlib
Coexistence de Python2 et 3 avec CircleCI (1.0)
Analyse des tweets avec Python, Mecab et CaboCha
[Python] axe limite du graphe 3D avec Matplotlib
Implémentation de l'arbre TRIE avec Python et LOUDS
Analyse statique du code Python avec GitLab CI
Poursuite du développement multi-plateforme avec Electron et Python
Exemple de lecture et d'écriture de CSV avec Python
Analyse de données avec python 2
Analyse vocale par python
Carte thermique par Python + matplotlib
Analyse vocale par python
Installation de matplotlib (Python 3.3.2)
Analyse de données avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
Téléchargez facilement et partiellement mp4 avec python et youtube-dl!
Visualisez la gamme d'insertions internes et externes avec python
Calculer le coefficient de régression d'une analyse de régression simple avec python
Défiez l'analyse des composants principaux des données textuelles avec Python
Analyse du squelette de plan avec Python (4) Gestion du déplacement forcé
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
Gestion des versions de Node, Ruby et Python avec anyenv
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
[Python] Analyse morphologique avec MeCab
Python et matériel - Utilisation de RS232C avec Python -
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Analyse de squelette planaire avec Python (3) Création d'un diagramme de force en coupe
[Python] Lisez le fichier csv et affichez la figure avec matplotlib
Analyse des émotions par Python (word2vec)
"Analyse des séries chronologiques de mesure des données économiques et financières" Résolution du problème de fin de chapitre avec Python
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Analyse statique des programmes Python
Débarrassez-vous des données sales avec Python et les expressions régulières
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
Analyse de squelette planaire avec Python
Analyse morphologique japonaise avec Python
python avec pyenv et venv
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Installation source et installation de Python
Analyse des secousses musculaires avec Python
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Fonctionne avec Python et R
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Analyse numérique des équations différentielles ordinaires avec l'odeint et l'ode de Scipy
Livres et sources recommandés de programmation d'analyse de données (Python ou R)
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Exercice pratique d'analyse de données avec Python ~ 2016 New Coder Survey Edition ~
Analyse de correspondance des phrases avec l'API COTOHA et sauvegarde dans un fichier
Opérabilité du bras et du robot mobile Dessinez une ellipse avec python
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
Pratique de l'analyse de données par Python et pandas (Tokyo COVID-19 data edition)
Traitement d'image par Python 100 knock # 4 Binarisation Otsu (méthode d'analyse de discrimination)
[Python] Implémentation de la méthode Nelder – Mead et sauvegarde des images GIF par matplotlib
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Communiquez avec FX-5204PS avec Python et PyUSB
Construction d'environnement de python et opencv
Briller la vie avec Python et OpenCV