From e743691c14d7c588647c354d0a3335fa538a13be Mon Sep 17 00:00:00 2001
From: fontchas5 <j.fontchastagner@gmail.com>
Date: Thu, 3 Mar 2022 15:39:01 +0100
Subject: [PATCH] correction coquilles
---
TP-FEMM/src/aimant.md | 207 ++++++++++++++++++++++++++++++++
TP-FEMM/src/bonnes_pratiques.md | 2 +-
TP-FEMM/src/intro.md | 4 +-
3 files changed, 210 insertions(+), 3 deletions(-)
diff --git a/TP-FEMM/src/aimant.md b/TP-FEMM/src/aimant.md
index df56588..ef04c1e 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 aa364ea..6b96494 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 1a5c172..e9c33a6 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)
--
GitLab