TRÍADAS O TRIANGULACIONES DE TRES NOTAS ACORDES (do , mi sol ) en los músculos
Universidad de Murcia - UMwebs.um.es/eliseo/um/uploads/Main/FreeFem_MNVEDP_2013_2014.… · 2....
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++
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