Vous êtes sur la page 1sur 22

2016/2017

RAPPORT PROGRAMME MEF


2D (P1/P2/Q1/Q2)

Ralis par :
MARTAB Rochdi
NAFAE Soukaina

Encadr par:
M. A.RACHID

ENSAM Casablanca
Implmentation de la MEF
Sommaire

Introduction ........................................................................................ 2
Maillage :............................................................................................. 3
Fonction chapeau : .............................................................................. 6
Quadrature.......................................................................................... 8
Jacobien : .......................................................................................... 10
MatElem2 .......................................................................................... 13
SMelem ............................................................................................. 15
Assemblage ....................................................................................... 16
MAIN 2D ............................................................................................ 18
Conclusion ......................................................................................... 21

ENSAM Casablanca 2016/2017


Introduction
La mthode des lments-finis (MEF) est une mthode dapproximation numrique de
solutions de problmes aux limites statiques ou dynamiques tels que diffusion thermique
mcanique des milieux continus (solides et fluides) lectromagntisme mais en fait,
absolument tous les problmes dquations aux drives partielles (EDP) aux limites. Il
sagit, comme dans toutes les mthodes numriques, de trouver une approximation discrte.
Pour faire bref, dun problme diffrentiels aux limites linaire, on trouve une formulation
vibrationnelle associe quivalente, dont on calcule une approximation de la solution en
projetant sur un espace de dimension finie, ce qui revient a rsoudre au final un systme
linaire. Lappellation lments finis vient de la dcomposition du domaine dtude en
lments : ils sont souvent reprsents par un maillage.

Historiquement, lorigine de la mthode peut se trouver dans les travaux de Fermat et


Bernoulli (1743) avec le calcul des variations, puis il faut attendre le dbut du XX met
sicle avec les progrs en analyse avec la mthode de Galrien se basant sur des thormes de
projection dans les espaces de Hilbert. En 1943 Robert Courant introduit le principe
vibrationnel avec des fonctions de base a supports locaux ouvrant la voie une division dun
domaine considr en lments. Cependant ce nest quavec le dveloppement des
ordinateurs que ces travaux trouvent leurs applications avec les travaux pionniers de
Zienckiewiz et Argyris qui dfiniront la mthode en 1960.

Ce qui amne le succs de la mthode et sa puissance est lapport du calcul matriciel, introduit
par un ingnieur civil anonyme. La mthode connait alors un dveloppement fulgurant
accompagne par les progrs de linformatique. La mthode des lments-finis est une
mthode puissante base sur une thorie mathmatique rigoureuse. Aujourdhui, les lments-
finis sont un outil majeur, incontournable en mcanique (fluides et solides, interactions,
structures), et applicable dans de nombreux domaines impliquant des problmes dEDP aux
limites comme par exemple en mathmatiques financires ou llectromagntisme. De
nombreux codes industriels (solveurs) existent et sont gnralement coupls un logiciel de
CAO 1 ou Computer Aided Design (CAD) en Anglais. Citons Ansys, Abaqus, Robot, LS-
dyna, Feap, Code-Aster, Cast3M et bien dautres.

ENSAM Casablanca 2016/2017


On considre le problme suivant :

= (, )

u(x,y)=0 ()

Maillage :
Pour le maillage, On doit comme dans le cas de 1D discrtiser notre domaine, il y a deux
types de discrtisation, soit triangulaire ou quadrilatre.
On commence tout dabord par la table de coordonnes, on la dfinit pour les deux types de
maillage.
Tandis que pour la table de connectivite, a diffre selon les cas, pour P1 la table se compose
de trois colonnes, qui contiennent les positions des nuds dans notre lment, cette table se
remplit laide dune boucle et contient 2*nx*ny lignes (nx=npx-1, npx est le nombre de
point), Pour P2 la table contient 6 colonnes. Dans le cas de quadrilatre Q1 la table se
compose de 4 colonnes et pour Q2 de 9 colonnes. Dans tous les cas le nombre de lignes est le
mme que P1.

function [X,T2,b,T] = Maillage2d(x1,x2,y1,y2,npx,npy,elem,k)

T2=0;
T=0;
if k==1
X = zeros((npx)*(npy),2);
% Nombre des lments dans chaque direction
nx = npx-1; ny = npy-1;
%
hx = (x2-x1)/nx;
hy = (y2-y1)/ny;
xs = linspace(x1,x2,npx)';
unos = ones(npx,1);
%
% Coordonnes des noeuds
%
yys = linspace(y1,y2,npy);
for i=1:npy
ys = yys(i)*unos;
posi = (i-1)*(npx)+1:i*(npx);
X(posi,:)=[xs,ys];
end
% P1
% Connectivit
if(elem==1)
T2 = zeros(nx*ny,3);
for i=1:ny
for j=1:nx
ielem = 2*((i-1)*nx+j)-1;

ENSAM Casablanca 2016/2017


inode = (i-1)*(npx)+j;
T2(ielem,:) = [inode inode+1 inode+(npx)];
T2(ielem+1,:) = [inode+1+npx inode+npx inode+1];
end
end
else if(elem==0)
T2 = zeros(nx*ny,4);
ielem = 0;
for i=1:ny
for j=1:nx
ielem = ielem+1;
inode = (i-1)*(npx)+j;
T2(ielem,:) = [inode inode+1 inode+1+(npx)
inode+(npx)];
end
end
end
end
T=T2;
%Noeuds sur le bord stockes dans "b" comme suit
(bas,gauche,droite,haut)
b=[1:npx,npx+1:npx:npx*npy,2*npx:npx:npx*npy,npx*npy-npx+2:npx*npy-1];
else if k== 2

%%% P2 & Q2

npx2=2*npx-1;npy2=2*npy-1;
X = zeros((npx*npy),2);
% Nombre des lments dans chaque direction
nx2 = npx2-1; ny2 = npy2-1;
nx = npx-1; ny = npy-1;
%
hx = (x2-x1)/nx2;
hy = (y2-y1)/ny2;
xs = linspace(x1,x2,npx2)';
unos = ones(npx2,1);
%
% Coordonnes des noeuds
%
yys = linspace(y1,y2,npy2);
for i=1:npy2
ys = yys(i)*unos;
posi = (i-1)*(npx2)+1:i*(npx2);
X(posi,:)=[xs,ys];
end

%%% P2:

% Connectivit
if(elem==1)
T2 = zeros(nx*ny,6);
T = zeros(nx2*ny2,3);
for i=1:ny2
for j=1:nx2
ielem = 2*((i-1)*nx2+j)-1;
inode = (i-1)*(npx2)+j;
T(ielem,:) = [inode inode+1 inode+(npx2)];
T(ielem+1,:) = [inode+1+npx2 inode+npx2 inode+1];

ENSAM Casablanca 2016/2017


end
end
for i=1:ny
for j=1:nx
ielem = 2*((i-1)*nx+j)-1;
inode = 2*(i-1)*(npx2)+(j-1)*2+1;
T2(ielem,:) = [inode inode+2 inode+2*npx2 inode+1
inode+npx2+1 inode+(npx2)];
T2(ielem+1,:) = [inode+2*(npx2+1) inode+2*npx2 inode+2
inode+2*npx2+1 inode+1+npx2 inode+npx2+2];
%les connectivit de 6 noeuds par element
end
end
else if(elem==0)

%%% Q2:
T2 = zeros(nx*ny,9);
T = zeros(nx2*ny2,4);
ielem = 0;
for i=1:ny2
for j=1:nx2
%ielem = 2*((i-1)*nx+j)-1;
ielem = ielem+1;
inode = (i-1)*(npx2)+j;
T(ielem,:) = [inode inode+1 inode+1+(npx2)
inode+(npx2)];

end
end
ielem = 0;
for i=1:ny
for j=1:nx
ielem = ielem+1;
inode = 2*(i-1)*(npx2)+(j-1)*2+1;
T2(ielem,:)=[inode inode+2 inode+2*(npx2+1) inode+(2*npx2) inode+1
inode+2+npx2 inode+1+2*npx2 inode+npx2 inode+1+npx2];
end
end

end
end
%Noeuds sur le bord stockes dans "b" comme suit
(bas,gauche,droite,haut)
b=[1:npx2,npx2+1:npx2:npx2*npy2,2*npx2:npx2:npx2*npy2,npx2*npy2-
npx2+2:npx2*npy2-1];
end
end
end

ENSAM Casablanca 2016/2017


Fonction chapeau :
Cette fonction nous calcule les fonctions de forme dans llment de rfrence pour les
diffrents cas, le calcul des Phis est fait par mapel, on a procde par la manire suivante pour
les calculer :

Cas P2 :

On a :

(0,1)

(0,1/2) (1/2,1/2)

)
(0,0) (1,0)
(1/2,0)
) )
)
On a = 2 + 2 + + + +

Et ( , ) = 1 6

Et par ces deux formules, on trouve les coefficients pour les 6 fonctions de forme.

Cette fonction nous donne galement les gradients des fonctions de formes, on les calcule
aussi par Mapel en les drivant.

function [phi,grad] = FoncChap(k,Xgauss,elem)

s = Xgauss(:,1);
t = Xgauss(:,2);
Ngauss=size(Xgauss,1);
if elem == 1
if k == 1 %P1
phi = [1-(s+t),s,t];
grad = [-ones(2,1),eye(2)];
% N3(0,1)
% | \
% | \
% | \
% N6(0,1/2)|_ _ _ \ N5(1/2,1/2)
% |\ /\
% |\ / \
% | \ / \
% |_ \/_ _ _ \

ENSAM Casablanca 2016/2017


% N1(0,0) N4(1/2,0) (1,0)N2
else if k == 2
% P2
s1=0;t1=0;s2=1;t2=0;s3=0;t3=1;
s4=0.5;t4=0;s5=0.5;t5=0.5;s6=0;t6=0.5; %%% Pour le calcule des phi
A=[s1^2 t1^2 s1*t1 s1 t1 1;
s2^2 t2^2 s2*t2 s2 t2 1;
s3^2 t3^2 s3*t3 s3 t3 1;
s4^2 t4^2 s4*t4 s4 t4 1;
s5^2 t5^2 s5*t5 s5 t5 1;
s6^2 t6^2 s6*t6 s6 t6 1];
coef = [s.^2 t.^2 s.*t s t ones(Ngauss,1)];
phi = coef*(A^-1);
grad = [4*s+4*t-3 4*s-1 zeros(Ngauss,1) -8*s-4*t+4 4*t -4*t;
4*s+4*t-3 zeros(Ngauss,1) 4*t-1 -4*s 4*s -8*t-4*s+4];
end
end
else if elem ==0
if k == 1 %Q1
phi = 0.25*[-s-t+s.*t+1,s-t-s.*t+1,s+t+s.*t+1,-s+t-s.*t+1];
grad = [-1+t 1-t 1+t -1-t;
-1+s -1-s 1+s 1-s];
else if k == 2 %Q2
% N4(-1,1) _ _ _N7 _ _ _N3=(1,1)
% | | |
% | | |
% N8 |_ _ _N9 _ _ _|N6
% | | |
% | | |
% |_ _ _ | _ _ _|
% N1=(-1,-1) N5 N2=(1,-1)

phi = [0.25*(s.*t).*(1-s).*(1-t),-0.25*(s.*t).*(1+s).*(1-
t),0.25*(s.*t).*(1+s).*(1+t),-0.25*(s.*t).*(1-s).*(1+t),-0.5*(1+s).*(1-
s).*t.*(1-t),0.5*s.*(1+s).*(1-t).*(1+t),0.5*(1-s).*(1+s).*t.*(1+t),-
0.5*s.*(1-s).*(1-t).*(1+t),(1-s).*(1+s).*(1-t).*(1+t)];
% phi1 phi2 phi3
phi4 phi5 phi6
phi7 phi8 phi9
grad = [0.5*s.*(t.^2)-0.5*s.*t-0.25*(t.^2)+0.25*t 0.50*s.*(t.^2)-
0.5*s.*t+0.25*(t.^2)-0.25*t 0.50*(s.*(t.^2))+0.50*(s.*t)+0.25*(t.^2)+0.25*t
0.50*(s.*(t.^2))+0.50*(s.*t)-0.25*(t.^2)-0.25*t -s.*(t.^2)+s.*t -s.*(t.^2)-
0.5*(t.^2)+s+0.5 -s.*(t.^2)-s.*t -s.*(t.^2)+0.5*(t.^2)+s-0.5 2*s.*(t.^2)-
2*s;
0.50*(s.^2).*t-0.25*(s.^2)-0.50*s.*t+0.25*s 0.50*(s.^2).*t-
0.25*(s.^2)+0.50*s.*t-0.25*s 0.50*(s.^2).*t+0.25*(s.^2)+0.50*(s.*t)+.25*s
0.50*(s.^2).*t+0.25*(s.^2)-0.50*(s.*t)-0.25*s -(s.^2).*t+0.5*(s.^2)+t-0.5 -
(s.^2).*t-s.*t -(s.^2).*t-0.5*(s.^2)+t+0.5 -(s.^2).*t+s.*t 2*(s.^2).*t-
2*t];
%Calculs utilisant maple
end
end
%%%
end
end
end

ENSAM Casablanca 2016/2017


Quadrature
Cette fonction nous fournit les points et les poids de gauss selon le nombre de gauss choisi,
Pour le cas de triangle on a le choix entre un nombre de gauss de 1, 3, 4, 7, 16 selon le degr
de prcision voulu, et pour le cas de rectangulaire, on a le choix entre 4 et 9.

function [Xgauss,Wgauss]=Quadrature(elem, Ngauss)

if elem == 0
if Ngauss == 4 % degr 1
pos1 = 1/sqrt(3);
Xgauss=[-pos1 -pos1
pos1 -pos1
pos1 pos1
-pos1 pos1];
Wgauss=[ 1 1 1 1];
elseif Ngauss == 9 % degr 2
pos1 = sqrt(3/5);
Xgauss=[-pos1 -pos1
0 -pos1
pos1 -pos1
-pos1 0
0 0
pos1 0
-pos1 pos1
0 pos1
pos1 pos1];
pg1=5/9; pg2=8/9; pg3=pg1;
Wgauss= [pg1*pg1 pg2*pg1 pg3*pg1 pg1*pg2 pg2*pg2 pg3*pg2 pg1*pg3
pg2*pg3 pg3*pg3];
else
error(' Cette quadrature n est pas programme')
end
elseif elem == 1
if Ngauss == 1 % degr 1
pos1 = 1/3;
Xgauss=[pos1 pos1];
Wgauss = 1/2;
elseif Ngauss == 3 % degr 2
pos1 = 1/2;
Xgauss = [pos1 pos1
0 pos1
pos1 0];
pes1 = 1/6;
Wgauss = [pes1 pes1 pes1];
elseif Ngauss == 4 % degr 3
Xgauss=[1/3 1/3
0.6 0.2
0.2 0.6
0.2 0.2];
Wgauss = [-27/96 25/96 25/96 25/96];
elseif Ngauss == 7 % degr 5
a = 0.101286507323456338800987361915123;
b = 0.470142064105115089770441209513447;
P1 = 0.0629695902724135762978419727500906;

ENSAM Casablanca 2016/2017


P2 = 0.0661970763942530903688246939165759;
Xgauss=[a a
a 1-2*a
1-2*a a
b b
b 1-2*b
1-2*b b
1/3 1/3];
Wgauss = [P1, P1, P1, P2, P2, P2, 0.1125];
elseif Ngauss == 12 % degr 6
a = 0.0630890144915022283403316028708191;
b = 0.249286745170910421291638553107019;
c = 0.0531450498448169473532496716313981;
d = 0.310352451033784405416607733956552;
P1 = 0.0254224531851034084604684045534344;
P2 = 0.0583931378631896830126448056927897;
P3 = 0.0414255378091867875967767282102212;
Xgauss = [a a
a 1-2*a
1-2*a a
b b
b 1-2*b
1-2*b b
c d
c 1-c-d
1-c-d c
1-c-d d
d 1-c-d
d c ];
Wgauss = [P1, P1, P1, P2, P2, P2, P3, P3, P3, P3, P3, P3];
elseif Ngauss == 16 % degr 8
a = 0.170569307751760206622293501491464;
b = 0.0505472283170309754584235505965989;
c = 0.459292588292723156028815514494169;
d = 0.728492392955404281241000379176061;
e = 0.263112829634638113421785786284643;
f = 1/3;
P1 = 0.0516086852673591251408957751460645;
P2 = 0.0162292488115990401554629641708902;
P3 = 0.0475458171336423123969480521942921;
P4 = 0.0136151570872174971324223450369544;
P5 = 0.0721578038388935841255455552445323;
Xgauss = [a a
a 1-2*a
1-2*a a
b b
b 1-2*b
1-2*b b
c c
c 1-2*c
1-2*c c
d e
d 1-d-e
1-d-e d
1-d-e e
e 1-d-e
e d
f f ];

ENSAM Casablanca 2016/2017


Wgauss = [P1*ones(1,3), P2*ones(1,3), P3*ones(1,3), P4*ones(1,6),
P5];
else
error('Cette quadrature n est pas programme')
end
else
error(' Cette quadrature n est pas programme')
end

Jacobien :
Cette fonction nous permet de calculer le jacobien, ce dernir se calcule de la faon suivante :

J = grad() = [ ]

Le gradient des phi selon le cas est dj calcul dans la fonction fonchap.
function [J]=jacobien(elem,k,S,x)
% Calcule de la matrice jacobienne
% La matrice jacobienne, dont le dterminant nous intresse,
% est dfinie partir des drives des polynmes de base.

% _ _ _ _
% | dphi/ds | | X1 Y1 |
% J = | | * | . . |
% |_dphi/dt_| |_. . _|
%

% elem: - espace Q: elem = 0


% - espace P: elem = 1
% k: - degres d'espace d'approximation (Pk ou Qk)
% s: - cordoons du variables s = [Si Ti] par exemple: s = [0 0]
% | xi yi |
% x: - cordoons du variables par exemple pour P1: x = [x y] = |xi+1 yi+1|
% |xi+2 yi+2|
s = S(1,1); t = S(1,2);
if elem == 1
if k == 1
% N1=(0,1)
% | \
% | \
% | \
% | TR \
% |_ _ _\
% N1=(0,0) (1,0)=N2
% _ _
% | x2-x1 x3-x1 |
% J = | |
% |_y2-y1 y3-y1_|
%
J = [-1 1 0;-1 0 1]*x;
else if k == 2
% N3(0,1)
% | \
% | \
% | \

ENSAM Casablanca 2016/2017


% N6(0,1/2)|_ _ _ \ N5(1/2,1/2)
% |\ /\
% |\ / \
% | \ / \
% |_ \/_ _ _ \
% N1(0,0) N4(1/2,0) N2(1,0)
% grad = [4*s+4*t-3 4*s-1 0 -8*s-4*t+4 4*t -4*t;
% 4*s+4*t-3 0 4*t-1 -4*s 4*s -8*t-
4*s+4];
switch s
case 0
switch t
case 0
J = [-3 -1 0 4 0 0;-3 0 -1 0 0 4]*x;
case 1
J = [1 -1 0 0 4 -4;1 0 3 0 0 -4]*x;
case 0.5
J = [-1 -1 0 2 2 -2;-1 0 1 0 0 0]*x;
end
case 1
J = [1 3 0 -4 0 0;1 0 -1 -4 4 0]*x;
case 0.5
switch t
case 0
J = [-1 1 0 0 0 0;-1 0 -1 -2 2 2]*x;;
case 0.5
J = [1 1 0 -2 2 -2;1 0 1 -2 2 -2]*x;
end
%
end
end
end
%
else if elem == 0
if k == 1
% N4(-1,1) _ _ _ _ _ _ _N3=(1,1)
% | |
% | |
% | QR |
% | |
% |_ _ _ _ _ _ _|
% N1=(-1,-1) N2=(1,-1)
switch s
case -1
switch t
case -1
J = ([-2 2 0 0;-2 0 0 2]*x)'; %Le jacobien en limage dun
sommet de QR (-1,-1)
case 1
J = ([0 0 2 -2;-2 0 0 2]*x)'; %Le jacobien en limage dun
sommet de QR (-1, 1)
end
case 1
switch t
case -1
J = ([-2 2 0 0;0 -2 2 0]*x)'; %Le jacobien en limage dun
sommet de QR (1,-1)
case 1

ENSAM Casablanca 2016/2017


J = ([0 0 2 -2;0 -2 2 0]*x)'; %Le jacobien en limage dun
sommet de QR (1, 1)
end

end
else if k == 2
% N4(-1,1) _ _ _N7 _ _ _N3=(1,1)
% | | |
% | | |
% N8 |_ _ _N9 _ _ _|N6
% | | |
% | | |
% |_ _ _ | _ _ _|
% N1=(-1,-1) N5 N2=(1,-1)
switch s
case -1
switch t
case -1
J = ([-1.5 -0.5 0 0 2 0 0 0 0;-1.5 0 0 -0.5 0 0 0 2
0]*x);%Le jacobien en limage dun sommet de QR (-1,-1)
case 1
J = ([0 0 -0.5 -1.5 0 0 2 0 0;0.5 0 0 1.5 0 0 0 -2
0]*x);%Le jacobien en limage dun sommet de QR (-1, 1)
case 0
J = ([0 0 0 0 0 -0.5 0 -1.5 2;-0.5 0 0 0.5 0 0 0 0
0]*x);%Le jacobien en limage dun sommet de QR (-1, 0)
end
case 1
switch t
case -1
J = ([0.5 1.5 0 0 -2 0 0 0 0;0 -1.5 -0.5 0 0 2 0 0 0]*x);
%Le jacobien en limage dun sommet de QR (1,-1)
case 1
J = ([0 0 1.5 0.5 0 0 -2 0 0;0 0.5 1.5 0 0 -2 0 0 0]*x);
%Le jacobien en limage dun sommet de QR (1, 1)
case 0
J = ([0 0 0 0 0 1.5 0 0.5 -2;0 -0.5 0.5 0 0 0 0 0 0]*x);
%Le jacobien en limage dun sommet de QR (1, 0)
end
case 0
switch t
case -1
J = ([-0.5 0.5 0 0 0 0 0 0 0;0 0 0 0 -1.5 0 -0.5 0 2]*x);
%Le jacobien en limage dun sommet de QR (0,-1)
case 1
J = ([0 0 0.5 -0.5 0 0 0 0 0;0 0 0 0 0.5 0 1.5 0 -2]*x);
%Le jacobien en limage dun sommet de QR (0, 1)
case 0
J = ([0 0 0 0 0 0.5 0 -0.5 0;0 0 0 0 -0.5 0 0.5 0 0]*x);
%Le jacobien en limage dun sommet de QR (0, 0)
end

end
end
end
end
end
end

ENSAM Casablanca 2016/2017


MatElem2
Dans cette fonction On construit la matrice lmentaire qui scrit de la faon suivante



= = ( (
) (
)) ()

function [Ke] = MatElem2(elem,k,X,T,ie,phi,grad,Xgauss,Wgauss)

%
Ngauss = size(Xgauss,1);
if elem == 0
if k == 1
Ngeom = 4;
elseif k == 2
Ngeom=9;
end
elseif elem == 1
if k == 1
Ngeom = 3;
elseif k == 2
Ngeom = 6;
elseif k == 3
Ngeom = 9;
end
end
if k==1
% Noeuds du triangle courant (sommet dans le cas o Ngeom=3)
x=X(T(ie,1:Ngeom),:);
% matice du changement de variable

KKe=zeros(3*k);%initialiser les tailles de Ke


%
%
if elem == 0
gradS=grad(1:Ngauss,:); % premiere partie du grad o les grad selon
dS
gradT=grad((Ngauss+1):(2*Ngauss),:); % deuxie partie du grad o
les grad selon dT
SS=[-1 -1;1 -1;1 1;-1 1];
for i=1:Ngeom
for j=1:Ngeom
gh = 0;
S=SS(j,:);
J = jacobien(elem,k,S,x);
for lmm=1:Ngauss
Jint=[gradS(lmm,:);gradT(lmm,:)]*x;
gh = gh +
Wgauss(lmm)*((Jint\[gradS(lmm,i);gradT(lmm,i)])'*(Jint\[gradS(lmm,j);gra
dT(lmm,j)]));

ENSAM Casablanca 2016/2017


end
KKe(i,j) = det(J)*gh;
KKe(j,i)=KKe(i,j);
end
end
Ke = KKe;
%calcul de la matrice lmentaire Ke
else if elem == 1
SS = [0 0;1 0;0 1];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%
for i=1:Ngeom
for j=i:Ngeom
S=SS(j,:);
J = jacobien(elem,k,S,x);
gh = 0;
for lmm=1:Ngauss
gh = gh + Wgauss(lmm)*(J\grad(:,i))'*(J\grad(:,j)); % erreur
corrig (calcule d'integrale: faut multiplier
% les
Wgauss
end
KKe(i,j) = gh;
KKe(j,i)=KKe(i,j);
end
end
Ke=det(J)*KKe; %pas besoin d'utiliser l'air apres changement de
variable (air = 1)
end
end
%
else if k == 2
x=X(T(ie,1:Ngeom),:);
KKe=zeros(3*k);%initialiser les tailles de Ke
%
%%%
%%% P2 & Q2
gradS=grad(1:Ngauss,:); % premiere partie du grad o les
grad selon dS
gradT=grad((Ngauss+1):(2*Ngauss),:); % deuxie partie du grad o
les grad selon dT
if elem == 1
SS = [0 0;1 0;0 1;1/2 0;1/2 1/2;0 1/2];
else if elem ==0
SS = [-1 -1;1 -1;1 1;-1 1;0 -1;1 0;0 1;-1 0;0 0];
end
end
for i=1:Ngeom
for j=1:Ngeom
S=SS(j,:);
J = jacobien(elem,k,S,x);
gh = 0;
for lmm=1:Ngauss
Jint=[gradS(lmm,:);gradT(lmm,:)]*x;
gh = gh +
Wgauss(lmm)*((Jint\[gradS(lmm,i);gradT(lmm,i)])'*(Jint\[gradS(lmm,j);gra
dT(lmm,j)]));

ENSAM Casablanca 2016/2017


end
KKe(i,j) = det(J)*gh;
KKe(j,i)=KKe(i,j);
end
end
Ke = KKe;
else
error(' ce type Pk n est pas encore programm')
end
end
end

SMelem
On calcule ici le second membre de la faon suivante :

= ( () ) () = +

function [ Fe ] = SMelem(f,elem,k,X,T,ie,Ngauss)
%calcul du second membre lmentaire Fe
%
[Xgauss,Wgauss]=Quadrature(elem, Ngauss);
%fonctions chapeaux
[phi, grad] = FoncChap(k,Xgauss,elem);
if elem == 0
if k == 1
Ngeom = 4;
elseif k == 2
Ngeom=9;
end
elseif elem == 1
if k == 1
Ngeom = 3;
elseif k == 2
Ngeom = 6;
elseif k == 3
Ngeom = 9;
end
end
%
if k==1
Fe=zeros(3*k,1); %initialiser les tailles de Me et Fe
% Noeuds du triangle courant (sommet dans le cas o Ngeom=3)
x=X(T(ie,1:Ngeom),:);

grad2 = [-1 1 1 -1;


-1 -1 1 1];
if(elem == 1)
J = (grad * x)';
else if (elem == 0)
J = (grad2 * x)';
end
end
%

ENSAM Casablanca 2016/2017


%On calcule Xc=X1+J*S aux noeuds de Gauss dont le nombre est Ngauss
Xc=zeros(Ngauss,2);
for i=1:Ngauss
Xc(i,:)=x(1,:)+(J*Xgauss(i,:)')';
end
%
%on calcule Fe1 Fe2 et Fe2 les composantes de Fe
%if elem == 1
for i=1:Ngeom
s=0;
for j=1:Ngauss
s=s+(Wgauss(j)*f(Xc(j,1),Xc(j,2))*phi(j,i));
end
Fe(i)=det(J)*s;
end
else if k==2
%%P2
Fe=zeros(3*k,1); %initialiser les tailles de Me et Fe
% Noeuds du triangle courant (sommet dans le cas o Ngeom=3)
x=X(T(ie,1:Ngeom),:);

if(elem == 1)
grad2 = [-3 -1 0 4 0 0;
-3 0 -1 0 0 4];

else if (elem == 0)
grad2 = [zeros(2,4),[0 0.5 0 -0.5 0;-0.5 0 0.5 0 0]];
end
end
J = (grad2 * x)';
%
%On calcule Xc=X1+J*S aux noeuds de Gauss dont le nombre est Ngauss
Xc=zeros(Ngauss,2);
for i=1:Ngauss
Xc(i,:)=x(1,:)+(J*Xgauss(i,:)')';
end
%
%on calcule Fe1 Fe2 et Fe2 les composantes de Fe
for i=1:Ngeom
s=0;
for j=1:Ngauss
s=s+(Wgauss(j)*f(Xc(j,1),Xc(j,2))*phi(j,i));
end
Fe(i)=det(J)*s;
end
end

end
end

Assemblage
Pour cette fonction, On assemble les matrices lmentaires pour construire la matrice globale

ENSAM Casablanca 2016/2017


function [ K,F ] = Assemblage2D(elem,k,X,T,f,phi,grad,Xgauss,Wgauss,Ngauss)
% Assemblage des matrices lmentaires "Ke" dans la matrice globale K
% Assemblage des seconds membres lmentaires "Fe" dans le second...
% membre global F
% On utilise la fonction "MatElem(k,X,T,ie,f,phi,grad,Xgauss,Wgauss)"
%
%Entres:
% elem: type d'lment (0 pour quadrilatres et 1 pour triangles)
% X: table des coordonnes
% T: tbale des connectivits
%
Nn=size(X,1); %nombre des noeuds
Nt=size(T,1); % nombre des lments
%
%K=sparse(zeros(Nn,Nn));% initialisation de K comme matrice creuse
K=zeros(Nn,Nn);% initialisation de K
F=zeros(Nn,1);% initialisation de F comme matrice creuse
%
for ie = 1:Nt
Tie = T(ie,:);
[Ke] = MatElem2(elem,k,X,T,ie,phi,grad,Xgauss,Wgauss);
[Fe] = SMelem(f,elem,k,X,T,ie,Ngauss);
K(Tie,Tie)=K(Tie,Tie)+Ke;
F(Tie)=F(Tie)+Fe;
clear Ke Fe;
end
end

1- MEF2D

On impose dans cette fonction les conditions aux bords, et on rsout le systme K.U=F.
function [Kb,Fb,U] = MEF2D(f,elem,k,X,T,b,Ngauss)
% fonction traite l'equation alpha*laplace(u)=f sur Omega avec u|Omega=0
% moyennant la mthode des lments finis de type Galerkin Pk
%Entres
% f: fonction second membre
% elem: type d'lment (0 pour quadrilatres et 1 pour triangles)
% k: type de la mthodes des lments finis (Pk)
% X: table des coordonnes
% T: table de connectivit
% b: noeuds sur le bords
% Ngauss: Nombre des noeuds de Gauss dans l'lment courant
%Sorties:
% U: Vecteurs solutions aux noeuds du maillage.
%
% --------Quadrature de Gauss-----------
[Xgauss,Wgauss]=Quadrature(elem, Ngauss);
%
%---------Fonctions chapeaux------------
[phi,grad] = FoncChap(k,Xgauss,elem);
%
%-------- Assemblage--------------------
[ K,F ] = Assemblage2D(elem,k,X,T,f,phi,grad,Xgauss,Wgauss,Ngauss);
%
%--------Conditions aux bords-----------
%On met "0" dans les lignes et les colonnes qui correspondent aux noeuds

ENSAM Casablanca 2016/2017


%bords dans K et F
K(b,:)=0; K(:,b)=0;
F(b)=0;
%On met "1" sur la diagonale de K correspodant aux aux noeuds bords
%K(b,b)=speye(length(b),length(b)); % cas o K est sparse
K(b,b)=eye(length(b),length(b));
% K et F aprs conditions aux bords
Kb=K; Fb=F;
%
U=Kb\Fb;
end

MAIN 2D
Premirement on choisit une fonction qui vrifie les conditions aux bords, et on construit le
problme, puis on fait appel les fonctions dj labore pour le rsoudre, et on ajoute la
solution exacte pour la comparaison.

clear all, close all, home


%------------------------
% Les entres
%------------------------
elem=input('Choisir elment(0 quadrilatre, 1 triangle) : ');
k=input('Choisir k pour type Pk : ');
Ngauss=input('Choisir le nombre de points de Gauss : ');
npx=input('Entrer nombre de points suivant (Ox) : ');
npy=input('Entrer nombre de points suivant (Oy) : ');
%------------------------------
% Les donnes du maillage
x1=-2;x2=2;
y1=-1;y2=1;
%
% Second membre
f=@(x,y) -2*x^2-2*y^2+10;
% Solution exacte
ue=@(x,y) (x^2-4)*(y^2-1);
%--------------------------------
% maillage
[X,T2,b,T] = Maillage2d(x1,x2,y1,y2,npx,npy,elem,k);
% calcul de la solution
[Kb,Fb,U] = MEF2D(f,elem,k,X,T2,b,Ngauss);
%------------------------------
% Affichage et comparaison
% Solution approche
figure(1); clf;
trisurf(T,X(:,1),X(:,2),0*X(:,1),U,'edgecolor','k','facecolor','interp');
view(2),axis([x1 x2 y1 y2]),axis equal,colorbar;
% Solution exacte
figure(2); clf;
uee=(X(:,1).^2-4).*(X(:,2).^2-1);
trisurf(T,X(:,1),X(:,2),0*X(:,1),uee,'edgecolor','k','facecolor','interp');
view(2),axis([x1 x2 y1 y2]),axis equal,colorbar;
%--------------------------------
% Calcul de l'erreur en norme L2

ENSAM Casablanca 2016/2017


error_L2=norm(U-uee,2);
err_rela=error_L2\norm(uee,2);
fprintf('\t\t %4d \t\t %20.16e \t\t %20.16e\n\n',
npx*npy,error_L2,err_rela);
fprintf('On a fini normalement\n');

Rsultats pour P1 :

Rsultats pour P2 :

ENSAM Casablanca 2016/2017


Rsultats pour Q1 :

Rsultats pour Q2 :

ENSAM Casablanca 2016/2017


Conclusion

Ce projet illustre bien limportance des mthodes numriques pour la rsolution


des problmes mathmatique, et il nous a permis de concrtiser nos
connaissances dans la rsolution des problmes en deux dimensions selon le
type de maillage choisi.

Dautre part, il nous a t trs utile de travailler sur ce projet, afin de se


familiariser davantage avec un outil important pour un lve ingnieur quest le
Matlab et ainsi reconnaitre son utilit.

ENSAM Casablanca 2016/2017