Vous êtes sur la page 1sur 11

Maillage

SAE - TP 4
2006
Lobjet de ce TP est de raliser avec Matlab un code ralisant des maillages bidimensionnels de domaines
simples qui seront utiliss dans le contexte de la mthode des lments nis.

Maillage

Soit
un domaine born, ferm et non vide de R2 . On appelle maillage toute collection de ferms
borns non vides (K` )`=1;L qui vrie les proprits suivantes :
[
K` =
`=1;L

K ` \ K `0 = ; si ` 6= `0 (K ` dsignant lintrieur de K` )
Dans le contexte de la mthode des lments nis, on impose galement que :
toute arte dun lment K` est soit une arte du bord de

soit une arte dun autre lment K`0

Cette hypothse interdit la situation suivante :

A K2
K1
K3
o larte A, arte de llment K2 nest pas une arte dun autre lment !
Un maillage peut-tre constitu de dirents types dlment gomtrique. En 2D, on rencontre principalement des triangles et des quadrangles. Lorsque le maillage est constitu exclusivement de triangle on parle
de triangulation du domaine et lorsquil est constitu exclusivement de quadrangle, on parle de quadrangulation. De faon gnrale, un triangle (resp. un quadrangle) est un domaine gomtrique constitu de 3
(resp. 4) cts ventuellement courbes. Dans la suite, on se restreindra des domaines gomtriques ayant
des cts droits. Notons, quavec des lments ayant des bords droits on ne peut mailler au sens de la dnition prcdente que des domaines eux mmes constitus de bords droits. Dans le cas o le domaine mailler
prsente des bords courbes on ne peut que raliser avec des lments bord droit quune approximation du
domaine :

Un maillage tant destin servir de "grille gnralise" de calcul, on caractrise la nesse du maillage par
un paramtre h :
h = sup diam(K` )
`=1;L

o diam(K` ) est le diamtre du plus petit cercle qui circonscrit K` :

Un triangle K` (resp. un quadangle) bords droits est entierement dtermin par ses p sommets, p = 3
(resp. p = 4) : S`i i=1;p On dnit lensemble des sommets du maillage par :
S=

[ [

S`i

`=1;Li=1;p

lunion tant ensembliste, cest_-dire que chaque sommet nest compt quune seule fois. On notera N le
cardinal de S (nombre de sommets).
Crer un maillage consiste gnrer lensemble des sommets (liste) et une structure permettant de retrouver
quels sont les sommets des lments. Dun point de vue concret, il sagit donc de gnrer
un tableau S (matrice de dimension N x2) fournissant les coordonnes de tous les sommets :
S(I; :) : coordonnes (xI ; yI ) du sommet SI
un tableau T (matrice de dimension Lxp) fournissant les numros des sommets de llment ` :
T (`; :) : n des sommets (I1 ; I2 ; :::; Ip ) de llment `
Exemple : maillage dun carr de ct 2 en 8 triangles
y

S7

S9

S8
K7

K8

K5

K6
S5

S4

S6

K2

K3

K4

K1
S1

S3

S2

En choisissant de numroter les sommets dun triangle en commenant par le sommet situ sur langle droit,
on a :

6
6
6
6
6
6
S=6
6
6
6
6
6
4

0
1
2
0
1
2
0
1
2

0
0
0
1
1
1
2
2
2

7
7
7
7
7
7
7
7
7
7
7
7
5

6
6
6
6
6
T =6
6
6
6
6
4

2
4
5
3
5
6
7
8

5
1
2
6
8
9
4
5

1
5
6
2
4
5
8
9

3
7
7
7
7
7
7
7
7
7
7
5

Dans le contexte des lments nis, il est souhaitable de disposer dinformations supplmentaires :
un numro dit de rfrence associ chaque triangle (permet de distinguer des matriaux dirents) :
vecteur RT : RT (`) rfrence de llment K`
un numro de rfrence associ chaque sommet (permet de retrouver des bords, des interfaces) :
vecteur RS : RS(I) rfrence du sommet SI

Triangulation de domaines simples

On se propose de raliser quelques triangulation de domaines simples : carr et rectangle.

2.1

Triangulation dun carr

On cherche fabriquer une triangulation du carr unit = [0; 1] [0; 1] base sur un dcoupage du carr
en m n rectangles, m nombre de rectangles suivant x et n nombre de rectangles suivant y:

2
1

1 2

Chaque petit rectangle est dcoup suivant une de ses diagonales. An deviter dintroduire trop de disymtrie,
il est plus judicieux dalterner le sens de dcoupage comme le montre la gure prcdente. On suggre de
numroter, bien que ce ne soit pas optimal, les sommets de gauche droite et de bas en haut :

(m+1)(n+1)

n(m+1)+1

m+2

2m+2

2
1
1 2

m+1

Les triangles sont numrots suivant le mme ordre. Notons quil y a (m + 1)(n + 1) sommets et 2mn
triangles.
On adopte la convention suivante : les numros des sommets dun triangle sont rangs dans lordre trigonomtrique
en commenant toujours par langle droit.
On crira une fonction qui maille un carr unit partir des paramtres m et n, un vecteur de taille
4 contenant les rfrences des bords, une valeur de rfrence qui caractrise le matriau. cette fonction
retourne les matrices S et T ainsi que les vecteurs RS et RT:
function [S,T,RS,RT] triangule_carre(m,n,ref_bord,ref_mat)
On pourra procder en plusieurs temps :
gnrer la matrice des coordonnes S
gnrer la matrice de numrotation des triangles T
gnrer les vecteurs de rfrences RS et RT

2.2

Triangulation dun rectangle

Un rectangle [a; b]

[c; d] est limage du carr unit par la transformation a ne :


X
Y

a
0

0
c

x
y

a
c

Pour obtenir la triangulation dun rectangle en 2m n triangles rguliers, il su t de trianguler le carr unit
puis dappliquer la transformation a ne prcdente aux sommets.
En utilisant dautres transformations gomtriques, on peut gnrer des maillages dautres domaines gomtriques.

2.3

Triangulation dun domaine rectangulaire possdant plusieurs types de matriau

Le vecteur RT permet de dnir pour chaque triangle une rfrence. Cette rfrence permet de direncier
des zones du maillage o sont dnis des matriaux dirents. Une mthode simple pour prendre en compte
ces direntes zones consiste utiliser une caractrisation gomtrique de ces zones du type f (x; y) 0:Puis,
en parcoutrant la liste des triangles dcider si le triangle est dans la zone. En premire approximation, on
peut dcider quun triangle appartient cette zone si ces 3 sommets vrient le critre dnissant la zone.
On peut de la mme faon trianguler un domaine rectangulaire prsentant des trous, pour peu que ces
derniers possdent uen caractrisation gomtrique du type f (x; y) 0: Si un triangle est dans un trou au
sens du critre prcdent, on le supprime de la liste des lments.

2.4

Dessin dun maillage sous Matlab

Il su t dutiliser la fonction Matlab triplot :


triplot(T,S(:,1),S(:,2),k)
4

Application au calcul dune intgrale surfacique

La technique gnrale pour calculer une approximation dune intgrale surfacique repose sur des formules
de quadrature sur le triangle de rfrence ou le carr unit. Ainsi si on note T^ le triangle de rfrence unit
de sommets (0; 0); (1; 0) et (0; 1) on utilise des formules du type :
Z
X
f (^
x; y^)d^
xd^
y'
!j f (^
xj ; y^j )
T^

j=1;q

o q est le nombre de points de quadrature, (^


xj ; y^j ) les points de quadrature et !j les poids de quadrature.
Les poids et les points de quadrature sont choisis de telle sorte que la formule de quadrature soit exacte
pour des polynmes dun degr donn. Par exemple, la formule de quadrature la plu simple sur un triangle
est celle des points milieux qui est dordre 2 :
point

poids
1
(0:5; 0:5)
6
1
(0; 0:5)
6
1
(0:5; 0)
6
Pour calculer une intgrale surfacique dune fonction donne sur un maillage, on utilise la formule suivante :
X R
R
f (x; y)dxdy =
Kl f (x; y)dxdy
X

=
'

`=1;L

2aire(K` )

x; y^)d^
xd^
y
T^ f` (^

`=1;L
X
P
2aire(K` ) j=1;q !j f^` (^
xj ; y^j )

`=1;L

o on a pos f^` (^
x; y^) = f F` (^
x; y^) avec F` lapplication a ne transformant le triangle de rfrence T^ en le
2
1
triangle Kl de sommets (S` ; S` ; S`3 ) :
F` (^
x; y^) = (1
laire de Kl est donne par
On pourra crire :

1
2

!
S`1 S`2

^S`2 + y^S`3
y^)S`1 + x

x
^

!
S`1 S`3 (produit vectoriel).

une fonction qui pour un triangle donn calcule lintgrale sur un triangle
function I=int_triangle(S,F)
avec S les sommets du triangle et F les valeurs aux milieux des artes du triangle.
une fonction qui somme toutes les contributions pour produire lintgrale complte :
function I=int_domaine(S,T,f )
avec S,T les matrices dnissant le maillage et f une fonction.

En choisissant comme fonction f (x; y) = 1 on doit retrouver la surface du domaine !

4
4.1

Correction
Maillage dun carr

function [S,T,RS,RT]=triangule_carre(m,n,ref_bord,ref_mat)
%initialisation
dx=1./m;
dy=1./n;
x=0:dx:1.;
y=0:dy:1.;
nbs=(m+1)*(n+1);
nbt=2*m*n;
RS=zeros(1,nbs);
RT=ref_mat*ones(1,nbt);
%definition des sommets
[X,Y]=meshgrid(x,y);
S=[reshape(X,nbs,1) reshape(Y,nbs,1)];
%definition de la numerotation des triangles
N1=[];N2=[];
mp=m+1;
for i=1:m
if(mod(i,2)==1) %i impair
N1=[N1 i i+1 mp+i i+1+mp i+mp i+1];
else
%i pair
N1=[N1 i+1 i+1+mp i i+mp i i+1+mp];
end,
end,
N1=reshape(N1,3,2*m);
mp=m+1;
for i=1:m
if(mod(i,2)==1) %i impair
N2=[N2 i+1 i+1+mp i i+mp i i+1+mp];
else
%i pair
N2=[N2 i i+1 mp+i i+1+mp i+mp i+1];
end,
end,
N2=reshape(N2,3,2*m);
T=[];
for j=1:n
if(mod(j,2)==1) T=[T;N1+(j-1)*mp];
else T=[T;N2+(j-1)*mp];
end,
end,
%reference des bords
RS(1:mp)=ref_bord(1);
RS(mp:mp:end)=ref_bord(2);
RS(n*mp+1:end)=ref_bord(3);
RS(1:mp:end)=ref_bord(4);

4.2

Maillage dun rectangle

function [S,T,RS,RT]=triangule_rectangle(rect,m,n,ref_bord,ref_mat)
[S,T,RS,RT]=triangule_carre(m,n,ref_bord,ref_mat);
%transf des coordonn\{e}es S
l=rect(2)-rect(1);
S(:,1)=rect(1)+l*S(:,1);
l=rect(4)-rect(3);
S(:,2)=rect(3)+l*S(:,2);
La commande :
[S,T,RS,RT]=triangule_carre(20,10,[1 2 3 4],10);
triplot(T,S(:,1),S(:,2),k);
produit le maillage suivant :
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0

0.2

0.4

0.6

0.8

La commande :
[S,T,RS,RT]=triangule_rectangle([0 2 0 1],20,10,[1 2 3 4],10);
triplot(T,S(:,1),S(:,2),k);
produit le maillage suivant :
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0

4.3

0.2

0.4

0.6

0.8

1.2

1.4

1.6

1.8

Maillage avec direntes zones

An de crer des zones o les triangles ont une rfrence particulire on utilise la fonction suivante :

%modification des references des triangles suivant un critere


%crit([x,y]) est une fonction qui retourne 1 si le point (x,y) le verifie
function [RT]=def_zone(S,T,RT,ind,crit)
%parcours des triangles
nbt=size(T,1);
for l=1:nbt
S1=S(T(l,1),:);S2=S(T(l,2),:);S3=S(T(l,3),:);
if( feval(crit,S1) & feval(crit,S2) & feval(crit,S3) )
RT(l)=ind;
end,
end,
o crit est une fonction dnissant un critre, par exemple :
function c=materiau1(P)
c= (P(1)<=2./3) & (P(1)>=1./3) & (P(2)<=2./3) & (P(2)>=1./3);
La fonction triplot nore pas beaucoup doptions. En particulier si on souhaite colorier les triangles en
fonction de la rfrence dun triangle (type de matriau) il faut en rcrire une.:
function plot_triangulation(S,T,RS,RT)
%fabrication dune liste de couleurs par defaut (11 couleurs)
couleur=[1 1 1; 1 0 0; 0 1 0; 0 0 1; 1 1 0; 0 1 1; 1 0 1;
0.5 0.5 0.5; 0.5 0.5 0; 0 0.5 0.5; 0.5 0 0.5];
% definition des couleurs
reft=unique(RT);
n=length(reft);
refc=11*ones(1,n);
c=0;m=min(reft)+1;
for i=1:min(n,11) c=c+1;refc(reft(i)+m)=c;end;
%dessin du maillage
figure
hold on
for l=1:size(T,1)
X=[S(T(l,1),1) S(T(l,2),1) S(T(l,3),1)];
Y=[S(T(l,1),2) S(T(l,2),2) S(T(l,3),2)];
i=refc(RT(l)+m);
c=couleur(i,:);
patch(X,Y,c);
end
Ainsi la squence suivante :
[S,T,RS,RT]=triangule_rectangle([0 2 0 1],40,20,[1 2 3 4],0);
[RT]=def_zone(S,T,RT,1,@materiau1);
[RT]=def_zone(S,T,RT,2,@materiau2);
plot_triangulation(S,T,RS,RT);
donne :

4.4

Maillage dun domaine avec des trous

En sinspirant de la fonction def_zone on cre la fonction def_trou qui supprime des triangles dun
maillage suivant un critre. Cette fonction est plus complique car il faut renumroter les sommets.
%suppression de triangles suivant un critere
%crit([x,y]) est une fonction qui retourne 1 si le point (x,y) le verifie
function [SN,TN,RTN,RSN]=def_trou(S,T,RT,RS,crit)
%parcours des triangles
nbt=size(T,1);
nbs=size(S,1);
%liste des triangles, des sommets a supprimer
TS=zeros(1,nbt);SS=[];SG=[];
for l=1:nbt
S1=S(T(l,1),:);S2=S(T(l,2),:);S3=S(T(l,3),:);
if( feval(crit,S1) & feval(crit,S2) & feval(crit,S3))
TS(l)=1;;
SS=[SS T(l,:)];
else
SG=[SG T(l,:)];
end,
end,
SS=unique(SS);
%supression des doublons
SG=unique(SG);
SSS=[];
%ceux quil faut reellement supprimer, dans SS mais pas dans SG
for i=1:length(SS)
if(isempty(find(SG==SS(i)))) SSS=[SSS SS(i)];end,
end,
SSS=[sort(SSS) 0];
%renumerotation et suppression des sommets
j=0;k=1;
rn=1:nbs;
SN=[];RSN=[];
for i=1:nbs,
if(i==SSS(k))
%sommet a supprimer
k=k+1;
rn(i)=0;
else;
j=j+1;
rn(i)=j;
SN=[SN;S(i,:)];
9

RSN=[RSN RS(i)];
end;
end,
%renumerotation des triangles
TN=[];RTN=[];
for l=1:nbt
if(TS(l)==0)
N=[rn(T(l,1)) rn(T(l,2)) rn(T(l,3))];
TN=[TN; N];
RTN=[RTN RT(l)];
end,
end,
Avec les commandes suivantes :
function c=trou(P)
c= (P(1)<=2./3) & (P(1)>=1./3) & (P(2)<=2./3) & (P(2)>=1./3);
[S,T,RS,RT]=triangule_rectangle([0 2 0 1],40,20,[1 2 3 4],0);
[S,T,RT,RS]=def_trou(S,T,RT,RS,@trou);
plot_triangulation(S,T,RS,RT);
on obtient :

ou avec un disque
function c=disque(P)
x=p(1)-0.5:y=p(2)-1;
c=(sqrt(x*x+y*y)<=0.25);
[S,T,RS,RT]=triangule_rectangle([0 2 0 1],100,50,[1 2 3 4],0);
[S,T,RT,RS]=def_trou(S,T,RT,RS,@disque);
plot_triangulation(S,T,RS,RT);

10

Notons que le disque nest pas trs bien approch (eet descalier). Il faudrait a ner le critre qui prcise si
un triangle qui chevauche doit ou non appartenir au disque.
En fait il existe des mailleurs plus sophistiqus qui construisent directement des maillages partir des
frontires dun domaine quellconque, mais cest une autre histoire ...

4.5

Calcul dune intgrale surfacique

function I=int_domaine(S,T,f)
global pds_quad pts_quad;
%boucle sur les triangles
nt=size(T,1);
q=length(pds_quad);
I=0;
for l=1:nt
Sl=[S(T(l,1),:);S(T(l,2),:);S(T(l,3),:)];
for k=1:q
M=Sl(1,:)+pts_quad(k,1)*(Sl(2,:)-Sl(1,:))+pts_quad(k,2)*(Sl(3,:)-Sl(1,:));
F(k)=feval(f,M);
end,
I=I+int_triangle(Sl,F);
end,
function I=int_triangle(S,F)
global pds_quad pts_quad
%calcul de laire
a=cross([S(2,:)-S(1,:) 0],[S(3,:)-S(1,:) 0]);
a=abs(a(3));
I=a*pds_quad*F;
function y=f(X)
y=1;

Le programme suivant :
%test integrale
global pds_quad pts_quad;
pds_quad=[1/6 1/6 1/6];
pts_quad=[0 0.5; 0.5 0; 0.5 0.5];
[S,T,RS,RT]=triangule_rectangle([0 1 0 2],10,20,[0 0 0 0],0);
I=int_domaine(S,T,@f);
R1R2
produit le rsultat I = 2 qui est bien gal 0 0 dxdy: Avec la fonction f (x; y) = sin(x)sin(y); on obtient
I = 0:6510 avec une erreur de lordre de 7 10 8 :

11