Académique Documents
Professionnel Documents
Culture Documents
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
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.
= (, )
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.
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;
%%% 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];
%%% 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
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.
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)
% |\ /\
% |\ / \
% | \ / \
% |_ \/_ _ _ \
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
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;
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_| |_. . _|
%
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
%
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
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),:);
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
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
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.
Rsultats pour P1 :
Rsultats pour P2 :
Rsultats pour Q2 :