Vous êtes sur la page 1sur 12

Université Paul Sabatier Année 2022/2023

M1 Mécanique Méthodes numériques A


TP numérique Elements Finis

Organisation du TP
Le TP numérique d’éléments finis se compose de 3 séances guidées de 2h chacune, plus un
mini-projet de 4h. Pour chacune des 3 premières séances, un compte-rendu est demandé et sera
à rendre la semaine suivante. Chacun de ces compte-rendus ne devra pas dépasser 4 pages, avec
l’organisation suivante :
- Partie théorique : 1 page max.
- Présentation du travail, discussion des résultats, commentaires sur les figures : 1 page max.
- Figures illustrant les résultats : 1 page max (6 figures max, judicieusement choisies).
- Programmes mis en forme et commentés : 1 page max par programme.

0 Les bases du logiciel FreeFem++


Cette notice présente de manière résumée les principales fonctionnalités de FreeFem++.
Pour plus de détails vous pouvez consulter le manuel en ligne :
https://doc.freefem.org/tutorials/index.html
Vous trouverez également quelques ressources en ligne, comme ces deux documents :
http://www.cmap.polytechnique.fr/IMG/pdf/Setif-FreeFem_I.pdf
https://www.unilim.fr/pages_perso/noureddine.igbida/Cours/Opt_forme/free_fem.pdf

0.1 Introduction
Le logiciel FreeFem++ fonctionne comme un language de programmation, avec une syntaxe
proche de celle du C++. Ce language comprend des instructions de base donnant les mêmes
fonctionnalités que la plupart des languages de programmation scientifiques (manipulation de
tableaux, chaines de caractères, boucles, etc...). Il contient surtout des fonctionnalités avancées
permettant de créer des maillages, définir des problèmes aux dérivées partielles à partir d’une
formulation variationnelle, résoudre ces problèmes et afficher les résultats.
Le logiciel fonctionne a partir de fichiers de programme au format fichier.edp que vous
pourrez créer avec l’éditeur de votre choix. Pour exécuter un programme deux méthodes : (i)
dans un terminal, tapez FreeFem++ fichier.edp ; (ii) (avec certaines installations sous windows)
en double-cliquant directement sur le fichier.

0.1.1 Démarrage "pour les nuls"


Voici, étape par étape, comment créer votre premier programme FreeFem++ sur les machines
du réseau de l’UPS.
— Lancer une session en mode Linux.
— Ouvrir un terminal (cliquez sur l’icône correspondante dans la barre du bas : >_ )
— Ouvrir un fichier "toto.edp" avec un éditeur de votre choix.
Par exemple, si vous utilisez gedit, tapez gedit toto.edp & dans la fenêtre terminal.
— Dans la fenêtre de l’éditeur, tapez le programme d’une ligne suivant :
cout << " Bonjour ! Je m’appelle toto " << endl;
puis enregistrez le programme (control-S ou via la barre de menu de l’éditeur)
— Revenez sur la fenêtre terminal, et tapez l’instruction suivante :
FreeFem++ toto.edp

1
0.2 Instructions de base
0.2.1 syntaxe
Avec FreeFem++ chaque instruction se termine par le symbole ";" (mais les instructions
peuvent s’étaler sur plus d’une ligne).
Si une ligne contient //, tout ce qui suit est interprété comme des commentaires et est ignoré
à l’exécution (éviter toutefois les caractères accentués dans les commentaires...).
On peut regrouper les instructions en blocs d’instructions délimités par { }. Toutes les va-
riables déclarées dans un tel bloc n’existent que dans celui-ci.

0.2.2 Types de variables


Toutes les variables utilisées dans un programme doivent être déclarées avant d’être utilisées,
en précisant leur type. Les principaux types de variables sont les suivants :
— Scalaires : entiers int, réels real, complexes complex. On peut utiliser sur ceux ci les
opérateurs arithmétiques (+,-,*,/, ∧ ) et les fonctions usuelles (sin,cos, exp,...).
Exemples :
real res; real a = 4; int n = 4; complex z = 2+2i; res = exp(abs(z))∧n/a;
int i = 0 ; i++; // (equivalent a i = i+1; )

— Chaines de caractères : string. On les définit avec des double-quotes ("). On peut les
concaténer avec l’opérateur +. Dans les concaténations les scalaires sont convertis en
chaines. Exemple :
string s="toto"; int zero=0; string ss=zero+" + "+zero+" = la tete a "+s;
Remarque : Ne pas utiliser de caractères accentués dans les chaines de caractères !

— Vecteurs et tableaux : ceux-ci doivent être déclarés avec leur type suivi de [int] pour les
vecteurs ou [int,int] pour les tableaux a deux indices, en précisant leur dimension. On
peut affecter un tableau en affectant ses composantes une par une, ou en bloc en précisant
les composantes délimitées par [ ] ; dans le second cas il n’est pas nécessaire de déclarer
la dimension.
Exemples :
real[int,int] A(2,2); A(0,0) = 1;A(0,1) = 2;A(1,0) = 3; A(1,1) = 4;
real[int,int] A = [ [1,2],[3,4] ]; \\ syntaxes equivalentes.
Remarques :
(i) En FreeFem++ la numérotation des vecteurs et tableaux commence à zéro. Un tableau
X de dimension N contient donc les éléments numérotés X(0) à X(N-1).
(ii) On peut obtenir la dimension d’un vecteur (ou d’un tableau à deux indices), ainsi que
ses valeurs maximale et minimale, par les instructions suivantes :
int sizeA = A.n; real minA = A.min; real maxA = A.max;

— Matrices. En FreeFem++ une matrice est équivalente à un tableau à deux indices, mais
est stockée dans un format "matrice creuse" (seul les éléments non nuls sont stockés).
Pour résoudre un système linéaire, il faut créer une matrice (MA) (par exemple a partir
d’un tableau A) et un vecteur pour le second membre (B), puis construire la décomposition
LU de la matrice et enfin calculer la solution avec les instructions suivantes :
int N = 10; real[int][int] A(N,N) ; real B(N),Y(N);
(...)
matrix MA = A; set(MA,solver=sparsesolver); Y = A∧-1*B;

2
Remarque : x et y sont des noms réservés aux coordonnées sur un maillage (voir plus loin)
et ne peuvent pas être utilisés comme noms de variables.

0.2.3 Test et boucles


Voici un exemple de test logique :
if( (1==0) | (4<3) ){ cout << " Votre processeur a fume grave..." << endl; }

Et voici comment faire une boucle simple :


for(int j = 0; j<N; j++){ cout << j << endl; }

0.2.4 Entrées-sorties
Sorties : Pour écrire dans un fichier, il faut d’abord l’ouvrir avec l’instruction ofstream qui
lui affecte un nom, puis écrire dedans avec l’opérateur de redirection d’un flux de sortie ” << ”.
l’instruction endl signifie "retour à la ligne". Essayez par exemple :
{ofstream file("fichier.txt"); for(int j=0; j<N; j++){ file << j << endl;}}
La sortie standard (sortie à l’écran) s’appelle cout et s’utilise de la même manière.

Entrées : Pour lire dans un fichier, il faut d’abord l’ouvrir avec l’instruction ifstream qui
lui affecte un nom, puis lire dedans avec l’opérateur de redirection d’un flux d’entrée ” >> ”.
Par exemple :
real z1,z2; { ifstream file("fichier.txt"); file >> z1 >> z2 ; }
cout << "valeurs lues sur les deux premieres lignes : << z1 << " ; " << z2;
L’entrée standard (entrée au clavier) s’appelle cin et s’utilise de la même manière.

Remarque : il est conseillé de regrouper les entrées-sorties dans un bloc d’instructions


délimité par { } . Ainsi les fichiers ouverts sont automatiquement refermés à la sortie du bloc.

0.3 Création de maillages


Un maillage 2D est un objet de type mesh qui doit être déclaré en tant que tel, et créé à
partir d’objets de type border (frontière) préalablement définis.
Une frontière se déclare en définissant formellement une paramétrisation [x(t); y(t)]. On lui
affecte également un label qui permet d’y faire référence ensuite.
Exemple pour créer deux contours en forme de cercle :
border Cext(t=0,2*pi){ x = cos(t) ; y = sin(t) ; label = 1;);}
border Cint(t=2*pi,0){ x = .5*cos(t) ; y = .5*sin(t) ; label = 2;);}
Un maillage se construit à partir d’un (ou plusieurs) contour(s) de la manière suivante, en
précisant le nombre d points sur chacun (ici 20 points) :
mesh Th = buildmesh (Cext(20) + Cint(20) ); plot(Th);
Remarque importante : Les contours extérieurs au domaine doivent être définis dans le
sens trigonométrique. Si le domaine comporte un trou (comme dans l’exemple précédent) celui-ci
doit être défini dans le sens anti-trigonométrique.

0.4 Déclaration et utilisation d’objets "éléments finis"


Après avoir construit un maillage on peut définir des espaces d’éléments finis sur celui-ci.
Les principaux types d’éléments finis sont P 1 (linéaire par morceaux) et P 2 (quadratique par
morceaux). Après avoir défini de tels espaces on peut définir des objets appartenant à ces espaces
(représentation discrète d’une fonction des coordonnées x, y).

3
Exemple : Pour déclarer un espace d’éléments finis P1, puis définir un objet F correspondant
à la fonction F (x, y) = x/(1 + x2 + y 2 ), puis la représenter graphiquement :
fespace p1S(Th,P1); p1S F; F = x/(1+x∧2+y∧2); plot(F);
Remarques :
- On peut directement récupérer la valeur d’un objet éléments finis en un point x, y en
utilisant celui-ci comme s’il était une fonction de (x, y). Par exemple pour faire afficher la valeur
de l’objet F précédent en (x, y) = (1, 2) :
cout << F(1,2) << endl;
- Le tableau contenant les valeurs d’un objet éléments finis à chacun des points du maillage
peut être obtenu avec l’opérateur []. Par exemple :
real[int] ValeursF = F[] ;
- On peut définir un objet éléments finis a valeurs complexes de la manière suivante :
p1S<complex> Z ; Z= x+1i*y;

0.5 Résolution de problèmes linéaires


Avec FreeFem, on déclare un problème linéaire a partir de sa formation variationnelle, en
écrivant celle-ci quasiment comme vous l’écrivez sur le papier ! on peut notamment utiliser int2d
et int1d pour définir des intégrales sur le domaine ou sur l’une de ses frontières, dx et dy pour
faire référence aux dérivées spatiales des fonctions et fonctions-tests, et on pour préciser des
conditions de Dirichlet. Exemple : on veut résoudre le problème suivant

∆u = 0 dans Ω, ∇u · n = gn sur ∂Ω1 , u = gd sur ∂Ω2 ,


En utilisant la méthode de pénalisation pour la condition limite de Dirichlet (cf. TD 1, avec
T GV = 1030 ), on met ce problème sous la forme variationnelle suivante :
ZZ Z Z
∀v(x, y), − (∇u · ∇v)dxdy + gn vd` + T GV (u − gd )vd` = 0.
Ω ∂Ω1 ∂Ω2

La déclaration, puis la résolution du problème à l’aide d’éléments finis de type P2, se fait
tout simplement avec les instructions suivantes :
fespace p2S(Th,P2); p2S u,v;
solve Probleme(u,v) = int2d(Th)( -(dx(u)*dx(v)+dy(u)*dy(v) ) )
+ int1d(Th,1)(gn*v) + on(2,u=gd) ;

Remarque :
L’instruction on(2,u=gd) est équivalente à int1d(Th,2)(TGV*u*v) - int1d(Th,2)(TGV*gd*v)

0.6 Tracés graphiques


FreeFem++ permet d’afficher graphiquement les résultats en utilisant la commande plot.
Pour une explication complète voir le manuel en ligne. Voici deux exemples simples :
plot(u,wait=1,value=1,fill=1,cmm="Ma figure",ps="Figure.eps");
Affiche les iso-contours de la fonction éléments finis u, avec un remplissage de couleurs
(fill=1), une échelle des valeurs (value=1), un titre (cmm="Ma figure") et en créant de plus un
fichier contenant la figure au format postscript (ps="Figure.eps").
plot(X,Y,wait=1,cmm="Ma Courbe",ps="Courbe.eps");
Si X et Y sont des vecteurs de même dimension, cet exemple trace la courbe correspondante.
Remarquez que dans ce cas il n’y a ni graduations ni axes. Pour tracer ce type de courbe il est
donc conseillé de ne pas utiliser FreeFem++. A la place on peut écrire les données dans un fichier
texte, puis le lire avec un autre logiciel (Matlab, Python, etc..)

4
Université Paul Sabatier Année 2022/2023
M1 Mécanique Méthodes numériques A

TP numérique Elements Finis

1 TP 1 : introduction aux éléments finis, problème 1D


On considère le problème suivant pour la fonction u(x), définie sur l’intervalle x ∈ [0, L],
avec une condition de Dirichlet homogène en x = 0 et une condition de Neuman inhomogène en
x=L:
u00 = S,
u(0) = 0,
u0 (L) = D.
La solution exacte est u(x) = Sx2 /2 + (D − SL)x.
Vous utiliserez les valeurs suivantes pour les quantités S, D et L (valeurs données en début
de séance) :

S D L

1.1 Résolutions par éléments finis 1D


1.1.1 Formulation faible
En introduisant la fonction test v(x), on arrive classiquement à la formulation faible suivante :
Z L Z L
0 0 0
∀v(x), − u (x)v (x) dx + Dv(L) − u (0)v(0) − Sv(x) dx = 0
0 0
On souhaite résoudre ce problème avec des éléments finis 1D de type P1. Pour cela on définit
un maillage donné par xj = j/N avec j = 0...N .
Trois variantes sont possibles selon la manière d’imposer la condition de Dirichlet en x = 0.

1.1.2 Première méthode : condition de Dirichlet implicite


On approxime la fonction par l’expansion suivante, qui vérifie automatiquement la condition
de Dirichlet en x = 0 :
N
X
u(x) = uj φj (x)
j=1

où φj (x) est la fonction "chapeau" associée au noeud de maillage xj (cf cours et TD).
en choisissant v(x) = φi (x) pour i = 1..N on arrive à N équations pour les inconnues ui .
Ceci conduit à un problème matriciel de dimension N sous la forme suivante :
 2 1
   
−h h 0 ··· 0 0 u1 Sh
 1 −2 1
··· 0 0    u2   Sh 
   
 h h h
1 2
 0
 h − h · · · 0 0   u3  =  Sh 
   

 .. .. .. .. .. ..   ..   .. 
 . . . . . .   .   . 
1
0 0 0 ··· h − h1 uN Sh
2 −D
| {z } | {z } | {z }
A U B

5
1.1.3 Seconde méthode : condition de Dirichlet explicite
On part cette fois de l’expansion suivante, qui ne vérifie pas automatiquement la condition
de Dirichlet en x = 0 :
XN
u(x) = uj φj (x)
j=0

On va écrire comme précédemment N équations pour i = 1 à N auxquelles on ajoute sim-


plement l’équation u0 = 0 sur la première ligne (numérotée par i = 0).
Ceci conduit à un problème matriciel de dimension N + 1 sous la forme suivante :
    
1 0 0 ··· 0 0 u0 0
1 −2 1
··· 0 0    u1   Sh 
   
h h h
1 2
0
 h − h · · · 0 0   u2  =  Sh 
   

 .. .. .. .. .. ..   ..   .. 
. . . . . .   .   . 
1
0 0 0 ··· h − h1 uN Sh
2 −D
| {z } | {z } | {z }
A U B

1.1.4 Troisième méthode : condition de Dirichlet imposée par pénalisation


Cette méthode consiste à modifier la condition de Dirichlet en une condition mixte (ou
condition de Robin) de la manière suivante :

T GV u(0) + u0 (0) = 0

où TGV est une "très grande valeur" (typiquement 1030 ).


Ceci conduit à un problème matriciel de dimension N + 1 sous la forme suivante :

T GV − h1 1
     Sh 
h 0 ··· 0 0 u0 2
1 2 1

 h − h h · · · 0 0   u
  1
  Sh 

1

 0 h − h2 · · · 0 0    u2  =  Sh 
   
.. .. .. .. . .. . . 
. .. .   ..   .. 
    
 . . .
0 0 0 · · · h1 − h1 uN Sh
−D
| {z } | {z } | 2 {z }
A U B

L’avantage de cette troisième méthode est qu’il n’est pas nécessaire de réécrire entièrement
les lignes de la matrice correspondant aux frontières sur lesquelles des conditions de Dirichlet
sont imposées, il suffit de rajouter des "TGV" sur les diagonales correspondant aux degrés de
liberté correspondants.
Notez que la première méthode est naturellement adaptée à la programmation en Matlab,
Fortran, Octave, ... où la numérotation des tableaux commence à l’indice 1, tandis que les deux
suivantes sont adaptées à la programmation en C++, python, FreeFem++, ... où la numération
commence à l’indice 0. (On peut évidemment aussi programmer la première méthode en Python
et/ou les seconde et troisième méthode en Matlab mais il faut alors décaler les indices des
tableaux).

1.1.5 Travail à réaliser


- (Partie théorique) Expliquez la démarche qui conduit au problème matriciel écrit ci-dessus,
dans le cas où la condition de Dirichlet est imposée par pénalisation.
- Recopiez le programme TP1_1D.edp fourni en figure 1, qui utilise la seconde méthode
"explicite".

6
- Commentez le programme afin d’expliquer son fonctionnement ligne par ligne.
- Modifiez les valeurs de S, L, D comme proposé.
- Représentez la solution u(x) obtenue par le programme avec les valeurs données pour S, D, L.
- Que peut-on dire de la précision de la méthode pour ce problème ?
- Modifiez votre programme pour utiliser la méthode de pénalisation. Vérifiez que si "TGV"
est choisi suffisamment grand le résultat reste le même.

1.2 Résolution en 2D avec FreeFem++


1.2.1 Extension du problème en 2D
Le logiciel FreeFem++ est conçu à la base pour résoudre des problèmes en 2D (ou 3D), mais
"qui peut le plus peut le moins" ! On va donc l’utiliser pour résoudre le problème précédent.
Pour cela on partira du problème suivant pour la fonction u(x, y) définie sur le domaine
(x, y) ∈ Ω = [0, L] × [0, H] qui est un domaine rectangulaire de hauteur H (arbitraire). On note
respectivement ∂Ω1 , ∂Ω2 , ∂Ω3 , ∂Ω4 les frontières bas, droite, haut et gauche du domaine.
On partira donc du problème suivant, équivalent au problème 1D de la section précédente :

∂2u ∂2u
Dans le domaine Ω : + 2 = S,
∂x2 ∂y
Sur la frontière ∂Ω4 : u(0, y) = 0,

∂u
Sur la frontière ∂Ω2 : = D,
∂x x=L

∂u ∂u
Sur les frontières ∂Ω1 et ∂Ω3 : = = 0.
∂y y=0 ∂y y=H

1.2.2 Formulation faible


En introduisant HΩ un espace de fonctions définies sur Ω et vérifiant la condition de Dirichlet
sur la frontière ∂Ω4 , le problème peut être mis sous la formulation faible suivante :
ZZ ZZ Z
∀v(x, y) ∈ HΩ , − (∇u · ∇v)dxdy − (Sv)dxdy + (Dv)dy = 0
Ω Ω ∂Ω2

1.2.3 Travail à réaliser


- Recopiez le programme TP1_2D.edp fourni en figure 1.
- Commentez le programme afin d’expliquer son fonctionnement ligne par ligne.
- Adaptez le programme pour utiliser les valeurs de S, L, D comme proposé.
- Représentez la solution u(x) obtenue, et comparez à la solution théorique.
- Faites varier le paramètre de discrétisation N . Que constatez-vous concernant la précision
de la méthode ?
- Faites varier la densité N du maillage et tracez l’erreur e = max |u(x, y) − utheo (x)| en
fonction de N (en logarithmique). Que peut-on en déduire sur l’ordre de la méthode ?
- Essayez maintenant d’utiliser des éléments finis de type P2. Que constate-t-on ? comment
peut-on l’expliquer ?

7
1 // TP1 : Probleme 1D modele , r e s o l u t i o n 1D a v e c s y n t a x e FreeFem de b a s e
2 r e a l D = −1.5; r e a l S = 4 ; r e a l L = 1 ;
3 int N = 10;
4 c o u t << " R e s o l u t i o n du p r o b l e m e modele a v e c D = " << D << " ; S = " << S
5 << " ; L = " << L << " ; N = " << N << e n d l ;
6 r e a l h = L/N ;
7 r e a l [ int , i n t ] A(N+1 ,N+1) ;
8 r e a l [ i n t ] B(N+1) , U(N+1) ;
9 f o r ( i n t i =1; i <N ; i ++)
10 {
11 A( i , i −1) = 1/ h ;
12 A( i , i ) = −2/h ;
13 A( i , i +1) = 1/ h ;
14 B( i ) = S∗h ;
15 };
16 A( 0 , 0 ) = 1 ;
17 B( 0 ) = 0 ;
18 A(N, N−1) = 1/ h ;
19 A(N, N) = −1/h ;
20 B(N) = S∗h/2−D;
21 m a t r i x MA = A ;
22 s e t (MA, s o l v e r=s p a r s e s o l v e r ) ;
23 U = MA^−1∗B ;
24 r e a l [ i n t ] Xmesh (N+1) , Utheo (N+1) ;
25 o f s t r e a m f i l e ( " TP1_Solution1D . t x t " ) ;
26 f o r ( i n t j =0; j <N+1; j ++)
27 {
28 Xmesh ( j ) = L∗ j /N ;
29 Utheo ( j ) = S∗Xmesh ( j ) ^2/2+(D−S∗L ) ∗Xmesh ( j ) ;
30 c o u t << " j = " << j << " : X = " << Xmesh ( j ) << " ; U = " << U( j ) << e n d l ;
31 // << " ; Utheo = " << Utheo ( j ) << e n d l ;
32 f i l e << j << " " << Xmesh ( j ) << " " << U( j ) << e n d l ;
33 };
34 p l o t ( [ Xmesh , U ] , w a i t =1 , p s=" f i g u r e . e p s " ) ;

Figure 1 – Programme TP1_1D.edp .

1 // / TP1 : Probleme 1D modele , r e s o l u t i o n en 2D ( i c i S = 1 , D = 1 , L = 1 )


2 int N = 50;
3 real H = 0.3;
4 b o r d e r b a s ( t =0 ,1) { x=t ; y =0; l a b e l = 1 ; } ;
5 b o r d e r d r o i t e ( t =0 ,H) { x =1; y=t ; l a b e l = 2 ; } ;
6 b o r d e r haut ( t =1 ,0) { x=t ; y=H ; l a b e l = 3 ; } ;
7 b o r d e r g a u c h e ( t=H, 0 ) { x =0; y=t ; l a b e l = 4 ; } ;
8 p l o t ( b a s (N)+d r o i t e (N∗H)+haut (N)+g a u c h e (N∗H) , w a i t =1 ,cmm=" C o n t o u r s pour c o n s t r u c t i o n du m a i l l a g e " ) ;
9 mesh t h = b u i l d m e s h ( b a s (N)+d r o i t e (N∗H)+haut (N)+g a u c h e (N∗H) ) ;
10 p l o t ( th , w a i t =1 ,cmm=" M a i l l a g e " , p s=" M a i l l a g e . p s " ) ;
11 f e s p a c e p1S ( th , P1 ) ;
12 p1S u , v ;
13 s o l v e TP1 ( u , v ) = − i n t 2 d ( t h ) ( dx ( u ) ∗ dx ( v )+dy ( u ) ∗ dy ( v ) )
14 − i n t 2 d ( t h ) ( v ) + i n t 1 d ( th , 2 ) ( v ) + on ( 4 , u=0) ;
15 p l o t ( u , w a i t =1 , f i l l =1 , v a l u e = 1 ,cmm=" s o l u t i o n du p r o b l e m e " , p s=" s o l u t i o n . e p s " ) ;
16 p1S u t h e o = x ^ 2 / 2 ;
17 p1S e r r e u r = a b s ( u−u t h e o ) ;
18 p l o t ( e r r e u r , w a i t =1 , f i l l =1 , v a l u e =1 ,cmm=" E r r e u r p a r r a p p o r t a l a s o l u t i o n e x a c t e " ) ;
19 c o u t << e n d l << " E r r e u r max : " << e r r e u r [ ] . max << e n d l ;
20 r e a l [ int ] Xline (101) , Uline (101) ;
21 o f s t r e a m f i l e ( " TP1_Solution1D . t x t " ) ;
22 f o r ( i n t i =0; i <101; i ++)
23 { Xline ( i ) = i /100.;
24 Uline ( i ) = u( i /100. ,0) ;
25 f i l e << X l i n e ( i ) << " " << U l i n e ( i ) << e n d l ;
26 };
27 p l o t ( [ X l i n e , U l i n e ] , cmm=" S o l u t i o n U( x , 0 ) " ) ;

Figure 2 – Programme TP1_2D.edp . Remarque : la ligne 13 a été modifiée pour correspondre


à la partie théorique en ajoutant le terme dy(u)*dy(v) mais ca ne change rien aux résultats.

8
2 TP2 : Ailette thermique ; résolution en 2D.
2.1 Théorie
2.1.1 Problème de conduction thermique en 2D dans une barre
On considère une barre (2D) de longueur L et de largeur H. L’extérieur est à la température
T0 et l’extrémité de la barre à la température T1 . On note k la conductivité thermique, h le
coefficient d’échanges par convection/rayonnement le long de la surface latérale. On suppose que
la barre est parfaitement isolée à son extrémité.
On montre (cf. cours thermique L3) que la température relative θ(x, y) = T (x, y) − T0 est la
solution du problème suivant :

∇ · (k∇θ) = 0,
θ = θ1 ≡ (T1 − T0 ) pour x = 0,
∇θ · n = 0 pour x = L,
(−k∇θ) · n = hθ pour y = 0 et y = H.

2.1.2 Théorie 1D dans le cas d’une ailette mince


On montre (cf. cours thermique L3) que si l’ailette est très élancée (L  H), la température
est uniforme dans chaque tranche et le problème peut se ramener à un problème 1D équivalent
pour la température θ = θ1D (x) :
r
d2 θ1D 2h
2
+ m2 θ1D = 0, avec m =
dx kH
θ1D (0) = θ1 ,

dθ1D
= 0.
dx x=L
Le problème admet alors une solution analytique sous la forme suivante :

cosh(m(L − x))
θ1D (x) = θ1
cosh(mL)
Et le flux thermique correspondant (en W par unité de longueur dans la direction transverse)
vaut
Φ1D = Hmθ1 tanh(mL)

2.2 Travail à réaliser


Vous travaillerez tout d’abord avec le choix de paramètres suivants :
L H k h θ1

1. (Partie théorique) Ecrire le problème 2D (section 2.1.1) sous forme variationnelle, en


précisant la méthode adoptée pour incorporer la condition de Dirichlet.
2. Ecrire un programme en FreeFem++ qui :
- Construit un maillage dont on pourra faire varier la densité N ,
- Calcule et affiche la solution θ(x, y),
- Affiche la valeur de la température au centre de la barre θc = θ(L/2, H/2).
- Affiche la valeur du flux thermique Φ à travers la barre.

9
3. Déterminez la valeur minimale de N pour avoir des résultats précis à 1% près pour θc
et Φ. Dans la suite du calcul on doublera cette valeur pour être sûr que le maillage est
suffisamment précis.
4. En gardant les autres paramètres constants, Faites varier la valeur de H et notez les
valeurs obtenues pour Φ et θs .
5. Tracez Φ et θc en fonction du rapport de forme H/L. Comparez avec les valeurs prédites
par l’approximation monodimensionnelle.
En déduire la valeur minimale du nombre de Biot pour que cette approximation soit
valable à moins de 5% près.
6. Dans quelles parties de la barre les écarts avec la solution 1D sont-elles les plus impor-
tantes ? expliquez physiquement.

10
3 TP3 : Conduction thermique dans une lettre !
3.1 Théorie
3.1.1 Problème physique
On étudie la conduction thermique dans un domaine Ω, de frontière ∂Ω. On note σ0 le taux
de production de chaleur (par exemple dû à des réactions chimiques, supposé uniforme) k la
conductivité thermique et h le coefficient d’échange avec le milieu extérieur.
Le problème est le suivant :

∇ · (−k∇θ) = σ0 pour (x, y) ∈ Ω,


(−k∇θ) · n = hθ pour (x, y) ∈ ∂Ω.
En notant L l’échelle caractéristique de longueur du domaine, on peut définir le nombre de
Biot Bi = hL/k.

3.1.2 Limite "objet thermiquement mince"


Dans le cas où Bi  1 (la conduction est beaucoup plus efficace que la convection), on peut
justifier que la température de l’objet est quasi-uniforme, et sera notée θtm . Un simple bilan
d’énergie sur le domaine permet de montrer que

σ0 A
θtm =
hP
où A est l’aire du domaine et P son périmètre.

3.1.3 Limite "objet très allongé"


Dans le cas d’un objet très allongé (qui correspond par exemple à la lettre I) de largeur H,
le problème se ramène à un problème 1D. On montre alors que la température de paroi et la
température maximale (atteinte au centre du domaine) sont données respectivement par :

σ0 H
θs∗ = ,
2h
σ0 H 2
 
∗ σ0 H ∗ BiH
θmax = + ≡ θs 1 + avec BiH = hH/k.
2h 8k 4

3.2 Exemple pour la lettre "D"


On fournit un programme qui construit un domaine en forme de lettre "D", résout le problème
thermique, et affiche les valeurs min et max de la température ainsi que les valeurs en six points
particuliers identifiés sur la figure 3.

3.3 Travail à réaliser


1. ( Partie théorique : ) démontrez les expressions données plus haut pour les limites théo-
riques θtm , θs∗ et θmax
∗ .
2. Construire un maillage correspondant à l’une de vos lettres initiales (majuscule ou mi-
nuscule). Vous dimensionnerez cette lettre pour qu’elle tienne a peu près dans un carré
de coté L = 1.

11
Maillage Solution du probleme pour h = 10
IsoValue
0.00501759
0.0058863
0.00646544
0.00704458
0.00762371
0.00820285
0.00878199
0.00936113
0.00994027
0.0105194
0.0110986
0.0116777
0.0122568
0.012836
0.0134151
0.0139942
0.0145734
0.0151525
0.0157317
0.0171795

3 4 5

2
1
0

Figure 3 – Lettre "D" : maillage et solution.

1 // programme s i m p l e pour l a c o n d u c t i o n dans une l e t t r e "D"


2 real S = 1; real k = 1; real h = 10;
3 int N = 40;
4 b o r d e r D1 ( t =1 ,0) { x =0; y=t ; l a b e l = 1 ; } ;
5 b o r d e r D2 ( t = 0 , . 2 ) { x=t ; y =0; l a b e l = 1 ; } ;
6 b o r d e r D3 ( t =0 , p i ) { x =0.2+.5∗ s i n ( t ) ; y =.5 −.5∗ c o s ( t ) ; l a b e l = 1 ; } ;
7 b o r d e r D4 ( t = . 2 , 0 ) { x=t ; y =1; l a b e l = 1 ; } ;
8 b o r d e r d1 ( t = 0 . 2 , . 8 ) { x = 0 . 2 ; y=t ; l a b e l = 2 ; } ;
9 b o r d e r d2 ( t=p i , 0 ) { x =0.2+.3∗ s i n ( t ) ; y =.5 −.3∗ c o s ( t ) ; l a b e l = 2 ; } ;
10 p l o t ( D1 (N)+D2 ( . 2 ∗N)+D3 ( p i ∗ . 5 ∗N)+D4 ( . 2 ∗N)+d1 ( . 6 ∗N)+d2 ( . 3 ∗ p i ∗N) ,
11 w a i t =1 ,cmm=" C o n t o u r s pour c o n s t r u c t i o n du m a i l l a g e " , p s=" LettreD_Contours . e p s " ) ;
12 mesh t h = b u i l d m e s h ( D1 (N)+D2 ( . 2 ∗N)+D3 ( p i ∗ . 5 ∗N)+D4 ( . 2 ∗N)+d1 ( . 6 ∗N)+d2 ( . 3 ∗ p i ∗N) ) ;
13 p l o t ( th , w a i t =1 ,cmm=" M a i l l a g e " , p s=" L e t t r e D _ M a i l l a g e . e p s " ) ;
14 f e s p a c e p2S ( th , P2 ) ;
15 p2S t h e t a , v ;
16 s o l v e TP1 ( t h e t a , v ) = − i n t 2 d ( t h ) ( k ∗ ( dx ( t h e t a ) ∗ dx ( v )+dy ( t h e t a ) ∗ dy ( v ) ) ) + i n t 2 d ( t h ) ( S∗ v )
17 − i n t 1 d ( th , 1 , 2 ) ( h∗ v ∗ t h e t a ) ;
18 p l o t ( t h e t a , w a i t =1 , f i l l =1 , v a l u e =1 ,cmm=" S o l u t i o n du p r o b l e m e pour h = "+h ,
19 p s=" L e t t r e D _ S o l u t i o n _ h "+h+" . e p s " ) ;
20 c o u t << " Temperature max : " << t h e t a [ ] . max << e n d l ;
21 c o u t << " Temperature min : " << t h e t a [ ] . min << e n d l ;
22 r e a l [ i n t ] Xp = [ 0 , . 1 , . 2 , . 5 , . 6 , . 7 ] ;
23 r e a l [ i n t ] Yp = [ 0 , . 1 , . 2 , . 5 , . 5 , . 5 ] ;
24 f o r ( i n t i =0; i <6; i ++)
25 { c o u t << " Temperature au p o i n t "+i+" : "+t h e t a (Xp( i ) ,Yp( i ) ) << e n d l ; };

Figure 4 – Programme TP3_LettreD.edp.

3. Résoudre le problème thermique dans ce domaine et représentez la solution pour plusieurs


valeurs du nombre de Biot (en utilisant un maillage suffisamment raffiné pour avoir des
résultats indépendants du raffinement).
4. Pour les valeurs choisies du nombre de Biot, donnez les valeurs min et max de la tempé-
rature, ainsi que les valeurs en quelques points particuliers que vous définirez. Comparez
avec les éléments théoriques, et expliquez l’accord (ou le désaccord) observé par rapport
à cette théorie.

12

Vous aimerez peut-être aussi