Functions from PAPoncet for reflection calculation (array and PUV)

This commit is contained in:
Edgar P. Burkhart 2022-03-31 14:40:19 +02:00
parent e95d679def
commit 8481dd456d
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
2 changed files with 522 additions and 0 deletions

View file

@ -0,0 +1,220 @@
import csv
import matplotlib.pyplot as plt
import os
import math
import sys
import numpy as np
from matplotlib import animation
import imageio
import cmath
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
def newtonpmoins(f,h,u0) :
# calcul de k:
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
return k
#Calcul du vecteur d'onde a partir de la frÈquence
#kh : vecteur d'onde * profondeur d'eau
def newtonpropa(hi,f):
# calcul de k:
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;
return kpropa
def reflex3S(x1,x2,x3,xs1,xs2,xs3,h,mean_freq,fmin,fmax) :
# 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)
#u=0;
# h profondeur d'eau
#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
# entr'elles
# xs1=0;xs2=0.80;xs3=1.30;
#ENTREES DONNEES DES 3 SONDES AMONT et des 2 SONDES AVAL
ampliseuil=0.005;
#'check'
#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));
T = []
fre = []
aincident12 = []
aincident23 = []
aincident13 = []
areflechi12 = []
areflechi23 = []
areflechi13 = []
r13 = []
ai = []
ar = []
Eincident123 = []
Ereflechi123 = []
count = 0
for jj in np.arange(indfmin, indfmax, 1):
f=freq1[jj]
#periode
T.append(1/f)
fre.append(f)
#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