Skip to content
Snippets Groups Projects
Commit 5f1cf3e4 authored by fontchas5's avatar fontchas5
Browse files

suite python

parent 255a5acc
Branches
No related tags found
No related merge requests found
......@@ -125,10 +125,10 @@ femm.mi_addsegment(R,-b/2,R,b/2)
> **Remarque :** Ceci est la façon la plus basique de procéder, on aurait pu utiliser des fonctions plus évoluées comme `mi_drawpolyline`, `mi_drawpolygon` ou, encore mieux dans notre cas, `mi_drawrectangle`. Pour notre rectangle, on aurait donc pu faire :
> 1. `mi_drawpolyline([R,b/2;R+a,b/2;R+a,-b/2;R,-b/2;R,b/2])`
> 2. `mi_drawpolygon([R,b/2;R+a,b/2;R+a,-b/2;R,-b/2])`
> 3. `mi_drawrectangle(R,b/2,R+a,-b/2)`
> **Remarque :** Ceci est la façon la plus basique de procéder, on aurait pu utiliser des fonctions plus évoluées comme `mi_drawpolyline` (MATLAB uniquement), `mi_drawpolygon` (MATLAB uniquement) ou, encore mieux dans notre cas, `mi_drawrectangle`. Pour notre rectangle, on aurait donc pu faire :
> 1. `mi_drawpolyline([R,b/2;R+a,b/2;R+a,-b/2;R,-b/2;R,b/2])` (MATLAB)
> 2. `mi_drawpolygon([R,b/2;R+a,b/2;R+a,-b/2;R,-b/2])` (MATLAB)
> 3. `mi_drawrectangle(R,b/2,R+a,-b/2)` (MATLAB ou Python)
>
> Ce qui est évidemment beaucoup plus compact...
......
......@@ -72,9 +72,14 @@ Pour commencer nous choisirons un courant d'alimentation de 10 A efficaces à 1
**➤ Implantez le problème correspondant en laissant le maillage par défaut créé automatiquement par FEMM.**
> On n'oubliera pas de définir le matériau de l'inducteur correctement :
> * *MATLAB :*
> ```Matlab
> mi_addmaterial('Litz',1,1,0,0,sigmaCu,0,0,1,5,0,0,nbrins,dbrins);
> ```
> * *Python :*
> ```Python
> femm.mi_addmaterial('Litz',1,1,0,0,sigmaCu,0,0,1,5,0,0,nbrins,dbrins)
>```
> Et de donner la valeur max du courant dans le circuit.
Vous pouvez alors constater les imprécisions dues au manque de finesse du maillage en traçant la densité de courants induits dans l'Inox.
......@@ -108,16 +113,21 @@ Vous avez dû observer que plus la fréquence est élevée, moins le champ pén
Ceci se fait simplement en :
1. ne créant pas pas de *label* dans le bloc ;
2. sélectionnant le segment de bloc situé sur l'axe et en le détruisant avec un `mi_deleteselectedsegments;`. (**Attention :** faites-le après avoir créé la boîte infinie, donc après le `mi_makeABC();`).
2. sélectionnant le segment de bloc situé sur l'axe et en le détruisant avec un `mi_deleteselectedsegments`. (**Attention :** faites-le après avoir créé la boîte infinie, donc après le `mi_makeABC()s`).
Les trois segments de la pièce en inox restants sont désormais des frontières du domaine, nous devons donc leur imposer une condition traduisant notre problème (équivalente à la présence du matériau de l'autre côté). À fréquence élevée, le champ magnétique est nul à l'intérieur de la pièce à chauffer, et la densité de courant est purement surfacique (comme si elle n'existait que sur une épaisseur \\(\delta\\) très petite. Ainsi, en développant le saut de la composante tangentielle de \\({\bf h}\\) sur les bords du conducteur, on obtient la condition mixte suivante :
\\[\frac{\partial\\,{\bf \underline{a}}}{\partial n} + \frac{1+i}{\delta}\\,{\bf \underline{a}} = 0\\]
Dans FEMM, une telle condition se crée facilement avec :
* *MATLAB :*
```Matlab
mi_addboundprop('Impedance_surface',0,0,0,0,mur,sigmaInox,0,0,1,0,0);
```
* *Python :*
```Python
femm.mi_addboundprop('Impedance_surface',0,0,0,0,mur,sigmaInox,0,0,1,0,0)
```
Il nous reste un dernier petit souci à régler : le calcul de la densité de pertes dans la pièce en Inox. Puisqu'elle n'est plus maillée, on ne peut plus intégrer la densité de perte Joule à l'intérieur. Ce n'est pas gênant, on l'estimera par le calcul de la puissance dans l'inducteur vu ci-avant.
......@@ -134,10 +144,11 @@ Un exemple de calcul avec impédance de surface est donné ci-dessous :
**➤ Forts des résultats précédents, faites une simulation à la vraie fréquence de fonctionnement de la plaque : 25 kHz (avec seulement la condition d'impédance de surface).**
**➤ Trouvez la valeur du courant inducteur permettant d'atteindre l'ébullition en 2 minutes.**
**➤ Trouvez la valeur du courant inducteur permettant d'atteindre l'ébullition en 2 minutes grâce à un couplage faible avec la thermique.**
> **Cadeau :** Pour ce faire, je vous fournis ci-dessous un morceau de programme qui permet de résoudre le problème thermique (en transitoire) avec FEMM. Il est à exécuter après votre résolution magnétique permettant de calculer ce que j'ai appelée `Ptr` : la puissance transmise par l'inducteur à la casserole.
* *MATLAB :*
```Matlab
% A executer apres la resolution magnetoharmonique
% --> prend en entree : Ptr (= puissance transmise a la casserole)
......@@ -216,6 +227,103 @@ for n=1:npas
ho_close();
end
plot(t,Tmoy,'linewidth',2));
xlabel("Temps (en s)");
ylabel("Temperature moyenne (en K)");
title("Evolution de la temperature dans la casserole")
grid on
```
* *Python :*
```Python
# A executer apres la resolution magnetoharmonique
# --> prend en entree : Ptr (= puissance transmise a la casserole)
import matplotlib.pyplot as plt
R = 80 # inutile si deja defini
ep = 10 # meme chose
eb = 3 # epaisseur bord
hc = 100 # hauteur casserole
he = 80 # hauteur d'eau
Ta = 273+20 # Temperature ambiante
h = 10 # coeff. convection naturelle avec air
femm.newdocument(2) # nouveau pbm thermique
femm.hi_probdef('millimeters','axi',1e-8)
femm.hi_getmaterial('Water') # eau
femm.hi_modifymaterial('Water',0,'Eau')
femm.hi_getmaterial('347 Stainless Steel') # inox
femm.hi_modifymaterial('347 Stainless Steel',0,'Inox')
femm.hi_addboundprop('Convection',2, 0, 0, Ta, h, 0)
femm.hi_addconductorprop('P_transmise', 0, Ptr, 0)
femm.hi_addconductorprop('Temp_ini', Ta, 0, 1)
femm.hi_drawline(0,0,R,0)
femm.hi_drawline(R,0,R,ep)
femm.hi_drawline(R,ep,R,ep+hc)
femm.hi_drawline(R,ep+hc,R-eb,ep+hc)
femm.hi_drawline(R-eb,ep+hc,R-eb,ep+he)
femm.hi_drawline(R-eb,ep+he,R-eb,ep)
femm.hi_drawline(R-eb,ep,0,ep)
femm.hi_drawline(0,ep,0,0)
femm.hi_addnode(0,ep+he)
femm.hi_addsegment(0,ep,0,ep+he)
femm.hi_addsegment(0,ep+he,R-eb,ep+he)
femm.hi_zoomnatural()
femm.hi_addblocklabel(R/2,ep/2)
femm.hi_selectlabel(R/2,ep/2)
femm.hi_setblockprop('Inox', 1, 0, 1)
femm.hi_clearselected()
femm.hi_addblocklabel(R/2,ep+he/2)
femm.hi_selectlabel(R/2,ep+he/2)
femm.hi_setblockprop('Eau', 1, 0, 1)
femm.hi_clearselected()
femm.hi_selectsegment(R/2,0)
femm.hi_setsegmentprop('<none>', 0, 1, 0, 1, 'Temp_ini') # 1er calcul pour init
femm.hi_clearselected()
femm.hi_selectsegment(R,ep/2)
femm.hi_selectsegment(R,ep+hc/2)
femm.hi_selectsegment(R-eb/2,R-(hc-he)/2)
femm.hi_selectsegment(R/2,ep+he)
femm.hi_setsegmentprop('Convection', 0, 1, 0, 1, '<none>' )
femm.hi_clearselected()
# 1ere resolution pour fixer T = Ta partout
femm.hi_saveas('Temp0.FEH')
femm.hi_analyze()
# puissance transmise par l'inducteur
femm.hi_selectsegment(R/2,0)
femm.hi_setsegmentprop('<none>', 0, 1, 0, 1,'P_transmise')
# boucle pour regime transitoire
deltaT = 4 # pas de temps en secondes
npas = 30 # nombre de pas
t = np.linspace(0,npas*deltaT,npas+1) # temps
Tmoy = np.zeros(npas+1) # initialisation
Tmoy[0] = Ta
for n in range(npas):
nomfichier = "Temp{}.anh".format(n)
femm.hi_probdef('millimeters','axi',1.e-8,1,30,nomfichier,deltaT)
femm.hi_saveas("Temp{}.feh".format(n+1))
femm.hi_analyze()
femm.hi_loadsolution()
# recuperation de la temperature moyenne sur le fond interieur
femm.ho_addcontour(0,ep)
femm.ho_addcontour(R-eb,ep)
res = femm.ho_lineintegral(3)
Tmoy[n+1] = res[0]
femm.ho_close()
plt.plot(t,Tmoy,'b',lw=2)
plt.title('Évolution de la température dans la casserole')
plt.xlabel('Temps (en s)')
plt.ylabel('Température moyenne (en K)')
plt.grid()
plt.show()
```
> **Remarque :** Initialement, FEMM ne permettait de résoudre que des problèmes thermiques stationnaires. Depuis quelque temps, a été introduit un moyen permettant de résoudre le régime transitoire en chargeant une résolution précédente et un pas de temps dans la définition du problème. C'est ce qui est fait ci-dessus dans la boucle.
......
......@@ -41,11 +41,11 @@ Les valeurs des paramètres sont données par la table suivante :
> **Remarque :** Pensez à définir votre problème comme 2D cartésien de profondeur Lz.
>
> En MATLAB :
> * *MATLAB :*
> ```Matlab
> mi_probdef(0,'millimeters','planar',1e-8,Lz); % 1e-8 = precision du solveur
> ```
> En Python :
> * *Python :*
> ```Python
> femm.mi_probdef(0,'millimeters','planar',1e-8,Lz) # 1e-8 = precision du solveur
> ```
......@@ -89,6 +89,7 @@ Dans FEMM, vous pourrez :
**➤ À l'aide du théorème d'Ampère, développez un modèle analytique approché permettant de calculer la force, et vérifiez la concordance des ordres de grandeur.**
### Force en fonction de la position
Une fois que les calculs précédents validés, nous allons tracer la force en fonction de la position de la plaque (entrefer \\(e\\) variable).
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment