import numpy as np
import matplotlib.pyplot as plt

## Parametres du probleme en USI
e=1.6e-19 # charge elementaire
eps0=8.85e-12 # permittivite dielectrique du vide
k=1/(4*np.pi*eps0)
    
## Maillage de l'espace
n = 100 # Nombre de points de discretisation selon chaque direction
# 1/2 longueur selon chaque direction en USI
Lx = 0.1 
Ly = 0.1
# Listes des xi et des yj 
xlist = np.linspace(-Lx,Lx,n)
ylist = np.linspace(-Ly,Ly,n)
# Matrice correspondant au maillage de l'espace 2D
X, Y = np.meshgrid(xlist,ylist)

## Caracteristiques de la distribution de charges ponctuelles Pi source du champ : positions selon chaque direction, valeurs de chaque charge
distrib=[[0.05,0,e],[-0.05,0,-e]]

## Expression du champ electrostatique et du potentiel crees par la distribution
Ex=0   # initialisation de la composante suivant (Ox) du champ E(M)
Ey=0   # initialisation de la composante suivant (Oy) du champ E(M)
V=0    # initialisation du potentiel V(M)
for i in range(len(distrib)):
    inv_r=1.0/((X-distrib[i][0])**2+(Y-distrib[i][1])**2)**(0.5)  # 1/PiM avec Pi le point où se trouve la charge et M le point où on calcule E
    Ex=Ex+k*distrib[i][2]*(X-distrib[i][0])*inv_r**3
    Ey=Ey+k*distrib[i][2]*(Y-distrib[i][1])*inv_r**3
    V=V+k*distrib[i][2]*inv_r
Norme=(Ex**2+Ey**2)**0.5   # norme de champ E(M)


## Représentations graphiques
plt.streamplot(X,Y, Ex, Ey, color=np.log(Norme), density=2, cmap='jet') # trace les lignes de champ E(M)
plt.colorbar() # echelle de correspondance couleur-valeur de ln(norme)

CP=plt.contour(X,Y,V,200,cmap='jet') # trace les équipotentielles
plt.axis('equal') # repere norme
plt.grid()
plt.show()