Vous êtes sur la page 1sur 43

` Introduction a FreeFem++

M. KALLEL
LAMSIN Ecole Nationale dIngnieurs de Tunis e Tunisie avec http://www.lamsin.rnu.tn

O. Pantz
mailto:moez.kallel@ipeit.rnu.tn

Ateliers de Simulation Numrique, Stif, 2008 e e

PLAN

Introduction Les types de donnes e Les fonctions Les boucles et les instructions de contrle o Les entres / sorties e Dnir un maillage e Rsoudre une EDP e Visualiser les rsultats e A travers des exemples

Ateliers de Simulation Numrique, Stif, 2008 e e

Introduction

FreeFem++ est un logiciel (freeware) crit en C++ dvelopp au Laboratoire e e e Jacques-Louis Lions de lUniversit Pierre et Marie Curie [F. Hecht, O. e Pironneau], port sous Windows, Unix (Linux) et MacOs. e Il sexcute en ligne de commande. Il permet de crer des maillages ainsi que e e de rsoudre des quations aux drives partielles par des mthodes de type e e e e e lments nis. ee Pour le tlcharger, consulter : ee

http://www.freefem.org/ff++
Ateliers de Simulation Numrique, Stif, 2008 e e 3

Caractristiques de FreeFem++ I/II (2D) e

Plusieurs types dlments nis : lment linaire et quadratique, P1 disconee ee e tinu et lment de Raviart-Thomas, lment vectoriel,... ee ee Interpolation automatique des donnes ` partir dun maillage sur un autre. e a Dnition du probl`me aux limites (complexe ou rel) directement avec la e e e forme variationnelle. Formulation Galerkin Discontinu. Discription analytique de la fronti`re. e Crer des maillages, base sur lalgorithme de Delaunay-Voronoi. e e Lire et sauver des maillages, solutions Adaptation des maillages, isotrope ou anisotrope.

Ateliers de Simulation Numrique, Stif, 2008 e e

Caractristiques de FreeFem++ II/II (2D) e

LU, Cholesky, Crout, CG, GMRES, UMFPack solveurs linaires ; valeurs e e propores et vecteurs propres calcules avec ARPACK. Mme syntax que C++. e Lien avec dautres logiciels : modulef, emc2, medit, gnuplot, ... Plusieurs exemples sont traits : Navier-Stokes, lasticit, structure uide, e e e probl`mes de valeurs propores, dcomposition de domaine, ... e e

Ateliers de Simulation Numrique, Stif, 2008 e e

Comment utiliser FreeFem++

1/ Editer un chier nomchier.edp avec : emacs, vi, nedit, etc. Excuter e votre script : FreeFem++ nomchier.edp 2/ Utiliser linterface graphique de FreeFem++ : FreeFem++-cs -Editer un chier -run

Ateliers de Simulation Numrique, Stif, 2008 e e

Les types de donnes e

Variables globales - x, y et z : les coordonnes du point courant. e - label : le numro de rfrence de la fronti`re dans laquelle se situe le point e ee e courant, 0 sinon. - P : le point courant. - N : le vecteur normal sortant unitaire au point courant sil se situe sur une fronti`re. e - cin, cout et endl : les commandes dachage/rcupration de donnes e e e issues de C++, utilises avec << et >>. e - pi : le nombre . - true et false : les boolens. e - i : le nombre imaginaire ( 1).

Ateliers de Simulation Numrique, Stif, 2008 e e

Les types basiques Les oprateurs sont comme dans C : e + - * / ^ // where a^b= ab == != < > <= >= & | // where a|b= a or b, a&b= a and b = += -= /= *= Les entiers : Il sagit du type int Les rels : Il sagit du type real e Les complexes : Il sagit du type complex. Quelques fonctions lmentaires ee associes : real, imag et conj e Les chaines de caract`res : Il sagit de string e string toto this is a string

Ateliers de Simulation Numrique, Stif, 2008 e e

Les tableaux et les matrices Il existe deux types de tableaux, ceux avec des indices entiers, et ceux dont les indices sont des chaines de caract`res. Les lments sont de type int, real e ee ou complex. real[int] a(n) ; a[3]=2 ; real [int,int] A(n,m) ; A[1][2]=0 ; matrix A=[ [1,2,3], [1,2,3], [1,2,3]] ;

Ateliers de Simulation Numrique, Stif, 2008 e e

Les fonctions
Les fonctions prdnies e e Les plus courantes : cos, sin, tan, acos, asin et atan cosh, sinh, acosh et asinh log, log10 et exp sqrt et Dnir une fonction ` une variable e a func type nom_fct(type & var) { instruction 1 ; ... ... instruction n ; return outvar ; }
Ateliers de Simulation Numrique, Stif, 2008 e e 10

Les formules Il sagit de fonctions dpendant des deux variables despace x et y et sont e dnies ` partir des fonctions lmentaires. e a ee func outvar = expression(x,y) ; func f = x+y ; func g = imag(sqrt(z)) ; Les fonctions dpendant du maillage e Il sagit dvaluer une formule sur les noeuds du maillage. e fespace espace_name(maillage, type_elements_finis) ; func fctoutvar = expression(x,y) ; espace_name FEfctoutvar = fctoutvar ;

Ateliers de Simulation Numrique, Stif, 2008 e e

11

Les boucles et les instructions de contrle o


La boucle for : for (init,cond,incr) { ... } La boucle while : while (cond) { ... } Les instructions de contrle : o if (cond) { ... } else { ... }
Ateliers de Simulation Numrique, Stif, 2008 e e 12

Les entres / sorties e


Pour ouvrir un chier en lecture : ifstream name(nom_fichier) ; Pour ouvrir un chier en criture : e ofstream name(nom_fichier) ; Lire/crire dans un chier >> / << e { ofstream gnu("plot.gp") ; for (int i=0 ;i<n ;i++) { gnu << x[i] << " " << y[i] << endl ; } }

Ateliers de Simulation Numrique, Stif, 2008 e e

13

Dnir un maillage e

Maillage triangulaire rgulier dans un domaine rectangulaire e On consid`re le domaine ]x0, x1[]y0, y1[. Pour gnrer un maillage rgulier e e e e nm : mesh nom_maillage = square(n,m,[x0+(x1-x0)*x,y0+(y1-y0)*y]) ; Maillage triangulaire non structur dni ` partir de ses fronti`res e e a e Pour dnir les fronti`res, on utilise la commande border : e e border name(t=deb,fin){x=x(t) ;y=y(t) ;label=num_label} ; Pour dnir un maillage ` partir de ses fronti`res, on utilise buildmesh : e a e buildmesh nom_maillage=buildmesh(a1(n1)+a2(n2)+...+ak(nk)) ;

Ateliers de Simulation Numrique, Stif, 2008 e e

14

Exemples de maillages 1/ Un domaine carr : ]0, 1[2 e mesh Th1 = square(10,10) ; plot(Th1,wait=1) ; // boundary label: 1 bottom, 2 right, 3 top, 4, left

//

2/ Un domaine sous forme L : ]0, 1[2\[ 1 , 1[2 2


border a(t=0,1.0){x=t ; y=0 ; label=1 ;} ; border b(t=0,0.5){x=1 ; y=t ; label=2 ;} ; border c(t=0,0.5){x=1-t ; y=0.5 ;label=3 ;} ; border d(t=0.5,1){x=0.5 ; y=t ; label=4 ;} ; border e(t=0.5,1){x=1-t ; y=1 ; label=5 ;} ; border f(t=0.0,1){x=0 ; y=1-t ;label=6 ;} ; plot(a(6) + b(4) + c(4) +d(4) + e(4) + f(6),wait=1) ; // mesh Th2 = buildmesh (a(6) + b(4) + c(4) +d(4) + e(4) + f(6)) ;

to see the 6 borders

3/ Lire un maillage externe mesh Th2("april-fish.msh") ; avec emc2, bamg, modulef, etc...
Ateliers de Simulation Numrique, Stif, 2008 e e 15

Maillage / gure

Ateliers de Simulation Numrique, Stif, 2008 e e

16

Entres / sorties chiers e savemesh(nom_maillage,nom_fichier) ; readmesh(nom_fichier) ; // // sauver le maillage (.msh)

lire un maillage ` partir dun fichier a

Autres fonctions sur les maillage mesh mail2 = movemesh(mail1,[f1(x,y),f2(x,y)]) ; // mesh mail2 = adaptmesh(mail1,var) ; zones de forte variations Lire les donnes dun maillage e Th.nt (nbre de triangle), Th.nv (nbre de noeuds), Th[i][j] (sommet j du triangle i), ... // dformer le maillage e

raffiner le maillage dans les

Ateliers de Simulation Numrique, Stif, 2008 e e

17

Rsoudre une EDP e


Dnition de lespace dapproximation e fespace nom_espace(nom_maillage,type_elements_finis) ; Le types dlments nis est un mot-cl dans la liste suivante : P0, P1, ee e P1dc, P1b, P2, P2b, P2dc, RT, P1inc. Lespace ainsi dni est ` son tour e a un type de donnes pour dnir les variables de type lments nis. e e ee Dnir le probl`me variationnel e e problem pb_name(u,v,solver)= a(u,v) - l(v) + (conditions aux limites) ; Pour rsoudre un probl`me variationnel, il sut de taper la commande : e e pb_name ;
Ateliers de Simulation Numrique, Stif, 2008 e e 18

Formes bilinaires e int1d(Th,n1,...,nk)(A*u*v)


T h T (ini )

Auv

int2d(Th[,k])(A*u*v)
T h [k ] T

Auv

intalledges(Th[,k])(A*u*v)
T h [k ] T

Auv

Formes linaires e int1d(Th,n1,...,nk)(A*v)


T h T (ini )

Av

intalledges(Th[,k])(A*v)
T h [k ] T

Av

Ateliers de Simulation Numrique, Stif, 2008 e e

19

Visualiser les rsultats e


Directement avec Freefem++ Pour acher des maillages, les courbes disovaleurs et les champs de vecteurs : plot(var1,[var2,var3],...[liste doptions]) ; wait=true/false, value=true/false, fill=num, ps="nom_fichier",... Exporter vers un autre logiciel Gnuplot, Medit,... { ofstream file("exemple.bb") ; // file for medit file <<"2 1"<<uh[].n<<" 2"<<endl ; for (int i=0 ;i<uh[].n ;i++){ file << uh[][j] << endl ; }} // to call gnuplot command and wait 5 second (tanks to unix command) // and make postscipt plot exec("echo plot \"plot.gp\" using 1:2 w l pause 5 set term postscript set output \"gnuplot.eps\" replot quit | gnuplot") ;
Ateliers de Simulation Numrique, Stif, 2008 e e 20

A travers des exemples

Ateliers de Simulation Numrique, Stif, 2008 e e

21

Equation de Laplace

Soit un domaine avec = 2 e. Trouver u solution : u = 1 dans , u = 2 sur 2, u = 0 sur e n (1)

On note Vg = {v H 1()/v|2 = g}. Formulation variationnelle : Trouver u V2() , t.q.

u v, u. v = 1v+ e n

v V0()

(2)

Ateliers de Simulation Numrique, Stif, 2008 e e

22

Equation de Laplace I/II

Code FreeFem++ : mesh Th("april-fish.msh") ; fespace Vh(Th,P1) ; Vh u,v ; solve laplace(u,v,solver=CG) = int2d(Th)( dx(u)*dx(v)+ dy(u)*dy(v) ) - int2d(Th) ( 1*v) + on(2,u=2) ; plot(u,fill=1,wait=1,value=0,ps="april-fish.eps") ;

//

define the P1 EF space

//

int on 2

Ateliers de Simulation Numrique, Stif, 2008 e e

23

Equation de Laplace / gure

Execute sh.edp

Ateliers de Simulation Numrique, Stif, 2008 e e

24

Equation de Laplace (formulation mixte) II/II


On cherche ` rsoudre p = f dans et p = g sur , avec u = a e Ce probl`me reste quivalent ` : e e a Trouver u, p solutions dans un domaine t.q. : .u = f , u p = 0 dans , p = g sur = (3) p

Formulation variationnelle Mixte : Trouver u Hdiv (), p L2() , t.q.

q .u +

p .v + u.v =

f q +

gv.n,

(v, q) Hdiv L2

Ateliers de Simulation Numrique, Stif, 2008 e e

25

Equation de Laplace (formulation mixte) II/II


mesh Th=square(10,10) ; fespace Vh(Th,RT0) ; fespace Ph(Th,P0) ; Vh [u1,u2],[v1,v2] ; Ph p,q ; func f=1. ; func g=1 ; problem laplaceMixte([u1,u2,p],[v1,v2,q],solver=LU) = // int2d(Th)( p*q*1e-10 + u1*v1 + u2*v2 + p*(dx(v1)+dy(v2)) + (dx(u1)+dy(u2))*q ) - int2d(Th) ( -f*q) - int1d(Th)( (v1*N.x +v2*N.y)*g) ; // int on gamma laplaceMixte ; // the problem is now solved plot([u1,u2],coef=0.1,wait=1,ps="lapRTuv.eps",value=true) ; plot(p,fill=1,wait=1,ps="laRTp.eps",value=true) ; Execute LaplaceRT.edp

Ateliers de Simulation Numrique, Stif, 2008 e e

26

Equation de Laplace (formulation mixte) / gure

Vec Value 0 0.0177758 0.0355515 0.0533273 0.0711031 0.0888789 0.106655 0.12443 0.142206 0.159982 0.177758 0.195533 0.213309 0.231085 0.248861 0.266637 0.284412 0.302188 0.319964 0.33774

IsoValue 0.997992 1.00362 1.00738 1.01114 1.01489 1.01865 1.0224 1.02616 1.02991 1.03367 1.03742 1.04118 1.04493 1.04869 1.05244 1.0562 1.05995 1.06371 1.06746 1.07685

Ateliers de Simulation Numrique, Stif, 2008 e e

27

Prsence dune singularit (adaptation de maillage) e e

Le domaine est =]0, 1[2\[ 1 , 1]2 et lEDP est 2


1 Trouver u H0 () t.q.

u = 1 dans ,

La solution u a une singularit au voisinage des angles, et on cherche ` e a capter numrique cette singularit. e e

Exemple dun maillage adapt e

Ateliers de Simulation Numrique, Stif, 2008 e e

28

programme FreeFem++ (singularits des coins) e

border border border border border border

a(t=0,1.0){x=t ; b(t=0,0.5){x=1 ; c(t=0,0.5){x=1-t ; d(t=0.5,1){x=0.5 ; e(t=0.5,1){x=1-t ; f(t=0.0,1){x=0 ;

y=0 ; label=1 ;} ; y=t ; label=2 ;} ; y=0.5 ;label=3 ;} ; y=t ; label=4 ;} ; y=1 ; label=5 ;} ; y=1-t ;label=6 ;} ;

mesh Th = buildmesh (a(6) + b(4) + c(4) +d(4) + e(4) + f(6)) ; fespace Vh(Th,P1) ; Vh u,v ; real error=0.01 ; problem Probem1(u,v,solver=CG,eps=1.0e-6) = int2d(Th)( dx(u)*dx(v) + dy(u)*dy(v)) int2d(Th)( v) + on(1,2,3,4,5,6,u=0) ; int i ; for (i=0 ;i< 7 ;i++) { Probem1 ; // solving the pde problem Th=adaptmesh(Th,u,err=error) ; // the adaptation with Hessian of u plot(Th,wait=1) ; u=u ; error = error/ (1000^(1./7.)) ; };

Ateliers de Simulation Numrique, Stif, 2008 e e

29

Un probl`me de fronti`re libre e e

Soit un domaine : real L=10 ; real h=2.1 ; real h1=0.35 ; border border border border // Width Left height Right height

// //

a(t=0,L){x=t ;y=0 ;label=1 ;} ; // bottom impermeable a b(t=0,h1){x=L ;y=t ;label=2 ;} ; // right, the source b f(t=L,0){x=t ;y=t*(h1-h)/L+h ;label=3 ;} ; // the free surface f d(t=h,0){x=0 ;y=t ;label=4 ;} ; // Left impermeable d

int n=10 ; mesh Th=buildmesh (a(L*n)+b(h1*n)+f(sqrt(L^2+(h-h1)^2)*n)+d(h*n)) ; plot(Th,ps="dTh.eps") ;

Ateliers de Simulation Numrique, Stif, 2008 e e

30

Maillage initial

Le probl`me est de trouver p et t.q. : e


p = 0 p =y p

dans sur b

=0 sur d a n p q = K nx sur f (N eumann) n p =y sur f (Dirichlet)

o`, q = 0.02, K = 0.5 et la vitesse u = p. u

Ateliers de Simulation Numrique, Stif, 2008 e e

31

algorithme
Nous allons utiliser la mthode de point xe : soit, k = 0, k = . e On rsout le probl`me : Trouver p dans V = H 1(k ), t.q. p = y sur k k e e b f
k

p p = 0,

p V avec p = 0 sur k k b f

Avec la condition de type Newmann, on transforme le domaine par F (x, y) = [x, y v(x)] o` v est solution de : v V , t.q. v = 0 sur k u a
k

q p v v = k( nx)v , K f n

v V avec v = 0 sur k a

Le nouveau domaine est : k+1 = F (k )

Ateliers de Simulation Numrique, Stif, 2008 e e

32

problem Pp(p,pp,solver=CG) = int2d(Th)( dx(p)*dx(pp)+dy(p)*dy(pp)) + on(b,f,p=y) ; problem Pv(v,vv,solver=CG) = int2d(Th)( dx(v)*dx(vv)+dy(v)*dy(vv)) + on (a, v=0) + int1d(Th,f)(vv*((Q/K)*N.y- (dx(p)*N.x+dy(p)*N.y))) ; while(errv>1e-6) { j++ ; Pp ; Pv ; errv=int1d(Th,f)(v*v) ; coef = 1 ; // Here french cooking if overlapping see the example Th=movemesh(Th,[x,y-coef*v]) ; // deformation }

Execute freeboundary.edp

Ateliers de Simulation Numrique, Stif, 2008 e e

33

avec du/du = residu

Un probl`me de dcomposition de domaine e e

Rsoudre e u = f, in = 1 2 par lalgorithme de Schwarz : um+1 = f in 1 1 um+1 = f in 2 2 um+1|1 = um 2 1 um+1|2 = um 1 2 u| = 0

o` i est la fronti`re de i avec les conditions 1 2 = et que ui = 0 u e pour litration 1. e Ici, 1 est un quadrangle et 2 est un disque.

Ateliers de Simulation Numrique, Stif, 2008 e e

34

Schwarz-overlap.edp / Maillage

int inside = 2 ; // inside boundary int outside = 1 ; // outside boundary border a(t=1,2){x=t ;y=0 ;label=outside ;} ; border b(t=0,1){x=2 ;y=t ;label=outside ;} ; border c(t=2,0){x=t ;y=1 ;label=outside ;} ; border d(t=1,0){x = 1-t ; y = t ;label=inside ;} ; border e(t=0, pi/2){ x= cos(t) ; y = sin(t) ;label=inside ;} ; border e1(t=pi/2, 2*pi){ x= cos(t) ; y = sin(t) ;label=outside ;} ; int n=4 ; mesh th = buildmesh( a(5*n) + b(5*n) + c(10*n) + d(5*n)) ; mesh TH = buildmesh( e(5*n) + e1(25*n) ) ; plot(th,TH,wait=1) ; // to see the 2 meshes

Ateliers de Simulation Numrique, Stif, 2008 e e

35

Schwarz-overlap.edp
fespace vh(th,P1) ; fespace VH(TH,P1) ; vh u=0,v ; VH U,V ; int i=0 ; problem PB(U,V,init=i,solver=Cholesky) = int2d(TH)( dx(U)*dx(V)+dy(U)*dy(V) ) + int2d(TH)( -V) + on(inside,U = u) + on(outside,U= 0 ) ; problem pb(u,v,init=i,solver=Cholesky) = int2d(th)( dx(u)*dx(v)+dy(u)*dy(v) ) + int2d(th)( -v) + on(inside ,u = U) + on(outside,u = 0 ) ; for ( i=0 ;i< 10 ; i++) { PB ; pb ; plot(U,u,wait=true) ; };

Ateliers de Simulation Numrique, Stif, 2008 e e

36

Schwarz-overlap.edp

Isovaleurs de la solution ` litration 0 et ` literation 9 a e a

Ateliers de Simulation Numrique, Stif, 2008 e e

37

Equations de Stokes
Le probl`me de Stokes consiste ` trouver une vitesse u = (u1, .., ud) et une e a prssion p dans un domaine de Rd, vriant : e e u + p =0 u =0 u = u dans dans sur

o`, u est la vitesse sur le bord . u Une formulation variationnelle de ce probl`me est : Trouver u H 1()d avec e u| = u, et p L2()/R t.q.
1 v H0 ()d, q L2()/R,

u:

v p .v q .u = 0

1 Numriquement, nous cherchons (u, p) H0 ()d L2() t.q. e (avec = 1010) 1 v H0 ()d, q L2(),

u:

v p .v q .u + pq = 0

Ateliers de Simulation Numrique, Stif, 2008 e e

38

Stokes en FreeFem++

mesh Th=square(15,15) ; fespace Uh(Th,P2) ; Uh u1,u2,v1,v2 ; fespace Ph(Th,P1) ; Ph p,q ; solve stokes([u1,u2,p],[v1,v2,q]) = int2d(Th)((dx(u1)*dx(v1)+dy(u1)*dy(v1) + dx(u2)*dx(v2)+dy(u2)*dy(v2)) - p*q*(0.000001) - p*(dx(v1)+dy(v2)) - q*(dx(u1)+dy(u2))) + on(1,2,4,u1=0,u2=0) + on(3,u1=1,u2=0) ; plot([u1,u2],p,ps="stokes_exple.eps") ;

Ateliers de Simulation Numrique, Stif, 2008 e e

39

Merci pour votre attention ?

Ateliers de Simulation Numrique, Stif, 2008 e e

40