Table des matières Python

Bobine épaisse : éléments finis

1. Introduction

Ce document présente le calcul du champ magnétique créé par une bobine à symétrie axiale et de son coefficient d'auto-inductance, par résolution numérique de l'équation de Poisson pour le potentiel vecteur.

Nous faisons la résolution par éléments finis avec le logiciel libre Finite Element Method Magnetic. Nous utilisons l'interface pour Python (pyfemm), qui permet de piloter le logiciel depuis un script Python (le logiciel doit être installé). Ce script permet de définir une géométrie complexe dépendant d'un ou de plusieurs paramètres et d'obtenir des tracés de champ sur des courbes particulières. Les commandes de l'interface Python sont des répliques des opérations que l'on effectue lorsqu'on utilise directement l'interface utilisateur. Il faut donc bien se familiariser avec cette interface avant d'aborder l'écriture des scripts Python.

Le logiciel FEMM permet d'effectuer la résolution numérique d'un problème de magnétostatique (ou d'électrostatique ou de diffusion thermique) par la méthode des éléments finis. Il résout les problèmes bidimensionnels, en géométrie plane ou axisymétrique. Contrairement au logiciel FreeFEM, dont l'utilisation pour un problème de magnétostatique est exposée dans Équation de Poisson : méthode des éléments finis, le logiciel FEMM peut être utilisé sans aucune connaissance sur la méthode des éléments finis ni même des équations de la magnétostatique. Le système magnétique est en effet défini directement par ses caractéristiques physiques.

La bobine étudiée est identique à celle étudiée dans Bobine épaisse : différences finies.

2. Définition de la bobine

On considère une bobine à symétrie axiale, modélisée par une densité de courant volumique orthoradiale.

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

La bobine est un tore de section rectangulaire, de longueur , d'épaisseur e et de rayon moyen a.

Le potentiel vecteur vérifie l'équation de Poisson en coordonnées cylindriques :

2(Aθeθ)=-μ0Jθeθ(1)

En présence d'un noyau en matériau ferromagnétique doux (fer ou ferrite), la perméabilité magnétique dans le noyau est μ0μr .

r(1r(rAθ)r)+2Aθz2=-μ0Jθ(2)

Le champ magnétique (rotationnel du potentiel vecteur) est :

Br=-Aθz(3)Bz=1r(rAθ)r(4)

On définit aussi le nombre de spires N et l'intensité du courant If dans le fil.

L'énergie magnétique (énergie à fournir pour établir le champ) s'écrit :

Em=12VJAdv=12VJθAθdv(5)

V désigne le volume de la bobine (volume du tore). L'énergie s'exprime aussi à l'aide du coefficient d'auto-inductance :

Em=12LIf2(6)

Il s'en suit que l'auto-inductance L peut être calculée par :

L=VJθAθdv(7)

Jθ est la densité de courant pour If=1A. L'auto-inductance dépend du nombre de spires : elle est proportionnelle à N2. Pour une taille de bobine donnée, elle dépend donc du diamètre du fil. Il peut être intéressant de calculer l'auto-inductance pour N=1, valeur qu'il faudra multiplier par N2. La valeur pour N=1 est obtenue avec un courant total dans une section du tore de 1 ampère.

3. Bobine longue sans noyau

On commence par définir le type de problème à résoudre (magnétostatique) et la géométrie (axisymétrique) :

bobineNoyau.py
import femm 
import numpy as np
import matplotlib.pyplot as plt
from os.path import exists

femm.openfemm()
femm.newdocument(0)
# 0 : magnetic, 1 : electrostatic, 2 ; heat flow, 3 : current flow
femm.mi_probdef(0, 'meters', 'axi', 1.0e-8, 0, 30)               
                

On définit les paramètres géométriques pour la bobine et un éventuel noyau; l'unité est le mètre (comme défini ci-dessus).

Rb = 1/16 # rayon moyen de la bobine
e = 1/32# épaisseur de la bobine
lb = 5/32 # longueur de la bobine
ln = lb # longueur du noyau
zn = 0 # position du noyau
R1 = 400e-3 # rayon du domaine
noyau = False
If = 1 # courant dans le fil
df = 1e-3 #diamètre du fil
N = e/df*lb/df # nombre de spires          
                

La fonction mi_addmaterial permet de définir un matériau par ses propriétés physiques. Il y a 13 propriétés mais la fonction mi_addmaterial a un nombre de paramètres variables. Nous n'utilisons que les 5 premiers paramètres :

Nous n'utilisons pas la densité de courant pour définir les courants dans la bobine (voir plus loin). La conductivité électrique du cuivre est définie par principe mais elle ne sert pas dans notre simulation.

Voici les trois matériaux :

femm.mi_addmaterial('Air', 1, 1)
femm.mi_addmaterial('Cuivre', 1, 1, 0, 0, 58)
femm.mi_addmaterial('Fer', 1000, 1000)
          

Le courant dans la bobine est défini par un circuit (qui correspond au fil) :

femm.mi_addcircprop('1+',If,1)  
          

La bobine et le noyau sont définis géométriquement par deux rectangles. Les coordonnées sont dans l'ordre (r,z).

femm.mi_drawrectangle(Rb-e/2,-lb/2,Rb+e/2,lb/2) 
if noyau:
    femm.mi_drawrectangle(0,zn-ln/2,Rb-e/2,zn+ln/2)     
          

On affecte les matériaux Air et Fer aux domaines correspondants :

femm.mi_addblocklabel(0,R1/2) # air
femm.mi_selectlabel(0,R1/2)
femm.mi_setblockprop('Air', 0, 1e-3, '<None>', 0, 0, 0)
femm.mi_clearselected()

if noyau:
    femm.mi_addblocklabel((Rb-e/2)/2,0) # fer
    femm.mi_selectlabel((Rb-e/2)/2,0)
    femm.mi_setblockprop('Fer', 0 1e-3, '<None>', 0, 0, 0)
    femm.mi_clearselected()     
          

Le second argument de la fonction mi_setblockprop indique que la finesse du maillage est donnée par le troisième argument.

Pour le domaine de cuivre de la bobine, on précise le circuit et le nombre de spires. La densité de courant est :

Jθ=NIfe(8)
femm.mi_addblocklabel(Rb,0) 
femm.mi_selectlabel(Rb,0) 
femm.mi_setblockprop('Cuivre', 0 ,1e-3, '1+', 0, 0,N)
femm.mi_clearselected() 
          

Le circuit 1+ est affecté au rectangle qui définit la bobine. On pourrait tout aussi bien définir la densité de courant dans mi_addmaterial('Cuivre',..) et ne pas définir de circuit.

Remarquons que la densité de courant est uniforme sur une section du tore donc le modèle correspond a des fils de section carrée.

Il faut définir une frontière globale pour le domaine et de la condition limite sur cette frontière. Dans le cas présent, cette frontière doit être relativement loin de la bobine et elle doit simuler un milieu ouvert, c'est-à-dire un milieu sans frontière. La fonction mi_makeABC permet de définir une série de cercles concentriques à la périphérie du domaine, avec des conditions limites sur ces cercles qui permettent de simuler un milieu ouvert. On doit préciser le nombre de cercle (entre 1 et 10), le rayon, les coordonnées du centre et la condition sur le plus grand cercle (0 pour Dirichlet, 1 pour Neumann).

femm.mi_makeABC(5,R1,0,0,0) # frontière ouverte            
                   

La dernière étape consiste à sauvegarder la configuration dans un fichier et à lancer l'analyse puis la résolution numérique.

femm.mi_zoomnatural()
femm.mi_saveas('aimant-bobine.fem')
femm.mi_analyze()
femm.mi_loadsolution()                
                   

Voici le calcul de l'auto-inductance et, pour comparaison, celle obtenue avec le modèle du solénoïde infini (sans noyau) :

femm.mo_selectblock(Rb,0)
LL = femm.mo_blockintegral(0) # intégrale de Atheta*j
print("L = ",LL)
#solénoide infini
LLinf = 4*np.pi*1e-7*np.pi*Rb**2*N**2/lb
print("L(inf) = ",LLinf)             
                   

Pour finir, on trace le champ magnétique sur l'axe de la bobine et dans le plan z=0 :

z = np.linspace(-0.4,0.4,1000)
Bz = np.zeros(len(z))
for k in range(len(z)):
    v = femm.mo_getpointvalues(0,z[k])
    Bz[k] = v[2]
plt.figure()
plt.plot(z,Bz)
plt.xlabel('z')
plt.ylabel('Bz (r=0)')
plt.grid()
np.savetxt("bobine-Bz(r=0).txt",np.array([z,Bz]).T)

r = np.linspace(0,0.4,1000)
Bz = np.zeros(len(r))
for k in range(len(r)):
    v = femm.mo_getpointvalues(r[k],0)
    Bz[k] = v[2]   
plt.figure()
plt.plot(r,Bz)
plt.xlabel('r')
plt.ylabel('Bz (z=0)')
plt.grid()
np.savetxt("bobine-Bz(z=0).txt",np.array([r,Bz]).T)

plt.show()
femm.closefemm()               
                   

Voici les lignes de champ magnétique :

bobine

Voici le champ sur l'axe de la bobine :

from matplotlib.pyplot import *
import numpy as np

[z,Bz] = np.loadtxt("bobine-Bz(r=0).txt",unpack=True)
figure(figsize=(10,5))
plot(z,Bz)
xlabel('z (m)',fontsize=18)
ylabel('Bz (r=0) (T)',fontsize=18)
grid()
                   
fig1fig1.pdf

On peut comparer au champ sur l'axe d'une bobine constituée de spires de rayons a, dont l'expression analytique est connue :

Bz(z)=μ0 NIf2(z+2(a2+(a+2)2)12-z-2(a2+(a-2)2)12)(9)
mu0 = 4*np.pi*1e-7
If = 1.0 # courant dans le fil
a = Rb = 1/16 # rayon de la bobine
e = 1/32# épaisseur de la bobine
lb = 5/32 # longueur de la bobine
df = 1e-3 #diamètre du fil
N = e/df*lb/df # nombre de spires 
Bz_spires = mu0*N*If/(2*lb)*((z+lb/2)/(a**2+(z+lb/2)**2)**(1/2)-(z-lb/2)/(a**2+(z-lb/2)**2)**(1/2))
figure(figsize=(10,5))
plot(z,Bz)
plot(z,Bz_spires,"r--")
xlabel('z',fontsize=16)
ylabel(r'$B_z (T)$',fontsize=16)
grid()  
            
fig2fig2.pdf

Pour le champ sur l'axe, la bobine épaisse est équivalente à une bobine d'épaisseur négligeable dont le rayon est égal au rayon moyen.

Voici le champ dans le plan z=0 :

[r,Bz] = np.loadtxt("bobine-Bz(z=0).txt",unpack=True)
figure(figsize=(10,5))
plot(r,Bz)
xlabel('r (m)',fontsize=18)
ylabel('Bz (z=0) (T)',fontsize=18)
grid()
                   
fig3fig3.pdf

Voici les valeurs de l'auto-inductance (en henry) :

L =  1.402811982050394
L(inf) =  2.3530970576022523
                   

La valeur donnée par le modèle du solénoïde infini est nettement plus grande.

Voici les résultats avec une bobine deux fois plus longue :

bobine
[z,Bz] = np.loadtxt("bobine-2-Bz(r=0).txt",unpack=True)
figure(figsize=(10,5))
plot(z,Bz)
xlabel('z (m)',fontsize=18)
ylabel('Bz (r=0) (T)',fontsize=18)
grid()
                   
fig4fig4.pdf
mu0 = 4*np.pi*1e-7
If = 1.0 # courant dans le fil
a = Rb = 1/16 # rayon de la bobine
e = 1/32# épaisseur de la bobine
lb = 5/32*2 # longueur de la bobine
df = 1e-3 #diamètre du fil
N = e/df*lb/df # nombre de spires 
Bz_spires = mu0*N*If/(2*lb)*((z+lb/2)/(a**2+(z+lb/2)**2)**(1/2)-(z-lb/2)/(a**2+(z-lb/2)**2)**(1/2))
figure(figsize=(10,5))
plot(z,Bz)
plot(z,Bz_spires,"r--")
xlabel('z',fontsize=16)
ylabel(r'$B_z (T)$',fontsize=16)
grid()  
            
fig5fig5.pdf
[r,Bz] = np.loadtxt("bobine-2-Bz(z=0).txt",unpack=True)
figure(figsize=(10,5)) 
plot(r,Bz)
xlabel('r (m)',fontsize=18)
ylabel('Bz (z=0) (T)',fontsize=18)
grid()
                   
fig6fig6.pdf
L =  3.32682784289769 
L(inf) =  4.706194115204505
                   

Nous avons vérifié que cercle définissant le bord du domaine n'est pas trop petit : une augmentation d'un facteur 2 de son rayon a très peu d'effet sur la valeur de l'auto-inductance.

4. Bobine longue avec noyau

Le noyau est en fer doux, de perméabilité relative 1000.

Voici les lignes de champ magnétique :

bobine

Voici le champ sur l'axe de la bobine :

from matplotlib.pyplot import *
import numpy as np

[z,Bz] = np.loadtxt("bobine-noyau-Bz(r=0).txt",unpack=True)
figure(figsize=(10,5))
plot(z,Bz)
xlabel('z (m)',fontsize=18)
ylabel('Bz (r=0) (T)',fontsize=18)
grid()
                   
fig7fig7.pdf

et le champ dans le plan z=0 :

[r,Bz] = np.loadtxt("bobine-noyau-Bz(z=0).txt",unpack=True)
figure(figsize=(10,5))
plot(r,Bz)
xlabel('r (m)',fontsize=18)
ylabel('Bz (z=0) (T)',fontsize=18)
grid()
                   
fig8fig8.pdf

Voici l'auto-inductance :

L =  5.799335307148285
L(inf) =  2.3530970576022523
                   

La présence du noyau augmente l'auto-inductance d'un facteur 4,1.

Voici les résultats avec une bobine deux fois plus longue :

bobine
[z,Bz] = np.loadtxt("bobine-2-noyau-Bz(r=0).txt",unpack=True)
figure(figsize=(10,5))
plot(z,Bz)
xlabel('z (m)',fontsize=18)
ylabel('Bz (r=0) (T)',fontsize=18)
grid()
                   
fig9fig9.pdf
[r,Bz] = np.loadtxt("bobine-2-noyau-Bz(z=0).txt",unpack=True)
figure(figsize=(10,5))
plot(r,Bz)
xlabel('z (m)',fontsize=18)
ylabel('Bz (z=0) (T)',fontsize=18)
grid()
                   
fig10fig10.pdf
L =  27.73946443527697
L(inf) =  4.706194115204505
                   

Pour cette bobine plus longue, la présence du noyau augmente l'auto-inductance d'un facteur 8,4. Plus la bobine est longue, plus la présence du noyau augmente l'auto-inductance. L'effet maximal est obtenu avec un noyau de forme torique, qui donne une augmentation de l'ordre de la perméabilité magnétique relative.

Le déplacement du noyau permet de faire varier l'auto-inductance :

bobine
[z,Bz] = np.loadtxt("bobine-3-noyau-Bz(r=0).txt",unpack=True)
figure(figsize=(10,5))
plot(z,Bz)
xlabel('z (m)',fontsize=18)
ylabel('Bz (r=0) (T)',fontsize=18)
grid()
                   
fig11fig11.pdf
[r,Bz] = np.loadtxt("bobine-3-noyau-Bz(z=0).txt",unpack=True)
figure(figsize=(10,5))
plot(r,Bz)
xlabel('r (m)',fontsize=18)
ylabel('Bz (z=0) (T)',fontsize=18)
grid()
                   
fig12fig12.pdf
L =  21.8181992403772
L(inf) =  4.706194115204505 
                   
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.