Académique Documents
Professionnel Documents
Culture Documents
net/publication/332705378
CITATIONS READS
0 2,343
1 author:
Allaoua Mehri
University of El-Tarf
12 PUBLICATIONS 12 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Allaoua Mehri on 27 April 2019.
1 Introduction
FreeFem++ est un logiciel libre développé au laboratoire Jacques-Louis Lions de l’université Pierre
et Marie Curie, didié à la résolution des équations aux dérivées partielles par la méthode de type
éléments finis. On se limite dans cette partie à l’équation de Poisson, équation de la chaleur, équation
des ondes, et équation non linéaire.
3 Equation de Poisson
−∆u = f dans Ω
(1)
u = g sur Γ
1
où f est une fonction dans L2(Ω) et g|Γ ∈ L2(Γ).
Problème variationnel
Z Z
∇u∇vdx = f vdx ∀v ∈ H01(Ω), u − g ∈ H01(Ω)
Ω Ω
Estimation d’erreur
ku − uhkL2(Ω) ≤ ch1+k , k = 1, 2
3.1 Exemple 1
2
cout<<"nbt="<<nbt<<","<<"nbv="<<nbv<<","<<"hmax="<<h[].max
macro Grad(uh)[dx(uh),dy(uh)]//
solve Poisson(uh,vh) = int2d(Th)(Grad(uh)’*Grad(vh))
- int2d(Th)( f*vh) + on(1,2,3,4,uh=g) ;
plot(Th,cmm="Nbre de noeuds : "+nbv) ; // traçage du maillage, T : tri-
angles,N : noeuds
//visualusation de la solution
plot(uh,dim=3,fill=false,value=true,ps="Poisson.jpg",boundary=true,cm
plot(uh,dim=2,fill=false,value=true,cmm="surface de uh",boundary=tru
plot(uh,dim=3,fill=true,value=true,boundary=true) ;
L2error[n]= sqrt(int2d(Th)((uh-ue)^2)) ;
}
for(int n=0 ;n<2 ;n++)
{+++
cout << " L2error " << n << " = "<< L2error[n] <<endl ;
}
cout <<" convergence rate = "<< log(L2error[0]/L2error[1])/log(2.) <<endl ;
//savemesh(Th,"Th.msh") ; // sauvegarde des coordonnées du maillage
//cout<<"uh="<<uh[]<<endl ;
3
Figure 1 – maillage, pash = 1/80, nbT riangles = 12800, nbN oeuds = 6561
4
Figure 3 – Projection de la solution ds Z=0
5
nombres de noeuds erreur en norme L2 ordre de convergence
121 0.300768e − 01 /
441 0.769230e − 02 1.9671
1681 0.193424e − 02 1.9916
6561 0.484264e − 03 1.9979
6
3.2 Exemple 2
7
problem Poisson(uh,vh,solver=CG,eps=1.0e-6) =
int2d(Th)(dx(uh)*dx(vh) + dy(uh)*dy(vh) )- int2d(Th)(f*vh)
+ on(1,2,3,4,5,6,uh=g1) ;
for (int i=0 ;i< 3 ;i++)
{
Poisson ;
Th=adaptmesh(Th,uh,err=error) ; // adaptation du maillage
uh=uh ; error = error/2. ;
plot(Th,wait=1,cmm="L-Shape") ;
L2error[i]= sqrt(int2d(Th)((uh-ue)^2)) ; // calcul de L2 error
cout.scientific<< " L2error " << i << " = "<< L2error[i] <<endl ;
string legende="L2error="+L2error[i] ;
plot(uh,dim=2,value=1,boundary=1,cmm=legende) ;
// visualisation de la solution
}
plot(uh,dim=3,value=1,boundary=1,cmm="surface uh en D3") ;
8
Figure 5 – L-Shape,nbTriangles=2724, nbNoeuds=1440, hmax=0.0952, hmin=0.0439
9
Figure 7 – L-Shape, nbTriangles=10920, nbNoeuds=5621, hmax=2.8525e-02, hmin=1.4854e-02
10
nombres de noeuds erreur en norme L2
1440 2.62050e − 04
2659 5.01579e − 05
5621 2.50832e − 05
11
3.3 Exemple 3
// Equation de Poisson
// le domaine est un disque unité
border a(t=0,2*pi){ x = cos(t) ; y = sin(t) ;label=1 ;} ;
mesh Th = buildmesh(a(50)) ; // definition du maillage
plot(Th) ; // visualisation du maillage
fespace Vh(Th,P1) ; // definition de l’ensemble d’elements finis
Vh uh,vh ;
func f = 1 ; // second membre
problem laplace(uh,vh) =int2d(Th)( dx(uh)*dx(vh) +
dy(uh)*dy(vh) ) // forme bilineaire
- int2d(Th)( f*vh ) // forme lineaire
+ on(1,uh=0) ; // condition au bord
func ue = (1-x^2-y^2)/4 ; // ue : solution exacte
laplace ;
Vh error = uh - ue ;
plot (uh,ps="aTutorial.eps",value=true,wait=true) ;
//plot(error,value=true,wait=true) ;
cout.scientific << "error L2=" << sqrt(int2d(Th)( error^2) )<< endl ;
cout.scientific << "error H10=" << sqrt( int2d(Th)((dx(uh)-x/2)^2)
+ int2d(Th)((dy(uh)-y/2)^2))<< endl ;
Th = adaptmesh(Th,uh,err=0.01) ;
plot(Th,wait=1) ;
laplace ;
error = uh - ue ; // erreur de la solution
12
//plot(error,value=true,wait=true) ;
cout.scientific << "error L2=" << sqrt(int2d(Th)( error^2) )<< endl ;
cout.scientific << "error H10=" << sqrt(int2d(Th)((dx(uh)-x/2)^2)
+ int2d(Th)((dy(uh)-y/2)^2))<< endl ;
real legende=sqrt(int2d(Th)((dx(uh)-x/2)^2)+
int2d(Th)((dy(uh)-y/2)^2)) ;
plot (uh,value=true,wait=true, cmm="error L2="
+sqrt(int2d(Th)( error^2))
+" error H10="+legende) ;
13
Figure 9 – maillage, nbTriangles=444, nbNoeuds=248, hmax=0.1965, hmin=0.9693e-01
14
Figure 11 – maillage, nbTriangles=1552, nbNoeuds=822, hmax=1.0973e-01, hmin=4.8221e-02
15
nombres de noeuds erreur en norme L2 erreur en norme H01
248 4.25000e − 04 3.75440e − 02
822 1.10390e − 04 1.88390e − 02
7222 1.05386e − 05 6.08005e − 03
16
4 Equation de la chaleur
4.1 Exemple 4
∂u
∂t − µ∆u = f dans Ω × ]0, T [
∂u
µ ∂n + α(u − ue) = 0 sur Γ2 ∪ Γ3
(2)
u = ue sur Γ1 ∪ Γ4
u(x, y, 0) = u0 dans Ω
Problème variationnel
Z Z Z Z Z
∂u
vdx + µ ∇u∇vdx + α uvdσ = f vdx + α uevdσ
Ω ∂t Ω Γ2 ∪Γ3 Ω Γ2 ∪Γ3
v ∈ V = v ∈ H 1(Ω)/ v = 0 sur Γ1 ∪ Γ4 , u − ue ∈ V
Schéma implicite
un − un−1
Z Z Z Z Z
vdx+µ ∇un∇vdx+α unvdσ = f vdx+α uevdσ
Ω dt Ω Γ2 ∪Γ3 Ω Γ2 ∪Γ3
On pose
17
// Equation de la chaleur, omega=[0,1]*[0,1]
// du/dt-mu.delta(u)=f in omega*(0,T), u(x,y,0)=u0 on omega
// mu.du/dn +alpha.(u-ue)=0 on gamma2+gamma3
// u=ue on gamma1+gamma4
// Schema implicite
//verbosity=0. ;
real Dx=.02,Dy=.02 ; //declaration des variables
real t,ue = 4., mu = 1., alpha=.001, dt=0.1, Tf=10 ;
mesh Th=square(floor(1./Dx),floor(1./Dy)) ; //definition du maillage
plot(Th,ps="square.jpg",cmm="maillage") ; // visualisation du maillage
fespace Vh(Th,P1) ; // ensemble d’elements finis
Vh uh,vh,uh0=10. ;
func f=20.*(.6<=x & x<=.8)*(.4<=y & y<=.6) ; // second membre
// resolution du problème variationnel
macro Grad(u)[dx(u),dy(u)]//
problem chaleur(uh,vh) = int2d(Th)(uh*vh/dt + Grad(uh)’*Grad(vh)*mu
- int2d(Th)(uh0*vh/dt + f*vh)+ int1d(Th,2,3)(uh*vh*alpha)
- int1d(Th,2,3)(ue*vh*alpha) +on(1,4,uh=ue) ;
int kk=0 ;
for (real t=0. ;t<Tf ;t+=dt) // boucle du temps t
{
chaleur ;
uh0=uh ;
if ( !(kk % 20)) // kk%20= le reste de la division kk/20
// !(kk%20)=0 si le reste de la division n’est pas nul, =1 si le reste est nul
// !(kk%20)= true or false
{ plot(uh,cmm="t="+t+"[sec]",dim=3,fill=true,value=true,wait=1) ;
plot(uh,cmm="t="+t+"[sec]",dim=2,fill=true,value=true,wait=1) ;}
18
kk+=1 ;
}
//cout<<"uh[]="<<uh[]<<endl ;
cout<<"Taille.uh="<<uh[].n<<endl ; // La taille du tableau
cout<<"Max.uh="<<uh[].max<<" ; Min.uh="<<uh[].min<<endl ; // Max
cout<<"Norme.uh l1="<<uh[].l1<<endl ; // Norme l1
cout<<"Norme.uh l2="<<uh[].l2<<endl ; // Norme l2
cout<<"Norme.uh sup="<<uh[].linfty<<endl ; // Norme sup
cout<<"Somme des termes="<<uh[].sum<<endl ; // Somme
cout<<"uh[](10)="<<uh[](10)<<endl ;
19
Figure 13 – Solution uh, uh.max = 9.20629, uh.min = 4, taille.uh = 2601
20
Figure 15 – Solution uh, uh.max = 4.43037, uh.min = 4, taille.uh = 2601
21
Figure 17 – Solution uh, max.uh = 4.42837, min.uh = 4, taille.uh = 2601
22
4.2 Exemple 5
23
problem chaleur(uh,vh) = int2d(Th)(uh*vh/dt + Grad(uh)’*Grad(vh))
- int2d(Th)(uh0*vh/dt + f*vh) +on(C1,uh=60)+on(C2,uh=20) ;
int kk=0 ;
for (real t=0. ;t<Tf ;t+=dt)
{
chaleur ;
uh0=uh ;
if ( !(kk % 20)) // kk%20= le reste de la division kk/20
// !(kk%20)=0 si le reste de la division n’est pas nul, =1 si le reste est nul
// !(kk%20)= true or false
{
plot(uh,cmm="t="+t+"[sec]",dim=3,fill=true,value=true,wait=1) ;
plot(uh,cmm="t="+t+"[sec]",dim=2,fill=true,value=true,wait=1) ;
}
kk+=1 ;
}
cout<<"uh[]="<<uh[]<<endl ;
cout<<"Taille.uh="<<uh[].n<<endl ; // La taille du tableau
cout<<"Max.uh="<<uh[].max<<" ; Min.uh="<<uh[].min<<endl ; // Max
cout<<"Norme.uh l1="<<uh[].l1<<endl ; // Norme l1
cout<<"Norme.uh l2="<<uh[].l2<<endl ; // Norme l2
cout<<"Norme.uh sup="<<uh[].linfty<<endl ; // Norme sup
cout<<"Somme des termes="<<uh[].sum<<endl ; // Somme
cout<<"uh[](10)="<<uh[](10)<<endl ;
24
Figure 19 – Maillage, nbTriangles=660, nbNoeuds=380, h.max=0.92531 ,h.min=0.298787
25
Figure 21 – Solution uh, uh.max = 60, uh.min = 20, taille.uh = 380
26
Figure 23 – Solution uh, uh.max = 60, uh.min = 20, taille.uh = 380
27
5 Equation des ondes
5.1 Exemple 6
∂ 2u
∂t2
− c2∆u = f dans Ω × ]0, T [
u = 0 sur Γ
(4)
u(x, y, 0) = u0 dans Ω
∂u
∂t (x, y, 0) = 0 dans Ω
Problème variationnel
Z 2 Z Z
∂ u
2
vdx + c2 ∇u∇vdx = f vdx, ∀v ∈ H01(Ω), u ∈ H01(Ω)
Ω ∂t Ω Ω
θ-Schéma (θ = 1/2), Schéma implicite
Z n+1
− 2un + un−1
Z Z
u 2 1 n+1 n−1
2
vdx + c ∇(u + u )∇vdx = f vdx,
Ω dt 2 Ω Ω
1 0
∀v ∈ H0 (Ω), u = u0, n = 1, 2, ......
30
Figure 25 – Solution uh, max.uh = 0.82017, min.uh = 0.00, taille.uh = 2601
Figure 26 – Projection de uh
31
Figure 27 – Solution uh , max.uh = 0.00, min.uh = −0.99444, taille.uh = 2601
Figure 28 – Projection de uh
32
Figure 29 – Solution uh , max.uh = 0.83775, min.uh = 0.00, taille.uh = 2601
Figure 30 – Projection de uh
33
6 Problème non linéaire
−∆u + uq(u) = f dans Ω
(5)
u = g sur Γ
où f est une fonction dans L2(Ω) et g|Γ ∈ L2(Γ), q : R −→ R, q ∈
C 0(R) nondécroissante avec q(0) = 0
Problème variationnel non linéaire
Z Z Z
∇u∇vdx + uq(u)vdx = f vdx ∀v ∈ H01(Ω), u − g ∈ H01(Ω),
Ω Ω Ω
34
//problème nonlinéaire
//-delta(u)+u.q(u)=f(x,y) dans omega
//u=g sur gamma
//verbosity=0. ;
real Dx=.02, R=1. ;
border C(t=0.,2.*pi){x=R*cos(t) ;y=R*sin(t) ;label=1 ;} ;
real[int] L2error(4) ;
for(int n=0 ;n<4 ;n++) {
mesh Th=buildmesh(C(30*2^n)) ;
//mesh Th=buildmesh(C(floor(2.*pi*R/Dx))) ;
fespace Vh(Th,P1) ;
Vh uh, uh0=0., V=uh0, vh ;
func ue = R^2 - x^2 - y^2 ;
func f = 4. + (R^2 - x^2 - y^2)^2 ;//sin(pi*x)*sin(pi*y) ;
macro Grad(u)[dx(u),dy(u)]//
real N=2000. ;
problem nonlinear(uh,vh) = int2d(Th)(Grad(uh)’*Grad(vh))
+ int2d(Th) ( uh*V*vh ) - int2d(Th) (f*vh ) + on(1,uh=0.) ;
for (int i=0 ;i<=100 ;i++) {
nonlinear ;
V=uh ;
if (i%10==0)
plot(uh,cmm="iter="+i+" ; min="+uh[].min+
" ; max="+uh[].max, fill=true,value=true,dim=3,
wait=1,boundary=false) ;
}
L2error[n]= sqrt(int2d(Th)((uh-ue)^2)) ;
}
35
for(int n=0 ;n<4 ;n++) {
cout << " L2error " << n << " = "<< L2error[n] <<endl ;
}
for (int n=0 ;n<3 ;n++){
cout <<" convergence rate = "<< log(L2error[n]/L2error[n+1])/log(2.) <<en
}
36
Figure 31 – maillage, nb.T riangles = 2270, nb.N oeuds = 1206, h.max = 0.45246, h.min =
0.14561
37
Figure 33 – Projection de la solution dans le plan Z=0
38
Nombres de noeuds Erreur en norme L2 Ordre de convergence
97 0.205855e − 01 /
353 0.507805e − 02 2.01929
1340 0.128046e − 02 1.98761
5124 0.321059e − 03 1.99575
39
Références
40