# TP 17  CONDUCTION THERMIQUE
#################################################################################################################################
# Cellule 1 : Importation des bibliothèques

import numpy as np
import matplotlib.pyplot as plt
#################################################################################################################################
# Cellule 2 : Entrée des valeurs expérimentales et tracé des courbes expérimentales

texp=np.array([])      # Instants en minutes de mesure de la température à l'abscisse x = 10 cm          A COMPLETER

T10 = np.array([])     # Température en °C à l'abscisse x = 10 cm                                        A COMPLETER

xexp = np.array([])    # Abscisses en cm de mesure de la température en régime permanent                 A COMPLETER

Tstat = np.array([])   # Température en °C en régime permanent                                           A COMPLETER

plt.subplot(1,2,1)     # Tracé de la température en fonction de x en régime permanent
plt.xlabel('abscisse en cm')
plt.title('Température expérimentale T(x) en régime permanent')
plt.grid()
plt.plot(xexp,Tstat,'+r')

plt.subplot(1,2,2)     # Tracé de la température en fonction de t à x = 10 cm
plt.xlabel('temps en minutes')
plt.title('Température expérimentale T(t,x=10cm)')
plt.grid()
plt.plot(texp,T10,'+b')
    
plt.legend
plt.show()  
#################################################################################################################################
# Cellule 3 : Vérification de la variation exponentielle de T(x) - Tair

y =                                          # Ecriture de la fonction permettant de vérifier que T(x) - Tair varie exponentiellement       A COMPLETER

p = np.polyfit(xexp,y,1)                     # Régression linéaire de y(x)                         
print('Pente de la droite a =',p[0],'cm-1')                          
print("Distance caractéristique d'atténuation delta = ",-1/p[0],'cm')   # Affichage de la distance caractéristique de variation de T(x)                   

plt.plot(xexp,y,'+b',label='y(x)')                                      # Tracé de y(x)
plt.plot(xexp,p[0]*xexp+p[1],'r--',linewidth=1,label='Modèle affine')   # Tracé de la droite de régression linéaire

plt.title('Régression linéaire de y(x)')
plt.xlabel('x en cm')
plt.ylabel('y(x)')
plt.legend()
plt.grid()
plt.show()       
#################################################################################################################################
# Cellule 4 : Résolution de l'équation de la diffusion thermique avec températures imposées aux extrémités et pertes latérales par convection

# Ecriture de la fonction de résolution de l'équation de la diffusion thermique

def Equationdiffusion(M,N,Tini,T0,TL):    

# Grandeurs d'entrée :
    # M : nombre d'intervalles de la plage de temps [0,tmax] (donc M+1 valeurs du temps t)
    # N : nombre d'intervalles de la plage d'abscisse [0,L]  (donc N+1 valeurs de l'abscisses x)
    # Tini : température à t = 0 pour tout x  (condition initiale)
    # T0 : température en x = 0  (condition aux limites en x = 0) 
    # TL : température en x = L  (condition aux limites en x = L)        
  
    T = np.zeros((M+1,N+1))  # Initialisation du tableau des températures T(ti,xk)
    T[0,:] = Tini            # Première ligne (indice i = 0) : température initiale des points xk    
    
    for i in range (0,M):    # Itération en temps ti = idt  (M valeurs de 0 à M-1)
    
        T[i+1,0] = T0          # Condition aux limites en x = 0 
        T[i+1,N] = TL          # Condition aux limites en x = L
        for k in range(1,N):   # Pour chaque abscisse de x1 à xN-1 (N-1 valeurs de k de 1 à N-1)
            # Discrétisation équation de la diffusion
            T[i+1,k] = T[i,k] + C*(T[i,k+1] + T[i,k-1] - 2*T[i,k]) - D*dt*H*(T[i,k] - Tair)    
   
    return T
   
# Paramètres physiques

lambd =                        # Conductivité thermique de l'aluminium          (W.m-1.K-1)                A COMPLETER
µ = 2700                       # Masse volumique de l'aluminium                 (kg.m-3)  
c = 897                        # capacité thermique massique de l'aluminium     (J.K-1.kg-1) 
D = lambd/(µ*c)                # Diffusivité thermique de l'aluminium           (m2.s-1)

L = 1                          # Longueur de la tige                            (m)
r = 0.006                      # Rayon de la tige                               (m)

tmax = 900                     # Durée de l'étude                               (s) 

Tair =                         # Température de l'air ambiant                   (°C)                       A COMPLETER
Tbain =                        # Température du bain thermostaté                (°C)                       A COMPLETER

h =                            # Coefficient de transfert thermique de surface  (W.m-2.K-1)                A COMPLETER

# Paramètres numériques

N = 100                         # Nombre d'intervalles en abscisses 
dx = L/N                        # Pas en abscisse 
x = np.linspace(0,L,N+1)        # Plage d'abscisse

M = 10000                       # Nombre d'intervalles de temps 
dt = tmax/M                     # Pas de temps 
t = np.linspace(0,tmax,M+1)     # plage de temps

# Conditions initiales et aux limites

T0 = Tbain                      # Conditions aux limites en x = 0      (°C) 
TL = Tair                       # Condition aux limites en x = L       (°C)
Tini= Tair                      # Température initiale                 (°C) 

# Constante intervenant dans l'équation de diffusion discrétisée

C = D*dt/dx**2  
H = 2*h/(lambd*r)               

if C < 0.5:        # Test sur la condition de convergence de l'algorithme

    T = Equationdiffusion(M,N,Tini,T0,TL)       # Résolution de l'équation de la diffusion thermique
    
    plt.subplot(1,2,1)                          # Tracés théorique et expérimental de la température en fonction de x en régime permanent
    plt.xlabel('abscisse en cm')
    plt.title('Température T(x) en régime permanent')
    plt.grid()
    plt.plot(x*100,T[M,:],'k',label='théorie')
    plt.plot(xexp,Tstat,'+r',label='expérience')
    plt.legend()

    plt.subplot(1,2,2)                          # Tracés théorique et expérimental de la température en fonction de t à x = 10 cm
    plt.xlabel('temps en minutes')
    plt.title('Température T(t,x=10cm)')
    plt.grid()
    plt.plot(t/60,T[:,10],'k',label='théorie')
    plt.plot(texp,T10,'+b',label='expérience')
    plt.legend()
    
    plt.show()                                                      
   

else:
    print("Les pas sont mal choisis car la constante C est supérieure à 0,5")
##################################################################################################################