Universidad de Murcia - UMwebs.um.es/eliseo/um/uploads/Main/FreeFem_MNVEDP_2013_2014.… · 2....

67
Universidad de Murcia etodos Num´ ericos y Variacionales de las Ecuaciones en Derivadas Parciales Notas sobre FreeFem++ Curso 2013-2014 Eliseo Chac´on Vera Departamento de Matem´aticas, Facultad de Matem´aticas, Universidad de Murcia, [email protected] 16 de septiembre de 2013

Transcript of Universidad de Murcia - UMwebs.um.es/eliseo/um/uploads/Main/FreeFem_MNVEDP_2013_2014.… · 2....

Universidad de MurciaMetodos Numericos y Variacionales

delas Ecuaciones en Derivadas Parciales

Notas sobre FreeFem++

Curso 2013-2014

Eliseo Chacon VeraDepartamento de Matematicas,

Facultad de Matematicas, Universidad de Murcia,[email protected]

16 de septiembre de 2013

INDICE INDICE

Indice

1. Introduccion a FreeFem++ 2

2. Ejemplos basicos: similar a C/C++ 8

3. Triangulaciones 2D 11

4. Formulacion variacional 17

5. Graficas 22

6. Problemas de evolucion en tiempo 37

7. FreeFem++ 3D: Triangulaciones 3d 41

8. Ecuaciones de Navier-Stokes 2D y 3D 56

1 Notas sobre FreeFem++, Curso 2013-2014

1 INTRODUCCION A FREEFEM++

1. Introduccion a FreeFem++

Este lenguaje esta desarrollado en C++ por lo que los aspectos basicosde la gramatica se refieren a C++.

Los archivos de ordenes se guardan con la terminacion .edp, el nombreno es importante pero sı lo es la terminacion. Se debe de usar un editor detexto plano como notepad u otros y que no contenga macros; por ejemploMicrosoft Word no sirve.

Normalmente, en un entorno Linux y en una terminal de texto, se ejecutanmediante la orden

FreeFem++ nombre.edp

aunque esto depende del entorno de trabajo y varıa en un entorno Windowsdonde se puede lanzar el trabajo con el raton de forma usual.

Sus caracterısticas se resumen en

Escrito en C/C++

EDPs en forma variacional

Elementos finitos 2d/3d

triangulaciones 2d/3d

Resolutores lineales matrices llenas y huecas

Enlaza resolutores lineales paralelos para matrices huecas sparse, MUMPS,pARMS, HIPS, etc...

Enlaza con ordenes basicas MPI

Software libre

Puede tratar problemas complejos

Bueno para investigacion y docencia

2 Notas sobre FreeFem++, Curso 2013-2014

1 INTRODUCCION A FREEFEM++

3 Notas sobre FreeFem++, Curso 2013-2014

1 INTRODUCCION A FREEFEM++

4 Notas sobre FreeFem++, Curso 2013-2014

1 INTRODUCCION A FREEFEM++

http://www.freefem.org/ff++/index.htm

5 Notas sobre FreeFem++, Curso 2013-2014

1 INTRODUCCION A FREEFEM++

http://www.um.es/freefem/ff++/pmwiki.php

6 Notas sobre FreeFem++, Curso 2013-2014

1 INTRODUCCION A FREEFEM++

Un poco de historia:

1985: MacFEM-PCFEM

1995: freefem+ ( Hecht y otros)

2000: freefem++ ( Hecht )

2000: freefem3D ( Del Pino and others)

2009: freefem++3D ( F. Hecht)

http://www.freefem.org/ff++/index.htm

Ideas principales:

Sigue matematica −→ formulacion variacional

uso de Elementos Finitos

Algoritmos responsabilidad del usuario

Bloques: Problemas elıpticos

Generadores de triangulaciones con adaptacion de malla

¡Si es MEF se puede hacer con Freefem++!

7 Notas sobre FreeFem++, Curso 2013-2014

2 EJEMPLOS BASICOS: SIMILAR A C/C++

2. Ejemplos basicos: similar a C/C++

archivo arithmetic.edp:

real x=3.14,y;

int i,j;

cout<< " x = "<< x << "\n";

x=1;y=2;x=y;i=0;j=1;

cout<< 1+3 << " " << 1./3 <<endl;

cout<< 10^10. << "\n";

cout<< 10^-10. << endl;

cout<< -10^-2.+5 << " = 4.99 \n";

cout<< 10^-2.+5 << " =5.01"<<endl;

cout<< " 8^(1/3) = "<< (8)^(1./3.) <<"\n";

cout<<"\n\n";

cout<< "--> Complex numbers: now i= sqrt(-1) "<<endl;

cout<< 10-10i <<"\n";

complex c;

c=(-1+0i)^(1./3.);

cout<< " -1^(1/3) = "<< c <<"\n";

cout<<"\n\n\n";

8 Notas sobre FreeFem++, Curso 2013-2014

2 EJEMPLOS BASICOS: SIMILAR A C/C++

Archivo loops.edp:

// example with for

//

for (int i=0;i<10;i=i+1)

cout <<i <<endl;

//

// example with while

//

int j=0;

real eps=1;

while (eps+1!=eps)

eps=eps/2;

j++;

if(abs(eps)<1e-16) break;

bool see=(eps+1==1);

string c1="Check when eps+1=1. ";

string c2="0-->False 1-->True. ";

string c3=" Result is ";

cout<<c1+c2+c3<<see<<endl;

cout<<"\n\n"<<endl;

if(see) break;

cout <<j <<" eps = "<<eps<<" eps+1= "<<eps+1<<endl;

9 Notas sobre FreeFem++, Curso 2013-2014

2 EJEMPLOS BASICOS: SIMILAR A C/C++

Archivo arrays.edp:

int n=20;

real[int] a(20);

for (int i=0;i<n;i=i+1)

a[i]=cos(n*pi/(i+1));

cout << "a=" << a << endl;

cout << "Sum of a[i]=" << a.sum << endl;

cout << " size of a = " << a.n << endl;

cout << " minimum of a = " << a.min << endl;

cout << " ||a||_1 = "<<a.l1<<endl;

cout << " ||a||_2 = "<<a.l2<<endl;

cout << " ||a||_infty = " <<a.linfty<<endl;

10 Notas sobre FreeFem++, Curso 2013-2014

3 TRIANGULACIONES 2D

Archivo curvas.edp:

real b=1,a=1;

func real phix(real t)

return (a+b)*cos(t)-b*cos(t*(a+b)/b);

func real phiy(real t)

return (a+b)*sin(t)-b*sin(t*(a+b)/b);

border C(t=0,2*pi) x=phix(t); y=phiy(t);

border OX(t=-0.5,5)x=t;y=0;

border OY(t=-0.5,5)x=0;y=t;

border G(t=-2,2)x=t;y=t^2;

string text="Some parametric curves";

plot(cmm=text,OX(1),OY(1),C(30),G(10),

wait=1,ps="curves.eps");

Some parametric curves

3. Triangulaciones 2D

Archivo rectangle.edp:

border a(t=0,2)x=t;y=0;label=1;;

border b(t=0,1)x=2;y=t;label=1;;

11 Notas sobre FreeFem++, Curso 2013-2014

3 TRIANGULACIONES 2D

border c(t=0,2)x=2-t;y=1;label=2;;

border d(t=0,1)x=0;y=1-t;label=1;;

int n=5;

mesh th=buildmesh(a(2*n)+b(n)+c(2*n)+d(n));

plot(th,wait=1,ps="rectangulo.eps");

Orientacion es la clave: Interior a la izquierda de la curva

Palabras clave para geometrıa 2D :

border define trozo de contorno

label asigna una a cada trozo de contorno

mesh tipo de variable

buildmesh genera la triangulacion

12 Notas sobre FreeFem++, Curso 2013-2014

3 TRIANGULACIONES 2D

Archivo hole.edp

real pi=4*atan(1.0);

border a(t=0,2*pi)x=2*cos(t);y=sin(t);

border b(t=0,2*pi)x=.3+.3*cos(t);y=.3*sin(t);

border c(t=0,2*pi)x=-.5+.3*cos(t);y=0.3+.3*sin(t);

mesh nohole=buildmesh(a(50)+b(30)+c(20));

mesh hole=buildmesh(a(50)+b(-30)+c(-20));

plot(nohole,wait=1,ps="nohole.eps");

plot(hole,wait=1,ps="hole.eps");

La orientacion de la curva es la clave

13 Notas sobre FreeFem++, Curso 2013-2014

3 TRIANGULACIONES 2D

Archivo triangle2d.edp

border a(t=0,1)x=t;y=0;label=1;

border b(t=0,1)x=1-t;y=t;label=2;

border c(t=0,1)x=0;y=1-t;label=3;

int nn=2;

mesh th=buildmesh(a(nn)+b(nn)+c(nn));

savemesh(th,"triangle2d.msh");

th=readmesh("triangle2d.msh");

plot(th,wait=1,ps="triangle2d.eps");

14 Notas sobre FreeFem++, Curso 2013-2014

3 TRIANGULACIONES 2D

Archivo triangle2d.mesh

10 9 9

0 0 3

0.323801507627 0 1

0.647603015254 0 1

1 0 2

0 0.323801507627 3

0.30928980099 0.324146353802 0

0.675445396471 0.324554603529 2

0 0.647603015254 3

0.324554603529 0.675445396471 2

0 1 3

10 8 9 0

8 5 6 0

6 9 8 0

1 6 5 0

7 9 6 0

1 2 6 0

6 2 3 0

4 7 3 0

6 3 7 0

10 8 3

8 5 3

5 1 3

4 7 2

7 9 2

9 10 2

1 2 1

2 3 1

3 4 1

nv nt neb nv= # vertices, nt= # triangles, nt= # edges on boundaryx y label...

......

n1 n2 n3 r n1, n2,n3 = numbering of vertices each triangle, r= # region...

......

ne1 ne2 label ne1, ne2 = # numbering of vertices each bundary edge...

......

15 Notas sobre FreeFem++, Curso 2013-2014

3 TRIANGULACIONES 2D

LANZAR tworectangletests.edp

int n = 10,m=1,lower = 1,upper = 2, inner = 3;

real cOX=-0.5,cOY=-1.25;

border OX(t=-.1,1)x = cOX+t; y =cOY;

border OY(t=-.1,1)x = cOX; y =cOY+t;

border C01(t=0,1)x = 0; y = -t;label = lower;

border C02(t=0,1)x = 1.5*t; y=-1;label = lower;

...

border C13(t=0,1)x = 1;y = -0.5+0.5*t; label = inner;

plot(C01(n),OX(m),OY(m),wait=true);

plot(C01(n),C02(n),OX(m),OY(m),wait=true);

...

mesh Th = buildmesh(C01(n)+C02(n)+C03(n)+

C04(n)+C05(n)+C06(n)+ C11(-n)+C12(-n)+C13(-n));

plot(Th, OX(m),OY(m),cmm="Triangulation + Axis ");

Triangulation + Axis

16 Notas sobre FreeFem++, Curso 2013-2014

4 FORMULACION VARIACIONAL

4. Formulacion variacional

problem P(u,v) = a(u,v) - l(f,v)

+ (boundary condition);

Tres formas problem, solve y varf

problem test()...; define problema variacional. Plantea y resuelve conla orden test;

solve test()...; define y resuelve.

varf construye matriz y termino independiente.

Integracion numerica: th triangulacion de Ω, Γ1 ⊂ ∂Ω

int1d(th)(v) =∫∂Ω

v(x) dx, int1d(th, 1)(v) =∫Γ1v(x) dx

int2d(th)(v) =∫Ωv(x) dx

Similar con int2d(th)(v) e int3d(th)(v)

intalledges(th)(v) =∑

τ∈th∫∂τ

v

Resolutores lineales: Basicamente tres.definidos via solver=...

CG Conjugate Gradient

UMFPACK

GMRES

Conectado con sparsesolvers en paralelo o directos viampi: hips, mumps,SuperLU, etc...

17 Notas sobre FreeFem++, Curso 2013-2014

4 FORMULACION VARIACIONAL

LANZAR Poisson-ellipse.edp

border a(t=0,2*pi)x=2*cos(t);y=sin(t);;

mesh Th= buildmesh (a(150));

plot(Th);

fespace Vh(Th,P2);

Vh u, v;

func f=sin(x*y);

problem laplace(u,v) =

int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v)) //bilinear part

-int2d(Th)(f*v) // right hand side

+on(a,u=0); // Dirichlet BC

laplace; //solve the pde

plot(u); //visualizacion

18 Notas sobre FreeFem++, Curso 2013-2014

4 FORMULACION VARIACIONAL

int2d(th)(...) y similares, se usan

con producto de incognitas y funciones tests

solo con funciones test y datos

NO CON AMBAS A LA VEZ

No correcto

int2d(th)(dx(u)*dx(v)+dy(u)*dy(v)-f*v)

+on(1,u=0)

correcto

int2d(th)(dx(u)*dx(v)+dy(u)*dy(v)) // bilinear part

+int2d(th)(-f*v) // right hand side

+on(1,u=0)

El siguiente codigo PoissonReaccion-adap.edp hace lo mismo pero conun problema mas complicado. Se resuelve en un rectangulo y mediante ele-mentos finitos P2 el problem variacional

(∇u,∇v) + (g u, v) = (f, v)

con dato de contorno u = 0.Cuando se usa un metodo iterativo y el parametro eps es negativo el criteriode parada en la iteracion para resolver un sistema lineal es el error absoluto

∥Ax− b∥ ≤ |eps|,

cuando es positivo el criterio es el error relativo

∥Ax− b∥∥Ax0 − b∥

≤ |eps|.

Observacion 1 Recordar que aunque el metodo del Gradiente Conjugado esun metodo directo en teorıa, desde el punto de vista practico se usa como sifuese un metodo iterativo.

Archivo PoissonReaccion-adap.edp

19 Notas sobre FreeFem++, Curso 2013-2014

4 FORMULACION VARIACIONAL

real a=1,b=1;int n=4,m=4;mesh Th=square(n,m,[a*x,b*y]);// Malla uniforme en [0,a]x[0,b]plot(Th,wait=1,ps=”PRmalla0.eps”);fespace Vh(Th,P2);Vh u,v;u=0;v=0;zero=0;func f=1;func g=10*x*y;int i=0;real error=0.1, coef=0.1∧ (1./5.);problem Problem1(u,v,solver=CG,init=i,eps=-1.0e-6)=int2d(Th)( dx(u)*dx(v)+dy(u)*dy(v)+g*u*v)-int2d(Th)( v*f)+on(1,u=0)+on(2,u=1)+on(3,4,u=0);real cpu=clock();Problem1;plot(u,wait=1,ps=”PRuinicial.eps”);for (i=0;i<5;i++)real d=clock();Problem1;cout << ”CPU = ”<< clock() -d << endl;plot(u,wait=1);Th= adaptmesh(Th,u,inquire=1,err=error);error=error*coef;;plot(u,wait=1,ps=”PRufinal.eps”);plot(Th,wait=1,ps=”PRmallafin.eps”);

20 Notas sobre FreeFem++, Curso 2013-2014

4 FORMULACION VARIACIONAL

Malla inicial generada con PoissonReaccion-adap.edp

Solucion inicial obtenida con PoissonReaccion-adap.edp

Malla final generada con PoissonReaccion-adap.edp

21 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Solucion final obtenida con PoissonReaccion-adap.edp

5. Graficas

Existen varias opciones una vez que se tiene una grafica en pantalla. Conla tecla ? se obtiene un menu de informacion con las distintas opciones cuandose tiene la malla

f o click del raton avanza el proceso

V muestra todos los vertices

+,- hace un zoom + ‘o -

= restaura el zoom

g muestra la geometrıa

m muestra la triangulacion

3 da una visualizacion 3D

b muestra los numeros de referencia de los lados de los triangulos

Cuando se tiene el dibujo

ac y AC aumenta o disminuye el coeficiente de las flechas

b y g cambia el color de la grafica

f rellena color entre lıneas de corriente

22 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

v muestra los valores numericos en las lıneas de corriente

m muestra la malla

Copiar, ejecutar y comprender los siguientes archivos para conocerlas estructuras basicas de programacion con FreeFem++.Algunos ejemplos de aritmetica basica son (igual que en C++ pero no hacefalta compilar):

Archivo aritmetica.edp

real x=3.14,y;int i,j;complex c;cout<< ”x = ”<< x << ”\n”;x=1;y=2;x=y;i=0;j=1;cout<< 1+3 << << 1./3 << ”\n”;cout<< 10∧10. << ”\n”;cout<< 10∧(-10.) << ”\n”;cout<< -10∧(-2.)+5 << -=4.99 \n”;cout<< 10∧(-2.)+5 << -=5.01 \n”;cout<< ————complex ———- \n”;cout<< 10-10i <<”\n”;cout<< 1∧(1/3) = ”<< (-1+0i)∧(1./3.) <<”\n”;cout<< ”8∧(1/3) = ”<< (8)∧(1./3.) <<”\n”;

Con for.edp y while.edp se puede ver el uso de ciclos siguiendo lagramatica basica de C. Observad la notacion standard de C, como por ejem-plo, i++ que equivale a i = i+ 1.Archivo for.edp:

int i;for (i=0;i<10;i=i+1)cout <<i <<”\n”;

Archivo while.edp:

int i;i=0;

23 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

real eps=1;while (eps>1e-5)eps=eps/2;if(i++>100) break;cout <<i <<”\n”;cout <<eps <<endl;;

Generacion de triangulaciones 2D La generacion de un mallado de una regiondel plano pasa primero por una descripcion parametrica de su contorno.Esta descripcion debe recorrer la frontera en el sentido contrario a las agujasdel reloj, de tal forma que el interior de la region quede siempre a la izquierdade la frontera.

Para crear una malla de un rectangulo usar:Archivo rectangulo1.edp:

border a(t=0,2)x=t;y=0;label=1;;border b(t=0,1)x=2;y=t;label=1;;border c(t=0,2)x=2-t;y=1;label=2;;border d(t=0,1)x=0;y=1-t;label=1;;int n=10;mesh th=buildmesh(a(2*n)+b(n)+c(2*n)+d(n));plot(th,wait=1,ps=”rectangulo.eps”);

Malla no uniforme generada con rectangulo1.edp

24 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Observar el uso de border para definir un segmento del contorno de la geo-metrıa junto con la orden buildmesh. Otro ejemplo de malla puede ser:Archivo rectangulo2.edp

real x0=1.2,x1=1.8;real y0=0.,y1=1.;int n=5,m=20;mesh Th=square(n,m,[x0+(x1-x0)*x,y0+(y1-y0)*y]);mesh th=square(4,5);plot(Th,th, ps=”dosrectangulos.eps”);

Dos mallas uniformes generadas con rectangulo2.edp

Se puede observar el uso de la opcion ps = . . . para generar un ficheroimagen en formato *.eps. La orden square genera una malla uniforme en elrectangulo determinado por los puntos (x0, y0) y (x1, y1). La numeracionpor defecto de los lados es 1,2,3,4 para los lados de base, derecha,superior, izquierda. La orden buildmesh genera una malla no uniforme.

Se puede alterar la numeracion de los lados mediante la orden label quedota de un numero de referencia para poder asignar datos de contorno. Varioslados pueden tener el mismo numero de referencia si van a tener el mismodato de contorno.

Con el siguiente ejemplo hueco.edp se crea un dominio con un huecosimplemente cambiando el sentido de orientacion de los nodos sobre la fron-tera interna:

Archivo hueco.edp

25 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

real pi=4*atan(1.0);border a(t=0,2*pi)x=2*cos(t);y=sin(t);label=1;;border b(t=0,2*pi)x=.3+.3*cos(t);y=.3*sin(t);label=2;;mesh thwithouthole=buildmesh(a(50)+b(30));mesh thwithhole=buildmesh(a(50)+b(-30));plot(thwithouthole,wait=1,ps=”thsinhueco.eps”);plot(thwithhole,wait=1,ps=”thconhueco.eps”);

Dos mallas complementarias generadas con hueco.edp

Mallas con hueco generada con hueco.edp

26 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

El siguiente ejemplo forma-ele.edp muestra una geometrıa poligonal y seusan las ordenes savemesh y readmesh para guardar y leer una malla:

Archivo forma-ele.edp

border a(t=0,1)x=t;y=0;label=1;;border b(t=0,0.5)x=1;y=t;label=1;;border c(t=0,0.5)x=1-t;y=0.5;label=1;;border d(t=0.5,1)x=0.5;y=t;label=1;;border e(t=0.5,1)x=1-t;y=1;label=1;;border f(t=0,1)x=0;y=1-t;label=1;;int n=10;mesh rh=buildmesh(a(n)+b(n)+c(n)+d(n)+e(n)+f(n));plot(rh,wait=1);savemesh(rh,”malla.msh”)mesh th=readmesh(”malla.msh”)plot(th,wait=1,ps=”ele.eps”);

Malla para L generada con forma-ele.edp

Como se pueden ver las funciones de base

Con la orden trunc se puede truncar una triangulacion. Tiene principal-mente dos parametros

label= pone etiqueta en las fronteras, 1 por defecto

split= n× n division del elemento, 1 por defecto.

mesh Th3 = trunc(Th,1,split=3);

27 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

divide cada triangulo de Th en 3.

Archivo base.edp permite ver las funciones de base ası como su soporte:

mesh Th=square(4,4);

fespace Vh(Th,P1);

Vh u;

int i,n=u.n;

u=0;

for (i=0;i<n;i++) // all degree of freedom

u[][i]=1; // the basic function i

plot(Th,u,wait=1,value=1,nbiso=50,ps="base"+i+".eps");

mesh Sh1=trunc(Th,abs(u)>1.e-10,split=5,label=2);

plot(Th,Sh1,wait=1,ps="trunc"+i+".eps"); // plot the mesh of

//the functions support

u[][i]=0; // reset

10th basis function with base.edp

28 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Support of 10th basis function with base.edp

Resolucion de problemas variacionales 2D El ejemplo Poisson–escalon.edpresuelve el problema de Poisson en un escalon hacia adelante con datos decontorno de tipo Dirichlet:Archivo Poisson–escalon.edp

real v1=4,v2=6,w=v1+v2;border a(t=0,v1)x=t;y=0;label=1;; //lado y=0, x en [0,v1]border b(t=0,1)x=v1;y=-t;label=1;;//lado x=v1, y en [0,-1]border c(t=0,v2)x=v1+t;y=-1;label=1;; //lado y=-1, x en [v1,w]border d(t=0,2)x=w;y=-1+t;label=1;;//lado x=w, y en [-1,1]border e(t=0,w)x=w-t;y=1;label=2;;//lado y=1, x en [0,w]border ff(t=0,1)x=0;y=1-t;label=1;;//lado x=0, y en [1,0]int n=10;mesh th=buildmesh(a(2*n)+b(n)+c(2*n)+d(2*n)+e(4*n)+ff(n));plot(th,wait=1,ps=”malla-escalon.eps”);fespace Vh(th,P1);Vh u,v;func f=0;problem laplace(u,v,solver=LU) =int2d(th)(dx(u)*dx(v)+dy(u)*dy(v)) // bilinear part+int2d(th)(-f*v) // right hand side+on(2,u=1) // Dirichlet boundary condition+on(1,u=0); // Dirichlet boundary conditionlaplace; //solve the pdeplot(u,wait=1,dim=3,value=1,fill=1,ps=”Poisson-escalon.eps”);

El ejemplo Poisson–escalon–Neumann.edp resuelve el problema de Pois-son en un escalon hacia adelante con datos de contorno de tipo Dirichlet en

29 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

todos los lados salvo en uno en el que el dato es de tipo Neumann, derivadanormal cero. Esto implica que no hay que poner dato de contorno sobre estetrozo de frontera:Archivo Poisson–escalon.edp

real v1=4,v2=6,w=v1+v2;border a(t=0,v1)x=t;y=0;label=1;; //lado y=0, x en [0,v1]border b(t=0,1)x=v1;y=-t;label=1;;//lado x=v1, y en [0,-1]border c(t=0,v2)x=v1+t;y=-1;label=1;; //lado y=-1, x en [v1,w]border d(t=0,2)x=w;y=-1+t;label=2;;//lado x=w, y en [-1,1]border e(t=0,w)x=w-t;y=1;label=2;;//lado y=1, x en [0,w]border ff(t=0,1)x=0;y=1-t;label=1;;//lado x=0, y en [1,0]int n=10;mesh th=buildmesh(a(2*n)+b(n)+c(2*n)+d(2*n)+e(4*n)+ff(n));plot(th,wait=1,ps=”malla-escalon.eps”);fespace Vh(th,P1);Vh u,v;func f=0;problem laplace(u,v,solver=LU) =int2d(th)(dx(u)*dx(v)+dy(u)*dy(v)) // bilinear part+int2d(th)(-f*v) // right hand side+on(1,u=0); // Dirichlet boundary conditionlaplace; //solve the pdeplot(u,wait=1,ps=”Poisson-escalon-Neumann.eps”);

30 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Malla para escalon generada con Poisson-escalon.edp

Solucıon obtenida con Poisson-escalon.edp

31 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Solucıon obtenida con Poisson-escalon-Neumann.edp

El siguiente codigo Poisson–elipse.edp resuelve mediante elementos finitosP2 el problem variacional

(∇u,∇v) = (f, v)

con dato de contorno u = 0 en una elipse:Archivo Poisson–elipse.edp

border a(t=0,2*pi)x=2*cos(t);y=sin(t);label=5;;mesh Th= buildmesh (a(150));plot(Th,wait=1,ps=”malla-elipse.eps”);fespace Vh(Th,P2);Vh u, v;func f=1;problem laplace(u,v,solver=LU) =int2d(Th)(dx(u)*dx(v)+dy(u)*dy(v)) // bilinear part-int2d(Th)(f*v) // right hand side+on(5,u=0); // Dirichlet boundary conditionreal d=cpu();laplace; //solve the pdecout<< ” CPU = ”<< clock() - d << endl;plot(u,wait=1,ps=”Poisson-elipse.eps”);

32 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Malla para elipse generada con Poisson-elipse.edp

Solucion obtenida con Poisson-elipse.edp

Observacion 2 Se puede realizar una adaptacion de mallado. Esto se hacenormalmente cuando se quiere reducir el error en una determinada parte dela region de calculo mientras que en otra se sabe que la solucion esta biencalculada.

El codigo Poisson-adap.edp es un ejemplo: Se resuelve en un rectanguloy mediante elementos finitos P1 el problem variacional

(∇u,∇v) = (f, v)

33 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

con dato de contorno u = g.Archivo Poisson–adap.edp

verbosity=2;mesh Th=square(10,10,[10*x,5*y]);// Malla uniforme en [0,10]x[0,5]plot(Th,wait=1,ps=”malla0.eps”);fespace Vh(Th,P1);Vh u,v,zero;u=0;v=0;zero=0;func f=-x*y;func g=x+y;int i=0;real error=0.1, coef=0.1∧(1./5.);real cpu=clock();problem Problem1(u,v,solver=CG,init=i,eps=-1.0e-6)=int2d(Th)( dx(u)*dx(v)+dy(u)*dy(v))-int2d(Th)( v*f)+on(1,2,3,4,u=g);Problem1;plot(u,zero,wait=1,ps=” uinicial.eps”);Th= adaptmesh(Th,u,inquire=1,err=error);real d=clock();cout << ” CPU = ”<< cpu -d << endl;for (i=1;i<10;i++)Problem1;plot(u,zero,wait=1);Th= adaptmesh(Th,u,inquire=1,err=error);cout << ” CPU = ”<< clock() -d << endl;d=clock();error=error*coef; ;cout << ” CPU = ”<< clock() -cpu << endl;plot(u,zero,wait=1,ps=” ufinal.eps”);plot(Th,wait=1,ps=”mallafin.eps”);

34 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Malla y solucion inicial obtenida con Poisson-adap.edp

35 Notas sobre FreeFem++, Curso 2013-2014

5 GRAFICAS

Malla y solucion final obtenida con Poisson-adap.edp

Observad como los comentarios se escriben despues de //

La orden fspace Vh(Th,P1) construye un espacio de elementos finitosP1 de acuerdo a la malla especificada Th y de nombre Vh.

36 Notas sobre FreeFem++, Curso 2013-2014

6 PROBLEMAS DE EVOLUCION EN TIEMPO

Con la orden Vh u,v,. . . se declaran distintos elementos de esteespacio vectorial.

Con la orden func g=. . . se puede declarar una funcion de acuerdoa una expresion analıtica.

La orden problem define un problema tipo y se le asigna un nombre,en este caso Problem1. Se debe observar como el primer argumento ucorresponde a la solucion buscada mientras que el segundo a la funciontest v. Los nombres de las variables no son importantes; sı que lo es elorden.

No se debe poner en la misma expresion de calculo la parte de la formabilineal y la parte del termino de fuerza.

Los sistemas lineales se resuelven mediante CG que equivale a Conju-gate Gradient o mediante LU que equivale a la factorizacion LU.

La malla se renueva mediante la orden adaptmesh

6. Problemas de evolucion en tiempo

Podemos resolver la ecuacion del calor

∂tu− ν∆u = f, (x, t) ∈ Ω× (0, T )

u(x, 0) = u0, x ∈ Ω

u(x, t) = g, (x, t) ∈ ΓD × (0, T )

∂nu(x, t) = 0, (x, t) ∈ ΓN × (0, T )

siendo ∂Ω = ΓN ∪ ΓD y usando elementos finitos en espacio y diferenciasfinitas en tiempo. Para la funcion

w(x, y, t) = sin(x) cos(y)et

el siguiente codigo evolucion.edp calcula w resolviendo

∂tu− ν∆u = f (x, y, t) ∈ Ω× (0, T )

u(x, y, 0) = sin(x) cos(y) (x, y) ∈ Ω

u(x, y, t) = sin(x) cos(y)et (x, y, t) ∈ ∂Ω× (0, T )

37 Notas sobre FreeFem++, Curso 2013-2014

6 PROBLEMAS DE EVOLUCION EN TIEMPO

siendo f = (1 + 2ν) ∗ w y Ω = (0, 1)× (0, 1) con T = 3.

Archivo evolucion.edp:

mesh Th=square(16,16);fespace Vh(Th,P1);Vh u,v,uu,f,g;real dt=0.1, nu=0.1,error;problem dcalor(u,v) =int2d(Th)( u*v+dt*nu*(dx(u)*dx(v) + dy(u)*dy(v)))+int2d(Th)(-uu*v-dt*f*v)+ on(1,2,3,4,u=g);real t=0;uu=sin(x)*cos(y);for (int m=0;m<=3/dt;m++)t=t+dt;f=(1+2*nu)*sin(x)*cos(y)*exp(t);g=sin(x)*cos(y)*exp(t);dcalor;plot(u,wait=true,dim=3,value=1);error=sqrt(int2d(Th)((u-sin(x)*cos(y)*exp(t)));uu=u;cout << ”t= ”<< t << ”L2-Error = ”<< error << endl;;plot(u,wait=1,dim=3,value=1,ps=” dcalor.eps”);

IsoValue0.4669731.400922.334873.268814.202765.136716.070657.00467.938558.872499.8064410.740411.674312.608313.542214.476215.410116.344117.27818.212

Solucion final obtenida con evolucion.edp

Otro ejemplo lo tenemos en la siguiente aplicacion practica: Buscamos ladistribucion de temperatura en una placa 3D de seccion rectangular Ω =

38 Notas sobre FreeFem++, Curso 2013-2014

6 PROBLEMAS DE EVOLUCION EN TIEMPO

(0, 6) × (0, 1). La placa esta inicialmente a una temperatura de u = u0 yrodeada de aire a temperatura ambiente uc. La temperatura cambia pococon la coordenada z y por lo tanto podemos considerar el problema como2D. Se plantea como resolver la ecuacion del calor

∂tu−∇ · (κ∇u) = 0, (x, t) ∈ Ω× (0, T )

u(x, y, 0) = u0, x ∈ Ω

κ∂nu+ α(u− uc) = 0, (x, t) ∈ Γ× (0, T )

y en donde el coeficiente de difusion κ toma dos valores, κ = 0.2 sobre y = 0.5y κ = 2 bajo y = 0.5.

Archivo termico.edp:

func u0 =10+15*x;func k = 1.8*(y< 0.5)+0.2;real ue = 25, alpha=0.25, T=5, dt=0.1 ;mesh Th=square(30,5,[6*x,y]);plot(Th,wait=1);fespace Vh(Th,P1);Vh u=u0,v,uold; // for the flat plateproblem termico(u,v)= int2d(Th)(u*v/dt + k*(dx(u) * dx(v) +dy(u)*dy(v)))+ int1d(Th,1,3)(alpha*u*v)- int1d(Th,1,3)(alpha*ue*v)- int2d(Th)(uold*v/dt) + on(2,4,u=u0);for(real t=0;t<T;t+=dt)uold=u;termico;plot(u,dim=3,wait=0,fill=1,value=1);;plot(u,wait=1,dim=3,fill=1,value=1,ps=” termico.eps”);

39 Notas sobre FreeFem++, Curso 2013-2014

6 PROBLEMAS DE EVOLUCION EN TIEMPO

IsoValue5.2631612.368417.105321.842126.578931.315836.052640.789545.526350.26325559.736864.473769.210573.947478.684283.421188.157992.8947104.737

Solucion final obtenida con termico.edp

40 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

7. FreeFem++ 3D: Triangulaciones 3d

La construccion clave es la de capa y el visualizador mas conveniente esmeditEjemplo triangulo3D.edp:

load "msh3";

load "medit";

border a(t=0,1)x=t;y=0;;

border b(t=0,1)x=1-t;y=t;;

border c(t=0,1)x=0;y=1-t;;

int nn=1;

mesh Th2=buildmesh(a(nn)+b(nn)+c(nn));

int nlayers=1;

real zmin=0,zmax=2;

mesh3 Th=buildlayers(Th2,nlayers,zbound=[zmin,zmax]);

medit(" Triangle1capa ", Th);

savemesh(Th,"Th3d.mesh");

Tres tetraedros basicos con una capa sobre un triangulo con triangulo3D.edp

El archivo Th3d.mesh tiene toda la informacion relativa a la particion

MeshVersionFormatted 1

Dimension 3

Vertices

6

41 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

0 1 0 3

0 1 1 3

0 0 0 3

0 0 1 3

1 0 0 2

1 0 1 2

Tetrahedra

3

1 6 3 5 0

1 4 3 6 0

1 6 2 4 0

Triangles

8

2 4 6 0

5 3 1 1

1 3 4 2

4 2 1 2

5 1 6 3

2 6 1 3

3 5 6 4

6 4 3 4

End

42 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Se ven aquı los 3 tetraedros triangulo3D.edp

Se ven aquı el numero de las caras triangulo3D.edp

43 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Dos capas triangulo3D.edp

44 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Lo mismo con un cubo:Archivo cubo.edp:

load "msh3"

load "medit"

int nn=1;

mesh Th2=square(nn,nn);

int nlayers=1;

real zmin=0,zmax=2;

mesh3 Th=buildlayers(Th2,ncapas,zbound=[zmin,zmax]);

medit(" Sol ", Th);

Triangulacion basica de un cubo con cubo.edp

8 vertices, 12 triangles, 6 tetrahedra

45 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Triangulacion basica de un cubo con cubo.edp y dos capas

Triangulacion basica de un cubo con cubo.edp y siete capas.

Las cotas mınimas y maximas en la generacion de capas zmin y zmax puedenser funcionesArchivo buildlayermesh.edp:

46 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

load "msh3"

load "medit"

border C0(t=0,2*pi) x=7*cos(t); y=10*sin(t);;

border C1(t=0,2*pi) x=3+2*cos(t); y=0.5*sin(t);;

mesh Th=buildmesh(C0(100)+C1(-20));

func zmin=-1+sin(x*y)/3;

func zmax=2;

int MaxLayer=10;

mesh3 Th3=buildlayers(Th, MaxLayer,zbound=[zmin,zmax]);

savemesh(Th3,"region1hole.mesh");

medit("regionwithhole",Th3);

Triangulacion 3D generada con buildlayermesh.edp

Archivo tank3D.edp

load "msh3"

load "medit"

real L=15;

real H=6;

border aa(t=0,L)x=t; y=0 ;label=1;

border bb(t=0,H)x=L; y= t ;label=2;

border cc(t=0,L)x=L-t; y=H ;label=3;

border dd(t=0,H)x= 0 ; y = H-t;label=4;

border C1(t=0,2*pi) x=3+0.5*cos(t); y=3+0.5*sin(t);label=5;

47 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

int n=6;

mesh Th2d=buildmesh(aa(9*n)+bb(4*n)+cc(9*n)+dd(4*n)+C1(-4*n));

plot(Th2d,wait=1,ps="superficie.eps");

func zmin=-1.5*(x<3)+(+1.5-x)*(x>3)*(x<7)-5.5*(x>7);

func zmax=1;

int[int] rup=[0,200], rdown=[0,100],rmid(10);

rmid=[1,11,2,22,3,33,4,44,5,55];

int MaxLayer=10;

mesh3 Th3=buildlayers(Th2d, MaxLayer,zbound=[zmin,zmax],

reffacemid=rmid,

reffaceup = rup,

reffacelow = rdown);

savemesh(Th3,"region1hole.mesh");

medit("regionconbujero",Th3);

48 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Triangulacion con tank3D.edp

Se usan variables enteras para modificar las etiquetas del contorno de la geo-metria 3D. La superficie 2D a partir de la que se generan las capas se etiquetacomo 0 y en el contorno de la geometrıa 3D la tapa superior se identifica con200 usando rup = [0, 200], luego la parte inferior se identifica con 100 usandordown = [0, 100] y finalmente, cada etiqueta de cada borde de la superficie2D se puede modificar de acuerdo a rmid = [1, 11, 2, 22, 3, 33, 4, 44, 5, 55].Aquı, por ejemplo, se usa el 11 para la cara que se asienta sobre el borde 1,el 22 para la que se asienta sobre el 2, etc...Las ordenes correspondientes son

int[int] rup=[0,200], rdown=[0,100],rmid(10);

rmid=[1,11,2,22,3,33,4,44,5,55];

zmin y zmax pueden ser funcionesLANZAR container.edp

load "msh3"

load "medit"

real L=6;

border aa(t=0,1)x=t; y=0 ;;

border bb(t=0,14)x=1+t; y= - 0.1*t ;;

border cc(t=-1.4,L)x=15; y=t ;;

border dd(t=15,0)x= t ; y = L;;

border ee(t=L,0.5) x=0; y=t ;;

border ff(t=0.5,0) x=0; y=t ;;

border C1(t=0,2*pi) x=3+0.5*cos(t); y=3+0.5*sin(t);;

int n=6, MaxLayer=10;

mesh Th2d=buildmesh(aa(n)+bb(9*n)+cc(4*n)+dd(10*n)

49 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

+ee(6*n) + ff(n)+C1(-6*n));

func zmin=-1.5*(x<3)+(+1.5-x)*(x>3)*(x<7)-5.5*(x>7);

func zmax=1;

mesh3 Th3=buildlayers(Th, MaxLayer,zbound=[zmin,zmax]);

medit("container",Th3);

50 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Profundidad variable y orilla:LANZAR shore.edp

load "msh3"

load "medit"

real eps=0.01;// shore thickness

int nn=10;

border cc(t=0,2*pi)x=cos(t);y=sin(t);;

mesh Th2= buildmesh(cc(100));

func zmin= 2-sqrt(4-(x*x+y*y));// bottom

func zmax= eps+ 2-sqrt(3.);//surface

mesh3 Th=buildlayers(Th2,nn,

coef= max((zmax-zmin)/zmax,1./(nn*2)),

zbound=[zmin,zmax]);

medit("myshore",Th);

51 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Vistas diferentes con grosores distintos shore.edp

52 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

Triangulacion por capas 3D desde una triangulacion 2D:

Ω3D = Ω2D × [zmin, zmax]

funciones zmin < zmax : Ω2D 7→ R.

Por defecto la superficie del fondo se etiqueta con 0 y las laterales seheredan de las etiquetas 2d.

Se pueden cambiar las etiquetas de las superficies

labelup=[0,2] asigna 2 superficie superior.

labeldown=[0,1] asigna 1 superficie inferior.

labelmid=[1,1,2,1,3,1,4,1,5,1] asigna 1 a todas las caras sobrelados 1, 2, 3,4,5.

LANZAR Laplaciano3d.edp:

load "msh3"

load "medit"

int nn=8;

53 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

mesh Th2=square(nn,nn);// 2D mesh

real zmin=0,zmax=2;

int[int] rup=[0,200],rdown=[0,100];

int[int] rmid=[1,1,2,1,3,1,4,1];

mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax],

labelup=rup, labeldown=rdown, labelmid=rmid);

func f=1. ;

fespace Vh(Th,P13d);

Vh u,v;

macro Grad3(u) [dx(u),dy(u),dz(u)] // EOM

problem Lap3d(u,v,solver=CG) =

int3d(Th)(Grad3(v)’ *Grad3(u))

- int3d(Th)(f*v)+ on(1,u=0);

Lap3d;

medit(" Laplacian3D ", Th, u );

54 Notas sobre FreeFem++, Curso 2013-2014

7 FREEFEM++ 3D: TRIANGULACIONES 3D

−∆u = 1 con u = 0 en laterales.

55 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

LANZAR shoreLaplace3d.edp:

load "msh3"

load "medit"

real eps=.015;// shore thickness

int nn=20;

border cc(t=0,2*pi)x=cos(t);y=sin(t);label=1;;

mesh Th2= buildmesh(cc(100));

func zmin= 2-sqrt(4-(x*x+y*y));// bottom

func zmax= eps+ 2-sqrt(3.);//surface

int[int] rup=[0,200],rdown=[0,100];

int[int] rmid=[1,1];

mesh3 Th=buildlayers(Th2,nn,

coef= max((zmax-zmin)/zmax,1./(nn*2)),

zbound=[zmin,zmax],

labelup=rup,

labeldown=rdown,

labelmid=rmid);

func f=1. ;

fespace Vh(Th,P13d);

Vh u,v;

//

macro Grad3(u) [dx(u),dy(u),dz(u)] // EOM

//

problem Lap3d(u,v,solver=CG) =

int3d(Th)(Grad3(u)’ *Grad3(v))

- int3d(Th)(f*v)

+ on(1,100, u=0);

Lap3d;

medit("myshore",Th,u);

8. Ecuaciones de Navier-Stokes 2D y 3D

Stokes test cavidad en [0, 1]× [0, 1] con el par P2-P1.u ∈ H1(Ω)2 y p ∈ L2(Ω) tal que

−∆u+∇p = f en Ωdiv(u) = 0 en Ω+C.C.

56 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

o bien,(∇u,∇v)Ω − (p, div(u))Ω = (f, v) en Ω

−(q, div(u))Ω = 0 en Ω+C.C.

LANZAR Stokes2dCavity.edp:

mesh Th=square(10,10);

fespace Xh(Th,P2);

fespace Mh(Th,P1);

Xh u1,v1,u2,v2;

Mh 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*dx(v1)-p*dy(v2)

-q*dx(u1)-q*dy(u2)

)

+on(1,2,4,u1=0,u2=0)

+on(3,u1=1,u2=0); // C.C. en borde superior

plot(cmm=" Velocidad [u1,u2] ",[u1,u2]);

plot(cmm=" Presion ",p);

plot(cmm=" Velocidad y Presion ",[u1,u2],p);

57 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Vec Value00.05263430.1052690.1579030.2105370.2631720.3158060.368440.4210750.4737090.5263430.5789780.6316120.6842470.7368810.7895150.842150.8947840.9474181.00005

Velocidad [u1,u2]

Velocidad Stokes2dCavity.edp

IsoValue-49.7096-44.6966-39.6837-34.6708-29.6578-24.6449-19.632-14.619-9.6061-4.593170.4197625.4326910.445615.458620.471525.484430.497435.510340.523245.5362

Presion

Presion Stokes2dCavity.edp

IsoValue-49.71-44.697-39.6841-34.6711-29.6581-24.6452-19.6322-14.6192-9.60627-4.59330.419675.4326410.445615.458620.471525.484530.497535.510440.523445.5364

Vec Value00.05263430.1052690.1579030.2105370.2631720.3158060.368440.4210750.4737090.5263430.5789780.6316120.6842470.7368810.7895150.842150.8947840.9474181.00005

Velocidad y presion Stokes2dCavity.edp

58 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Navier-Stokes evolutivo:

u(t) ∈ H1(Ω)2 y p(t) ∈ L2(Ω) tal que

∂tu+ (u · ∇)u−∆u+∇p = f en Ωdiv(u) = 0 en Ω+C.C.

o bien,

( DDtu, v) + (∇u,∇v)Ω − (p, div(u))Ω = (f, v) en Ω

−(q, div(u))Ω = 0 en Ω+C.C.

Nonlinealidad tratada con convect que resuelve:

∂tϕ+ u∇ϕ = 0,

ϕ(0, x) = ϕ0(x).

59 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Lanzar NS2d.edp. Archivo NS2d.edp:

mesh Th=square(32,32);

fespace Xh(Th,P2);

fespace Mh(Th,P1);

Xh u2,v2, u1,v1,up1=0,up2=0;

Mh p,q;

real Re=5000,nu=1/Re;

real dt=0.1;

problem NS(u1,u2,p,v1,v2,q,solver=UMFPACK) =

int2d(Th)( (1/dt)*(u1*v1+u2*v2)

+nu*(dx(u1)*dx(v1)+dy(u1)*dy(v1)

+dx(u2)*dx(v2)+dy(u2)*dy(v2) )

-p*dx(v1)- p*dy(v2)

+dx(u1)*q+ dy(u2)*q)

+int2d(Th)(

-(1/dt)*convect([up1,up2],-dt,up1)*v1

-(1/dt)*convect([up1,up2],-dt,up2)*v2

)

+on(1,2,4,u1=0,u2=0)+on(3,u1=1,u2=0);

for (i=0;i<=400;i++)

NS;

up1=u1;

up2=u2;

plot(coef=.5,cmm=" Velocidad ",[u1,u2]);

;

plot(cmm=" Pressure ",p);

60 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Velocidad [u1,u2]

Velocity Cavity.edp

Presion

Pressure with Cavity.edp

61 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Lanzar obstaculo.edp y acoplamiento Navier-Stokes - TemperaturaNS2dT.edpCavidad 3D:

Archivo Stokes3dcavity.edp:

load "msh3";

load "medit";

int nn=15;

mesh Th2=square(nn,nn);// 2D mesh

fespace Vh2(Th2,P2);// cross-section space

Vh2 ux,uz,p2;

real zmin=0,zmax=1,yy;

int[int] rup=[0,200],rdown=[0,100];

int[int] rmid=[1,1,2,1,3,1,4,1];

mesh3 Th=buildlayers(Th2,nn, zbound=[zmin,zmax],

labelup=rup, labeldown=rdown, labelmid=rmid);// 3D mesh

fespace VVh(Th,[P23d,P23d,P23d,P13d]);

VVh [u1,u2,u3,p];

VVh [v1,v2,v3,q];

macro Grad(u) [dx(u),dy(u),dz(u)]// EOM

macro div(u1,u2,u3) (dx(u1)+dy(u2)+dz(u3)) //EOM

varf vStokes([u1,u2,u3,p],[v1,v2,v3,q]) =

int3d(Th)(Grad(u1)’*Grad(v1) +Grad(u2)’*Grad(v2)

+Grad(u3)’*Grad(v3)

- div(u1,u2,u3)*q - div(v1,v2,v3)*p

)

+on(1,100,u1=0,u2=0,u3=0)+ on(200,u1=1.,u2=0,u3=0) ;

matrix A=vStokes(VVh,VVh);

set(A,solver=GMRES);

real[int] b= vStokes(0,VVh);

p[]= A^-1 * b;

for(int i=1;i<10;i++)

yy=i/10.;

ux= u1(x,yy,y);

uz= u3(x,yy,y);

p2= p(x,yy,y);

plot([ux,uz],p2,cmm=" cut y = "+yy,wait= 1);

if (i==5)

62 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

plot([ux,uz],p2,cmm=" cut y = "+yy,wait= 1);;

;

medit("cavity3d",Th,p);

medit("cavity3d",Th,u3);

medit("cavity3d",Th,u2);

medit("cavity3d",Th,u1);

cut y = 0.5

63 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

64 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Cavity Stokes.

65 Notas sobre FreeFem++, Curso 2013-2014

8 ECUACIONES DE NAVIER-STOKES 2D Y 3D

Ecuaciones en el puerto de Cartagena:

66 Notas sobre FreeFem++, Curso 2013-2014