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