Vous êtes sur la page 1sur 15

La méthode des éléments finis

Introduction

Le comportement d’un système discret est représenté par un système d’équations algébriques
tandis qu’un système continu est le plus souvent représenté par un système d’équations aux
dérivées partielles ou intégro-différentielles associés à des conditions aux limites en espaces
et en temps. On résout les équations algébriques d’un système discret par des méthodes
numériques telle que la méthode d’élimination de Gauss. La méthode des éléments finis
permet de discrétiser les équations aux dérivées partielles en équations algébriques qui sont
alors résolues par les méthodes numériques traditionnelles.

Justification du problème à résoudre.

Le problème choisi pour l’expérimentation de la méthode des éléments finis est représenté
mathématiquement par une équation de Laplace en deux dimensions. J’ai choisi ce problème
comme point de départ pour construire le code FORTRAN permettant de résoudre ce type de
problème par la méthode des éléments finis. Comme la solution de ce type de problème est
très bien connues, il sera plus facile de déverminer le programme et de comprendre
mathématiquement la méthode des éléments finis.

0.0,1.0 0.5,1.0 1.0,1.0

3 4
2

2
3
Conducteur
rectangulaire
1
4

1 5
8
5

0.0,0.0 0.5,0.0 1.0,0.0


Le problème est de déterminer les propriétés d’une onde TEM d’une ligne de t ransmission
coaxiale composée d’un conducteur rectangulaire. On doit déterminer la distribution du
potentiel électrique dans l’espace interconducteur. Pour des raisons de symétrie, nous utilisons
seulement un quart de ce conducteur (voir la figure ci-dessous).

Discrétisation de l’équation de Poisson

Pour obtenir la forme discrétisée de l’équation de Poisson , nous utilisons la méthode des
résidus pondérés de Galerkine. La discrétisation de l’équation de Poisson sera grandement
facilité par la réduction de l’équation à une forme faible.

L’équation de Poisson est donnée comme suit :

 ∂ 2U ∂ 2U 
Γ 2 + 2  = b où U(x, y) est un potentiel dépendant de x et y 1.0
 ∂x ∂y 

La méthode des résidus pondérés permet de diminuer l’ordre d’intégration tout en faisant
apparaître un terme supplémentaire en utilisant l’intégration par partie. Le résidu R(x,y ;a) est
la forme canonique de l’équation 1.0 et ϕi(x,y) est une fonction d’interpolation polynomiale.
Contrairement à la méthode des volumes finis, la méthode des éléments finis permet de
linéariser une équation différentielle. Un exemple imagé de la solution graphique que permet
la méthode des volumes finis est donné par le site géologique « la chaussée des géants », il
faut bien s’amuser un peu dans les analogies.
L’équation des résidus pondérés s’écrit selon 2.0.

∫∫ R( x, y;a)ϕ ( x, y)dydx = 0
i 2.0

 ∂ 2U ∂ 2U 
avec R( x, y; a) = Γ 2 + 2  − b
 ∂x ∂y 

Lorsque ϕi(x,y)=1, cette relation se ramène à la méthode des volumes finis. Le but de cette
relation est de trouver une fonction Uex qui satisfasse l’équation différentielle. La fonction
Uex qui est partie intégrante du résidu est une approximation polynômiale fonction de (x,y)
de la forme suivante :

Uex = ϕ 0 ( x, y) + ϕ1 ( x, y)a1 + ϕ 2 ( x, y)a2 + .... 3.0

Pour obtenir la forme faible, nous effectuons une intégration par parties pour la relation 2.0.

 ∂ 2U ∂ 2U 
∫∫ R( x , y; a )ϕ i ( x , y )dydx = ∫∫  ∂x 2 ∂y 2 ϕ i ( x, y)dydx
Γ  + − b 4.0

De par la définition de l’intégration par parties (forme faible) , nous avons

d df dg
( fg) = g + f 5.0
dx dx dx

et, en intégrant de chaque coté, nous avons ce qui suit :

d df dg
∫ dx ( fg)dx = ∫ dx gdx + ∫ dx fdx
e
6.0

df dg
fge = ∫ gdx + ∫ fdx 8.0
e
dx e
dx

et enfin, en réarrangeant les termes, nous avons

df dg
∫ dx gdx + ∫ dx fdx − fg
e e
e 9.0
Comme l’intégrale du résidu est de la forme

 ∂ 2U ∂ 2U 
∫∫ R( x , y; a )ϕ i ( x , y )dydx = ∫∫  ∂x 2 + ∂y 2 − b ϕ i ( x, y)dydx
Γ 10

alors en généralisant sur une intégrale double, nous aurons

 ∂ 2U ∂ 2U   ∂  ∂U  ∂  ∂U  
 
∫∫s Γ ∂x 2 + ∂y 2 − b ϕ i ( x, y)dydx = Γ∫∫s  ∂x  ∂x  − ∂y  ∂y  − bϕ i ( x, y)dydx 11
 

La fonction U est une solution approximative sur un élément et dont la forme est :

n
U ( x , y; a ) = ∑ a j φ j ( x , y ) où n est le nombre de degré de liberté.
j =1

Après intégration par parties, nous obtenons la forme suivante pour chaque degré de liberté

  ∂U ∂φ1   ∂U ∂φ1  
Γ∫∫   +  dydx = ∫∫ bφ1dydx − ∫ τ nφ1ds 
 e  ∂x ∂x   ∂y ∂y  e e 
  ∂U ∂φ   ∂U ∂φ  
Γ∫∫  2
 +  2
dydx = ∫∫ bφ 2dydx − ∫ τ nφ2 ds 12
 e  ∂x ∂x   ∂y ∂y  e e 
 
Γ  ∂U ∂φ3  +  ∂U ∂φ3 dydx = bφ dydx − τ φ ds
 ∫∫  ∂x ∂x   ∂y ∂y  ∫∫e 3 ∫e n 3 
 e

Pour simplifier les calculs, nous avons supposé que Γ était indépendant de toute variation
dans la direction x et y, i.e que nous sommes dans un milieu isotrope.

En insérant la fonction approximée dans chacunes des équations ci-haut, nous retrouvons une
matrice 3x3 représentant la matrice de rigidité élémentaire.

 3  ∂φ j ∂φ1   ∂φ j ∂φ1  
Γ∑ ∫∫  + dydx = ∫∫ bφ1dydx − ∫ τ nφ1ds 
 j =1 e  ∂x ∂x   ∂y ∂y  e e 
 3  ∂φ 
Γ ∂φ2   ∂φ j ∂φ 2 
∑ ∫∫  j + dydx = ∫∫ bφ2dydx − ∫ τ nφ2ds
 j =1 e  ∂x ∂x   ∂y ∂y  e e
 13
 
 3  ∂φ j ∂φ3   ∂φ j ∂φ 3  
Γ∑ ∫∫  +
 
dydx = ∫∫ bφ3dydx − ∫ τ nφ3ds

 j =1 e  ∂x ∂x   ∂y ∂y  e e 
Si nous résolvons uniquement l’équation de Laplace, le terme b=0 et l’intégrale en τ disparaît
pour former ainsi un système matriciel de 3x3 que nous éclatons ainsi :

 K11e K12e K13e 


 e e   ∂φ j ∂φ i   ∂φ j ∂φ i 
 K 21 K 22 K 23  où les K ij = Γ∫∫  ∂x ∂x  +  ∂y ∂y dydx
e e
14
 K 31
e e e  e    
 K 32 K 33 

α j + β j x +γ j y
Avec ϕ j ( x, y ) = 15
2∆

Nous pouvons déterminer les dérivées partielles par rapport à x et y et ainsi obtenir une
relation discrétisée.

∂ϕ j βj ∂ϕ j γj
= = 16
∂x 2∆ ∂y 2∆

avec

α j = xk yl − xl yk
β j = yk − yl 17
γ j = yl − y k

Nous devons suivre la permutation des indices pour déterminer α j , β j ,γ j

 j kl
 
 1 2 3
Soit  18
3 1 2
 
 2 3 1 

1
Et enfin ∫∫ dydx = ∆ où ∆ = (α1 + α 2 + α 3 )
2
19

Une fois la matrice élémentaire construite pour chaque élément, on insère celle-ci dans la
matrice globale selon la position des nœuds pour chaque éléments. En tout dernier, on insère
les conditions frontières au niveau des potentiels. Pour ce faire on utilise la méthode du terme
unité sur la diagonale.
L’insertion de la matrice de rigidité élémentaire dans la matrice gl obale s’effectue de la
manière suivante :

Supposons que nous calculions la matrice élémentaire d’un élément composé des nœuds 3, 6
et 9 sur un ensemble de 9 nœuds qui compose la totalité du problème. La matrice globale sera
donc une matrice de 9 lignes et 9 colonnes. La matrice de rigidité élémentaire sera insérée
dans la matrice globale en fonction de la numérotation des nœuds composant l’élément en
question.

Matrice de rigidité élémentaire


3−− 6−− 9
3  K 11e K 12e K13e 
 e e e 
6  K 21 K 22 K 23 
9  K 31
e e e 
K 32 K 33 

Matrice globale

1 2 3 4 5 6 7 8 9
1
 
2 
3  
K11e K12e K13e 
4 
 
5 
6 e e e 
 K 21 K 22 K 23 
7 
8 
 
9 e e e 
 K 31 K 32 K 33 

Après insertion dans la matrice globale, on passe à l’élément suivant et on recommence le


processus. Après avoir traversé la liste des éléments, on insère les conditions se présentant sur
les nœuds ou sur les éléments dépendamment si c’est un pot entiel ou une densité de flux. On
insère ces conditions essentielles soit selon la méthode du terme diagonal unitaire ou la
méthode du terme diagonal dominant.
Expérimentation

Expérience 1.0a et 1.0b

L’expérience 1.0 concerne un conducteur rect angulaire dont on veut déterminer les lignes
d’équipotentielles d’un potentiel électrique appliqué sur l’enveloppe externe du conducteur.
L’expérience à été réalisée selon le cas où nous avons plusieurs éléments et le cas où nous
avons peu d’éléments. Le r ésultat était connu à l’avance et me permis de valider le
programme.

Expérience 2.0

Cette expérience démontre la simulation d’une pièce métallique soumise à une température à
chaque extrémités.

Analyse et discution des résultats

Expérience 1.0a ( Éléments triangulaires linéaires)

Table de position des noeuds Table de connectivité des éléments


24 noeuds 28 éléments
24 3 28 3
0.0 0.5 1 19 2
0.0 0.8 2 19 3
0.0 0.9 19 5 3
0.0 1.0 543
0.2 1.0 19 6 5
0.3 1.0 20 6 19
0.5 1.0 18 20 19
0.7 1.0 18 19 1
1.0 1.0 17 20 18
1.0 0.7 20 7 6
1.0 0.5 20 21 7
1.0 0.3 20 17 21
1.0 0.0 21 8 7
0.8 0.0 21 22 8
0.5 0.0 22 9 8
0.5 0.3 22 10 9
0.5 0.5 22 21 17
0.3 0.5 17 23 22
0.2 0.8 23 11 22
0.4 0.8 11 10 22
0.6 0.8 23 24 11
0.8 0.8 24 23 17
0.8 0.5 17 16 24
0.8 0.3 16 15 24
15 14 24
14 13 24
13 12 24
12 11 24

La table ci-haut correspond à l’exemple du conducteur rectangulaire dont seulement le quart


du conducteur est modélisé pour raison de symétrie. Il manque les conditions essentielles aux
nœuds (voir code ci -bas).
Image représentant le résultat de la simulation pour l’expérience 1.0. Cette image représente
les équipotentielles rencontrées pour un champ électrique produit par une onde TEM.

1.0 1.0

0.8
0.8
0.6
row

0.4 0.6

row
0.2
0.4
0.0
0.0 0.2 0.4 0.6 0.8 1.0
0.2
col

0.0
0.0 0.2 0.4 0.6 0.8 1.0
0.0 0.2 0.4 0.6 0.8 1.0
col
mat_B_txt_3

1.0
0.8
0.6
0.4 mat_B_txt_3
0.2
0.0
1.0 1.0
0.8 0.8
0.6 0.6
row 0.4 0.4 col

0.2 0.2
0.0 0.0

L’expérimentation effectuée avec un si petit nombre d’éléments représ ente une assez bonne
approximation de ce que nous devons retrouver au niveau de la distribution des
équipotentielles. Si nous regardons maintenant pour l’expérience 1.0b, avec un plus petit
nombres d’éléments, nous remarquons que la distribution est conser vée mais que le nombre
de ligne de contour est plus faible, par contre la distribution visualisée sous forme d’image
donne le même résultats.
Expérience 1.0b ( Éléments triangulaires linéaires)

Table de position des noeuds Table de connectivité des éléments


8 noeuds 6 éléments

82 63
0.0 0.5 182
0.0 1.0 283
0.5 1.0 384
1.0 1.0 485
1.0 0.5 586
1.0 0.0 687
0.5 0.0
0.5 0.5
1.0

0.8

1.0
0.6

row
0.4 0.8

0.2 0.6

row
0.0
0.4
0.0 0.2 0.4 0.6 0.8 1.0

col
0.2

0.0
0.0 0.2 0.4 0.6 0.8 1.0
0.0 0.2 0.4 0.6 0.8 1.0
col
mat_B_txt_3

1.0
0.8
0.6
0.4 mat_B_txt_3
0.2
0.0
1.0 1.0
0.8 0.8
0.6 0.6
row 0.4 0.4 col

0.2 0.2
0.0 0.0
Pour ce qui de l’expérience 2.0, j’ai expérimenté le programme pour connaître la distrib ution
de température sans aucune source et sans aucune convection et voilà ce que cela donne :

Table de position des noeuds Table de connectivité des éléments


9 noeuds 8 éléments

92 83
00 125
10 236
20 154
01 265
11 487
21 598
02 458
12 569
22

La forme qui a été donnée pour cette expérience est la suivante :

10 C

0C

2.00
1.75
1.50
2.00
1.25
1.75
row

1.00
0.75 1.50

0.50 1.25
0.25
row

1.00
0.00
0.00
0.25
0.50
0.75
1.00
1.25
1.50
1.752.00 0.75

col 0.50

0.25

0.00
0.000.250.500.751.001.251.501.752.00
0 2 4 6 8 10
col
mat_B_txt_3
10
8
6
4 mat_B_txt_3
2
0
2.00
1.75
1.50
1.25
1.00
row
0.75
0.50
0.000.25 0.25
0.500.75
1.001.25 0.00
1.501.75
col 2.00

Le code source pour le programme de simulation par éléments finis est présenté ci-dessous et vous donnera un
aperçu de la simplicité du programme.

c
c
c Programme de simulation par éléments finis
c

Program main

c ------------ Ecoulement de chaleur sans source

parameter (NBnoeud=9)
parameter (NBdim=2)
parameter (NBelem=8)
parameter (elemdim=3)

c ------------ Ecoulement de chaleur sans source externe ou interne

c parameter (NBnoeud=21)
c parameter (NBdim=2)
c parameter (NBelem=24)
c parameter (elemdim=3)

c ------------ Equipotentiel dans un conducteur rectangulaire

c parameter (NBnoeud=24)
c parameter (NBdim=2)
c parameter (NBelem=28)
c parameter (elemdim=3)
c parameter (NBnoeud=8)
c parameter (NBdim=2)
c parameter (NBelem=6)
c parameter (elemdim=3)

c Parameter (mho = 1/(1.375D-6*0.01))


parameter (mho = 1.0)

c Coords correspond à la matrice des coordonnées


c elem correspond à la matrice des éléments triangulaire
real coords(NBnoeud,NBdim),elem(NBelem,elemdim)
real area
real A(NBnoeud,NBnoeud),B(NBnoeud),CL(NBnoeud)
real matelem(elemdim,elemdim),curelem(elemdim)
real alpha(elemdim),beta(elemdim),gamma(elemdim)
real DphiDX(3),DphiDY(3)

integer Ncoords,dimcoords,NoNoeud(NBnoeud)
integer Nelem,dimelem,kpvt(NBnoeud),info
integer i,j,m,n,k,ligne,col,ncond,indice
Character*1 uneTouche

c *********************************************************************
c LECTURE DES DONNÉES D'INITIALISATION DU PROGRAMME DE SIMULATION
c *********************************************************************

c *********************************************************************
c INITIALISATION DES FICHIERS AINSI QUE LEURS NUMÉRO DE BUFFER
c *********************************************************************

c --------------- Fichier de charles


c open(unit=1,file='corg2.txt',status='unknown')
c open(unit=2,file='conec2.txt',status='unknow
n')
c open(unit=3,file='condlim.txt',status='unknown')

c --------------- Fichier de charles


open(unit=1,file='corg1.txt',status='unknown')
open(unit=2,file='conec1.txt',status='unknown')
open(unit=3,file='cond1.txt',status='unknown')

c --------------- Fichier test 1


c open(unit=1,file='lstnode1.txt',status='unknown')
c open(unit=2,file='lstelem1.txt',status='unknown')
c open(unit=3,file='condlim2.txt',status='unknown')

c --------------- Fichier test 2


c open(unit=1,file='lstnode.txt',status='unknown')
c open(unit=2,file='lstelem.txt',status='unknown')
c open(unit=3,file='condition.txt',status='unknown')

open(unit=4,file='mat_area.txt',status='unknown')
open(unit=5,file='mat_A.txt',status='unknown')
open(unit=6,file='mat_B.txt',status='unknown')

c *********************************************************************
c DEBUT DE LA LECTURE DES DONNÉES
c *********************************************************************

c ------- Lecture des noeuds


read(1,*) Ncoords,dimcoords
do i=1,Ncoords
read(1,*) coords(i,1),coords(i,2)
enddo
c
c -------- Lecture de la table de connectivité (Element triangle)

read(2,*) Nelem,dimelem
do i=1,Nelem
read(2,*) elem(i,1),elem(i,2),elem(i,3)
enddo

c -------- Lecture des conditions limites indiquées aux noeuds

read(3,*) Ncond
do i=1,Ncond
read(3,*) NoNoeud(i),CL(i)
enddo

c *********************************************************************
c DEBUT DU PROGRAMME DE CALCUL POUR LA MODÉLISATION
c *********************************************************************

do i=1,Nelem

c
c Calcul de alpha, béta et gamma selon permutation cyclique.
c

alpha(1)=(coords(elem(i,2),1)*coords(elem(i,3),2))
+ -(coords(elem(i,3),1)*coords(elem(i,2),2))
alpha(2)=(coords(elem(i,3),1)*coords(elem(i,1),2))
+ -(coords(elem(i,1),1)*coords(elem(i,3),2))
alpha(3)=(coords(elem(i,1),1)*coords(elem(i,2),2))
+ -(coords(elem(i,2),1)*coords(elem(i,1),2))

beta(1)=(coords(elem(i,2),2)-coords(elem(i,3),2))
beta(2)=(coords(elem(i,3),2)-coords(elem(i,1),2))
beta(3)=(coords(elem(i,1),2)-coords(elem(i,2),2))

gamma(1)=(coords(elem(i,3),1)-coords(elem(i,2),1))
gamma(2)=(coords(elem(i,1),1)-coords(elem(i,3),1))
gamma(3)=(coords(elem(i,2),1)-coords(elem(i,1),1))

c Calcul de surface de l'élément ciblé


c --------------------------------------------

area=0.5*(alpha(1)+alpha(2)+alpha(3))

c
c Construction de la matrice rigidité élémentaire
c ----------------------------------------------------------
do m=1,elemdim
do n=1,3
matelem(m,n) = mho*((beta(m)*beta(n))+
+ (gamma(m)*gamma(n)))/(4*area)
enddo
enddo
c
c Insertion dans la matrice globale selon l'élément en cours
c ----------------------------------------------------------

do j=1,3
curelem(j)=elem(i,j)
enddo
do m=1,3
ligne=curelem(m)
do n=1,3
col=curelem(n)
A(ligne,col)=A(ligne,col)+matelem(m,n)
enddo
enddo

enddo

c *********************************************************************
c FIN DE LA BOUCLE PRINCIPALE
c *********************************************************************

c
c *********************************************************************
c INSERTION DES CONDITIONS LIMITES
c *********************************************************************

c
c On parcours la matrice globale pour instaurer les conditions frontières
c par la méthode du terme diagonale unitaire.

do i=1,Ncond
indice=NoNoeud(i) ! indice représente le numéro de la diagonale

do k=1,NBnoeud ! On met toute la ligne à zéro


A(indice,k)=0
enddo

A(indice,indice)=1 ! On met A(i,i)=1


B(indice)=CL(i) ! on met la condition limite dans b(i)

do j=1,NBnoeud ! on met toute la colonne à zéro après avoir


if(j.NE.indice) then
B(j)=B(j)-A(j,indice)*CL(i) ! sauvegardé dans B les valeur non nulles
A(j,indice)=0
endif

enddo

enddo

c *********************************************************************
c RESOLUTION DU SYSTEME AX=B
c *********************************************************************

call ssifa(A,NBnoeud,NBnoeud,kpvt,info)

call ssisl(A,NBnoeud,NBnoeud,kpvt,B)
do i=1,NBnoeud
write(6,*) coords(i,1),coords(i,2),B(i)
enddo

end

c
c *********************** Utilitaire de déboggage

c test
c open(unit=1,file='elemout.txt',status='unknown')

c do i=1,Nelem
c write(1,*) elem(i,1),elem(i,2),elem(i,3)
c enddo

c open(unit=1,file='mat_A.txt',status='unknown')

c do k=1,NBelem
c write(1,*) area(i)
c enddo