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.
Figure pleine pageLe potentiel électrostatique en coordonnées cylindriques V(z,r) vérifie l'équation de Laplace :
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.
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 :
plotA.pdfV=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 :
plotB.pdfOn 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()plotC.pdf
Voici le tracé du champ électrique sur l'axe :
figure() z = laplace.get_z() plot(z,Ez[0,:]) xlabel('z') ylabel('Ez') grid()plotD.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()plotE.pdf
figure() z = laplace.get_z() plot(z,Ez[0,:]) xlabel('z') ylabel('Ez') grid()plotF.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')plotG.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()plotH.pdf
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 :
La figure suivante montre la géométrie des conducteurs, qui sont infinis dans la direction Z :
Figure pleine pageDans 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')plotI.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()plotJ.pdf
figure() x=laplace.get_x() plot(x,Ex[2**(n-1),:]) xlabel('x') ylabel('Ex') grid()plotK.pdf