### Resolution de l'equation de Laplace sur un carre tel que les bords haut et bas correspondent aux armatures du condensateur

## Importation des modules
import numpy as np
import matplotlib.pyplot as plt

## Parametres du probleme en USI
L = 50     # 1/2 cote du carre etudie en m 
# Valeurs du potentiel sur les bords en V
V0 = 0
Vmoins = -5
Vplus = 5


## Discretisation de l'espace
# Nombre de cellules selon chaque direction et pas d'espace en USI
n = 100
h = L/n   
  
## Tableau des potentiels
# Création, affectation des CL
V = np.zeros((n+1,n+1))
for i in range(n+1):
    V[i][n] = V0
    V[i][0] = V0
    V[0][i] = Vmoins
    V[n][i] = Vplus


## Algorithme de Jacobi
def ecart(V1,V2):
    diff = 0
    for i in range(n):
        for j in range(n):
            diff += (V1[i][j] - V2[i][j])**2
    e = np.sqrt(diff/(n**2))
    return e

def iteration_jacobi():
    oldV = V.copy()
    for i in range(1,n):
        for j in range(1,n):
            V[i][j] = (oldV[i+1][j] + oldV[i-1][j] + oldV[i][j+1] + oldV[i][j-1])/4
    e = ecart(V,oldV)
    return e

def jacobi(eps,kmax):
    e = 2*eps
    k = 0   # compteur d'itérations
    while e > eps and k<kmax:
        e = iteration_jacobi()
        k += 1
    return k


## Maillage de l'espace
# Listes des xi et des yj 
xlist = np.linspace(-L,L,n+1)
ylist = np.linspace(-L,L,n+1)
# Matrice correspondant au maillage de l'espace 2D
X, Y = np.meshgrid(xlist,ylist)

## Appel de la fonction pour resoudre et trace des equipotentielles
N = jacobi(1e-3,1e3)
print(N)
plt.contour(X,Y,V,20,cmap='jet') # trace les équipotentielles
plt.colorbar() # echelle de correspondance couleur-valeur de V
plt.axis('equal') # repere norme
plt.grid()
plt.show()

# visualisation du résultat avec imshow (attention orientation différente de la figure V[0][0] en haut à gauche)
"""plt.imshow(V,cmap='jet')
plt.colorbar() # echelle de correspondance couleur-valeur de V
plt.show()"""
