2022-03-31 14:40:19 +02:00
|
|
|
import csv
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
import os
|
|
|
|
import math
|
|
|
|
import sys
|
|
|
|
import numpy as np
|
|
|
|
from matplotlib import animation
|
|
|
|
import cmath
|
2022-03-31 15:23:46 +02:00
|
|
|
from scipy.fft import fft
|
2022-03-31 14:40:19 +02:00
|
|
|
|
2022-04-01 17:11:37 +02:00
|
|
|
|
|
|
|
def newtonpplus(f, h, u):
|
2022-03-31 14:40:19 +02:00
|
|
|
# calcul de k:
|
|
|
|
g = 9.81
|
|
|
|
kh = 0.5
|
|
|
|
x = 0.001
|
2022-04-01 17:11:37 +02:00
|
|
|
u = -u
|
|
|
|
while abs((kh - x) / x) > 0.00000001:
|
2022-03-31 14:40:19 +02:00
|
|
|
x = kh
|
2022-04-01 17:11:37 +02:00
|
|
|
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
|
2022-03-31 14:40:19 +02:00
|
|
|
return k
|
|
|
|
|
2022-04-01 17:11:37 +02:00
|
|
|
|
|
|
|
def newtonpmoins(f, h, u0):
|
2022-03-31 14:40:19 +02:00
|
|
|
# calcul de k:
|
2022-04-01 17:11:37 +02:00
|
|
|
g = 9.81
|
|
|
|
kh = 0.5
|
|
|
|
x = 0.01
|
|
|
|
x = 6 * h
|
|
|
|
|
|
|
|
while np.abs((kh - x) / x) > 0.00000001:
|
|
|
|
x = kh
|
|
|
|
fx = x * math.tanh(x) - (h / g) * (2 * math.pi * f - (u0 / h) * x) * (
|
|
|
|
2 * math.pi * f - (u0 / h) * x
|
|
|
|
)
|
|
|
|
fprimx = (
|
|
|
|
math.tanh(x)
|
|
|
|
+ x * (1 - (math.tanh(x)) ** 2)
|
|
|
|
+ (2 * u0 / g) * (2 * math.pi * f - (u0 / h) * x)
|
|
|
|
)
|
|
|
|
kh = x - (fx / fprimx)
|
|
|
|
k = kh / h
|
2022-03-31 14:40:19 +02:00
|
|
|
return k
|
|
|
|
|
2022-04-01 17:11:37 +02:00
|
|
|
|
|
|
|
# Calcul du vecteur d'onde a partir de la frÈquence
|
|
|
|
# kh : vecteur d'onde * profondeur d'eau
|
|
|
|
def newtonpropa(hi, f):
|
2022-03-31 14:40:19 +02:00
|
|
|
# calcul de k:
|
2022-04-01 17:11:37 +02:00
|
|
|
g = 9.81
|
|
|
|
si = (2 * math.pi * f) ** 2 / g
|
|
|
|
kh = 0.5
|
|
|
|
x = 0.001
|
|
|
|
while np.abs((kh - x) / x) > 0.00000001:
|
|
|
|
x = kh
|
|
|
|
fx = x * math.tanh(x) - si * hi
|
|
|
|
fprimx = math.tanh(x) + x * (1 - (math.tanh(x)) ** 2)
|
|
|
|
kh = x - (fx / fprimx)
|
|
|
|
kpropa = kh / hi
|
2022-03-31 14:40:19 +02:00
|
|
|
return kpropa
|
|
|
|
|
|
|
|
|
2022-04-01 17:11:37 +02:00
|
|
|
def reflex3S(x1, x2, x3, xs1, xs2, xs3, h, mean_freq, fmin, fmax):
|
2022-03-31 14:40:19 +02:00
|
|
|
# Analyse avec transformee de fourier d un signal en sinus
|
|
|
|
# calcul du coefficient de reflexion en presence d un courant u
|
|
|
|
# tinit : temps initial
|
|
|
|
# tfinal : temps final
|
|
|
|
# deltat : pas de temps
|
|
|
|
# fech= 1/deltat : frequence d echantillonnage
|
|
|
|
# T : periode de la houle
|
|
|
|
# nbrepoints : nombre de points
|
|
|
|
# fmin : frequence minimale de recherche des maxima du signal de fourier
|
|
|
|
# fmax : frequence maximale de recherche des maxima du signal de fourier
|
|
|
|
# ampliseuil : amplitude minimale des maxima recherches
|
|
|
|
# valeur du courant (u > 0 correspond a un courant dans le sens
|
|
|
|
# des x croissants)
|
2022-04-01 17:11:37 +02:00
|
|
|
# u=0;
|
|
|
|
|
2022-03-31 14:40:19 +02:00
|
|
|
# h profondeur d'eau
|
2022-04-01 17:11:37 +02:00
|
|
|
|
|
|
|
# hold on;
|
|
|
|
# fech=16;
|
|
|
|
# fmin=0.1;fmax=4;ampliseuil=0.005;
|
|
|
|
# nbrepoints=fech*T*1000;
|
|
|
|
# deltat=1./fech;
|
|
|
|
# tinit=0;tfinal=tinit+deltat*(nbrepoints-1);
|
|
|
|
|
|
|
|
# aitheo=1;artheo=0.4;
|
|
|
|
# h=3;
|
|
|
|
# T=1.33;
|
|
|
|
# ftheo=1/T;
|
|
|
|
# fech=16;
|
|
|
|
# fmin=0.1;fmax=4;ampliseuil=0.005;
|
|
|
|
# nbrepoints=fech*T*1000;
|
|
|
|
# deltat=1./fech;
|
|
|
|
# tinit=0;tfinal=tinit+deltat*(nbrepoints-1);
|
|
|
|
# t = [tinit:deltat:tfinal];
|
|
|
|
# ktheo = newtonpropa(ftheo,h);
|
|
|
|
|
|
|
|
# Positions respectives sondes amonts entr'elles et sondes aval
|
2022-03-31 14:40:19 +02:00
|
|
|
# entr'elles
|
2022-04-01 17:11:37 +02:00
|
|
|
|
2022-03-31 14:40:19 +02:00
|
|
|
# xs1=0;xs2=0.80;xs3=1.30;
|
2022-04-01 17:11:37 +02:00
|
|
|
|
|
|
|
# ENTREES DONNEES DES 3 SONDES AMONT et des 2 SONDES AVAL
|
|
|
|
ampliseuil = 0.005
|
2022-03-31 14:40:19 +02:00
|
|
|
#'check'
|
2022-04-01 17:11:37 +02:00
|
|
|
# pause
|
|
|
|
# PAS DE TEMPS
|
|
|
|
deltat1 = 1 / mean_freq
|
|
|
|
deltat2 = 1 / mean_freq
|
|
|
|
deltat3 = 1 / mean_freq
|
|
|
|
# transformees de Fourier
|
|
|
|
Y1 = fft(x1, len(x1))
|
|
|
|
N1 = len(Y1)
|
|
|
|
Y2 = fft(x2, len(x2))
|
|
|
|
N2 = len(Y2)
|
|
|
|
Y3 = fft(x3, len(x3))
|
|
|
|
N3 = len(Y3)
|
|
|
|
# amplitudes normalisees, soit coef de fourier
|
|
|
|
amplitude1 = np.abs(Y1[1 : N1 // 2]) / (N1 // 2)
|
|
|
|
nyquist = 1 / 2
|
|
|
|
freq1 = (np.arange(1, (N1 // 2) + 1, 1) - 1) / (N1 // 2) / deltat1 * nyquist
|
|
|
|
amplitude2 = np.abs(Y2[1 : N2 // 2]) / (N2 // 2)
|
|
|
|
nyquist = 1 / 2
|
|
|
|
freq2 = (np.arange(1, (N2 // 2) + 1, 1) - 1) / (N2 // 2) / deltat2 * nyquist
|
|
|
|
amplitude3 = np.abs(Y3[1 : N3 // 2]) / (N3 // 2)
|
|
|
|
nyquist = 1 / 2
|
|
|
|
freq3 = (np.arange(1, (N3 // 2) + 1, 1) - 1) / (N3 // 2) / deltat3 * nyquist
|
|
|
|
# recherche de la phase
|
|
|
|
theta1 = np.angle(Y1[1 : N1 // 2])
|
|
|
|
theta2 = np.angle(Y2[1 : N2 // 2])
|
|
|
|
theta3 = np.angle(Y3[1 : N3 // 2])
|
|
|
|
# pas de frequence deltaf
|
|
|
|
deltaf = 1 / (N1 // 2) / deltat1 * nyquist
|
|
|
|
nbrefreq = len(freq1)
|
|
|
|
# Caracteristiques fondamentaux,sondes canaux 1 et 3
|
|
|
|
# distances entre les sondes
|
|
|
|
x12 = xs2 - xs1
|
|
|
|
x13 = xs3 - xs1
|
|
|
|
x23 = xs3 - xs2
|
|
|
|
# Debut calcul des coefficients de reflexion
|
|
|
|
indmin = np.min(np.where(freq1 > 0.02))
|
|
|
|
indfmin = np.min(np.where(freq1 > fmin))
|
|
|
|
indfmax = np.max(np.where(freq1 < fmax))
|
|
|
|
|
2022-03-31 14:40:19 +02:00
|
|
|
T = []
|
|
|
|
fre = []
|
|
|
|
aincident12 = []
|
|
|
|
aincident23 = []
|
|
|
|
aincident13 = []
|
|
|
|
areflechi12 = []
|
|
|
|
areflechi23 = []
|
|
|
|
areflechi13 = []
|
|
|
|
r13 = []
|
|
|
|
ai = []
|
|
|
|
ar = []
|
|
|
|
Eincident123 = []
|
|
|
|
Ereflechi123 = []
|
|
|
|
count = 0
|
|
|
|
for jj in np.arange(indfmin, indfmax, 1):
|
2022-04-01 17:11:37 +02:00
|
|
|
f = freq1[jj]
|
|
|
|
# periode
|
|
|
|
T.append(1 / f)
|
2022-03-31 14:40:19 +02:00
|
|
|
fre.append(f)
|
2022-04-01 17:11:37 +02:00
|
|
|
# calcul des vecteurs d'onde
|
|
|
|
kplus = newtonpplus(f, h, 0)
|
|
|
|
kmoins = newtonpmoins(f, h, 0)
|
|
|
|
k = newtonpropa(h, f)
|
|
|
|
deltaku = k - (kmoins + kplus) / 2
|
|
|
|
# amplitude des signaux pour la frequence f:
|
|
|
|
a1 = amplitude1[jj]
|
|
|
|
a2 = amplitude2[jj]
|
|
|
|
a3 = amplitude3[jj]
|
|
|
|
# dephasages entre les signaux experimentaux des 3 sondes amont
|
|
|
|
phi1 = theta1[jj]
|
|
|
|
phi2 = theta2[jj]
|
|
|
|
phi3 = theta3[jj]
|
|
|
|
phi12 = phi2 - phi1
|
|
|
|
phi13 = phi3 - phi1
|
|
|
|
phi23 = phi3 - phi2
|
|
|
|
# evolution theorique entre les sondes de la phase pour une onde progressive
|
|
|
|
delta12p = -kplus * x12
|
|
|
|
delta13p = -kplus * x13
|
|
|
|
delta23p = -kplus * x23
|
|
|
|
delta12m = -kmoins * x12
|
|
|
|
delta13m = -kmoins * x13
|
|
|
|
delta23m = -kmoins * x23
|
|
|
|
# calcul du coefficient de reflexion a partir des sondes 1 et 2
|
|
|
|
aincident12.append(
|
|
|
|
math.sqrt(a1 * a1 + a2 * a2 - 2 * a1 * a2 * math.cos(phi12 + delta12p))
|
|
|
|
/ (2 * np.abs(math.sin((delta12p + delta12m) / 2)))
|
|
|
|
)
|
|
|
|
areflechi12.append(
|
|
|
|
math.sqrt(a1 * a1 + a2 * a2 - 2 * a1 * a2 * math.cos(phi12 - delta12m))
|
|
|
|
/ (2 * np.abs(math.sin((delta12p + delta12m) / 2)))
|
|
|
|
)
|
|
|
|
# r12(jj)=areflechi12(jj)/aincident12(jj);
|
|
|
|
# calcul du coefficient de reflexion a partir des sondes 2 et 3
|
|
|
|
aincident23.append(
|
|
|
|
math.sqrt(a2 * a2 + a3 * a3 - 2 * a2 * a3 * math.cos(phi23 + delta23p))
|
|
|
|
/ (2 * np.abs(math.sin((delta23p + delta23m) / 2)))
|
|
|
|
)
|
|
|
|
areflechi23.append(
|
|
|
|
math.sqrt(a2 * a2 + a3 * a3 - 2 * a2 * a3 * math.cos(phi23 - delta23m))
|
|
|
|
/ (2 * np.abs(math.sin((delta23p + delta23m) / 2)))
|
|
|
|
)
|
|
|
|
# r23(jj)=areflechi23(jj)/aincident23(jj);
|
|
|
|
# calcul du coefficient de reflexion a partir des sondes 1 et 3
|
|
|
|
aincident13.append(
|
|
|
|
math.sqrt(a1 * a1 + a3 * a3 - 2 * a1 * a3 * math.cos(phi13 + delta13p))
|
|
|
|
/ (2 * np.abs(math.sin((delta13p + delta13m) / 2)))
|
|
|
|
)
|
|
|
|
areflechi13.append(
|
|
|
|
math.sqrt(a1 * a1 + a3 * a3 - 2 * a1 * a3 * math.cos(phi13 - delta13m))
|
|
|
|
/ (2 * np.abs(math.sin((delta13p + delta13m) / 2)))
|
|
|
|
)
|
|
|
|
# r13.append(areflechi13[jj]/aincident13[jj])
|
|
|
|
# calcul du coefficient de reflexion par methode des 3 sondesavec moindres carres
|
|
|
|
delta1m = 0
|
|
|
|
delta2m = delta12m
|
|
|
|
delta3m = delta13m
|
|
|
|
delta1p = 0
|
|
|
|
delta2p = delta12p
|
|
|
|
delta3p = delta13p
|
|
|
|
s1 = (
|
|
|
|
cmath.exp(-1j * 2 * delta1m)
|
|
|
|
+ cmath.exp(-1j * 2 * delta2m)
|
|
|
|
+ cmath.exp(-1j * 2 * delta3m)
|
|
|
|
)
|
|
|
|
s2 = (
|
|
|
|
cmath.exp(+1j * 2 * delta1p)
|
|
|
|
+ cmath.exp(+1j * 2 * delta2p)
|
|
|
|
+ cmath.exp(+1j * 2 * delta3p)
|
|
|
|
)
|
|
|
|
s12 = (
|
|
|
|
cmath.exp(1j * (delta1p - delta1m))
|
|
|
|
+ cmath.exp(1j * (delta2p - delta2m))
|
|
|
|
+ cmath.exp(1j * (delta3p - delta3m))
|
|
|
|
)
|
|
|
|
s3 = (
|
|
|
|
a1 * cmath.exp(-1j * (phi1 + delta1m))
|
|
|
|
+ a2 * cmath.exp(-1j * (phi2 + delta2m))
|
|
|
|
+ a3 * cmath.exp(-1j * (phi3 + delta3m))
|
|
|
|
)
|
|
|
|
s4 = (
|
|
|
|
a1 * cmath.exp(-1j * (phi1 - delta1p))
|
|
|
|
+ a2 * cmath.exp(-1j * (phi2 - delta2p))
|
|
|
|
+ a3 * cmath.exp(-1j * (phi3 - delta3p))
|
|
|
|
)
|
|
|
|
s5 = s1 * s2 - s12 * s12
|
|
|
|
|
|
|
|
ai.append(abs((s2 * s3 - s12 * s4) / s5))
|
|
|
|
ar.append(abs((s1 * s4 - s12 * s3) / s5))
|
|
|
|
# refl[jj]=ar[jj]/ai[jj];
|
|
|
|
# Calcul de l'energie, on divise par le pas de frequence deltaf
|
|
|
|
# calcul de l'energie incidente sans ponderation avec les voisins
|
|
|
|
Eincident123.append(0.5 * ai[count] * ai[count] / deltaf)
|
|
|
|
Ereflechi123.append(0.5 * ar[count] * ar[count] / deltaf)
|
|
|
|
count += 1
|
|
|
|
|
|
|
|
return ai, ar, Eincident123, Ereflechi123, indfmin, indfmax, fre
|