import numpy as np
import matplotlib.pyplot as plt

n = 100 # n+1 points de discretisation sur l'axe (Ox)
m = 100 # m+1 points de discretisation sur l'axe (Oy)
# Données numériques : :

Delta_x = 0.001 # pas de discrétisation en m (pour mémoire)
L = 40. # largeur des armatures en unité de Delta_x
a = 20. # distance entre les armatures en unité de Delta_x
e = 6. # épaisseur des armatures en unités de Delta_x
U = 10. # potentiel de référence en V

# Paramètres du calcul :
eps = 1e-4*U # choix de la précision
nbMaxIter = 2000 # nombre maximum d'itérations

# Initialisation des tableaux des potentiels :
V0 = np.zeros((n+1,m+1)) # création d'un tableau nul
V1 = np.zeros((n+1,m+1)) # création d'un tableau nul

# Conditions aux limites :
def condLim(V) : # cette fonction modifie le tableau V pour qu'il vérifie les conditions aux limites :
# a) nullité de V sur la frontière du domaine de calcul :
    for i in range(n+1) :
        V[i,0] = 0
        V[i,m] = 0
    for j in range(m+1) :
        V[0,j] = 0
        V[n,j] = 0
    # b) valeurs du potentiel imposées sur les rubans conducteurs :
    imin, imax = n//2-int(L)//2, n//2+int(L)//2 #valeurs extrêmes de i pour les rubans
    jminS, jmaxS = m//2 + int(a-e)//2, m//2 + int(a+e)//2 # valeurs extrêmes de j pour le ruban supérieur
    jminI, jmaxI = m//2 + int(-a-e)//2, m//2 + int(-a+e)//2 # valeurs extrêmes de j pour le ruban inférieur

    for i in range(imin, imax+1) :
        for j in range(jminS,jmaxS+1) :
            V[i,j] = U
        for j in range(jminI,jmaxI+1) :
            V[i,j] = -U

# Methode de relaxation :
def distance(V0, V1) : # calcul de l'écart entre les deux tableaux de potentiels
# Écrire ici le code permettant de calculer la distance d entre les deux tableaux
    return d


d = np.inf # réel flottant supérieur à tous les autres
iter = 0
# Écrire ci-dessous la boucle correspondant à la méthode de relaxation


# Représentation graphique :
x = np.array([i*Delta_x for i in range(n+1)]) # tableau des abscisses
y = np.array([j*Delta_x for j in range(m+1)]) # tableau des ordonnées
valeurs = [-U + k*2*U/10 for k in range(1,11)] # liste des valeurs des équipotentielles à tracer
plt.contour(x,y,np.transpose(V1),valeurs,colors = 'gray') # tracé des équipotentielles (il faut donner à cette fonction la transposée de V1, cf. https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.contour.html)

def traceRectangle(xmin,xmax,ymin,ymax) : # fonction qui trace le rectangle de sommets opposés (xmin, ymin) et (xmax, ymax)
    plt.plot((xmin,xmin,xmax,xmax, xmin),(ymin, ymax,ymax, ymin,ymin
),color='black')

traceRectangle(Delta_x*(n/2-L/2), Delta_x*(n/2+L/2), Delta_x*(m/2+a
/2-e/2), Delta_x*(m/2+a/2+e/2)) # dessin de l'armature supérieure
traceRectangle(Delta_x*(n/2-L/2), Delta_x*(n/2+L/2), Delta_x*(m/2-a
/2-e/2), Delta_x*(m/2-a/2+e/2)) # dessin de l'armature inférieure
plt.axis('equal') # pour avoir la même échelle sur les deux axes
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.show()
