import numpy as np
import matplotlib.pyplot as plt

## Caracteristiques du probleme
# Parametres de la barre de cuivre à renseigner
L =  0.154   # longueur en m
D =  1e-4   # coefficient de diffusion en m^2/s
tauRT = L**2/D    # temps caracteristique de diffusion en s
print("temps caractéristique de diffusion en s :",tauRT)
# Conditions initiales à renseigner
Tt0 = 20   # en °C
# Conditions aux limites à renseigner
Tx0 = 65   # en °C
TxL = 20   # en °C

## Discretisation de l'espace et du temps
# Nombre de subdivisions spatiales du systeme et pas d'espace
nx = 8
dx = L/(nx-1)   # en m
# Duree totale, nombre d’iterations temporelles et pas de temps : (compléter lignes 21 et 22)
tf = 800  # en s
nt = 801
dt = tf/(nt-1)   # en s
print("pas de temps en s :",dt)
# Test du critere de stabilite : compléter ligne 26
if D*dt/dx**2 > 0.5  :
    print("résolution erronnée => il faut augmenter le nb d'iterations temporelles")
else:
    print("condition de stabilité vérifiée")

## Tableau des temperatures
# Création, affectation des CI et des CL à renseigner
T=np.zeros((nx,nt))
for k in range(nx):
    T[k][0]= Tt0
for i in range(nt):
    T[0][i]= Tx0
    T[nx-1][i]= TxL
# Resolution par la methode des differences finies : compléter lignes 40, 41 et 42
for i in range(nt-1):
    for k in range(1,nx-1):
        T[k][i+1]= T[k][i] + dt*D/dx**2*(T[k+1][i]+T[k-1][i]-2*T[k][i])

## Representations graphiques
# Listes des positions et des instants
x = [k*dx for k in range(nx)]
t = [i*dt for i in range(nt)]
# Evolution temporelle de la temperature au niveau des differents capteurs : compléter ligne 49 (8 courbes à tracer)
plt.plot(t,T[0],t,T[1],t,T[2],t,T[3],t,T[4],t,T[5],t,T[6],t,T[7])
plt.xlabel("t (s)")
plt.ylabel("T(xk,t) (°C)")
plt.legend(["x=0 cm","x=2,2 cm","x=4,4 cm","x=6,6 cm","x=8,8 cm","x=11 cm","x=13,2 cm","x=15,4 cm"],loc="best")
plt.title("Evolution temporelle de la température au niveau des différents capteurs")
plt.grid()
plt.show()
# Profils de temperature a différentes dates en s 
plt.plot(x,T[:,0],x,T[:,8],x,T[:,40],x,T[:,80],x,T[:,800])
plt.xlabel("x (m)")
plt.ylabel("T(x,ti) (°C)")
plt.legend(["t=0 s","t=8 s","t=40 s","t=80 s","t=800 s"],loc="best")
plt.title("Profils de température à différentes dates")
plt.grid()
plt.show()