Setif FreeFem II
Setif FreeFem II
Setif FreeFem II
FreeFem++ (suite)
O. Pantz et M. Kallel
CMAP, Ecole Polytechnique, Palaiseau, France
ENIT-LAMSIN, Tunis, Tunisie
Merci `a F. Hecht...
O`u telecharger les logiciels libres qui vont bien ?
http://www.freefem.org
Visualisation de maillages Medit
http://www-rocq.inria.fr/gamma/medit/medit.html
Editeur de texte sous Windows Notepad++
http://notepad-plus.sourceforge.net
Retrouver cette presentation (avec les scripts) sur
http://www.cmap.polytechnique.fr/
~
pantz
Ateliers de Simulation Numerique, Setif, 2008 1
PLAN
Matrices, tableaux et vecteurs
Vecteurs
Tableaux
Matrices
Elements nis et vecteurs, formulations variationnelles et matrices
Formulations Variationnelles
Conditions aux bords de Dirichlet
Laplacien avec CL de Neumann
Changements de maillage
Un exemple sur un probl`eme devolution
Formulations Galerkin discontinues
jump, average, nTonEdge, intallEdge, ...
Laplacien ( encore... ) P
dc
1
Cas dun domaine avec fracture
Vecteurs et valeurs propres
Algorithmes
Pour le fun : Vesicules dans un ecoulement
Ateliers de Simulation Numerique, Setif, 2008 2
Declaration de vecteurs
int n=10 ;
real[int] u(n) ; // Cr eation dun vecteur de taille n
u=1 ; // la valeur 1 est affect ee ` a tous les el ements
u(0)=2 ; // la num erotation va de 0 ` a n-1
u[1]=2 ; // crochets ou parentheses ...
cout<<"u="<<u<<endl ; // On affiche u
u=[0,1,2,3,4,5,6,7,8,9]; // D eclaration de tous les termes
cout<<"u="<<u<<endl ;
cout<<"Taille="<<u.n<<endl; // La taille du tableau
cout<<"Max="<<u.max<<"; Min="<<u.min<<endl; // Max et min
cout<<"Norme l1="<<u.l1<<endl ; // Norme l1
cout<<"Norme l2="<<u.l2<<endl ; // Norme l2
cout<<"Norme sup="<<u.linfty<<endl ; // Norme sup
cout<<"Somme des termes="<<u.sum<<endl; // Somme
Execute declarationvecteurs.edp
Ateliers de Simulation Numerique, Setif, 2008 3
Operations sur les vecteurs
int n=10 ;
real[int] u(n),v(n),w(n),r(n); // Cr eation de vecteurs de
taille n
u=[0,1,2,3,4,5,6,7,8,9]; // D eclaration de u
v=[9,8,7,6,5,4,3,2,1,9]; // D eclaration de v
w=2.*u+1./2.*v ; // Combinaison lin eaire de vecteurs v/2=non
autoris e
cout<<"u="<<u<<endl;
cout<<"v="<<v<<endl;
cout<<"w=2*u+1/2*v="<<w<<endl;
r=1 ;
r(0:5)=w(n-6,n-1); // Extraction de tableau
cout<<"r="<<r<<endl;
cout<<"u*u="<<u*u<<endl; // u= transpos ee de u ;
*=multiplication matrices
Execute operationsvecteurs.edp
Ateliers de Simulation Numerique, Setif, 2008 4
Tableaux I/II
int n=3 ; int m=4 ;
real[int,int] A(n,m) ; // Tableau n lignes, m colonnes
A=1 ; // tous les elements egaux a 1
A(0,0)=2 ; // numerotation commence a 0
// A[0,0]=2 ; Ne fonctionne pas
cout<<"A="<<A<<endl; // On affiche le tableau
A=[[1,1,1,1],[0,1,0,0],[0,0,1,0]]; // d eclaration de tableau
cout<<"A="<<A<<endl ;
cout<<"Nombre de lignes="<<A.n<<endl; // nombre de lignes
cout<<"Nombre de colonnes="<<A.m<<endl; // nombre de colonnes
// pas dop erateur max, min,l1,l2 ou linfty
// ...
Ateliers de Simulation Numerique, Setif, 2008 5
Tableaux II/II
real[int] b(4),c(3) ; // vecteurs de 4 elements
b=[0,1,2,3] ;
c=A*b ; // produit matrice vecteur
cout<<"b="<<b<<endl ;
cout<<"c=A*b="<<c<<endl;
real[int,int] B(4,3) ;
B=b*c ;
cout<<"B=b*c="<<B<<endl;
// A+B ; B*A ; 2.*B ; non definis ! ! !
Execute tableaux.edp
Ateliers de Simulation Numerique, Setif, 2008 6
Declarations Matrices I/II
real[int,int] A(3,3) ;
A=[[1,2,3],[1,0,0],[0,16,18]];
matrix B=A ; // B est une matrice "creuse"
cout<<"A="<<A<<endl ;
cout<<"B=A="<<B<<endl; // Stockage: indices non nuls seulement
int[int] I(1),J(1) ;
real[int] C(1) ;
[I,J,C]=B ; // On r ecup` ere les indices (i,j) et leur valeur c
cout<<"I="<<I<<endl<<"J="<<J<<endl
<<"C="<<C<<endl ;
I=[0,1,3,2] ;J=[0,1,2,3] ;C=[pi,0.5,3.333,4.5];
B=[I,J,C] ; // Matrice B(I(i),J(i))=C(i)
cout<<"I="<<I<<endl<<"J="<<J<<endl<<"C="<<C<<endl;
cout<<"B=[I,J,C]="<<B<<endl;
// ...
Ateliers de Simulation Numerique, Setif, 2008 7
Declarations Matrices II/II
real[int] d(B.n) ;
d=B.diag ; // Diagonale de la matrice carr ee B
cout<<"d=B.diag="<<d<<endl;
d=2.*d ;
B.diag=d ;
cout<<"Fixe la diagonale de B a 2.*d ; B="<<B<<endl ;
matrix D=[d] ; // Matrice diagonale
cout<<"D=[d]="<<D<<endl;
matrix E=[[B,D],[D,B]]; // Matrice bloc
cout<<"E=[[B,D],[D,B]]="<<E<<endl;
Execute declarationmatrices.edp
Ateliers de Simulation Numerique, Setif, 2008 8
Alg`ebre matriciel
real[int,int] A(4,4) ;
A=[[1,2,3,4],[2,3,4,5],[0,0,1,1],[0,0,0,2]];
matrix B=A ;
real[int] b=[1,1,1,1] ;
real[int] c(b.n) ;
c=B*b ; // Multiplication Matrice / vecteur
cout<<"B="<<A<<endl ;
cout<<"b="<<b<<endl ;
cout<<"c=B*b="<<c<<endl;
set(B,solver=UMFPACK);
real[int] d(4) ;
d=B^-1*c ; // R esolution du syst` eme Bc=d
cout<<"B^-1*c="<<d<<endl;
matrix C,D,E ;
C=2.*B ; // Combinaison Lin eaire de Matrices
D=2.*B+(-1)*C ; // D=2.*B-C ; non autoris e
cout<<"D="<<D<<endl;
Execute algebrematriciel.edp
Ateliers de Simulation Numerique, Setif, 2008 9
Formulations variationnelles I/V
On consid`ere lEDP
_
u = f dans
u = 0 sur
Cette EDP est equivalente au probl`eme variationnel consistant `a
trouver u H
1
0
() tel que et
a(u, v) = L(v)
pour tout v H
1
0
() avec
a(u, v) =
_
u v et L(v) =
_
fv.
Une approximation de Galerkin consiste `a determiner u
h
V
h
tel que
a(u
h
, v
h
) = L(v
h
)
pour tout v
h
V
h
, o`u V
h
est un sous espace de dimension nie de
H
1
0
().
Ateliers de Simulation Numerique, Setif, 2008 10
Formulations variationnelles II/V
La methode des elements nis P
1
sur un maillage S
h
consiste `a choisir
V
h
= u C(; R) : u = 0 sur , u
[T
P
1
pour tout T triangle du maillage S
h
,
o`u P
1
designe lensemble des polynomes de degre 1.
Ateliers de Simulation Numerique, Setif, 2008 11
Formulations variationnelles III/V
Comme V
h
est un espace vectoriel de dimension nie, on peut
decomposer u
h
et v
h
dans une base de vecteurs (appeles ici fonctions
de base) et note (
i
). On note alors
u
h
=
i
u
i
h
i
, et v
h
=
i
v
i
h
i
.
Ainsi, a(u
h
, v
h
) = L(v
h
) si et seulement si pour tout vecteur (v
i
h
), on a
i,j
a(
i
,
j
)u
i
h
v
j
h
=
j
L(
j
)v
j
h
.
En dautres termes, on doit avoir
AU = b,
o`u U est le vecteur (u
i
h
), A est la matrice A
ij
= a(
i
,
j
) et b est le
vecteur b
j
= L(
j
).
Ateliers de Simulation Numerique, Setif, 2008 12
Formulations variationnelles IV/V
Application au Laplacien
_
u = f dans
u = g sur
mesh Sh=square(50,50); // D efinition du maillage
fespace Vh(Sh,P1) ; // D efinition de lespace V
h
func f=10. ;
func g=cos(x) ;
varf a(u,v)=int2d(Sh)(dx(u)*dx(v)+dy(u)*dy(v))
+on(1,2,3,4)(u=g); // D efinition de la forme bilineaire a(u, v)
varf L(u,v)=int2d(Sh)(f*v)+on(1,2,3,4,u=g); // D efinition de la
forme lin eaire b(v)
Ateliers de Simulation Numerique, Setif, 2008 13
Formulations variationnelles V/V
matrix A=a(Vh,Vh) ; // Matrice A
ij
= a(
i
, Phi
j
)
real[int] b=L(0,Vh) ; // Le second membre b
j
= L(
j
)
Vh uh=0 ; // u
h
V
h
uh[]=A^-1*b ; // uh[] est le vecteur U = (u
i
h
) des coordonn ees de
u dans la base de fonctions propres
plot(uh,wait=1);
Execute fv.edp
Ateliers de Simulation Numerique, Setif, 2008 14
Au sujet des conditions aux bords
Les conditions aux bords de type Dirichlet sont imposees par
penalisation. Si i est un degre de liberte xe `a la valeur g
i
, A
ii
est
incremente de tgv et b
i
de tgv*g
i
, o`u tgv prend une Tr`es Grande
Valeure.
mesh Sh=square(10,10);
fespace Vh(Sh,P1) ;
varf L(u,v)=on(1,2,3,4,u=1);
Vh u=0 ;
u[]=L(0,Vh,tgv=1); // On peut modifier tgv u=tgv sur le bord
plot(u,wait=1,value=1);
Execute tgv.edp
Ateliers de Simulation Numerique, Setif, 2008 15
Laplacien avec conditions de Neumann I/III
On souhaite resoudre
_
u = f sur
u
n
= 0 sur
On introduit la formulation mixte consistant `a determiner u H
1
()
et p R tels que pour tout v H
1
() et tout q R,
_
u v +p
_
u +q
_
v =
_
fv,
cest `a dire
a(u, v) +ps(v) +qs(u) = L(v),
avec
a(u, v) =
_
u v, s(v) =
_
v et L(v) =
_
fv.
Ateliers de Simulation Numerique, Setif, 2008 16
Laplacien avec conditions de Neumann II/III
mesh Sh=square(50,50,[x-0.5,y-0.5]); // Maillage
fespace Vh(Sh,P1) ; // Vh est lespace dEF P1
func f=x*y ; // forces appliqu ees
varf a(u,v)=int2d(Sh)(dx(u)*dx(v)+dy(u)*dy(v));
// forme bilin eaire a(u, v) =
_
u v
varf L(u,v)=int2d(Sh)(f*v); // forme lin eaire L(v) =
_
fv
varf s(u,v)=int2d(Sh)(v); // forme lin eaire s(v) =
_
v
// ...
Ateliers de Simulation Numerique, Setif, 2008 17
Laplacien avec conditions de Neumann III/III
matrix B=a(Vh,Vh) ; // Assemblage matrice B
i,j
= a(
i
,
j
)
real[int] c=s(0,Vh) ; // Assemblage vecteur c
i
= s(
i
)
real[int] d=L(0,Vh) ; // Assemblage vecteur d
i
= L(
i
)
matrix A=[[B,c],[c,0]]; // D efinition de
A =
_
B c
c
0
_
real[int] b=[d,0] ; // D efinition du vecteur b = (d, 0)
set(A,solver=UMFPACK); // On doit choisir un solveur
real[int] res(Vh.ndof+1) ; // ndof = Number of Degree Of Freedom
r=A^-1*b ; // r = A
1
b
Vh u=0 ; real p ;
[u[],p]=r ; // u =
i
r
i
i
plot(u,wait=1) ;
Execute Neumann.edp
Ateliers de Simulation Numerique, Setif, 2008 18
Changements de maillages I/IV
Elasticite
mesh Sh=square(5,5,[x-0.5,y-0.5]); // Maillage
fespace Vh(Sh,[P1,P1]) ; // V
h
est lespace dEF P
1
P
1
Vh [u,v]=[0,0] ; // (u, v) V
h
u[]=1. ; // (u, v) =
i
o` u
i
est une base de V
h
plot([u,v],wait=1,value=1); // (u, v) = (1, 1) et non (0, 1)
v[]=-1. ; // (u, v) =
i
2
i
plot([u,v],wait=1,value=1); // (u, v) = (2, 2) et non (1, 2)
Execute Vectoriel.edp
Ateliers de Simulation Numerique, Setif, 2008 19
Changements de maillages II/IV
Elasticite
mesh Sh=square(1,1) ; // Maillage tr` es grossier
fespace Vh(Sh,P1) ; // V
h
est lespace dEF P
1
Vh u=cos(pi*x)*cos(pi*y);
plot(Sh,u,wait=1);
Sh=adaptmesh(Sh,0.05,IsMetric=1); // Adaptation du maillage
Sh=adaptmesh(Sh,0.05,IsMetric=1); // Adaptation du maillage
plot(Sh,wait=1,cmm="Le nouveau maillage") ;
string legende="u est defini sur lANCIEN maillage u[] est de
taille "+u[].n ;
plot(u,cmm=legende,wait=1);
u=cos(pi*x)*cos(pi*y);
legende="u est defini sur le nouveau maillage u[] est de taille
"+u[].n ;
plot(Sh,u,cmm=legende,wait=1);
Execute AfterAdapt.edp
Ateliers de Simulation Numerique, Setif, 2008 20
Changements de maillages III/IV
Elasticite
mesh Sh=square(10,10);
real mu=1.,lambda=1.;
func f1=0 ;func f2=-2. ;
fespace Vh(Sh,[P2,P2]) ; // V
h
est lespace dEF P
1
P
1
Vh [u1,u2],[v1,v2] ;
macro e(u1,u2)
[dx(u1),(sqrt(2.)*dx(u2)+dy(u1))/2.,dy(u2)] //
macro div(u1,u2) (dx(u1)+dy(u2)) //
solve elasticity([u1,u2],[v1,v2])=
int2d(Sh)(2.*mu*(e(u1,u2)*e(v1,v2))+lambda*div(u1,u2)*div(v1,v2))
-int2d(Sh)(f1*v1+f2*v2)+on(1,u1=0,u2=0);
Ateliers de Simulation Numerique, Setif, 2008 21
Changements de maillages IV/IV
Elasticite
fespace Wh(Sh,P1) ;
Wh sigma,sigma2 ;
sigma=2.*mu*(e(u1,u2)*e(u1,u2))+lambda*div(u1,u2)^2;
Sh=movemesh(Sh,[x+u1,y+u2]);
sigma2=0 ; // D eclare
2
comme un EF sur le nouveau maillage
sigma2[]=sigma[]; //
2
a les meme coordonn ees que
plot(sigma,fill=1,wait=1,cmm="contraintes dans la configuration de
r ef erence") ;
plot(sigma2,fill=1,wait=1,cmm="contraintes dans la configuration
d eform ee") ;
Execute elasticite.edp
Ateliers de Simulation Numerique, Setif, 2008 22
Un probl`eme devolution I/IV
On souhaite determiner levolution dun solide elastique, solution du
probl`eme variationnel consistant `a determiner
u C
1
([0, T]; L
2
()
2
) C
0
([0, T]; H
1
()
2
) tel que pour tout t ]0, T[
et tout v H
1
()
2
,
_
d
2
u
dt
2
vdx +
_
f v,
o`u f sont les forces appliquees, et les coecients de Lame du
solide, la masse volumique et e() le tenseur symetrise. Il faut
eventuellement ajouter des conditions aux limites (temps et espace).
On eectue une discretisation de type dierences nies en temps. On
Ateliers de Simulation Numerique, Setif, 2008 23
peut (par exemple) considere les schema impicite, centre dordre 2
consistant `a determiner u
n
u(nt)
_
u
n+1
2u
n
+u
n1
t
2
v
+
_
2e(u
n+1
) e(v) +(div u
n+1
)(div v)
+(1 )
_
2e(u
n1
) e(v) +(div u
n1
)(div v) =
_
f v.
Un probl`eme devolution II/IV
real Lx=5., Ly=1., dn=7., mu=10., lambda=0., rho=1. ;
real Dt=0.5, T=100., exa=0.3 ;
func f1=0. ;func f2=0. ;
mesh Sh=square(Lx*dn,Ly*dn,[Lx*x,Ly*y]);
fespace Vh(Sh,[P2,P2]) ;
macro e(u1,u2)
[dx(u1),(sqrt(2.)*dx(u2)+dy(u1))/2.,dy(u2)] //
macro div(u1,u2) (dx(u1)+dy(u2)) //
Vh [u1,u2],[v1,v2] ;
Vh [up1,up2],[upp1,upp2];
[upp1,upp2]=[0.,0.]; // D eplacement initial
[v1,v2]=[0.,-1]; // Vitesse initiale
[up1,up2]=[upp1+Dt*v1,upp2+Dt*v2]; // au temps Dt
Ateliers de Simulation Numerique, Setif, 2008 24
Un probl`eme devolution III/IV
real t=0 ;
real theta=0.6 ; // theta >= 1/2 => cest stable
problem elasticity([u1,u2],[v1,v2],init=t,solver=Cholesky)=
int2d(Sh)(rho*([u1,u2]*[v1,v2])/(Dt)^2)
+int2d(Sh)(theta*(2.*mu*(e(u1,u2)*e(v1,v2))
+lambda*div(u1,u2)*div(v1,v2)))
+int2d(Sh)((1.-theta)*(2.*mu*(e(upp1,upp2)*e(v1,v2))
+lambda*div(upp1,upp2)*div(v1,v2)))
-int2d(Sh)(f1*v1+f2*v2)
-int2d(Sh)(rho*([2.*up1-upp1,2.*up2-upp2]*[v1,v2])/(Dt)^2)
+on(4,u1=0,u2=0);
Ateliers de Simulation Numerique, Setif, 2008 25
Un probl`eme devolution IV/IV
mesh Th=Sh ;
mesh Th0=Sh ;
fespace Ph(Th,P1) ;
fespace Wh(Sh,P1) ;
Ph sigma2=0 ; Wh sigma ;
while(t<T){
elasticity ;
sigma=(2.*mu*(e(u1,u2)*e(u1,u2))+lambda*div(u1,u2)*div(u1,u2));
Th=movemesh(Sh,[x+exa*u1,y+exa*u2]);
sigma2=0 ;sigma2[]=sigma[];
plot(sigma2,fill=1,wait=0,bb=[[0,-Ly],[Lx+Ly,2.*Ly]],viso=viso,hsv=colorhs
t+=Dt ; [upp1,upp2]=[up1,up2]; [up1,up2]=[u1,u2];
} ;
Execute elasticite-evolution.edp
Ateliers de Simulation Numerique, Setif, 2008 26
Formulations Galerkin discontinues
FreeFem++ permet dutiliser des formulations de type Galerkin ou
volumes nis `a laide des mots cles jump, average, intalledges et
nTonEdge.
intalledges(Th)(u) =
TT
h
_
T
u.
Sur chaque arete e dun triangle T,
jump(u)(x) = lim
t0+
u(x +tn) u(x tn),
o`u n est la normale exterieure au triangle T et la convention u(x) = 0
si x / .
average(u)(x) = lim
t0+
(u(x +tn) +u(x tn))/2,
nTonEdge= Nombre de triangles adjacents `a larete.
Ateliers de Simulation Numerique, Setif, 2008 27
Le Laplacien avec P
dc
1
I/II
On peut resoudre le probl`eme dapproximation du Laplacien `a laide
delements nis P
1
discontinus. En eet, la resolution du probl`eme
consistant `a minimiser
1
2
_
[u[
2
fu
sur lensemble des u
h
V
0
h
(elements nis P
1
nuls sur le bord du
domaine) equivaut `a minimiser
1
2
TS
h
_
T
[u[
2
fu
sur lensemble des u, elements nis P
1
discontinus de sauts nuls aux
aretes. A cet eet, on introduit des multiplicateurs de Lagrange.
Ateliers de Simulation Numerique, Setif, 2008 28
Le Laplacien avec P
dc
1
II/II
On cherche (u, p) P
dc
1
P
dc
1
tels que
TS
h
_
T
u v
_
fv +
_
T
[u][q] +[v][p]
_
T
pq = 0
pour tous (v, q) P
dc
1
P
dc
1
.
mesh Sh=square(50,50,[x,y]); // D efinition du Maillage S
h
func f=-1 ; // Second membre
fespace Vhdc(Sh,P1dc) ; // Espace V
dc
h
des EF P
1
discontinues
Vhdc u,v,p,q ; // u, v, p et q V
dc
h
solve LaplacienP1dc(u,p,v,q)=
int2d(Sh)(dx(u)*dx(v)+dy(u)*dy(v)+u*v)
-intalledges(Sh)(jump(q)*jump(u)+jump(p)*jump(v))
-intalledges(Sh)(1.e-10*(p*q))
-int2d(Sh)(f*v);
plot(u,wait=1) ;
Execute P1dc.edp
Ateliers de Simulation Numerique, Setif, 2008 29
Application aux domaine fractures I/II
On peut utiliser le precedent script an de traiter le cas des domaines
fractures. Il sut de ne pas imposer la contrainte de saut nul le long
de la fracture (et le long de la fronti`ere du domaine si on impose des
conditions aux limites de type Neumann).
border a(t=0,2*pi){x=cos(t);y=sin(t) ;label=1 ;} ;
border fracture(t=0,1){x=t;y=0 ;label=2 ;} ;
mesh Sh=buildmesh(a(50)+fracture(20)); // D efinition du
Maillage
func f=x+y ;
fespace Vh(Sh,P1) ;
varf idfracture(u,v)=on(2,u=1.); // On rep` ere la fracture
Vh onfracture=0 ; onfracture[]=idfracture(0,Vh,tgv=1);
plot(Sh,onfracture,wait=1);
// ...
Ateliers de Simulation Numerique, Setif, 2008 30
Application aux domaine fractures II/II
fespace Vhdc(Sh,P1dc) ;
Vh1dc u,v,p,q ;
solve LaplacienP1dc(u,p,v,q)=
int2d(Sh)(dx(u)*dx(v)+dy(u)*dy(v)+u*v)
-intalledges(Sh)((jump(q)*jump(u)+jump(p)*jump(v))
*(nTonEdge-1.)*(1.-onfracture))
// On impose la continuit e sauf le long de la fracture
// et le long du bord
-intalledges(Sh)(1.e-10*(p*q))-int2d(Sh)(f*v);
plot(u,wait=1) ;
Execute fracture.edp
Ateliers de Simulation Numerique, Setif, 2008 31
Vecteurs propres et valeurs propres I/II
On souhaite determiner (u, ) H
1
0
() R tels que pour tout
v H
1
0
(),
a(u, v) = m(u, v),
o`u
a(u, v) =
_
u v et m(u, v) =
_
uv
Ateliers de Simulation Numerique, Setif, 2008 32
Vecteurs propres et valeurs propres II/II
mesh Sh=square(50,50);
fespace Vh(Sh,P1) ; // V
h
= El ements finis P
1
varf a(u,v)=int2d(Sh)(dx(u)*dx(v)+dy(u)*dy(v))+on(1,2,3,4,u=0);
// a(u, v) =
_
u v
varf m(u,v)=int2d(Sh)(u*v); // m(u, v) =
_
uv
matrix A=a(Vh,Vh) ; // A
ij
= a(
i
,
j
)
matrix M=m(Vh,Vh) ; // M
ij
= m(
i
,
j
)
int neV=20 ; // nombre de valeurs propres et vecteurs propres
stock es
real[int] lambda(neV) ; // valeurs propres
Vh[int] u(neV) ; // vecteurs propres
int k=EigenValue(A,M,sym=true,sigma=0,value=lambda,
vector=u,tol=1.e-10,ncv=0,maxit=0); // Calcul des vecteurs et
valeurs propres
for(int i=0 ;i<k ;i++)
plot(u[i],cmm="Vecteur propre n."+(i+1)+" ; valeur
propre="+lambda(i),wait=1);
Execute propres.edp
Ateliers de Simulation Numerique, Setif, 2008 33
Algorithmes
An de resoudre des probl`emes de type J
t
(u) = 0, divers algorithmes
sont disponibles, `a savoir
Le Gradient Conjugue lineaire ou Non Lineaire (LinearCG et NLCG)
pour les probl`emes convexes.
The Generalized minimal residual Method pour les probl`emes non
symetriques (LinearGMRES).
La methode de Newton (Newton)
La methode Broyden-Flechter-Goldfrab-Shanno (BFGS)
Les methodes Newton et BFGS sont importees du package COOOL et
utilisent des matrices pleines.
Ateliers de Simulation Numerique, Setif, 2008 34
Gradient Conjugue Non Lineaire I/IV
On cherche u : C
1
() R minimisant laire de la surface S
parametree par (x, y) (x, y, u(x, y)), sur lensemble des
fonctions u tels que u
[
= u
0
[
.
Le probl`eme consiste donc `a minimiser
J(u) =
__
_
_
_
1
0
x
u
_
_
_
_
_
_
0
1
y
u
_
_
_
2
dxdy =
__
_
1 +(
x
u)
2
+(
y
u)
2
dxdy
dequation dEuler associee
v/v
[
= 0 : DJ(u)v =
_
(
x
v
x
u +
y
v
y
y
u)
_
1 +(
x
u)
2
+(
y
u)
2
= 0
Ateliers de Simulation Numerique, Setif, 2008 35
Gradient Conjugue Non Lineaire II/IV
Exemple dutlisation de NLCG
func real J(real[int] & xx) // La fonctionnelle ` a minimiser
{ real s=0 ;
... // Le code qui calcul J(u) en fonction de xx=u[]
return s ; }
func real[int] DJ(real[int] &xx) // Le gradient de la fonctionnelle
{ .... // calcul la d eriv ee J
t
(u) en fonction de u[]
.... // stocke le resultat dans xx
return xx ; } ; // Retourne une variable non locale=ok
...
NLCG(DJ,x,eps=1.e-6,nbiter=20,precon=matId) ;
Pour visualiser le resultat avec medit
savemesh(Th,"mm",[x,y,u]); // sauve mm.points et mm.faces pour
medit
exec("medit mm ;rm mm.bb mm.faces mm.points") ; // appel ` a medit
Ateliers de Simulation Numerique, Setif, 2008 36
Gradient Conjugue Non Lineaire III/IV
func g=cos(2*x)*cos(2*y); // valeur au bord
mesh Th=square(20,20,[x*pi,y*pi]); // Maillage de
fespace Vh(Th,P1) ;
func real J(real[int] & xx) // La fonctionnelle ` a minimiser
{ Vh u ;u[]=xx ; // Defini lEF u ` a laide de ces coordonn ees
xx
return int2d(Th)( sqrt(1 +dx(u)*dx(u) + dy(u)*dy(u) ) ) ; }
func real[int] dJ(real[int] & x) // Le gradient de J
{ Vh u ;u[]=xx ; // Defini lEF u ` a laide de ces coordonn ees
xx
varf au(uh,vh) = int2d(Th)( ( dx(u)*dx(vh) + dy(u)*dy(vh) )
/ sqrt(1. +dx(u)*dx(u) + dy(u)*dy(u) ) )
+ on(1,2,3,4,uh=0);
return xx= au(0,Vh) ; } // Retourne une variable non
locale=ok
Ateliers de Simulation Numerique, Setif, 2008 37
Gradient Conjugue Non Lineaire IV/IV
Vh u=G ;
verbosity=5 ; // to see the residual
int conv=NLCG(dJ,u[],nbiter=500,eps=1e-5);
cout << " the surface =" << J(u[]) << endl ;
// so see the surface un 3D
savemesh(Th,"mm",[x,y,u]); // sauve la surface pour medit
exec("medit mm ;rm mm.bb mm.faces mm.points") ;
Execute minimal-surf.edp
Ateliers de Simulation Numerique, Setif, 2008 38
Juste pour le fun...
Vesicules dans un ecoulement
On consid`ere un syst`eme constitue de vesicules dans un ecoulement.
Chaque vesicule est denie comme un region du maillage global. A
chaque iteration, le domaine est remaille compl`etement. On assure de
plus le non-recouvrement des vesicules. Execute visualisation.edp
Ateliers de Simulation Numerique, Setif, 2008 39