Table des matières Python

Lentille électrostatique à deux conducteurs

1. Système étudié

Les lentilles électrostatiques étaient utilisées dans les premiers microscopes électroniques. Dans sa forme la plus simple, une lentille électrostatique est constituée de deux conducteurs cylindriques auquels on applique une différence de potentiel. Il s'agit d'un problème à symétrie axiale.

../../../../figures/sciphys/elecmag/lentille/lentille.svgFigure pleine page

Le potentiel électrostatique en coordonnées cylindriques V(z,r) vérifie l'équation de Laplace :

1rr(rVr)+2Vz2=0(1)

Cette équation est discrétisée comme expliquée dans Discrétisation de l'équation de Poisson en géométrie axiale. La méthode itérative de Gauss-Seidel est utilisée pour résoudre le système d'équations linéaires obtenues.

Pour le module Python utilisé voir : Équation de Poisson : module python.

Le domaine de calcul rectangulaire est représenté sur la figure. Pour respecter la symétrie du problème, on choisit d'imposer un potentiel nul sur les bords du domaine, et deux potentiels opposés sur les conducteurs.

2. Calcul en géométrie axiale

Le problème est défini pour r>0. Il y donc deux conducteurs à placer, qui sont définis sur un maillage réduit de 64 par 32. Le maillage fin sur lequel le calcul est effectué est de 512 par 256.

from matplotlib.pyplot import *
import math
import numpy
import poisson.main
n=8
p=5 
levels = n-p+1 
laplace=poisson.main.PoissonAxial(p+1,p,levels,1.0,0.5,x0=-0.5,y0=0.0)
laplace.laplacien()
laplace.dirichlet_borders(0.0)
rayon = 2
longueur = 20
distance = 6
laplace.dirichlet_polygon(2**p-distance/2,rayon,[-longueur],[0],1.0)
laplace.dirichlet_polygon(2**p+distance/2,rayon,[longueur],[0],-1.0)
result=laplace.iterations_norm(20,50,threads=4,omega=1.9)
figure(figsize=(8,4))
plot(result[0],result[1])
xlabel('niter')  
ylabel('norm') 
            

La norme de la matrice des valeurs de V permet de contrôler la convergence des itérations de Gauss-Seidel :

plotAplotA.pdf
 
V=laplace.get_array(symetry=True) 
Ez=-laplace.get_derivZ()
Er=-laplace.get_derivR()
extent = laplace.get_extent(symetry=True)
figure(figsize=(8,8))
contour(V,20,extent=extent)
imshow(~laplace.get_mask(symetry=True),extent=extent,alpha=0.5, cmap=cm.gray)
xlabel('z')
ylabel('r')
grid()
            

Lignes équipotentielles :

plotBplotB.pdf

On s'intéresse surtout à la zone centrale, qui constitue la lentille électrostatique :

figure(figsize=(8,8))
contour(V,20,extent=extent)
imshow(~laplace.get_mask(symetry=True),extent=extent,alpha=0.5, cmap=cm.gray)
axis([-0.2,0.2,-0.2,0.2])
xlabel('z')
ylabel('r')
grid()
            
plotCplotC.pdf

Voici le tracé du champ électrique sur l'axe :

figure()
z = laplace.get_z()
plot(z,Ez[0,:])
xlabel('z')
ylabel('Ez')
grid()
            
plotDplotD.pdf

On reprend le calcul en réduisant la distance entre les deux conducteurs :

n=8
p=5 
levels = n-p+1 
laplace=poisson.main.PoissonAxial(p+1,p,levels,1.0,0.5,x0=-0.5,y0=0.0)
laplace.laplacien()
laplace.dirichlet_borders(0.0)
rayon = 2
longueur = 20
distance = 2
laplace.dirichlet_polygon(32-distance/2,rayon,[-longueur],[0],1.0)
laplace.dirichlet_polygon(32+distance/2,rayon,[longueur],[0],-1.0)
result=laplace.opencl_iterations_norm(20,50,omega=1.9)
V=laplace.get_array(symetry=True) 
Ez=-laplace.get_derivZ()
Er=-laplace.get_derivR()
extent = laplace.get_extent(symetry=True)
figure(figsize=(8,8))
contour(V,20,extent=extent)
imshow(~laplace.get_mask(symetry=True),extent=extent,alpha=0.5, cmap=cm.gray)
axis([-0.2,0.2,-0.2,0.2])
xlabel('z')
ylabel('r')
grid()
            
plotEplotE.pdf
figure()
z = laplace.get_z()
plot(z,Ez[0,:])
xlabel('z')
ylabel('Ez')
grid()
            
plotFplotF.pdf

La réduction de la distance a pour effet d'augmenter la valeur maximale du champ.

Reprenons le même calcul en utilisant une méthode itérative multigrille :

n=8
p=5 
levels = n-p+1 
laplace=poisson.main.PoissonAxial(p+1,p,levels,1.0,0.5,x0=-0.5,y0=0.0)
laplace.laplacien()
laplace.dirichlet_borders(0.0)
rayon = 2
longueur = 20
distance = 2
laplace.dirichlet_polygon(32-distance/2,rayon,[-longueur],[0],1.0)
laplace.dirichlet_polygon(32+distance/2,rayon,[longueur],[0],-1.0)
result1=laplace.multigrid_Vcycles_norm(1,levels,50,2,2,20)
figure(figsize=(8,6))
plot(result[0],result[1],label='1 grille')
plot(result1[0],result1[1],label='4 grilles')
xlabel('niter')  
ylabel('norm') 
legend(loc='lower right')
            
plotGplotG.pdf

La méthode multigrille apporte une augmentation très importante de la vitesse de convergence, comparée à la méthode monogrille (Gauss-Seidel) avec sur-relaxation.

 
V=laplace.get_array(symetry=True) 
Ez=-laplace.get_derivZ()
Er=-laplace.get_derivR()
extent = laplace.get_extent(symetry=True)
figure(figsize=(8,8))
contour(V,20,extent=extent)
imshow(~laplace.get_mask(symetry=True),extent=extent,alpha=0.5, cmap=cm.gray)
xlabel('z')
ylabel('r')
grid()
            
plotHplotH.pdf

3. Calcul en coordonnées cartésiennes

Compte tenu de la difficulté de la discrétisation du laplacien en symétrie axiale, on peut chercher à traiter un problème analogue en coordonnées cartésiennes, avec l'équation de Laplace suivante :

2Vx2+2Vy2=0

La figure suivante montre la géométrie des conducteurs, qui sont infinis dans la direction Z :

../../../../figures/sciphys/elecmag/lentille/lentille-cartesienne.svgFigure pleine page

Dans ce cas, il faut définir 4 conducteurs. Pour comparer au calcul précédent, il faut utiliser un maillage carré de 512 par 512.

n=9
p=6 
levels = n-p+1 
laplace=poisson.main.Poisson(p,p,levels,1.0,1.0,x0=-0.5,y0=-0.5)
laplace.laplacien()
laplace.dirichlet_borders(0.0)
rayon = 2
longueur = 20
distance = 2
laplace.dirichlet_polygon(32-distance/2,32-rayon,[-longueur],[0],1.0)
laplace.dirichlet_polygon(32-distance/2,32+rayon,[-longueur],[0],1.0)
laplace.dirichlet_polygon(32+distance/2,32-rayon,[longueur],[0],-1.0)
laplace.dirichlet_polygon(32+distance/2,32+rayon,[longueur],[0],-1.0)
result=laplace.multigrid_Vcycles_norm(1,levels,50,2,1,20)
figure(figsize=(8,4))
plot(result[0],result[1])
xlabel('niter')  
ylabel('norm') 
            
plotIplotI.pdf
 
V=laplace.get_array() 
Ex=-laplace.get_derivX()
Ey=-laplace.get_derivY()
extent = laplace.get_extent()
figure(figsize=(8,8))
contour(V,20,extent=extent)
imshow(~laplace.get_mask(),extent=extent,alpha=0.5, cmap=cm.gray)
xlabel('z')
ylabel('r')
grid()
            
plotJplotJ.pdf
figure()
x=laplace.get_x()
plot(x,Ex[2**(n-1),:])
xlabel('x') 
ylabel('Ex')
grid()
            
plotKplotK.pdf
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.