# Capacité 4 : PROPAGATION D'UN PAQUET D'ONDES
######################################################################################
# 2) CAS 1 : PROPAGATION D'UN PAQUETS D'ONDES GAUSSIEN DANS UN MILIEU DISPERSIF
#            Relation de dispersion développée à l'ordre 1 en w - w0

import numpy as np
import matplotlib.pyplot as plt

# Spectre en pulsation w du paquet d'ondes gaussien 

def A(w):
    return np.exp(-(w-w0)**2/(2*sigma**2))
    
wmin = 0                # Pulsation minimale
wmax = 10               # Pulsation maximale
w0 = 5                  # Pulsation centrale
sigma = 0.35            # Paramètre caractéristique de la largeur du spectre

N = 1000                # Choix du nombre de valeurs de w           

w = np.linspace(wmin,wmax,N)    # Plage de variation de w

plt.plot(w,A(w))
plt.xlabel('pulsation w')
plt.ylabel('amplitude',rotation=0)  
plt.title("Spectre du paquet d'ondes")
plt.grid()
plt.show()
plt.pause(5)            # Temps d'affichage de la courbe  
plt.clf()               # Effacement de la courbe

# Expression du paquet d'ondes

def paquet(x,t):
    sum = 0
    for w in np.linspace(wmin,wmax,N):
        sum = sum + A(w)*np.cos(w*t-k(w)*x)
    return sum

# Relation de dispersion développée à l'odre 1 au voisinage de w0

def k(w):
    return k0 + dk0*(w-w0)  # k(w) = k(w0) + (dk/dw)(w0)(w-w0) 
    
k0 = 5                      # k(w0)
dk0 = 1.2                   # (dk/dw)(w0)

# Enveloppe du paquet d'ondes    

def env(x,t):
    sum=0
    for w in np.linspace(wmin,wmax,N):
        sum=sum+A(w)*np.cos((w-w0)*(t-dk0*x))
    return sum        

# Plage d'abscisses pour les tracés 

x=np.linspace(-10,50,1000)

# Tracé du paquet d'ondes à t = 0

plt.axis([-10,50,-100,100])
plt.xlabel('abscisse x')
plt.ylabel('s(x,0)',rotation=0)  
plt.title("Paquet d'ondes s(x,0)")
plt.plot(x,paquet(x,0),'b')
plt.plot(x,env(x,0),'r',linewidth=0.5)
plt.plot(x,-env(x,0),'r',linewidth=0.5)
plt.grid()
plt.show()
plt.pause(5)   

# Propagation du paquet d'ondes

vphi = w0/k0                     # Vitesse de phase vphi = w0/k(w0)
vg = 1/dk0                       # Vitesse de groupe vg = (dw/dk)(w0)

for t in np.arange(0,30,0.25):    # t varie de 0 à 30 avec un pas de 0.25

    plt.clf()                    # Effacement de l'image précédente
    plt.axis([-10,50,-100,100])
    plt.xlabel('abscisse x')
    plt.ylabel('s(x,t)',rotation=0)
    plt.title("Paquet d'ondes s(x,t)")  
    plt.plot(x,paquet(x,t),'b')
    plt.plot(x,env(x,t),'r',linewidth=0.5)
    plt.plot(x,-env(x,t),'r',linewidth=0.5)
    plt.plot(vphi*t,paquet(vphi*t,t),'ob')    # Tracé du point signal situé en x = 0 à t = 0
    plt.plot(vg*t,env(vg*t,t),'or')           # Tracé du point enveloppe situé en x = 0 à t = 0
    plt.grid()
    plt.pause(0.01)
#######################################################################################