Hammer Notebook Soluce

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 8

Notebook : la règle de Hammer

Jérome Eertmans
Louis Navarre
Gilles Poncelet
Ce document a pour but d’aider les étudiants du cours d’Eléments Finis, donné par M. Vincent
Legat à l’Ecole Polytechnique de Louvain, en leur offrant une solution détaillée aux devoirs.

1 Le problème à résoudre
L’objectif de ce devoir est double. Dans un premier temps, il est demandé d’implémenter la fonc-
tion hammerIntegrate(x, y, f, graphics), qui estime l’intégrale d’une fonction f sur un do-
maine Ω triangulaire. Dans un second temps, il faut implémenter la fonction hammerIntegrateRecursive(x,
y, f, n, graphics), qui appliquera de manière récursive la première méthode en subdivisant le
triangle courant en d’autres plus petits.

1.1 Les arguments des fonctions


— x et y : des vecteurs numpy unidimensionnels de longueur 3
— f : une fonction, pas forcément vectorisée, qui prend 2 arguments scalaires en entrée
pour en retourner un seul
— n : un entier donnant le nombre de récursions à appliquer
— graphics : un booléen indiquant si, oui ou non, il faut dessiner le problème

1
Règle de Hammer Février 2019

1.2 La règle d’intégration de Hammer d’ordre 2 et ses poids


Cette méthode donne une approximation de l’intégration d’une fonction sur un triangle quel-
conque :
Z 3
X
f (x, y) dx dy ≈ wk f (xk , yk ) (1)
Ω̂
| {z } |k=1 {z }
I
Ih

Les poids wk sont donnés dans le tableau suivant pour l’élément parent, le triangle Ω̂, dont les
sommets sont (0,0), (1,0) et (0,1) dans le plan (ξ, η) :

ξk ηk wk

1/6 1/6 1/6


1/6 2/3 1/6
2/3 1/6 1/6

Afin de passer de l’élément parent à un élément quelconque donc les sommets sont (Xi , Yi ) avec
i = 1...3, on utilise le changement de variable suivant :
3
X 3
X
x(ξ, η) = Xi φi (ξ, η) et y(ξ, η) = Yi φi (ξ, η) (2)
i=1 i=1

Il ne faut pas oublier d’adapter les poids wk de la règle de Hammer, car ceux repris ci-dessus
sont valables uniquement pour l’élément parent (c’est-à-dire un triangle formé par les sommets
considérés précédemment) ! Pour ce faire, on utilise le jacobien de la transformation, dont la valeur
absolue peut être interprété comme étant un rapport d’aire entre le triangle parent et le triangle
quelconque. Le jacobien étant le déterminant du gradient de la transformation, il se calcule comme
suit :   ∂x ∂x
∂(x, y) ∂ξ ∂η
J = det = ∂y ∂y = (X2 − X1 )(Y3 − Y1 ) − (X3 − X1 )(Y2 − Y1 ) (3)
∂(ξ, η) ∂ξ ∂η
Le détail du calcul a été évité étant donné sa longueur mais il suffit d’appliquer les définitions
de x et de y pour trouver le même résultat.

1.3 Les fonctions de formes


La manipulation des fonctions de forme est une partie importante de la matière de ce cours,
étant donné leur utilité dans le calcul des éléments finis. Rappelons que lors de calculs numériques,
un ordinateur aura très facile à calculer des additions et des produits, ceci expliquant pourquoi
on approche souvent des fonctions compliquées par le biais de polynômes. Nous vous conseillons
vivement de lire la partie du syllabus sur ce sujet (chapitre 1).

Les fonctions de formes peuvent ici être vues comme l’application multidimensionnelle du prin-
cipe des polynômes de Lagrange. Leur construction est toujours la même : à chaque noeud, on

2
Règle de Hammer Février 2019

associe une fonction qui vaut 1 en ce noeud et 0 lorsqu’elle est évaluée sur les autres noeuds. Ces
fonctions sont de degré p et, dans le cadre de ce devoir, on a choisit p = 1.

Pour ceux qui ont un peu de difficultés avec les fonctions de formes, vous êtes invités à lire
l’annexe (4).

2 Les importations
Pour ce devoir, seul le package glfem est nécessaire étant donné qu’on ne va pas réaliser de réelle
opération vectorielle. L’utilisation de numpy est théoriquement meilleure étant donné la meilleure
gestion des produits sur des vecteurs mais, vu la petite taille des vecteurs utilisés, rien ne dit que
du Python pure serait plus rapide :)

1 import glfem
2 import numpy as np

Note sur l’optimisation


Pour ce devoir, faire des boucles n’était clairement pas pénalisant au niveau de la rapidité étant
donné leur longueur (sur 3 ou 4 éléments maximum). C’est souvent le désavantage des méthodes
récursives : on ne sait que très rarement les vectoriser.

3
Règle de Hammer Février 2019

3 Résolution du problème
3.1 Le code
1 def hammerIntegrate(x, y, f, graphics) :
2

3 # Les poids donnés


4 xi = np.array([1/6, 1/6, 2/3])
5 eta = np.array([1/6, 2/3, 1/6])
6

7 # Ici on crée les tableaux de x & y après changement de variable


8 # numpy permet d'écrire le tout sans boucle :)
9 xLoc = x[0]*(1 - xi - eta) + x[1]*xi + x[2]*eta
10 yLoc = y[0]*(1 - xi - eta) + y[1]*xi + y[2]*eta
11

12 # La formule de Hammer
13 I = 0
14 for i in range(3):
15 I += 1/6*f(xLoc[i],yLoc[i]) # Rappel : f pas forcément vectorisée
16

17 # Le déterminant, en n'oubliant pas la valeur absolue !


18 det = abs((x[0]-x[1])*(y[0]-y[2]) - (x[0]-x[2])*(y[0]-y[1]))
19

20 if graphics :
21 # On dessine, dans l'ordre, le triangle, ses sommets et ses poids
22 # où on évalue la fonction
23 glfem.drawElement(x,y,'-k')
24 glfem.drawNodes(x,y,'or')
25 glfem.drawNodes(xLoc,yLoc,'ob')
26

27 return I*det

4
Règle de Hammer Février 2019

1 def hammerIntegrateRecursive(x,y,f,n,graphics) :
2

3 I = 0.0
4 if n > 0:
5 # Ici, on transpose les noeuds milieux du triangle parent
6 # à ceux du triangle étudié
7 xParent = np.array([[0.0,0.0,0.5], [0.0,0.0,0.5],
8 [0.5,0.5,1.0], [0.0,0.5,0.5]])
9 yParent = np.array([[1.0,0.5,0.5], [0.5,0.0,0.0],
10 [0.5,0.0,0.0], [0.5,0.0,0.5]])
11 # Attention : ces deux vecteurs sont bien 4 x 3
12 # => 4 sous-triangles par triangle
13 for i in range(4):
14 xLoc = x[0]*(1.0-xParent[i]-yParent[i]) +
15 x[1]*xParent[i] + x[2]*yParent[i]
16 yLoc = y[0]*(1.0-xParent[i]-yParent[i]) +
17 y[1]*xParent[i] + y[2]*yParent[i]
18 I += hammerIntegrateRecursive(xLoc,yLoc,f,n-1, graphics)
19 else:
20 return hammerIntegrate(x,y,f, graphics)
21

22 return I

3.2 Les explications


3.2.1 hammerIntegrate
Comme le définit la règle de Hammer, une approximation de l’intégrale de la fonction f sur le
domaine considéré est simplement la somme pondérées de l’évaluation de f aux point considérés.
Nous connaissons les coordonnées des point d’intégration sur le triangle parent, mais pas sur
le triangle quelconque. Pour pouvoir évaluer la fonction en ces points, on va devoir utiliser le
changement de variable permettant de localiser ces points dans le triangle quelconque : c’est ici
qu’interviennent les fonctions de forme. Le but est donc de calculer les coordonnées (Xk , Yk ) de
ces points dans le triangle quelconque. On obtient donc

Xk (ξk , ηk ) = (1 − ξk − ηk ) X0 + ξk X1 + ηk X2 (4)

Yk (ξk , ηk ) = (1 − ξk − ηk ) Y0 + ξk Y1 + ηk Y2 (5)
Une fois ces trois points trouvés, on somme le résultat de la fonction f en ces points (Xk , Yk ),
en multipliant par la pondération (qui est toujours ici de 61 ). Comme dit plus haut, il faut encore
calculer et multiplier par le Jacobien de la transformation, qui peut se calculer en une ligne de
code. Il faut tout de même faire attention à ce que ce Jacobien soit positif : on prend donc la valeur
absolue de celui-ci.

5
Règle de Hammer Février 2019

3.2.2 hammerIntegrateRecursive
Le principe fondamental de cette fonction est la récursion. Il faut tout d’abord établir la condi-
tion de récursion (cf le cours LFSAB1402 Informatique 2). Ici cette condition est n > 0. Si la condi-
tion n’est pas respectée, alors on va simplement calculer l’intégrale sur le triangle formé par les
vecteurs x et y sur la fonction f . Il suffit donc de retourner l’appel à la fonction hammerIntegrate
avec ces paramètres.

Si la condition est respectée, alors il faut subdiviser le triangle courant (toujours formé par les
vecteurs x et y) en 4 sous-triangles. La question est désormais de savoir comment subdiviser le
triangle quelconque en 4 sous-triangles. La réponse est pourtant toute simple : de la même ma-
nière que pour trouver les points d’intégration dans la fonction précédente. Pour cela, partons du
triangle parent : pour subdiviser celui-ci, on a besoin de 3 points supplémentaires : un sur le milieu
de chaque segment du triangle. Les coordonnées (x, y) des points de chaque sous-triangle formé
sur base du triangle parent sont stockés dans les vecteurs xParent et yParent respectivement.
Pour passer de chaque sous-triangle de l’élément triangulaire parent au sous-triangle quelconque,
on réutilise les équations 4 et 5.

Une fois ces coordonnées trouvées, il suffit de rappeler la fonction récursive sur chaque sous-
triangle, en décrémentant évidemment la valeur de n pour arriver à la fin de la récursion. Bien
évidemment, il faut sommer la valeur de retour (qui est l’intégrale sur chaque sous-triangle) pour
obtenir la valeur totale de l’intégrale.

4 Annexe
4.1 Exemple de calcul de fonctions de formes
Dans les cas étudiés, nous prendrons le cas d’un espace bi-dimensionnel, donc avec 2 variables,
dans lequel on veut appliquer les méthodes aux éléments finis sur un triangle parent de sommets
(0,0), (1,0) et (0,1).

4.1.1 Fonction du premier degré


Une fonction du premier degré peut s’écrire en toutes généralité :

f (ξ, η) = aξ + bη + c (6)

On retrouve 3 degrés de libertés : il nous faut donc 3 noeuds.

La méthode utilisée pour calculer les fonctions de formes étant essentiellement la même quelque
soit l’ordre, nous ne la détaillerons que pour les fonctions de formes d’ordre 2. Vous devez néanmoins
retrouver, en reprenant la notation du cours :

6
Règle de Hammer Février 2019

φ1 = 1 − ξ − η (7)
φ2 = ξ (8)
φ3 = η (9)

4.1.2 Fonction du second degré


Une fonction du deuxième degré peut s’écrire en toutes généralité :

f (ξ, η) = aξ + bη + c + dξ 2 + eη 2 + f ξη (10)

On retrouve 6 degrés de libertés : il nous faut donc 6 noeuds.

Figure 1 – Illustration de la méthode pour les fonctions de degré 2.

On va choisir les trois points formant le triangle, ainsi que le milieu de chacun des segments
de celui-ci. Calculer directement une fonction de degré deux telle qu’on a 1 au point considéré
et 0 aux autres points n’est pas directement visible (sauf peut-être pour certains d’entre vous :-
). Heureusement, on peut se rappeler qu’une fonction telle que la fonction f est équivalente à
un produit de fonctions (bi-)linéaires. Nous pouvons dès lors chercher à simplement multiplier
plusieurs fonctions simples entre elles pour donner obtenir la fonction de forme voulue.
Pour une fonction de degré p à une variable, on obtient la forme suivante

f (x) = (x − x1 )(x − x2 )...(x − xp )

où chaque terme du produit est une racine de f . C’est exactement ce que nous allons faire ici :
chercher ces fonctions (bi-)linéaires telles que les racines du polynôme formé sont exactement
les coordonnées des points que nous cherchons justement à annuler dans la fonction de forme.
Néanmoins, deux contraintes se présentent :

7
Règle de Hammer Février 2019

— Dans notre cas, les fonctions de forme sont de degré 2, pas plus
— En notre point considéré, la fonction de forme doit valoir 1
Il faut donc effectuer un choix judicieux de ces fonctions de forme pour, premièrement, obtenir le
degré désiré et, deuxièmement, que cette fonction de forme vaille 1 au point considéré. De manière
générale, vous pouvez vous dire que si la fonction de forme est de degré p, il faut s’attendre à
multiplier ( au maximum) p fonctions linéaires entre elles. Pour le point (ξ, η) = (0, 0), on voit sur
la figure que ces deux fonctions bi-linéaires sont f1 (ξ, η) = 1/2 − ξ − η et f2 (ξ, η) = 1 − ξ − η. Les
multiplier entre elles donne simplement

φ∗1 (ξ, η) = (1/2 − ξ − η)(1 − ξ − η)

Cette fonction vaut bien 0 pour les autres points que le point (0, 0), mais elle vaut 1/2 au point
d’intérêt. Pour obtenir f (0, 0) = 1, on peut simplement multiplier cette fonction par un facteur 2.
On obtient donc finalement

φ1 (ξ, η) = 2(1/2 − ξ − η)(1 − ξ − η)


= 1 − 3(ξ + η) + 2(ξ + η)2

La marche à suivre est la même pour toutes les autres fonctions de formes. Elle peuvent être
également représentées dans le plan (ξ, η, z) où z contient l’image des fonctions de formes.

Figure 2 – Illustration 3D des fonctions de formes de degré 2.

Vous aimerez peut-être aussi