travaux pratiques d’ eléments finis · 2009. 10. 29. · nous discrétiserons ce problème par...
TRANSCRIPT
Bonnet Rebecca
Pernod Erik
ISITV
Calcul scientifique
2ère année
Travaux
Pratiques
D’
Eléments
Finis
1
I - Problématique………………………………………………..……………………..2
II – Etude du problème………………………………………..……………………..2
III – Algorithme ……………………………..…………………..……………………..9
IV – Points délicats……………………………………………………………….…..10
V – Résultats.………………………………………………..………………...………..11
VI – Programme …………...……………………………………..…………………..15
TP 1 : Application de la méthode des éléments
Finis au problème de la plaque. Equation de la chaleur.
2
I - Problématique
Dans ce TP, nous considérons une plaque rectangulaire dont les 4 côtés sont
maintenus à des températures différentes. On cherche alors la température d’état
stationnaire T(x,y) en tout point de la plaque.
Nous sommes donc amenés à résoudre le problème (P) suivant :
(P)
] [ ] [
====
×=∆−
10)1,(
50)0,(
20),1(
5),0(
,0,00
xT
xT
yT
yT
basurT
Nous discrétiserons ce problème par la méthode des éléments finis, avec des pas de
discrétisation h=1
1
+N et k=
1
1
+M.
Par simplification du problème on pose a = b = 1 et M=N.
II – Etude du problème
Etude du problème variationnel
On cherche à étudier le système (P).
On a V= deBordConditionsvVv ⊂∈ ;
Et on a le problème variationnel suivant :
0.
0..
=−∇∇⇔
=∇−∇∇
∫∫
∫∫
ΩΩ
ΩΩ
δ
δ
vdivuvu
nvuvu
Or
3
( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( )∫∫∫∫∫
∫∫∫∫∫
∇+∇+∇+∇=
∇+∇+∇+∇=
Ω
Ω
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
,15,0201,100,50.
,1,1,0,01,1,0,0,.
dxyudxyudxxudxxuvdivu
dyyvyudyyvyudxxvxudxxvxuvdivu
δ
δ
D’où
( ) ( ) ( ) ( ) 0,15,0201,100,50.1
0
1
0
1
0
1
0
=
∇+∇+∇+∇−∇∇=−∇∇ ∫∫∫∫∫∫∫
ΩΩΩ
dxyudxyudxxudxxuvuvdivuvuδ
On obtient donc :
( ) ( ) ( ) ( ) ( )
∫
∫∫∫∫
Ω
∇∇=
∇+∇+∇+∇=
vuvua
dxyudxyudxxudxxuvl
),(
,15,0201,100,501
0
1
0
1
0
1
0
On a a(u,v) bilinéaire car l’intégrale et le gradient sont des fonctions linéaires et car a
est symétrique.
L(v) est aussi linéaire car c’est une somme d’intégrales et de gradients.
Montrons la continuité de a(u,v) :
11
1
'
...2
²
2
²
2
²²
HH
LLH
LL
vudvu
oùd
or
vudvu
∫
∫
Ω
Ω
≤Ω∇∇
∇+=
∇∇≤Ω∇∇
On a bien a(u,v) continue.
Montrons la V-ellipticité de a(u,v) :
4
2
2
²
2
1
1
1
'²1
),(
H
L
uc
uc
Poincaréaprèsddxuc
dx
udvuuua
≥
≥
≥
Ω=Ω∇∇=
∫
∫ ∫
Ω
Ω Ω δδ
a(u,v) est V-elliptique
l(v) est continue car elle ne dépend pas de v
On peut donc appliquer le théorème de Lax-Milgram au problème : on a donc
existence et unicité de la solution.
Etude du problème variationnel approché
On a
( )
( ) ( )( ) ( )
( )
( ) ( )2
1
,
0,
'
0,
0,
,;
∫
∑
∑
∑
∇=
≠=
==
==
=
∈∈Ω∈= ∞
iii
ii
jjii
jjh
iih
iihTihhh
a
et
jijau
oùd
lua
luaet
uu
TborddeconditionslesvérifievetQvCvV
φφφ
φφ
φφφ
φφφ
τ
Il faut donc calculer pour chaque j les Σ ui a(φi, φi ), pour cela déterminons la valeur
du gradient de φi sur les triangles qui entourent le point i comme sur le schéma
suivant :
Tα+2n
Tα+2n-1 Tα+2n+1
Tα Tα+2
Tα+1
5
−−
−
−=∇
++
+
−+
+
+
12
2
12
2
1
)1
;1
(
)1
;0(
)0;1
(
)0;1
(
)1
;0(
)1
;1
(
n
n
n
i
Tsurhh
Tsurh
Tsurh
Tsurh
Tsurh
Tsurhh
α
α
α
α
α
α
φ
Par exemple calculons a(φi, φi ) :
Les termes diagonaux de la matrice seront donc tous égaux à 4 car A(i,i) = a(φi, φi ).
Mais le nœud i est en relation avec 6 autres nœuds. Pour chaque interaction entre
deux nœuds on prend comme support les deux triangles adjacents.
4
²
2
²
1
²
1
²
1
²
1
²
2
2
²
),(12
2
2
2
12
2
2
2
1
22
=
+++++=
∇+∇+∇+∇+∇+∇= ∫∫∫∫∫∫+++−+++
hhhhhh
h
anT
i
nT
i
nT
i
T
i
T
i
T
iii
αααααα
φφφφφφφφ
6
( ) ( )
1
0
1.
1
1
1
1
.0
1
2
²
,1,
21212
1212 11
1
1
−=
−+−
−
=
∇∇+∇∇=
∇
∇∇+∇∇=
∇∇=
=−
+++−+
−+−+
∫∫
∫∫
∫
ΩΩ
−Ω
−Ω
Ω−
−
h
h
h
h
hh
h
lespourntranslatioparsymétrieayil
aiiA
TiTiTiTi
TiTiTiTi
ii
ii
nn
nn
αααα
αααα
φφφφ
φ
φφφφ
φφ
φφ
Par la suite on obtient :
∇=∇
∇=∇
∇=∇
∇=∇
∇=∇
∇=∇
++
−++
+++
+
++−+
+
−
−
−−
−−
−
−
n
n
n
n
nn
TiTNi
TiTNi
TiTNi
TiTNi
TiTi
TiTi
22
121
121
2
1212
2
1
1
1
1
αα
αα
αα
αα
αα
αα
φφ
φφ
φφ
φφ
φφ
φφ
7
∇=∇
∇=∇
∇=∇
∇=∇
∇=∇
∇=∇
+++
+
++
+−+
−+++
+
++
++
+
+
+
+
112
2
22
112
1212
2
1
1
1
1
αα
αα
αα
αα
αα
αα
φφ
φφ
φφ
φφ
φφ
φφ
TiTNi
TiTNi
TiTNi
TiTNi
TiTi
TiTi
n
n
n
n
nn
On en déduit le remplissage de la matrice A suivant :
A(i,i) = a(φi, φi ) = 4
A(i,i-1) = a(φi, φi-1 ) = -1
A(i,i+1) = a(φi, φi+1 ) = -1
A(i,i-N) = a(φi, φi-N ) = 0
A(i,i+N) = a(φi, φi+N ) = 0
A(i,i+N+1) = a(φi, φi+1+N ) = -1
A(i,i-N-1) = a(φi, φi-1-N ) = -1
8
N-1
On obtient donc le système matriciel suivant :
=
−−
−−
−−
++
+
++
+
+
−−
−−
−−
+
1,1
12
1,1
11
1,1
12
1,1
11
2
11
11
2
11
2
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
.
'
.
.
'
'
nn
N
nn
N
N
NN
NN
NN
N
f
f
f
f
u
u
u
u
I
IAI
IAI
I
IAI
I
Avec
−−
−−
=
410
1..
...
..1
014
'A de taille N-1xN-1
I, la matrice identité. Sa présence reflète le fait que les valeurs des bords sont connues
et sont présentes dans le vecteur de charge.
Dans ce cas particulier où nous connaissons les valeurs des bords le vecteur de
charge s’écrira plus précisément :
=
15
10
...
10
5.7
20
0
...
0
5
35
50
...
50
5.27
F
N-1
Taille N+1. Le motif se répète N-1 fois
9
III – Algorithme
10
IV – Points délicats
1. Pour un M et un N donnés, on obtient une matrice de taille
[(N+1)x(M+1)]x[(N+1)x(M+1)]. Autrement dit lorsqu’on dépasse N=M=40, on constate
alors que le programme est très long voire impossible à exécuter pour les PC peu
puissants (Le langage fortran étant lui aussi limité dans la taille des matrices).
2. Nous nous sommes aperçus que pour la résolution du système matriciel
l’utilisation de la matrice A totale est fastidieuse. Ainsi nous avons utilisé une matrice
A restreinte aux nœuds intérieurs (de taille A[(N-1)² ;(N-1)²]. Cela permet aussi
d’alléger le système matriciel. Bien évidemment, il faut modifier le vecteur solution
et le vecteur de charge en conséquence.
3. Le problème majeur que nous avons rencontré a été de passer du maillage de la
plaque en indice (i,j) qui s’effectue de bas en haut au remplissage de la matrice
d’indice (i,j) qui s’effectue de haut en bas. En effet, à un nœud numéroté i,
correspond à la ligne entière i de la matrice solution. Il nous a donc fallut trouver
une équation de passage entre ces deux notations. (correspondance entre A(i,i) et
a(φi ;φi) vue précédemment).
11
V – Résultats Afin de simplifier l’étude des résultats nous avons tracé des courbes grâce aux
résultats obtenus et à l’aide de Maple.
A la fin du programme, on imprime le vecteur solution dans un fichier texte,
ainsi à l’aide de Maple il est possible de récupérer les données de ce fichier et de
reconstituer la matrice solution.
Voici le programme Maple pour N=5
EF : TP1 Equation de la chaleur sur une plaque. Résolution par la méthode des éléments finis. Acquisition des données et modélisation graphique > restart: > n:=5: > n:=n+1: > f := fopen( "F:\\Documents and Settings\\erik\\Bureau\\EF\\resultats\\Matrices.n=5 .dat",READ ): > all:=readdata(f,float,1): for i from 1 to n do a[i]:=[seq(all[j+(i-1)*n],j=1..n)]: od: mat:=[seq(a[i],i=1..n)]: MAT:=convert(mat,Matrix);
:= MAT
7.5 10.0 10.0 10.0 10.0 15.05.0 9.63979195 11.9062886 12.3112889 10.5778222 20.05.0 11.6528792 15.6740734 16.7610449 14.875149 20.05.0 16.2976514 22.376081 24.1836684 22.7395511 20.05.0 26.1616456 33.3489308 34.8579965 31.8993869 20.027.5 50.0 50.0 50.0 50.0 35.0
> with(plots): matrixplot(MAT,title=`Evolution graphique de la cha leur`, axes=boxed); matrixplot(MAT,title=`Histogramme de l'évolution de la chaleur`,heights=histogram,axes=boxed);
12
Voici les courbes de l’évolution de la chaleur : Pour M=N=5
Graphique plan Histogramme
Pour M=N=15
Graphique plan Histogramme
Pour M=N=25
13
Graphique plan Histogramme
Pour M=N=40
Graphique plan Histogramme
Avec ici, en rouge la température la plus élevé (50°C) et violet la plus faible (5°C)
14
Dans les coins, nous avons pris à chaque fois la moyenne des températures des
deux bords. On retrouve bien les résultats attendus.
On constate bien que la diffusion de la chaleur est progressive. De plus les
histogrammes rendent bien compte de l’importance du maillage. Plus celui-ci est
grand moins il y a d’écarts brusques de température entre 2 mailles voisines.
A l’aide d’un compteur placé dans la méthode de la résolution du système,
nous pouvons obtenir le tableau suivant :
Valeur de N et M Nombre d’itérations nécessaires
5 30
15 390
25 1150
40 3040
On constate que le nombre d’itérations augmente très rapidement. On est donc très
vite limité par la capacité de l’ordinateur.
15
VI – Programme
c ********************************************* ********************* c | | c | Elements Finis : TP1 | c | Diffusion chaleur dans une pla que | c | | c ********************************************* ********************* c PROGRAM Bidule c c Declarations c ************ c INTEGER i,j,k,dim,N,Neu,cpt DOUBLE PRECISION A,h,Aptit,FM,F,T,TM,L,U PARAMETER (dim= 2000 ) DIMENSION A(dim,dim),T(dim),TM(dim,dim),F(dim),Aptit(dim,dim) , & FM(dim,dim),L(dim,dim),U(dim,dim) c OPEN(UNIT= 69, FILE= 'Matrices.dat' ,STATUS='UNKNOWN') OPEN(UNIT= 17, FILE= 'Resultats.dat' ,STATUS='UNKNOWN') c c c Initialisation c ************** c 15 WRITE(*,*) 'Saisissez une valeur pour N' READ(*,*)N c Neu=N+ 1 c IF (N*N .GT. dim) THEN WRITE (*,*) 'La valeur de N choisie est trop grande, recommence z' GOTO 15 ENDIF c c c On resout le systŠme sans prendre en compte l es bords neu=neu- 2 c c --- Vecteur de charge --- c DO i= 1,Neu !remplissage de 0 DO j= 1,Neu FM(i,j)= 0 ENDDO ENDDO c DO i= 1,Neu !matrice de charge (taille neu x neu) DO j= 1,Neu FM( 1,j)= 50 FM(i, 1)= 5 FM(i,Neu)= 20 FM(Neu,j)= 10 ENDDO ENDDO FM(1, 1)= 55 !on complete les coins FM(1,Neu)= 70 FM(Neu, 1)= 15 FM(Neu,Neu)= 30 c DO i= 1,Neu !on remplit le vecteur de charge (taille neu x neu) DO j= 1,Neu ! a l'aide de la matrice de charge F((i- 1)*Neu+j)=FM(i,j) ENDDO ENDDO c
16
c --- Matrice restreinte aux noeuds interieurs --- c DO i= 1,Neu** 2 DO j= 1,Neu** 2 !remplissage de 0 Aptit(i,j)= 0 ENDDO ENDDO c DO i= 1,Neu** 2 Aptit(i,i)= 4 !remplissage des termes diagonaux ENDDO DO i= 1,Neu** 2- 1 Aptit(i,i+ 1)=- 1 Aptit(i+ 1,i)=- 1 ENDDO DO i= 1,Neu** 2-(Neu+ 1) Aptit(i,i+Neu)=- 1 Aptit(i+Neu,i)=- 1 ENDDO DO i= 1,Neu- 1 !remplacement des 0 sur les diags Aptit(i*Neu,i*Neu+ 1)= 0 Aptit(i*Neu+ 1,i*Neu)= 0 ENDDO c WRITE(*,*) WRITE(*,*) c c --- resolution --- c CALL decLU(Neu,dim,Aptit,L,U) CALL resolLU(Neu,L,U,F,T,cpt,dim) c WRITE( 17,*) 'taille N : ' ,N WRITE( 17,*) WRITE( 17,*) "Nombre d'it‚rations pour la r‚solution :" WRITE( 17,*)cpt WRITE( 17,*) c DO i= 1,Neu DO j= 1,Neu TM(i,j)=T((i- 1)*Neu+j) ENDDO ENDDO c c DO i= 1,Neu DO j= 1,Neu A(i+ 1,j+ 1)=TM(i,j) ENDDO ENDDO c DO i= 1,N+ 1 DO j= 1,N+ 1 A( 1,j)= 50 A(i, 1)= 5 A(i,N+ 1)= 20 A(N+1,j)= 10 ENDDO ENDDO A( 1, 1)= 27.5 A(N+1, 1)= 7.5 A(N+1,N+ 1)= 15 A( 1,N+ 1)= 35 c CALL Mat(A,N+ 1,dim) CLOSE( 69) CLOSE( 17) c c END
17
c c ********************************************* ********************* c --------------------------------------------- --------------------- c c --------------------------------------------- --------------------- c Decomposition LU c SUBROUTINE decLU(N,dim,A,L,U) INTEGER n,i,j,k,m,dim DOUBLE PRECISION A,L,U DIMENSION A(dim,dim),L(dim,dim),U(dim,dim) m=n*n do i= 1,m- 1 do j= 1+i,m U(j,i)= 0 L(i,j)= 0 enddo enddo do i= 1,m L(i,i)= 1 enddo do i= 1,m U( 1,i)=A( 1,i) enddo L( 2, 1)=A( 2, 1)/U( 1, 1) do i= 2,m U( 2,i)=A( 2,i)-L( 2, 1)*U( 1,i) enddo do i= 3,m do j= 1,i- 1 L(i,j)=A(i,j) do k=1,j- 1 L(i,j)=L(i,j)-L(i,k)*U(k,j) enddo L(i,j)=L(i,j)/U(j,j) enddo do j=i,m U(i,j)=A(i,j) do k=1,i- 1 U(i,j)=U(i,j)-L(i,k)*U(k,j) enddo enddo enddo return end c --------------------------------------------- --------------------- c c --------------------------------------------- --------------------- c Resolution LU c SUBROUTINE resolLU(N,L,U,q,x,cpt,dim) INTEGER n,i,j,cpt,dim DOUBLE PRECISION L,U,q,x,y DIMENSION L(dim,dim),U(dim,dim),q(dim),x(dim),y(dim) c y( 1)=q( 1) cpt= 0 do i= 2,n*n y(i)=q(i) do j= 1,i- 1 y(i)=y(i)-L(i,j)*y(j) cpt=cpt+ 1 enddo enddo c x(n*n)=y(n*n)/U(n*n,n*n) do i=n*n- 1, 1,- 1 x(i)=y(i) do j=n*n,i+ 1,- 1 x(i)=x(i)-U(i,j)*x(j)
18
cpt=cpt+ 1 enddo x(i)=x(i)/U(i,i) enddo c return end c --------------------------------------------- --------------------- c c --------------------------------------------- --------------------- c _____ Affichage de la matrice _____ c SUBROUTINE MAT(A,N,dim) c INTEGER i,j,N,dim,choix DOUBLE PRECISION A DIMENSION A(dim,dim) c WRITE(*,*) 'Comment voulez-vous afficher la matrice A ?' WRITE(*,*) "0 = Ne pas afficher la matrice" WRITE(*,*) "1 = A l'‚cran sous forme de matrice" WRITE(*,*) "2 = Dans un fichier texte sous forme de matrice" WRITE(*,*) "3 = Dans un fichier texte sous forme de vecteur Nx N" READ(*,*)choix WRITE(*,*) c 10 FORMAT(d14 .8 , 1A,$) c IF (choix .EQ. 1) THEN DO 100 i= 1,N WRITE(*,*)(A(i,j),j= 1,N) 100 CONTINUE c ELSEIF (choix .EQ. 2) THEN DO i= 1,N DO j= 1,N WRITE( 69, 10)A(i,j), ';' ENDDO WRITE ( 69,*) ENDDO c ELSEIF (choix .EQ. 3) THEN DO i= 1,N DO j= 1,N WRITE( 69,*)A(N-i+ 1,j) ENDDO ENDDO c ENDIF c c RETURN END c --------------------------------------------- --------------------- c c --------------------------------------------- --------------------- c PRODUIT SCALAIRE c SUBROUTINE SCALAIRE (V1,V2,taille,NM,res) c c --- Declarations --- INTEGER i, taille DOUBLE PRECISION V1(taille), V2(taille) DOUBLE PRECISION res c c -- - Initialisation --- res= 0 c c --- Calcul du Produit Scalaire ---
19
DO i= 1,NM res=res+V1(i)*V2(i) ENDDO RETURN END c --------------------------------------------- ---------------------