# Capacité 4 : PROPAGATION D'UN PAQUET D'ONDES
#############################################################################################################
# 4) PROPAGATION D'UN PAQUETS D'ONDES GAUSSIEN DANS UN PLASMA
#    Utilisation de la fonction animation   

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# Spectre en pulsation w du paquet d'ondes gaussien 

def A(w):
    return np.exp(-(w-w0)**2/(2*sigma**2))
    
wmin = 15               # Pulsation minimale
wmax = 35               # Pulsation maximale
w0 = 25                 # Pulsation centrale
sigma = 2               # 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):
                                                                  # A COMPLETER
    return sum

# Relation de dispersion d'un plasma   k² = (w² - wp²)/c²

def k(w):
                                                                  # A COMPLETER
 
c = 1
wp = 15

x=np.linspace(-5,30,1000)

# Tracé du paquet d'ondes à t = 0

plt.axis([-5,30,-300,300])
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))
plt.grid()
plt.show()
plt.pause(5)   


# Propagation du paquet d'ondes

dt = 0.01                 # Pas de temps

fig = plt.figure()        # Nom de la fenêtre graphique contenant la courbe à animer        
plt.xlim(-5, 30)
plt.ylim(-300,300)
plt.grid()

def init():               # Initialise la figure
    return () 
    
def animate(i): 
    t = i * dt
    return (plt.plot(x,paquet(x,t),'b'))

# Il y a 3000 images (frames) tracées avec un pas dt = 0,01 s donc la plage de temps du tracé est 30 s
ani = animation.FuncAnimation(fig,animate, init_func=init, frames=3000, blit=True, interval=10, repeat=False)

plt.show()
##############################################################################################################