Uploaded by Daniel Mendoza

Uso de Freefem++

advertisement
FACULTAD DE POSTGRADO
ASIGNACIÓN:
TAREA 2
SUSTENTADO POR:
DANIEL ENRIQUE MENDOZA CORRALES
11513079
MÉTODOS NUMÉRICOS
CATEDRÁTICO: IVÁN HENRÍQUEZ
11 DE MAYO DE 2015
TEGUCIGALPA, M.D.C.
HONDURAS, C.A.
Tema: Uso de Freefem++
Objetivo: familiarizarse con el uso del programa Freefem++ para la resolución de problemas mediante el
método de elementos finitos.
El problema consiste en resolver:
−∇ ∙ (k∇u) = f, en Ω
𝑢 = 0, 𝑒𝑛 𝜕Ω
Siendo f = 𝑥 × 𝑦, Ω = (0,1)x(0,1)
1) Para k=1
2) Para k=2
2
3) Para k=[
0
0
]
−3
Previo a introducir el input del programa, debemos deducir la formulación débil del problema el cuál lo
obtenemos al multiplicar ambos lados de la ecuación en su formulación clásica por una función de prueba
v ∈ Ω.
∫ −∇ ∙ (k∇u)v = ∫ fv
Ω
Ω
Utilizando la igualdad ∇ ∙ ((𝑘∇𝑢)𝑣) = ∇ ∙ (𝑘∇𝑢)𝑣 + (𝑘∇𝑢) ∙ ∇𝑣 y sustituyendo para ∇ ∙ (𝑘∇𝑢)𝑣, en la
ecuación anterior y aplicando el teorema de divergencia obtenemos:
∫ −(k∇u)v ∙ n
⃗ + ∫ (𝑘∇𝑢) ∙ ∇𝑣 = ∫ fv
𝜕Ω
Ω
Ω
De la condición de borde v=0, volviendo =0 el primer término del lado izquierdo de la ecuación obteniendo
nuestra formulación débil
∴ ∫ (𝑘∇𝑢) ∙ ∇𝑣 − ∫ fv = 0
Ω
Ω
Procedimiento
1) Caso donde k=1
Primero debemos definir nuestro borde tal y como está definido Ω = (0,1)x(0,1)
Este debe introducirse en sentido anti horario para que resulte positivo, y lo definimos de la siguiente
manera:
Borde B1(t=0,1) {x=t; y=0;};
Borde B2(t=0,1) {x=1; y=t;};
Borde B3(t=0,1) {x=1-t; y=1;};
Borde B4(t=0,1) {x=0; y=1-t;};
En la Figura 1.1 se aprecia el sentido anti horario que definimos para el borde de Ω.
Una vez, definido nuestro borde, procedemos a declarar la malla Th en función del valor n, que nos
permitirá una rápida modificación del tamaño de la misma:
int n=50;
mesh Th=buildmesh(B1(n)+B2(n)+B3(n)+B4(n))
En la figura 1.2 observamos una malla para el valor de n=50
Figura 1.1
Figura 1.2
Definimos el espacio por elementos finitos Vh para la malla Th y polinomios de grado 1, las ecuaciones u,
v y el escalar Kappa, así como la función fuente f.
fespace Vh(Th,P1); Vh u,v; Vh kappa=1; func f=x*y
Ahora indicamos que resuelva nuestro sistema para una función a(u,v) = a la formulación débil pero
descrita en función de derivadas parciales con respecto a las variables 𝑥, 𝑦, para esto debemos resolver el
producto punto de (𝑘∇𝑢) ∙ ∇𝑣
𝜕𝑢
𝜕𝑣
𝜕𝑢 𝜕𝑣 𝜕𝑢 𝜕𝑣
𝜕𝑥
𝜕𝑥
𝑘 𝜕𝑢 ∙ 𝜕𝑣 = 𝑘 ⌊
+
⌋
𝜕𝑥 𝜕𝑥 𝜕𝑦 𝜕𝑦
(𝜕𝑦) (𝜕𝑦)
Solve a(u,v)= int2d(Th) (kappa*(dx(u)*dx(v) + dy(u)*dy(v)))
- int2d(Th) (f*v)
+ on(B1,u=0)+on(B2,u=0)+on(B3,u=0)+on(B4,u=0);
Para las condiciones de borde u=0 en la frontera.
El resultado obtenido para la función u es el siguiente:
Figura 1.3
Observaciones:
Debido al mallado n=50, obtenemos curvas suaves, de igual forma pudimos utilizar una malla de menor
magnitud con polinomios de segundo grado para suavizarla.
De las iso líneas distinguimos que la condición en los bordes realmente están iguales a cero.
2) Caso donde k=1
Repetimos el procedimiento del caso donde k=1 modificando únicamente el valor de kappa, el resultado
obtenido es el siguiente:
Figura 2.1
Observaciones:
El resultado en la figura 2.1 es exactamente igual al anterior (figura 1.3), ya que nuestra función u es
solución única, y el escalar kappa al ser constante, no altera la solución de la función u.
𝟐
3) Caso donde k=[
𝟎
𝟎
]
−𝟑
Para este caso en particular ya no contamos con un comportamiento isotrópico ya que kappa está
definiendo un comportamiento anisotrópico, es decir, la difusión se comporta de manera diferente para
las diferentes direcciones dentro de Ω.
Para resolver este problema debemos realizar ciertos cambios con respecto a los modelos anteriores y
consiste en la definición de nuestra solución a(u,v), para la cual debemos resolver:
𝑘∇𝑢 ∙ ∇𝑣
𝜕𝑢
𝜕𝑢
𝜕𝑢
𝜕𝑦
𝜕𝑥
𝜕𝑦
𝑎11 + 𝑎12
𝜕𝑥
𝜕𝑦
𝑎11 𝑎12
𝑎11 𝑎12 𝜕𝑥
Donde k=[
], de este modo 𝑘∇𝑢 = [
] (𝜕𝑢) = [
]
𝜕𝑢
𝜕𝑢
𝑎21 𝑎22
𝑎21 𝑎22
𝑎21 + 𝑎22
Luego debemos resolver el producto punto con el gradiente de v
𝜕𝑢
𝜕𝑢
𝜕𝑣
+ 𝑎12
𝜕𝑢
𝜕𝑢 𝜕𝑣
𝜕𝑢
𝜕𝑢 𝜕𝑣
𝜕𝑥
𝜕𝑦
𝜕𝑥
∙ 𝜕𝑣 = (𝑎11
+ 𝑎12 )
+ (𝑎21
+ 𝑎22 )
𝜕𝑢
𝜕𝑢
𝜕𝑥
𝜕𝑦 𝜕𝑥
𝜕𝑥
𝜕𝑦 𝜕𝑦
𝑎21
+ 𝑎22
𝜕𝑦)
(
𝜕𝑥
𝜕𝑦]
[
𝑎11
Ahora podemos definir nuestras variables a11, a12, etc. Así como la función a(u,v) que nos de la solución
para u.
Vh a11=2; Vh a12=0; Vh a21=0; Vh a22=-3; func f=x*y;
solve a(u,v)= int2d(Th) (a11*dx(u)*dx(v) + a12*dy(u)*dx(v) + a21*dx(u)*dy(v) + a22*dy(u)*dy(v))
- int2d(Th) (f*v)
+ on(B1,u=0)+on(B2,u=0)+on(B3,u=0)+on(B4,u=0);
Figura 3.1
En este caso la solución de U es diferente dada su
naturaleza anisotrópica, pero resulta en isolíneas no tan
suaves como en los casos anteriores, por lo cual
probaremos modificar nuestra malla a 2 veces el valor
del n definido anteriormente.
Figura 3.2
Podemos apreciar que los contornos se encuentran
mejor definidos aunque aún presentan ciertas
irregularidades, por lo cual intentaremos una última vez,
modificando el grado de los polinomios de Vh.
Figura 3.3
En la última Figura (3.3) podemos
apreciar ya mucho más definidos
los contornos de la solución u,
para ello hemos comprobado las
observaciones realizadas en el
caso 1, pero se sacrifica tiempo de
cómputo que para nuestros casos
de estudios son irrelevantes, pero
en un modelo de aplicación más
complejo pudiera resultar muy
significativo.
Conclusiones:

El programa Freefem++ resulta amigable y de fácil aplicación para modelos que puedan resolverse
mediante el método de elementos finitos, trabajando con la formulación débil del problema, pero
como pudimos observar se deben realizar ciertos cálculos previos a la formulación del problema
en el input del programa, pueda que sea falta de conocimiento del programa pero el alcance de
este ejercicios no pretende profundizar en la programación del mismo.

Podemos elegir diferentes rutas al momento de suavizar la función de solución, de modo que los
resultados puedan apreciarse de mejor manera tal y como observamos en las interaciones
realizadas en el caso tres, esto dependerá de la aplicación que se le deba dar al modelo.

Comprobamos el efecto que tiene el tensor de difusión Kappa, el cual cuando está definido como
escalar para un caso isotrópico no altera los resultados de la función u que es solución única,
distinto al caso cuando se define un caso anisotrópico, en donde si influye en los resultados del
modelo debido al comportamiento diferente para las diferentes direcciones de la difusión.
Anexos
A continuación se presenta el código del modelo para el caso 1
//EJERCICIO 1 MODELO DE DIFUSIÓN CON U=O EN LA FRONTERA Y KAPPA=1
border B1(t=0,1) {x=t; y=0;};
border B2(t=0,1) {x=1; y=t;};
border B3(t=0,1) {x=1-t; y=1;};
border B4(t=0,1) {x=0; y=1-t;}; // SE DELIMITAN LOS BORDES EN SENTIDO ANTI HORARIO
int n=50;
mesh Th=buildmesh(B1(n)+B2(n)+B3(n)+B4(n)); // SE DEFINE LA MALLA Th
//plot(Th,wait=1,ps="rectángulo.eps"); // COMPROBACIÓN DE LA MALLA
//plot(B1(n)+B2(n)+B3(n)+B4(n),wait=1); // COMPROBACIÓN DE LOS BORDES
fespace Vh(Th,P1); //DEFINIMOS EL ESPACIO POR ELEMENTOS FINITOS Vh PARA LA MALLA Th Y
POLINOMIOS DE GRADO 1
Vh u,v; // DEFINIMOS LAS ECUACIONES U Y V QUE PERTENECEN AL DOMINIO
Vh kappa=1; // DEFINIMOS EL ESCALAR KAPPA
func f=x*y; // DEFINIMOS LA FUNCION FUENTE f
solve a(u,v)= int2d(Th) (kappa*(dx(u)*dx(v) + dy(u)*dy(v)))
- int2d(Th) (f*v)
+ on(B1,u=0)+on(B2,u=0)+on(B3,u=0)+on(B4,u=0); // RESOLVEMOS LA SOLUCIÓN a(u,v) DE LA
FORMULACIÓN DÉBIL
plot(u); // SE IMPRIME LA SOLUCIÓN
A continuación se presenta el código del modelo para el caso 2
//EJERCICIO 1 MODELO DE DIFUSIÓN CON U=O EN LA FRONTERA Y KAPPA=2
border B1(t=0,1) {x=t; y=0;};
border B2(t=0,1) {x=1; y=t;};
border B3(t=0,1) {x=1-t; y=1;};
border B4(t=0,1) {x=0; y=1-t;}; // SE DELIMITAN LOS BORDES EN SENTIDO ANTI HORARIO
int n=50;
mesh Th=buildmesh(B1(n)+B2(n)+B3(n)+B4(n)); // SE DEFINE LA MALLA Th
//plot(Th,wait=1,ps="rectángulo.eps"); // COMPROBACIÓN DE LA MALLA
//plot(B1(n)+B2(n)+B3(n)+B4(n),wait=1); // COMPROBACIÓN DE LOS BORDES
fespace Vh(Th,P1); //DEFINIMOS EL ESPACIO POR ELEMENTOS FINITOS Vh PARA LA MALLA Th Y
POLINOMIOS DE GRADO 1
Vh u,v; // DEFINIMOS LAS ECUACIONES U Y V QUE PERTENECEN AL DOMINIO
Vh kappa=2; // DEFINIMOS EL ESCALAR KAPPA
func f=x*y; // DEFINIMOS LA FUNCIÓN FUENTE f
solve a(u,v)= int2d(Th) (kappa*(dx(u)*dx(v) + dy(u)*dy(v)))
- int2d(Th) (f*v)
+ on(B1,u=0)+on(B2,u=0)+on(B3,u=0)+on(B4,u=0); // RESOLVEMOS LA SOLUCIÓN a(u,v) DE LA
FORMULACIÓN DÉBIL
plot(u); // SE IMPRIME LA SOLUCIÓN
A continuación se presenta el código del modelo para el caso 3
//EJERCICIO 1 MODELO DE DIFUSIÓN ANISOTRÓPICA CON U=O EN LA FRONTERA Y KAPPA=matriz
border B1(t=0,1) {x=t; y=0; label=1;};
border B2(t=0,1) {x=1; y=t; label=2;};
border B3(t=0,1) {x=1-t; y=1; label=3;};
border B4(t=0,1) {x=0; y=1-t; label=4;}; // SE DELIMITAN LOS BORDES EN SENTIDO ANTI HORARIO
int n=100;
mesh Th=buildmesh(B1(n)+B2(n)+B3(n)+B4(n)); // SE DEFINE LA MALLA Th
//plot(Th,wait=1,ps="rectángulo.eps"); // COMPROBACIÓN DE LA MALLA
//plot(B1(n)+B2(n)+B3(n)+B4(n),wait=1); // COMPROBACIÓN DE LOS BORDES
fespace Vh(Th,P2); //DEFINIMOS EL ESPACIO POR ELEMENTOS FINITOS Vh PARA LA MALLA Th Y
POLINOMIOS DE GRADO 1
Vh u,v; // DEFINIMOS LAS ECUACIONES U Y V QUE PERTENECEN AL DOMINIO
Vh a11=2;
Vh a12=0;
Vh a21=0;
Vh a22=-3; // DEFINIMOS LOS ELEMENTOS DE LA MATRIZ KAPPA
func f=x*y; // DEFINIMOS LA FUNCIÓN FUENTE f
solve a(u,v)= int2d(Th) (a11*dx(u)*dx(v) + a12*dy(u)*dx(v) + a21*dx(u)*dy(v) + a22*dy(u)*dy(v))
- int2d(Th) (f*v)
+ on(B1,u=0)+on(B2,u=0)+on(B3,u=0)+on(B4,u=0); // RESOLVEMOS LA SOLUCIÓN a(u,v) DE LA
FORMULACIÓN DÉBIL
plot(u); // SE IMPRIME LA SOLUCIÓN
Download