2022-03-31 14:40:19 +02:00
import math
import os
import shutil
import subprocess
import numpy as np
import csv
import matplotlib . pyplot as plt
import sys
from scipy import signal
import re
from scipy . interpolate import griddata
import scipy . io as sio
from mpl_toolkits import mplot3d
from scipy import signal
from scipy . fftpack import fft , ifft
2022-03-31 15:23:46 +02:00
from scipy . signal import detrend
from numpy import angle
2022-03-31 14:40:19 +02:00
# fonction moyenne glissante
def lissage ( Lx , Ly , p ) :
''' Fonction qui débruite une courbe par une moyenne glissante
sur 2 P + 1 points '''
Lxout = [ ]
Lyout = [ ]
Lxout = Lx [ p : - p ]
for index in range ( p , len ( Ly ) - p ) :
average = np . mean ( Ly [ index - p : index + p + 1 ] )
Lyout . append ( average )
return Lxout , Lyout
# h = profondeur locale
#fs = fréquence echantillonage
# zmesP = profondeur de mesure de la pression
# zmesU = profondeur de mesure de la vitesse
def PUV_dam ( u , p , h , fs , zmesP , zmesU ) :
2022-03-31 15:23:46 +02:00
#u = detrend(u)
#p = detrend(p)
2022-03-31 14:40:19 +02:00
ampliseuil = 0.001
N = len ( u )
2022-03-31 15:23:46 +02:00
delta = fs
2022-03-31 14:40:19 +02:00
#transformée de fourrier
Yu = fft ( u )
Yp = fft ( p )
nyquist = 1 / 2
#Fu_xb = ((1:N/2)-1)/(N/2)/deltat*nyquist
2022-03-31 15:23:46 +02:00
xf = np . linspace ( 0.0 , 1.0 / ( 2.0 / fs ) , N / / 2 )
Ampu = np . abs ( Yu [ 1 : N / / 2 ] ) / ( N / 2.0 )
Ampp = np . abs ( Yp [ 1 : N / / 2 ] ) / ( N / 2.0 )
2022-03-31 14:40:19 +02:00
#pas de frequence deltaf
2022-03-31 15:23:46 +02:00
deltaf = 1 / ( N / 2 ) / delta * nyquist ;
2022-03-31 14:40:19 +02:00
#phase
2022-03-31 15:23:46 +02:00
ThetaU = angle ( Yu [ 1 : N / / 2 ] ) ;
ThetaP = angle ( Yp [ 1 : N / / 2 ] ) ;
2022-03-31 14:40:19 +02:00
#calcul du coefficient de reflexion
2022-03-31 15:23:46 +02:00
nbf = len ( xf ) ;
2022-03-31 14:40:19 +02:00
if max ( p ) > 0 :
#si pas de données de pression, jsute Sheremet
#attention : on commence par le deuxieme point, le premier correspondant a frequence nulle
iicutoff_xb = max ( min ( np . where ( xf > 0.5 ) ) ) #length(Fu_xb)) ?
#calcul de l'amplitude en deca de la frequence de coupure
k_xb = [ ]
ii = 1
while ii < iicutoff_xb :
k_xb [ ii ] = newtonpplus ( xf [ ii ] , h , 0 ) ;
a1 = Ampu [ ii ] ;
a3 = Ampp [ ii ] ;
phi1 = ThetaU [ ii ] ;
phi3 = ThetaP [ ii ] ;
omega [ ii ] = 2 * pi * xf [ ii ] ;
cc = omega [ ii ] * cosh ( xf [ ii ] * ( zmesU + h ) ) / sinh ( xf [ ii ] * h ) ;
ccp = omega [ ii ] * cosh ( xf [ ii ] * ( zmesP + h ) ) / sinh ( xf [ ii ] * h ) ;
cs = omega [ ii ] * sinh ( xf [ ii ] * ( zmesU + h ) ) / sinh ( xf [ ii ] * h ) ;
#Procedure de calcul des ai et ar sans courant
ccc [ ii ] = cc ;
ccs [ ii ] = cs ;
cccp [ ii ] = ccp ;
#calcul des amplitudes des ondes incidentes a partir de uhoriz et p
aincident13 [ ii ] = 0.5 * sqrt ( a1 * a1 / ( cc * cc ) + a3 * a3 * g * g * xf [ ii ] * xf [ ii ] / ( omega [ ii ] * omega [ ii ] * ccp * ccp ) + 2 * a1 * a3 * g * k_xb [ ii ] * cos ( phi3 - phi1 ) / ( cc * ccp * omega [ ii ] ) )
areflechi13 [ ii ] = 0.5 * sqrt ( a1 * a1 / ( cc * cc ) + a3 * a3 * g * g * k_xb [ ii ] * k_xb [ ii ] / ( omega [ ii ] * omega [ ii ] * ccp * ccp ) - 2 * a1 * a3 * g * xf [ ii ] * cos ( phi3 - phi1 ) / ( cc * ccp * omega [ ii ] ) )
cv = g * xf [ ii ] / ( omega [ ii ] * ccp )
cp = 1 / cc
aprog [ ii ] = a3 / ( g * xf [ ii ] / ( omega [ ii ] * ccp ) ) ; #hypothese progressive Drevard et al |u|/Cv
#aprog(ii)= a1/cp;
#|p|/Cp
if aincident13 [ ii ] < 0.18 * ampliseuil :
r13 [ ii ] = 0
else :
r13 [ ii ] = areflechi13 [ ii ] / aincident13 [ ii ]
#calcul des energies incidente et reflechie sans ponderation avec les voisins
Eprog = 0.5 * aprog * * 2 / deltaf ;
Eixb = 0.5 * aincident13 * * 2 / deltaf
Erxb = 0.5 * areflechi13 * * 2 / deltaf
F = Fu_xb [ 1 : iicutoff_xb ]
return Eixb , Erxb , Eprog , F
' test '
# Calcul du vecteur d'onde en prÈsence d'un courant
# constant u de sens opposÈ ‡ celui de propagation de l'onde
# a partir de la frÈquence f, la profondeur d'eau h et
# la vitesse u du courant
# kh : vecteur d'onde * profondeur d'eau
def newtonpplus ( f , h , u ) :
# calcul de k:
g = 9.81
kh = 0.5
x = 0.001
u = - u
while ( abs ( ( kh - x ) / x ) > 0.00000001 ) :
x = kh
fx = x * math . tanh ( x ) - ( h / g ) * ( 2 * math . pi * f - ( u / h ) * x ) * ( 2 * math . pi * f - ( u / h ) * x )
fprimx = math . tanh ( x ) + x * ( 1 - ( math . tanh ( x ) ) * * 2 ) + ( 2 * u / g ) * ( 2 * math . pi * f - ( u / h ) * x )
kh = x - ( fx / fprimx )
k = kh / h
return k
# fin du calcul de k