import numpy as np
import matplotlib.pyplot as plt

h=100
lamb=220 # plaque en aluminium
Text=20

Lx=10e-2 # taille du domaine de travail en mètre
Ly=10e-2

Nx=40  # nombre de points de la grille
Ny=40

dx=Lx/Nx # intervalle entre deux points
dy=Ly/Ny

precision = 1e-3# règle la précision du calcul : si la methode converge à ce
                 # nombre près, le programme arrête les itérations

T=np.zeros((Ny,Nx))       # tableaux à 2 dimensions vide au départ
T2=np.zeros((Ny,Nx))      # T température
B=np.zeros((Ny,Nx))       # jx et jy vecteur courant
jx=np.zeros((Ny,Nx))      # B : si B=1, la taempérature est imposée, B=0 vide
jy=np.zeros((Ny,Nx))

# conditions aux limites : plaque
T[:,:]=20
B[:,0]=1
T[:,0]=80

B[:,Nx-1]=2

B[0,:]=1
T[0,:]=60
B[Ny-1,:]=1
T[Ny-1,:]=50

#------------calcul du potentiel méthode de Gauss Seidel -------------------
w=2/(1+np.pi/max(Nx,Ny))        # paramètre optimal pour la convergence
emax=1000                       # on met une valeur arbitraire > précision
k=0                             # pour que le while ne stoppe pas tout de suite
                                # les itérations, emax sera l'écart max de
                                # potentiel entre deux itérations

while emax>precision:           # tant que la présicion n'est pas atteinte
                                # on met à zéro au départ pour calculer le max
    emax=0                      # d'écart sur l'ensemble de la grille

    for i in range(Ny):
        for j in range(Nx):

            if B[i,j]==0: # si on est dans le vide : on résout l'equ de Laplace
                          # méthode de Gauss -Seidel : converge + vite
                T2=T[i,j]
                T[i,j]=(1.-w)*T[i,j]+w*(T[i+1,j]+T[i-1,j]+T[i,j+1]+T[i,j-1])/4.
                emax=max(emax,abs(T2-T[i,j])) # on compare pour trouver
                                                   # l'écart maximum

        T[i,Nx-1]= (h*Text+lamb/dx*T[i,Nx-2])/(h+lamb/dx) # convection à droite

    k=k+1                 # on compte le nombre d'itérations
#---------------------------------------------------------------------------

print(str(k)+" itérations")

# -------------calcul des courants thermiques jx et jy--------------------------

for i in range(1,Ny-1):
    for j in range(1,Nx-1):

        jy[i,j]=-(T[i+1,j]-T[i-1,j])/(2*dy) # calcul du gradient selon Oy
        jx[i,j]=-(T[i,j+1]-T[i,j-1])/(2*dx) # selon Ox

#----------------------------------------------------------------------------

# tracé de la carte : T et vecteur courant j

x=np.linspace(0,Lx,Nx)
y=np.linspace(0,Ly,Ny)
X,Y=np.meshgrid(x,y)
plt.figure(figsize=(10,8))
cf=plt.contourf(X,Y,T,100,cmap='jet')
graph=plt.contour(X,Y,T,12,colors='black')
plt.clabel(graph,inline=1,fontsize=10,fmt='%3.2f') #affiche les valeurs de T
plt.colorbar(cf)
plt.xlabel("en m")
plt.ylabel("en m")
plt.title("Carte thermique")
plt.streamplot(X,Y,jx,jy,density=0.5,color='black')
plt.show()
