import numpy as np
from matplotlib import pyplot as plt


#--Paramètres de simulation--

P=dict()

#constantes

P["c"]=1
P["a0"]=1
P["omega0"]=10
P["Nfreq"]=200
P["delta"]=0.03
P["coupure"]=4
P["k2abs"]=0.05

#calcul des autres paramètres

def coeffFreq(P):
    pass

def k1k2(P):
    pass

#calcul d'un paquet d'ondes en un point (x,t)

def unPaquet(x,t,P,decalage=0):
    pass

def titre(P):
    if P["onde2"]:
        chaine="deux ondes"
    else:
        chaine="une onde"
    if P["dispersif"]:
        chaine+=", milieu dispersif"
    else:
        chaine+=", milieu non dispersif"
    if P["absorbant"]:
        chaine+=", absorbant"
    else:
        chaine+=",non absorbant"
    return chaine
    
def observationxnul(P,ti,tf,Nt,t0=0):
    coeffFreq(P)
    k1k2(P)
    chaine=titre(P)
    plt.figure(chaine+", t=0")
    t=np.linspace(ti,tf,Nt)
    u=np.zeros(Nt)
    v=np.zeros(Nt)
    for i in range(Nt):
        u[i]=unPaquet(0,t[i],P)     
    if P["onde2"]:
        for i in range(Nt):
            v[i]=unPaquet(0,t[i]-t0,P) 
    plt.plot(t,u+v)
    plt.show() 
       
def observationdifferentst(P,listet,xi,xf,Nx,t0=0,arrete=False):
    coeffFreq(P)
    k1k2(P)
    chaine=titre(P)
    x=np.linspace(xi,xf,Nx)
    deltax=(xf-xi)/Nx
    u=np.zeros(Nx)
    v=np.zeros(Nx)
    plt.figure(chaine+" observations pour différents t")
    for j in range(len(listet)):
        plt.subplot(230+j+1)
        plt.title("t="+str(listet[j]))
        plt.ylim([-0.2,0.2])
        for i in range(Nx):
            if arrete:
                decalage=listet[j]*P["c"]
            else:
                decalage=0
            u[i]=unPaquet(x[i],listet[j],P,decalage) 
            if P["onde2"]:
                v[i]=unPaquet(x[i],listet[j]-t0,P,decalage) 
        plt.plot(x+decalage,u+v)
    plt.show()

#choix du milieu et nombre d'ondes

P["onde2"]=False
P["dispersif"]=False
P["absorbant"]=False


temps=[7*i for i in range(6)]
tempsLong=[3*(t+1) for t in temps] #échelle différente pour voir dispersion
tempsTresLong=[12*(t+1) for t in temps] #échelle différente pour voir dispersion

#une seule onde

observationxnul(P,-20,20,400)


#observationdifferentst(P,temps,-5,40,2000)

P["dispersif"]=True
#observationdifferentst(P,tempsLong,0,125,2000)
P["dispersif"]=False

P["absorbant"]=True
#observationdifferentst(P,temps,-5,40,2000)
P["absorbant"]=False
"""
#deux ondes 
P["onde2"]=True

observationxnul(P,-40,80,1000,20)

#observationdifferentst(P,tempsLong,-5,90,2000,20)

P["dispersif"]=True
#observationdifferentst(P,tempsLong,0,150,2000,-30)
#observationdifferentst(P,tempsTresLong,-80,80,2000,-30,arrete=True)
P["dispersif"]=False

"""


