Académique Documents
Professionnel Documents
Culture Documents
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.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.
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.
— 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.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.
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;
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)
4
Université Paul Sabatier Année 2022/2023
M1 Mécanique Méthodes numériques A
S D L
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
T GV u(0) + u0 (0) = 0
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).
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.
∂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
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 " ) ;
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.
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)
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 :
σ0 A
θtm =
hP
où A est l’aire du domaine et P son périmètre.
σ0 H
θs∗ = ,
2h
σ0 H 2
∗ σ0 H ∗ BiH
θmax = + ≡ θs 1 + avec BiH = hH/k.
2h 8k 4
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
12