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 2P+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
|
|
|
|
|