#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri May 12 09:11:43 2023

@author: tex
"""

import matplotlib.pyplot as plt
import numpy as np

Lv=4. #longueur moyenne d'une voiture


Nv=20 #nombre de voitures à l'arrêt au feu : c'est ce nombre là que l'on fait 
#varier : plus la durée du feu rouge est longue et plus le nombre de voitures
#qui attend au feu est grand
x2=100 #le feu se situe en x2=100 m
x1=100-Nv*Lv #distance sur laquelle les Nv voitures s'accumulent

Temps=60 #je fais l'étude entre t=0 et t=Temps
Nt=1000 
Nl=1000 
Lr=1000 #longueur de la route
dx=Lr/Nl #l'espace est discrétisé xj=j*dx
dt=Temps/Nt #le temps est discrétisé ti=i*dt

TabC=np.zeros((Nt,Nl)) #TabC[i,j]=c(ti=i*dt,xj=j*dx)

for j in range(0,Nl): #condition initiale TabC[0,:]=c(t=0,x)
    if j<x1/dx or j>x2/dx:
        TabC[0,j]=0.0
    else:
        TabC[0,j]=1/Lv
        
x=np.linspace(0,Lr,Nl)  #tracé de la courbe c(0,x)       
plt.plot(x,TabC[0,:])
plt.show()

def resolution2(TabC,cmax,vmax):
    for i in range(0,Nt-1):
        q=TabC[i,:]*vmax*(1-TabC[i,:]/cmax)
        for j in range(0,Nl):
            TabC[i+1,j]=(TabC[i,(j-1)%Nl]+TabC[i,(j+1)%Nl])/2-dt/2/dx*(q[(j+1)%Nl]-q[j-1])#lax-friedriehcs
    return TabC

cmax=1/Lv #concentration maximale de voitures (les voitures se touchent)
vmax=50/3.6 #vitesse maximale en ville 50 km/h

Tabv=np.zeros((Nt,Nl))
Tabv=vmax*(1-(resolution2(TabC,cmax,vmax)/cmax))

x=np.linspace(0,Lr,Nl)
for i in range(0,5):
    plt.plot(x,resolution2(TabC,cmax,vmax)[i*200,:]) # tracé de la courbe c(ti,x)
    #aux instants ti=0,200*dt,400*dt,...
    plt.grid()
    plt.xlabel('x(m)')
    plt.ylabel('c(vehicules/m)')
plt.grid()
plt.show()

cmax=1/Lv #concentration maximale de voitures (les voitures se touchent)
vmax=25/3.6 #vitesse maximale en ville 50 km/h

Tabv=np.zeros((Nt,Nl))
Tabv=vmax*(1-(resolution2(TabC,cmax,vmax)/cmax))

x=np.linspace(0,Lr,Nl)
for i in range(0,5):
    plt.plot(x,resolution2(TabC,cmax,vmax)[i*200,:]) # tracé de la courbe c(ti,x)
    #aux instants ti=0,200*dt,400*dt,...
    plt.grid()
    plt.xlabel('x(m)')
    plt.ylabel('c(vehicules/m)')
plt.grid()
plt.show()

cmax=1/Lv #concentration maximale de voitures (les voitures se touchent)
vmax=12.5/3.6 #vitesse maximale en ville 50 km/h

Tabv=np.zeros((Nt,Nl))
Tabv=vmax*(1-(resolution2(TabC,cmax,vmax)/cmax))

x=np.linspace(0,Lr,Nl)
for i in range(0,5):
    plt.plot(x,resolution2(TabC,cmax,vmax)[i*200,:]) # tracé de la courbe c(ti,x)
    #aux instants ti=0,200*dt,400*dt,...
    plt.grid()
    plt.xlabel('x(m)')
    plt.ylabel('c(vehicules/m)')
plt.grid()
plt.show()