diff --git a/TP-FEMM/src/aimant.md b/TP-FEMM/src/aimant.md index df5658865c51f08267312252d72fa55b84427f21..ef04c1ea6c660369fcb9370b6adaeaa0558cb2a1 100644 --- a/TP-FEMM/src/aimant.md +++ b/TP-FEMM/src/aimant.md @@ -15,6 +15,7 @@ On prendra des dimensions similaires à celles de l'intérieur de la bobine pré ### Méthode « classique » Le début du programme sera donc identique au précédent. Dans un fichier `aimant.m`, on rentre : +* *MATLAB :* ```Matlab % Fichier aimant.m simulant l'aimant du second tuto avec FEMM close all @@ -42,6 +43,33 @@ mi_addsegment(0,b/2,0,Rdom); mi_addarc(0,-Rdom,0,Rdom,180,5); mi_zoomnatural; ``` +* *Python :* +```Python +# Fichier aimant.py simulant l'aimant du second tuto avec FEMM +import numpy as np +import femm + + +# Donnes probleme +R = 10 # mm +b = 20 # mm +Rdom = 10*np.sqrt(R**2+(b/2)**2) # on prend un domaine tres large + +femm.openfemm() +femm.newdocument(0) # nouveau pbm magnetique +femm.mi_probdef(0,'millimeters','axi') # frequence = 0, en mm, axisymetrique + +# Geometrie +femm.mi_drawrectangle(0,b/2,R,-b/2) # aimant +# domaine : +femm.mi_addnode(0,-Rdom) +femm.mi_addnode(0,Rdom) +femm.mi_addsegment(0,-Rdom,0,-b/2) +femm.mi_addsegment(0,b/2,0,Rdom) +femm.mi_addarc(0,-Rdom,0,Rdom,180,5) +femm.mi_zoomnatural() +``` + Dans un premier temps, nous choisissons un domaine très large : 10 fois la diagonale du bloc "aimant", pour être certain de ne pas dénaturer le problème. @@ -56,6 +84,7 @@ La courbe \\(B(H)\\) d'un aimant peut se représenter de la façon suivante : FEMM utilise la droite passant par \\((-H_c, 0)\\) et \\((0,B_r)\\). On voit alors directement que : \\[H_c = \frac{B_r}{\mu_0\\,\mu_r}\\] Finalement, on peut créer nos matériaux et les affecter aux régions correspondantes. Et on ajoute la condition aux limites de Dirichlet sur le bord : +* *MATLAB :* ```Matlab Br = 1.2; % T mu0 = 4e-7*pi; @@ -81,10 +110,37 @@ mi_clearselected; mi_saveas('aimant.FEM'); ``` +* *Python :* +```Python +Br = 1.2 # T +mu0 = 4e-7*np.pi +mur = 1.05 +Hc = Br/(mu0*mur) + +femm.mi_addmaterial('Air',1,1) +femm.mi_addmaterial('Aimant',mur,mur,Hc) + +femm.mi_addblocklabel(R/2,0) +femm.mi_selectlabel(R/2,0) +femm.mi_setblockprop('Aimant',1,0,0,90,2,0) # automesh, 90° pour aimantion, groupe 2 +femm.mi_clearselected() +femm.mi_addblocklabel(Rdom/2,0) +femm.mi_selectlabel(Rdom/2,0) +femm.mi_setblockprop('Air',1,0,0,0,1,0) # automesh, groupe 1 +femm.mi_clearselected() + +femm.mi_addboundprop('a=0',0,0,0,0) +femm.mi_selectarcsegment(Rdom,0) +femm.mi_setarcsegmentprop(5,'a=0',0,1) +femm.mi_clearselected() + +femm.mi_saveas('aimant.FEM') +``` Nous avons volontairement laissé le choix de discrétisation automatique (*automesh*) pour voir. On peut alors résoudre, visualiser les résultats et calculer l'énergie magnétique due à l'aimant : +* *MATLAB :* ```Matlab mi_analyze(); mi_loadsolution; @@ -93,6 +149,16 @@ mo_groupselectblock(); Wmag = mo_blockintegral(2); mo_clearblock; ``` +* *Python :* +```Python +femm.mi_analyze() +femm.mi_loadsolution() + +femm.mo_groupselectblock() +Wmag = femm.mo_blockintegral(2) +femm.mo_clearblock() +``` + **➤ Observez l'inversion de la direction de \\({\bf h}\\) dans l'aimant (avec le tracé de vecteurs) ainsi que l'ordre de grandeur de l'énergie par rapport à celle de la bobine précédente.** @@ -122,6 +188,8 @@ Cependant, pour de gros problèmes basés sur des géométries complexes nécess ### Transformation de Kelvin Reprenons le problème précédent en le modifiant légèrement. Le rayon du domaine Rdom est réduit et nous ajoutons au dessus de celui-ci une petite sphère de rayon Rext. + +* *MATLAB :* ```Matlab % Fichier aimant_TK.m simulant l'aimant du second tuto avec FEMM % Version avec transfo de Kelvin (region exterieure) @@ -155,9 +223,43 @@ mi_addsegment(0,Rdom,0,Rdom+2*Rext); mi_addarc(0,Rdom,0,Rdom+2*Rext,180,5); mi_zoomnatural; ``` +* *Python :* +```Python +# Fichier aimant_TK.py simulant l'aimant du second tuto avec FEMM +# Version avec transfo de Kelvin (region exterieure) + +import numpy as np +import femm + + +# Donnes probleme +R = 10 # mm +b = 20 # mm +Rdom = 2*np.sqrt(R**2+(b/2)**2) # on prend un domaine reduit +Rext = Rdom/4 # rayon region exterieure + +femm.openfemm() +femm.newdocument(0) # nouveau pbm magnetique +femm.mi_probdef(0,'millimeters','axi') # frequence = 0, en mm, axisymetrique + +# Geometrie +femm.mi_drawrectangle(0,b/2,R,-b/2) # aimant +# domaine : +femm.mi_addnode(0,-Rdom) +femm.mi_addnode(0,Rdom) +femm.mi_addsegment(0,-Rdom,0,-b/2) +femm.mi_addsegment(0,b/2,0,Rdom) +femm.mi_addarc(0,-Rdom,0,Rdom,180,5) +# region exterireure : +femm.mi_addnode(0,Rdom+2*Rext) +femm.mi_addsegment(0,Rdom,0,Rdom+2*Rext) +femm.mi_addarc(0,Rdom,0,Rdom+2*Rext,180,5) +femm.mi_zoomnatural() +``` Nous créons ensuite nos matériaux comme précédemment, mais en plus nous ajoutons ce que FEMM appelle une « région extérieure » associée à notre problème et que nous lions à notre petite sphère (définie comme de l'air environnant). +* *MATLAB :* ```Matlab Br = 1.2; % T mu0 = 4e-7*pi; @@ -183,9 +285,37 @@ mi_setblockprop('Air',1,0,0,0,1,0); % automesh, groupe 1 mi_attachouterspace; % dans region exterieure mi_clearselected; ``` +* *Python :* +```Python +Br = 1.2 # T +mu0 = 4e-7*np.pi +mur = 1.05 +Hc = Br/(mu0*mur) + +femm.mi_addmaterial('Air',1,1) +femm.mi_addmaterial('Aimant',mur,mur,Hc) +femm.mi_defineouterspace(Rdom+Rext/2,Rext,Rdom) # region exterieure + +femm.mi_addblocklabel(R/2,0) +femm.mi_selectlabel(R/2,0) +femm.mi_setblockprop('Aimant',1,0,0,90,2,0) # automesh, 90° pour aimantion, groupe 2 +femm.mi_clearselected() +femm.mi_addblocklabel(Rdom/2,0) +femm.mi_selectlabel(Rdom/2,0) +femm.mi_setblockprop('Air',1,0,0,0,1,0) # automesh, groupe 1 +femm.mi_clearselected() + +femm.mi_addblocklabel(Rext,Rdom+Rext) +femm.mi_selectlabel(Rext/2,Rdom+Rext) +femm.mi_setblockprop('Air',1,0,0,0,1,0) # automesh, groupe 1 +femm.mi_attachouterspace() # dans region exterieure +femm.mi_clearselected() +``` + Il ne reste plus qu'à créer une condition de périodicité liant le bord du domaine à celui de la région extérieure. +* *MATLAB :* ```Matlab % condition de periodicite : mi_addboundprop('Periodique',0,0,0,0,0,0,0,0,4); @@ -196,12 +326,26 @@ mi_clearselected; mi_saveas('aimant.FEM'); ``` +* *Python :* +```Python +# condition de periodicite : +femm.mi_addboundprop('Periodique',0,0,0,0,0,0,0,0,4) +femm.mi_selectarcsegment(Rdom,0) # bord domaine +femm.mi_selectarcsegment(Rext,Rdom+Rext) # bord region exterieure +femm.mi_setarcsegmentprop(5,'Periodique',0,1) +femm.mi_clearselected() + +femm.mi_saveas('aimant.FEM') +``` + + #### Comment ça marche ? Dans la région extérieure, la formulation a été modifiée par un changement de variable \\(r \mapsto R\\) tel que \\(\frac{1}{R} \to 0\\) lorsqu'on s'approche du centre de la petite sphère. Ainsi, le centre de la région est équivalent à l'\\(\infty\\). Le lien avec le domaine d'étude est assuré par une condition de périodicité égalisant les valeurs de \\(a_\theta\\) sur leurs frontières respectives. **Pour simplifier : tout se passe comme si on avait « replié » la partie de l'espace située en dehors du domaine d'étude dans la petite sphère du dessus.** On peut ensuite résoudre notre problème et calculer l'énergie : +* *MATLAB :* ```Matlab mi_analyze(); mi_loadsolution; @@ -210,6 +354,16 @@ mo_groupselectblock(); Wmag = mo_blockintegral(2); mo_clearblock; ``` +* *Python :* +```Python +femm.mi_analyze() +femm.mi_loadsolution() + +femm.mo_groupselectblock() +Wmag = femm.mo_blockintegral(2) +femm.mo_clearblock() +``` + Calculons l'énergie pour les deux dernières valeurs de Rdom du paragraphe précédent : @@ -239,6 +393,7 @@ Même si cette technique est moins rigoureuse, mathématiquement parlant, que la * une seule instruction : `mi_makeABC();` (les options par défaut sont, la plupart du temps, très bien choisies). Le script pour résoudre complètement notre problème devient ainsi plus concis : +* *MATLAB :* ```Matlab % Fichier aimant_OB.m simulant l'aimant du second tuto avec FEMM % Version avec condition « open boundary » @@ -289,6 +444,58 @@ Wmag = mo_blockintegral(2); mo_clearblock; ``` +* *Python :* +```Python +# Fichier aimant_OB.py simulant l'aimant du second tuto avec FEMM +# Version avec condition « open boundary » + +import numpy as np +import femm + + +# Donnes probleme +R = 10 # mm +b = 20 # mm + +femm.openfemm() +femm.newdocument(0) # nouveau pbm magnetique +femm.mi_probdef(0,'millimeters','axi') # frequence = 0, en mm, axisymetrique + +# Geometrie +femm.mi_drawrectangle(0,b/2,R,-b/2) # aimant +femm.mi_makeABC() # domaine (open boudary) +femm.mi_zoomnatural() + +# Physique +Br = 1.2 # T +mu0 = 4e-7*np.pi +mur = 1.05 +Hc = Br/(mu0*mur) + +femm.mi_addmaterial('Air',1,1) +femm.mi_addmaterial('Aimant',mur,mur,Hc) + +femm.mi_addblocklabel(R/2,0) +femm.mi_selectlabel(R/2,0) +femm.mi_setblockprop('Aimant',1,0,0,90,2,0) +femm.mi_clearselected() +femm.mi_addblocklabel(1.2*R,0) +femm.mi_selectlabel(1.2*R,0) +femm.mi_setblockprop('Air',1,0,0,0,1,0) +femm.mi_clearselected() + +femm.mi_saveas('aimant.FEM') + +femm.mi_analyze() +femm.mi_loadsolution() + +femm.mo_groupselectblock() +Wmag = femm.mo_blockintegral(2) +femm.mo_clearblock() +``` + + + On obtient alors les résultats décrits par la figure et la table ci-dessous :  diff --git a/TP-FEMM/src/bonnes_pratiques.md b/TP-FEMM/src/bonnes_pratiques.md index aa364ea8f30c4e50bf686b3c37df5b5cc5cdf36b..6b96494ec8bbbb3910976d65257349aec3a8bb10 100644 --- a/TP-FEMM/src/bonnes_pratiques.md +++ b/TP-FEMM/src/bonnes_pratiques.md @@ -1,7 +1,7 @@ # Bonnes pratiques avant de partir tête baissée -## MATLAB +## Scripts MATLAB ou Python 1. Pensez à créer dans votre compte un **dossier de travail** (du genre `TP_FEMM`) et différents sous-dossiers pour chaque sujet. Depuis les salles infos, le mieux est d'utiliser un répertoire local dans `C:\Temp\` et de **penser à récupérer ce qu'il contient à la fin de la séance**. diff --git a/TP-FEMM/src/intro.md b/TP-FEMM/src/intro.md index 1a5c1729141ab7b97d6d0ab6ff6c8771246d9e05..e9c33a65e27f613bc1a5aad05ee1eea16eef2dc5 100644 --- a/TP-FEMM/src/intro.md +++ b/TP-FEMM/src/intro.md @@ -36,9 +36,9 @@ L'objectif des séances de TP est de vous apprendre à définir proprement des p Les sujets ne sont pas calibrés pour correspondre à une séance particulière. **Il faut voir l'ensemble des 12 heures prévues comme un unique micro-projet** dans lequel seront traités les différents énoncés. -Les séances se dérouleront en salle informatique à l'ENSEM où tout ce qui faut est installé par défaut sur les postes de travail (FEMM, MATLAB, Python). +**Les séances se dérouleront en salle informatique à l'ENSEM où tout ce qui faut est installé par défaut sur les postes de travail (FEMM, MATLAB, Python, GNU Octave).** -**Si, malheureusement, nous étions obligés d'effectuer les séances en mode « distanciel » via visioconférence : FEMM et MATLAB sont accessibles depuis le portail [Virt'UL](https://virtul.univ-lorraine.fr)**. +Si, malheureusement, nous étions obligés d'effectuer les séances en mode « distanciel » via visioconférence : **FEMM et MATLAB sont accessibles depuis le portail [Virt'UL](https://virtul.univ-lorraine.fr)**. > **Remarque :** Vous pouvez également installer sur votre PC personnel : > * MATLAB avec la license campus de l'UL en suivant les [instructions du WikiDocs](https://wikidocs.univ-lorraine.fr/display/dnsudocoffsoft/La+licence+Matlab+pour+les+Etudiants)