Análisis Numérico II A (75.38) Trabajo Práctico Nº2 2º Cuatrimestre 2012 Simulación numérica de la distribución de temperaturas en un intercambiador de calor Autores: Apellido y Nombre Padrón E-Mail Windmüller, Catalina M. 90976 caty.windmuller@gmail.com Rotsztejn, Jonathan I. 90576 jonrostein@hotmail.com Contenido Enunciado ..................................................................................................................................... 2 Resolución..................................................................................................................................... 4 1) Formulación débil................................................................................................................. 4 2) Discretización del dominio y la función ............................................................................... 5 Numeración de nodos y elementos ....................................................................................... 5 Función interpolante ............................................................................................................. 5 Funciones de peso ................................................................................................................. 6 Discretización de la formulación débil................................................................................... 6 Elementos triangulares ......................................................................................................... 7 3) Discretización del dominio mediante GMSH ...................................................................... 11 Mallas no estructuradas...................................................................................................... 11 Mallas estructuradas........................................................................................................... 22 4) Distribución de temperaturas ............................................................................................. 26 Mallas no estructuradas...................................................................................................... 27 Mallas estructuradas........................................................................................................... 32 Comparación de errores y conclusiones .............................................................................. 36 Comparación de tiempos de ejecución ................................................................................ 37 5) Sensibilidad del problema al valor de la conductividad térmica de C2 ............................... 38 7) Variante del problema con C2 adiabático ............................................................................ 42 Anexo .......................................................................................................................................... 43 Ensayos previos ....................................................................................................................... 43 Código fuente del programa en MATLAB............................................................................... 44 Página 1 Enunciado Introducción Los problemas de equilibrio en dos o tres dimensiones son evaluados a partir de las ecuaciones diferenciales en derivadas parciales elípticas. El ejemplo más sencillo es el de la ecuación de Laplace mediante la cual se puede simular la distribución de temperaturas en un intercambiador de calor. C1 y C2 son dos conductores térmicos dentro de un recinto C0. El primero de ellos se mantiene a una temperatura constante T1=100ºC y el otro tiene una conductividad térmica k2 que resulta 5 veces mayor que k0. Se asume que la temperatura en la frontera de C0 es T0=20ºC. Con el objetivo de conocer T(x,y) en el recinto , se debe resolver: (k T ) 0 en donde es el interior de C0 menos C1 y es el borde de (los contornos de C0 y C1). Figura 1. Dominio del problema Desarrollo del práctico 1) Plantear la formulación débil del problema. 2) Discretizar el problema utilizando el método de los volúmenes finitos. 3) Plantear la discretización para el dominio presentado utilizando el generador de mallas GMSH. Resolverlo para mallas estructuradas y no estructuradas utilizando elementos triangulares (de tres nodos) y cuadrangulares (de cuatro nodos). Implementar la solución en un código computacional. 4) Obtener y graficar la distribución de temperaturas para los cuatro tipos de resolución. 5) Resolver el problema con el código numérico evaluando la sensibilidad del problema al valor de la conductividad térmica de C2. 6) Para uno de las discretizaciones, remallar para obtener mallas de distintas precisiones y utilizar el código ya desarrollado para obtener nuevas soluciones. Página 2 7) Resolver el mismo problema pero considerando que C2 es adiabático, es decir, imponiendo como condición de borde, en la frontera de C2, que el gradiente normal de temperatura es igual a cero (condición de Neumann homogénea). 8) OPCIONAL: El ejercicio planteado consiste en uno de los ejemplos de FreeFem++, que es una herramienta para resolver ecuaciones diferenciales en derivadas parciales por medio del método de elementos finitos. Resolver el ejemplo para dos juegos adicionales de condiciones de borde. Comentar brevemente en qué consiste el software y que estrategia numérica utiliza para resolver las ecuaciones. Página 3 Resolución 1) Formulación débil Partiendo de la forma diferencial de la ecuación del calor en estado estacionario o ecuación de Laplace ∇ ⋅ (𝑘𝑡 ∇𝑢) = 0 en Ω con condiciones de contorno generales: I. 𝑢 = 𝑢̃ sobre Γ1 𝜕𝑢 𝑘𝑡 𝜕𝑛 = 𝑞̃ sobre Γ2 II. A partir del cálculo variacional, puede obtenerse la formulación ponderada: ∫ ∇ ⋅ (𝑘𝑡 ∇𝑢)𝑤 𝑑Ω + ∫ (𝑢 − 𝑢̃)𝑤 ̃ 𝑑Γ + ∫ (𝑘𝑡 Ω Γ1 Γ2 𝜕𝑢 − 𝑞̃) 𝑤 ̂ 𝑑Γ = 0 𝜕𝑛 Integrando por partes la expresión obtenida y aplicando el teorema de Green, se tiene: − ∫ 𝑘𝑡 ∇𝑢 ⋅ ∇𝑤 𝑑Ω + Ω ∫ 𝑘𝑡 𝑤∇𝑢 ⋅ 𝑛̆ 𝑑Γ + ∫ (𝑢 − 𝑢̃)𝑤 ̃ 𝑑Γ + ∫ (𝑘𝑡 Γ1 ∪Γ2 Γ1 Γ2 𝜕𝑢 − 𝑞̃) 𝑤 ̂ 𝑑Γ = 0 𝜕𝑛 Es posible imponer condiciones sobre las funciones de peso para simplificar la expresión: I. II. III. 𝑤 = 0 sobre Γ1 𝑢 = 𝑢̃ sobre Γ2 𝑤 ̂ = −𝑤 sobre Γ2 Finalmente, se llega a la formulación débil del problema, que puede expresarse en forma general como: − ∫ 𝑘𝑡 ∇𝑢 ⋅ ∇𝑤 𝑑Ω + ∫ 𝑞̃𝑤 𝑑Γ = 0 Ω Γ2 { 𝑢 = 𝑢̃ sobre Γ1 Y, para las condiciones del problema en particular: − ∫ 𝑘𝑡 ∇𝑢 ⋅ ∇𝑤 𝑑Ω = 0 Ω { 𝑇(𝜕𝐶0 ) = 20 𝑇(𝜕𝐶1 ) = 100 Página 4 2) Discretización del dominio y la función El dominio del problema se discretiza para obtener un número finito de incógnitas y que su comportamiento requiera una cantidad finita de grados de libertad para describirlo. Los subdominios generados se denominan elementos y están interconectados entre sí con un número discreto de puntos o nodos situado en sus contornos. El objetivo de la resolución es obtener los valores de la función en dichos nodos, para poder aproximarla en todo el dominio a través de interpolación en los elementos. El siguiente es un ejemplo de una discretización de un dominio rectangular empleando una malla conformada por elementos triangulares: Numeración de nodos y elementos Cada nodo de la malla posee una numeración local 𝑛 (1 ≤ 𝑛 ≤ 𝑁), siendo 𝑁 el número de nodos total, y una numeración local 𝑘 (1 ≤ 𝑘 ≤ 𝐾), siendo 𝐾 el número de nodos por elemento. A su vez, cada uno de los 𝑀 elementos se numera 𝑚 (1 ≤ 𝑚 ≤ 𝑀) y todas las numeraciones 𝑚 precedentes se relacionan entre sí a través de la matriz de conectividad 𝐺(𝑘) , que indica la numeración global 𝑛 del 𝑘 -ésimo nodo del 𝑚 Las incógnitas (valores de la función en cada nodo) se notan 𝑢𝑛 = 𝑦(𝑘) . elemento 𝑚. Función interpolante La función 𝑢(𝑥, 𝑦) se aproxima de forma discreta como la agregación de funciones 𝑚 interpolantes por elemento, i.e.: 𝑢(𝑥, 𝑦) ≅ ∑𝑀 𝑚=1 𝑢 (𝑥, 𝑦). Página 5 Cada función interpolante 𝑢𝑚 (𝑥, 𝑦) se obtiene a partir de los valores nodales: 𝐾 𝑢𝑚 (𝑥, 𝑦) = { 𝑚 𝑚 (𝑥, 𝑦)𝑢(𝑘) ∑ 𝑁(𝑘) 𝑠𝑖 (𝑥, 𝑦) ∈ 𝑒 𝑚 𝑘=1 𝑠𝑖 (𝑥, 𝑦) ∉ 𝑒 𝑚 0 𝑚 (𝑥, 𝑦) es la función de forma del nodo 𝑘 en el elemento 𝑚 y, por la forma de 𝑢𝑚 (𝑥, 𝑦) es 𝑁(𝑘) 𝑚 𝑚 claro que es necesario que valga 1 sobre el nodo 𝐺(𝑘) y 0 sobre los nodos 𝐺(𝑘′) con 𝑘′ ≠ 𝑘, además de afuera del elemento 𝑚. Funciones de peso Se discretiza planteando una función de peso 𝑤𝑛 (𝑥, 𝑦) por cada nodo que, en el método de los volúmenes finitos vale: 𝑤𝑛 (𝑥, 𝑦) = { 1 0 𝑠𝑖 (𝑥, 𝑦) ∈ Ω𝑛 𝑠𝑖 (𝑥, 𝑦) ∉ Ω𝑛 Siendo Ω𝑛 el volumen de control asociado al nodo 𝑛 que, en el caso de un problema bidimensional, puede llamarse área de control. Discretización de la formulación débil A partir de todas las definiciones anteriores, es posible plantear la formulación débil de forma discreta: Página 6 − ∫ 𝑘𝑡 ∇𝑢 ⋅ ∇𝑤𝑛 𝑑Ω = − ∫ 𝑘𝑡 ∇𝑢 ⋅ ∇𝑤𝑛 𝑑Ω = ∫ 𝑘𝑡 Ω Ω𝑛 La última igualdad es producto de que 𝜕𝑤𝑛 𝜕𝑛 Γ𝑛 𝜕𝑢 𝑑Ω = 0 𝜕𝑛 es una delta de Dirac sobre el contorno Γ𝑛 = ∂Ω𝑛 . Cabe destacar que si Ω = ⋃𝑁 𝑛=1 Ω𝑛 y cada segmento de Γ𝑛 pertenece a dos áreas de control, es posible asegurar que el flujo se conserva a lo largo de toda la geometría. Luego, es posible pasar a un sistema de ecuaciones algebraicas de tamaño 𝑛 × 𝑛 planteando: 𝐿 𝐿 𝐾 𝑚𝑙 𝑚𝑙 𝜕 ∑𝑘=1 𝑁(𝑘) 𝑢(𝑘) 𝜕𝑢 𝜕𝑢 ∫ 𝑘𝑡 𝑑Ω = ∑ ∫ 𝑘𝑡 𝑑Ω = ∑ ∫ 𝑘𝑡 𝑑Ω = 𝜕𝑛 𝜕𝑛 𝜕𝑛 𝑚 𝑚 𝑙=1 Γ 𝑙 Γ𝑛 𝑙=1 Γ 𝑙 𝑛 𝐿 𝑛 𝐾 𝑚 𝑚 ∑ ∑ 𝑢(𝑘) ∫ 𝑚 𝑙=1 𝑘=1 Γ 𝑙 𝑛 𝑚 𝑘𝑡 𝜕𝑁(𝑘)𝑙 𝜕𝑛 𝐾 𝑑Ω = ∑ 𝑎𝑛𝑝 𝑢𝑝 𝑘=1 𝑚 𝑙 Siendo 𝐺(𝑘)𝑙 = 𝑛, 𝑝 = 𝐺(𝑘′) con 𝑘′ ≠ 𝑘. Dicho sistema puede plantearse a través del ensamble, que consiste en calcular los coeficientes de las ecuaciones recorriendo la malla por elemento y hallando los aportes de cada nodo a sus vecinos, en lugar de hacerlo por nodo. Elementos triangulares Al utilizar una malla forma por elementos triangulares de 3 nodos (uno en cada vértice), el área de control se construye utilizando las medianas de los lados, como se ve en las figuras: Página 7 Es conveniente calcular la integral correspondiente a cada nodo 𝑛 sobre el elemento 𝑚 realizando una transformación de las coordenadas espaciales (𝑥, 𝑦) a un dominio normalizado de coordenadas (𝜉, 𝜂), de la siguiente manera: Aquí, las funciones de forma son: 𝑁1 (𝜉, 𝜂) = 1 − 𝜉 − 𝜂 𝑁2 (𝜉, 𝜂) = 𝜉 𝑁3 (𝜉, 𝜂) = 𝜂 Y la transformación se logra como: 3 𝑚 𝑥 = ∑ 𝑁𝑘 (𝜉, 𝜂)𝑥(𝑘) 𝑘=1 3 𝑚 𝑦 = ∑ 𝑁𝑘 (𝜉, 𝜂)𝑦(𝑘) { 𝑘=1 𝑥 𝑥𝑚 ⟹ ( ) = ( 12 𝑚 𝑦 ⏟𝑦12 𝐽𝑚 𝑚 𝑚 𝑥(1) 𝜉 𝑥13 ) ( ) + ( 𝑚 𝑚 ) 𝑦13 𝜂 𝑦(1) 𝑚 𝑚 𝑚 Siendo {𝑥(𝑘) , 𝑦(𝑘) y: } las coordenadas del nodo local 𝐺(𝑘) 𝑚 𝑚 𝑚 𝑥12 = 𝑥(2) − 𝑥(1) 𝑚 𝑚 𝑚 𝑥13 = 𝑥(3) − 𝑥(1) 𝑚 𝑚 𝑚 𝑦12 = 𝑦(2) − 𝑦(1) 𝑚 𝑚 𝑚 {𝑦13 = 𝑦(3) − 𝑦(1) 𝑚 𝑚 𝑚 𝑚 𝐽𝑚 es la matriz jacobiana de la transformación y ∆= 𝑥12 𝑦13 − 𝑥13 𝑦12 su determinante. La integral se calcula realizando a través de un cambio de coordenadas e integrando sobre el dominio normalizado Ω′𝑛 : 𝜕𝑢 𝜕𝑢 𝜕𝑤 𝜕𝑤 − ∫ 𝑘𝑡 ∇𝑢 ⋅ ∇𝑤𝑛 𝑑Ω = − ∫ 𝑘𝑡 ( , ) ⋅ ( , ) 𝑑Ω = 𝜕𝑥 𝜕𝑦 𝜕𝑥 𝜕𝑦 𝑚 𝑚 Ω𝑛 Ω𝑛 𝜕𝑢 𝜕𝜉 𝜕𝑢 𝜕𝜂 𝜕𝑢 𝜕𝜉 𝜕𝑢 𝜕𝜂 𝜕𝑤 𝜕𝜉 𝜕𝑤 𝜕𝜂 𝜕𝑤 𝜕𝜉 𝜕𝑤 𝜕𝜂 = −|∆| ∫ 𝑘𝑡 ( + , + )⋅( + , + ) 𝑑Ω′ (∗) 𝜕𝜉 𝜕𝑥 𝜕𝜂 𝜕𝑥 𝜕𝜉 𝜕𝑦 𝜕𝜂 𝜕𝑦 𝜕𝜉 𝜕𝑥 𝜕𝜂 𝜕𝑥 𝜕𝜉 𝜕𝑦 𝜕𝜂 𝜕𝑦 Ω′𝑛 Página 8 Los valores de las derivadas de la inversa de la transformación pueden hallarse a partir de la matriz inversa de la jacobiana: 𝐽𝑚 −1 𝜕𝜉 𝜕𝑥 = 𝜕𝜉 (𝜕𝑦 𝜕𝜉 1 𝑦𝑚 𝜕𝑦 = ( 13𝑚 𝜕𝜂 ∆ −𝑦12 𝜕𝑦) 𝑚 −𝑥13 𝑚 ) 𝑥12 En tanto, las derivadas de la función interpolante, se calculan: 3 𝑚 (𝜉, 𝜂)) 𝜕𝑢 𝜕(∑3𝑘=1 𝑁𝑘 (𝜉, 𝜂)𝑢(𝑘) ) 𝑚 𝜕(𝑁𝑘 𝑚 𝑚 = = ∑ 𝑢(𝑘) = − 𝑢(1) + 𝑢(2) 𝜕𝜉 𝜕𝜉 𝜕𝜉 𝑘=1 3 (𝜉, 𝜂)) 𝜕𝑢 𝑚 𝜕(𝑁𝑘 𝑚 𝑚 = ∑ 𝑢(𝑘) = − 𝑢(1) + 𝑢(3) 𝜕𝜂 𝜕𝜂 𝑘=1 Reemplazando las derivadas en la expresión (∗): 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 ′ − ∫ ((−𝛼 ⏟ 13 + 𝛼123 )𝑢(1) + 𝛼13 𝑢(2) − 𝛼123 𝑢(3) , (−𝛼12 + 𝛼123 )𝑢(1) − 𝛼13 𝑢(2) + 𝛼123 𝑢(3) ) ⋅ ∇′𝑤𝑛 𝑑Ω Ω′𝑛 ̅̅̅̅ 𝐹𝑚 Donde ∇′𝑤𝑛 es el gradiente de 𝑤𝑛 en las coordenadas normalizadas y: 2 2 𝑚 𝑚 𝑥12 + 𝑦12 = 𝑘𝑡 |∆| 𝑚2 𝑚2 𝑥13 + 𝑦13 𝑚 𝛼13 = 𝑘𝑡 |∆| 𝑚 𝑚 𝑚 𝑚 𝑥 𝑥 12 13 + 𝑦12 𝑦13 𝑚 𝛼123 = 𝑘𝑡 { |∆| 𝑚 𝛼12 Ahora es posible pasar del cálculo de una integral de superficie al del flujo a través de la curva Γ𝑛 = 𝜕Ω′𝑛 : ′ ̅̅̅̅ 𝑛 𝑑Ω′ − ∫ ̅̅̅̅ 𝐹𝑚 ⋅ ∇′𝑤𝑛 𝑑Ω′ = ∫ ̅̅̅̅ 𝐹𝑚 ⋅ 𝑛̆𝑛 𝑑Ω′ = ∫ ̅̅̅̅ 𝐹𝑚 ⋅ 𝑛̆ 𝑛 1 𝑑Ω + ∫ 𝐹𝑚 ⋅ 𝑛̆ 2 Ω′𝑛 Γ𝑛 Γ𝑛 1 Γ𝑛 2 Página 9 𝑚 Dependiendo del nodo local 𝑘⁄𝐺(𝑘) = 𝑛 que se esté analizando, las curvas de integración, su longitud y la dirección de sus normales exteriores varían: 𝒌 𝟏 1 𝒏̆ 𝒏𝟏 𝒍𝒏 𝟏 √5 1 (2,1) − √5 1 (1,2) − √5 𝟐 𝟑 1 √5 6 √5 6 √5 6 (1,2) 𝒏̆ 𝒏𝟐 (2,1) √5 1 (−1,1) √2 1 (1, −1) √2 𝒍𝒏 𝟐 √5 6 √2 6 √2 6 𝑙𝑛 1y 𝑙𝑛 2 son las longitudes de las curvas Γ𝑛 1 y Γ𝑛 2 . ′ ̅̅̅̅ Como ̅̅̅̅ 𝐹𝑚 = (𝐹𝑚 1 , 𝐹𝑚 2 ) es constante en todo el dominio, ∫Γ ̅̅̅̅ 𝐹𝑚 ⋅ 𝑛̆ 𝑛 1 𝑑Ω + ∫Γ 𝐹𝑚 ⋅ ′ ̅̅̅̅ 𝑛 + 𝑙𝑛 ̅̅̅̅ 𝑛̆ 𝐹 ⋅ 𝑛̆ 𝑛 2 𝑑Ω = 𝑙𝑛 1 𝐹𝑚 ⋅ 𝑛̆ 𝑛 2 y las integrales resultan: 1 2 𝑚 𝑛1 𝑛2 𝒌 ̆𝒏 𝒅𝛀′ ∫ ̅̅̅̅ 𝑭𝒎 ⋅ 𝒏 𝟏 𝟐 𝟑 𝚪𝒏 𝑚 𝑚 𝑚 𝑚 𝑚 𝑚 𝛼13 𝛼12 𝛼13 𝛼123 𝛼12 𝛼123 𝑚 𝑚 𝑚 𝑚 − + 𝛼123 +( − +( − (− ) 𝑢(1) ) 𝑢(2) ) 𝑢(3) 2 2 2 2 2 2 ( 𝑚 𝑚 𝑚 𝑚 𝛼13 𝛼123 𝛼13 𝛼123 𝑚 𝑚 − − 𝑢(2) + 𝑢𝑚 ) 𝑢(1) 2 2 2 2 (3) 𝑚 𝑚 𝑚 𝑚 𝛼12 𝛼123 𝛼123 𝛼12 𝑚 𝑚 − 𝑢 +− 𝑢𝑚 ( ) 𝑢(1) + 2 2 2 (2) 2 (3) Página 10 3) Discretización del dominio mediante GMSH La discretización del dominio se llevó a cabo utilizando la herramienta de software libre bajo licencia GNU/GPL GMSH. Se trata de un generador de grillas tridimensionales de elementos finitos que dispone de capacidad de pre y post-procesamiento. Mallas no estructuradas Para discretizar el intercambiador de calor de forma no estructurada se generaron mallas con GMSH empleando sólo dos superficies de mallado, una para C0 y otra para C2. Geometría para la generación de mallas no estructuradas Elementos triangulares de 3 nodos A partir de este modelo, mallando con una longitud característica de 1,0 (valor predeterminado) en todos los puntos, se obtuvo la malla 1.1. A fin de poder contrastar la precisión de la solución obtenida al trabajar con una malla más gruesa, considerando “buena” la anterior por su cantidad de elementos, se llevó a cabo el mismo proceso con una longitud característica de 2,0, para producir la malla 1.2. Finalmente, a partir de la malla 1.1, se aplicó el comando reiteradamente “Refine by Splitting”, obteniéndose 5 mallas diferentes, cada una de ellas con mayor número de elementos que la anterior. De esta forma, fue posible adoptar como solución “exacta” a la obtenida a partir de la más fina (1.7) y utilizarla como patrón de referencia para la comparación de los resultados obtenidos. Página 11 Malla 1.1. 102 nodos, 216 elementos. Malla 1.2. 52 nodos, 110 elementos. Página 12 Mallas refinadas Malla 1.3. 366 nodos, 756 elementos Malla 1.4. 1.380 nodos, 2.808 elementos Página 13 Malla 1.5. 5.352 nodos, 10.800 elementos Malla 1.6. 21.072 nodos, 42.336 elementos Página 14 Malla 1.7. 83.616 nodos, 167.616 elementos Elementos triangulares de 3 nodos (concentrada alrededor de C1) Para tener pruebas más consistentes, se realizó otro tipo de mallado, modificando las longitudes características de ciertos puntos. Como el conductor C1 se encuentra a 100°, es de esperarse que los gradientes de temperatura sean mayores alrededor de éste, particularmente en la zona derecha del intercambiador. Por lo tanto, para poder obtener resultados más precisos en el entorno del mismo, se llevó a cabo una discretización más fina en esa zona. Se definieron los puntos de los vértices de C2 con una longitud característica de 0,4 y los vértices de C1 con una longitud característica de 0,15. Luego, análogamente al trabajo realizado en el apartado anterior, se aplicó reiteradamente el comando “Refine by Splitting” para lograr una precisión incremental en los ensayos sucesivos. De esta manera, se elaboraron las siguientes mallas: Página 15 Malla 2.1. 970 nodos, 1.972 elementos Mallas refinadas Malla 2.2. 3.672 nodos, 7.408 elementos Página 16 Malla 2.3. 14.272 nodos, 28.672 elementos Malla 2.4. 56.256 nodos, 112.768 elementos Página 17 Elementos cuadrangulares de 4 nodos Se llevó a cabo el mismo procedimiento de refinamientos sucesivos para mallas conformadas por elementos cuadrangulares de 4 nodos además de generar una discretización de menor número de nodos a la predeterminada (malla 3.2). Malla 3.1. 477 nodos, 543 elementos Página 18 Malla 3.2. 232 nodos, 264 elementos Mallas refinadas Malla 3.3. 1.628 nodos, 1.760 elementos Página 19 Malla 3.4. 6.344 nodos, 6.608 elementos Malla 3.5. 25.040 nodos, 25.568 elementos Página 20 Malla 3.6. 99.488 nodos, 100.544 elementos Página 21 Mallas estructuradas Para la creación de mallas estructuradas, es necesario discretizar el dominio de forma tal que las superficies de mallado estén conformadas por subdominios que sean isomorfos en alto grado a formas geométricas rectangulares o triangulares para poder aplicar un algoritmo transfinito que genere los elementos triangulares por subdivisión de rectángulos y los cuadrangulares a partir de la recombinación de los mismos. Geometría para la generación de mallas estructuradas Elementos triangulares de 3 nodos Para aplicar la misma metodología de refinamientos sucesivos que en los casos anteriores, fue necesario indicar la cantidad de nodos a generar en cada línea transfinita, a través de la modificación de los parámetros de cada una de ellas, asegurándose de mantener la compatibilidad entre sus valores en cada subdominio delimitado. Comenzando a partir de valores bajos, se obtienen una discretización gruesa, que se van mejorando gradualmente. Página 22 Malla 4.1. 44 nodos, 98 elementos Mallas refinadas Malla 4.2. 148 nodos, 316 elementos Página 23 Malla 4.3. 536 nodos, 1.112 elementos Malla 4.4. 2.032 nodos, 4.144 elementos Página 24 Malla 4.5. 7.904 nodos, 15.968 elementos Malla 4.6: 31.168 nodos, 62.656 elementos Página 25 4) Distribución de temperaturas Las mallas obtenidas en el punto anterior fueron procesadas a partir de archivo .msh generado aplicando el método de los volúmenes finitos descripto en los primeros apartados con el código MATLAB incluido en el anexo para obtener la distribución de temperaturas en el intercambiador de calor. Posteriormente, se procedió a comparar cada una de dichas soluciones 𝑢 con la obtenida utilizando la discretización más fina 𝑢̂. Para ello, se definió la función ∆𝑢 = 𝑢 − 𝑢̂ y se realizó un muestreo de la misma sobre los nodos de la malla más fina (i.e.: ∆𝑢𝑛 =. 𝑢(𝑥𝑛 , 𝑦𝑛 ) − 𝑢̂𝑛 para 1 ≤ 𝑛 ≤ 𝑁 ) para emplear la funcionalidad de post-procesamiento provista por GMSH y obtener una gráfica de su distribución a lo largo de todo el dominio. A continuación se muestran los gráficos de las soluciones obtenidas en los ensayos y postprocesadas con GMSH para varias mallas y de la mencionada función de diferencia de cada una de ellas, constituyendo ésta una aproximación del error introducido por la discretización. Para todos los gráficos de solución, se utiliza la misma escala de valores: Página 26 Mallas no estructuradas Elementos triangulares de 3 nodos Solución Malla 1.1 Error Malla 1.1 Página 27 Solución Malla 1.4 Error Malla 1.4 Página 28 Solución Malla 1.6 Error Malla 1.6 Página 29 Elementos triangulares de 3 nodos (concentrada alrededor de C1) Solución Malla 2.1 Error Malla 2.1 Página 30 Solución Malla 2.3 Error Malla 2.3 Elementos Cuadrangulares *A completar en la próxima entrega* Página 31 Mallas estructuradas Elementos Triangulares de 3 nodos Solución Malla 4.1 Error Malla 4.1 Página 32 Solución Malla 4.3 Error Malla 4.3 Página 33 Solución Malla 4.5 Error Malla 4.5 Página 34 Elementos Cuadrangulares *A completar en la próxima entrega* Página 35 Comparación de errores y conclusiones El siguiente gráfico ilustra la relación entre el número de nodos de la malla y el módulo del máximo error cometido para cada tipo de malla a partir de los resultados obtenidos en los ensayos realizados. 18 16 |Error Máximo| 14 12 10 No Estructurada 8 No Estructurada Concentrada 6 Estructurada 4 2 0 0 5000 10000 15000 20000 25000 Nº de nodos Se observa cómo, al incrementar la cantidad de nodos, los errores, que exceden los 17°C en las mallas más gruesas, caen a alrededor de 0,5°C en las mallas más densas. Cabe destacar que surge del análisis de las distribuciones de errores de la sección anterior que estos valores máximos representados, en la mayor parte de los casos, se alcanzan en entornos muy localizados alrededor de los bordes rectos del conductor C2. El motivo de ello es la presencia de importantes gradientes de temperatura en esa zona, que generan la necesidad de una discretización con elementos de menor tamaño a fin de poder representar con fidelidad el fenómeno físico que se presenta. En las zonas cercanas al borde externo del intercambiador, ya es posible obtener un error virtualmente nulo a partir de discretizaciones con un número reducido de nodos. A partir de la observación de las tres curvas de tendencia, es posible concluir que el mallado no estructurado con nodos concentrados en las cercanías de los conductores es el que entrega mejores resultados para el mismo número de nodos, mientras que no existe una diferencia considerable entre los mallados estructurados y los no estructurados. Por consiguiente, resulta una estrategia interesante dedicar los esfuerzos a estructurar apropiadamente y refinar la malla en alto grado en las zonas críticas analizadas con un elevado nivel de detalle, en lugar de hacerlo sobre la totalidad del dominio. Página 36 Comparación de tiempos de ejecución Para cada resolución del problema, utilizando las funciones tic y toc de MATLAB, se computó el tiempo de ejecución del algoritmo, elaborándose el siguiente gráfico, que muestra su relación con el número de nodos de la malla (de cualquier tipo). 250 Tiempo de Ejecución (s) 200 150 Tiempo de Ejecución 100 Ajuste Cuadrático y = 3E-08x2 - 2E-05x + 0,1613 R² = 0,9998 50 0 0 20000 40000 60000 80000 100000 Nº de nodos La resolución se llevó a cabo en todos los casos a través del software MATLAB R2012a, en un equipo con procesador Intel Core i5-760 a 2,8 GHz y 4 GB de memoria RAM DDR3 a 1333 MHz. No se consideró en ningún caso el tiempo de acceso para lectura/escritura de datos almacenados en unidades magnética. Se observa que el tiempo de ejecución crece abruptamente cuando se tienen decenas de miles de nodos, llegando hasta casi cuatro minutos para la malla de aprox. 83.000 nodos. Realizando un ajuste cuadrático a partir de los valores obtenidos, es posible lograr una excelente aproximación de la curva y, de esta forma, es simple inferir cuánto tiempo insumirá una ejecución conociendo la cantidad de nodos de la malla. Página 37 5) Sensibilidad del problema al valor de la conductividad térmica de C 2 A partir de la malla de elementos triangulares de 3 nodos no estructurada más refinada (2.4), se resolvió el problema manteniendo constante la conductividad térmica 𝑘0 de C0 y variando la de C2 (𝑘2 ) entre 0,01 y 100 (valores que, a fines prácticos, pueden considerarse como nulo e infinito respectivamente) para estudiar el comportamiento de la solución. Cabe destacar que la distribución de temperaturas obtenidas depende sólo de la relación entre los parámetros 𝑘2 . 𝑘0 Solución obtenida para 𝒌𝟐 = 𝟎, 𝟎𝟏 Se observa que el conductor C2 actúa como una importante barrera térmica entre el borde izquierdo del intercambiador, que se encuentra a 20ºC y el lado derecho del conductor C1, que se encuentra a 100ºC ya que hay una fuerte caída de la temperatura en esa dirección (gradientes importantes) como consecuencia de la baja conductividad 𝑘2 . Página 38 Solución obtenida para 𝒌𝟐 = 𝟏 El perfil de temperaturas muestra que hay un suave decaimiento desde el borde de C1 hacia la periferia del intercambiador en todas las direcciones ya que, al ser iguales ambas conductividades térmicas, el sistema resulta equivalente a uno en el que, en lugar de existir C2, C0 cubriera esa porción de espacio físico, considerando válida la hipótesis de que la interfaz es ideal y no existen pérdidas. Página 39 Solución obtenida para 𝒌𝟐 = 𝟓 Se trata del problema planteado originalmente, puede interpretarse como una perturbación introducida sobre el caso anterior, en la cual la temperatura cae más gradualmente hacia la periferia del lado izquierdo debido a la mayor conductividad térmica de C2, que permite un flujo de calor más importante a través de él. Página 40 Solución obtenida para 𝒌𝟐 = 𝟏𝟎𝟎 Se acentúan más las características de la solución anterior. En este caso, el decaimiento de temperatura en la superficie de C2 es prácticamente nulo (i.e.: el gradiente de temperaturas es aproximadamente el vector nulo) ya que en esa región la resistencia al flujo de calor es casi inexistente. Página 41 7) Variante del problema con C2 adiabático Al considerarse C2 adiabático, éste no pueda ya intercambiar calor con su entorno, lo que representa una conductividad térmica nula o, equivalentemente, una resistividad infinita. De esta forma, se tiene la situación extrema del caso simulado en el apartado anterior, en el que se resolvió el problema para 𝑘2 = 0,01 ≅ 0, es decir, una aislación térmica total. De forma general, para aplicar el método de los volúmenes finitos, al haber introducido una condición de Neumann, es necesario considerar el término adicional obtenido a partir 𝜕𝑢 discretización de la formulación débil: ∫Γ 𝑘𝑡 𝜕𝑛 𝑑Ω. Sin embargo, debido a que dicha condición 𝑛 es nula, esta integral desaparece y el sistema de ecuaciones resultantes finalmente es el mismo. La diferencia operativa que se presenta es la necesidad de modificar la geometría para excluir de a C2 de la superficie mallada ya que carece de sentido físico la ecuación del calor en esa región. Se efectuó el ensayo partir de una malla similar a la 2.4, con la diferencia mencionada en el párrafo anterior, obteniéndose el resultado esperado. Puede observarse una gráfica extremadamente similar a la del primer ensayo del apartado 5). Esta vez C2 constituye una barrera térmica total entre la zona izquierda y la derecha del intercambiador. Página 42 Anexo Ensayos previos Para verificar el correcto funcionamiento del algoritmo, se definió una geometría de prueba simple conformada por un dominio rectangular de 4cm x 2cm con conductividad térmica unitaria, cuyo borde izquierdo se hallaba a 40ºC y su borde derecho a 20ºC. Es sencillo hallar la solución analítica de la ecuación del calor en estado estacionario allí: 𝑢(𝑥, 𝑦) = 20 + 5𝑥 (con las unidades correspondientes para cada variable y parámetro). Se definió la siguiente malla estructurada de elementos triangulares de 3 nodos, con la ventaja de que, por su simpleza, es posible calcular manualmente su matriz global y el valor de las incógnitas en cada nodo: El resultado obtenido fue el esperado y pudieron verificarse satisfactoriamente los pasos del algoritmo. Página 43 Código fuente del programa en MATLAB classdef Solucion < handle properties pathMesh mesh sol nodosBorde end methods function obj=Solucion(path) obj.pathMesh=path; end function dif = compararCon( obj, pathMesh2, salida ) %Cálculo de la otra solucion s2 = Solucion(pathMesh2); s2.doVolumenesFinitos(0); %Vector de diferencias dif = zeros(obj.mesh.nbNod,1); %Minimos y maximos X elemento_X = [(1:s2.mesh.nbTriangles)' zeros(s2.mesh.nbTriangles,1) zeros(s2.mesh.nbTriangles,1)]; for j=1:s2.mesh.nbTriangles nodosElem = s2.mesh.TRIANGLES(j, 1:3); elemento_X(j,2) = min( s2.mesh.POS(nodosElem([1 2 3]),1) ); elemento_X(j,3) = max( s2.mesh.POS(nodosElem([1 2 3]),1) ); end %Computo de las diferencias for i=1:obj.mesh.nbNod %Si es un nodo de borde, dif = 0; if ( ismember(i,obj.nodosBorde) ) continue; end %Posicion del nodo x = obj.mesh.POS(i,1); y = obj.mesh.POS(i,2); %Busqueda del elemento correspondiente en la otra malla %Candidatos b = [ elemento_X(:,2)<=x elemento_X(:,3)>=x]; candidatos = elemento_X( b(:,1) & b(:,2), 1); encontrado=0; j=0; while( ~encontrado && j<size(candidatos,1) ) j = j+1; Página 44 nodosElem = s2.mesh.TRIANGLES(candidatos(j), 1:3); xv = s2.mesh.POS(nodosElem,1); yv = s2.mesh.POS(nodosElem,2); encontrado = inpolygon(x,y,xv,yv); end %Si no esta en ninguno, copia un vecino if( j == size(candidatos,1) && ~encontrado) if( i > 1) dif(i) = dif(i-1); end disp({x,',',y,' no se pudo mapear', j}); continue; end %disp({x,',',y,' esta en el elemento ', s2.mesh.nbLines+j, ' de vertices ', xv, yv}); %Normalización de coordenadas del punto x1 = s2.mesh.POS(nodosElem(1),1); y1 = s2.mesh.POS(nodosElem(1),2); x12 = s2.mesh.POS(nodosElem(2),1) s2.mesh.POS(nodosElem(1),1); x13 = s2.mesh.POS(nodosElem(3),1) s2.mesh.POS(nodosElem(1),1); y12 = s2.mesh.POS(nodosElem(2),2) s2.mesh.POS(nodosElem(1),2); y13 = s2.mesh.POS(nodosElem(3),2) s2.mesh.POS(nodosElem(1),2); - det = x12*y13-x13*y12; psi = y13/det*(x-x1)-x13/det*(y-y1); eta = -y12/det*(x-x1)+x12/det*(y-y1); %Calculo de la solucion en la otra malla sol2xy = (1-psi-eta)*s2.sol( nodosElem(1) ) + psi*s2.sol( nodosElem(2) ) + eta*s2.sol( nodosElem(3) ); %disp({'Sol en el nodo ', i, ' de malla refinada: ', obj.sol(i)}); %disp({'Sol en el malla gruesa: ', sol2xy}); %Diferencia entre soluciones en el punto dif(i) = obj.sol(i)-sol2xy; end %Se guardan las diferencias en un archivo de salida si se requiere if (salida == 1) pathSalida = strrep(pathMesh2,'.msh','-Dif.msh'); copyfile(obj.pathMesh, pathSalida); fileID = fopen(pathSalida,'a'); Página 45 fprintf(fileID,'\r\n$NodeData\r\n1\r\n"Dif. Temperatura [*C]"\r\n1\r\n0\r\n3\r\n0\r\n1\r\n'); fprintf(fileID,'%d\r\n',obj.mesh.nbNod); for i=1:obj.mesh.nbNod fprintf(fileID,'%d %.15f\r\n',i,dif(i)); end fprintf(fileID,'$EndNodeData\r\n'); fclose(fileID); end end function doVolumenesFinitos( obj, salida ) %Lectura de la malla obj.mesh = load_gmsh2( obj.pathMesh ); %Matriz global M = sparse(obj.mesh.nbNod,obj.mesh.nbNod); %Vector de incógnitas U = zeros(obj.mesh.nbNod,1); %Factores normalizados PSI_psi = [-0.5 0 0.5]; PSI_eta = [0.5 -0.5 0]; %Conductividades termicas K0 = 1; K2 = 0.0001; %Ensamble de matriz global for m=1:obj.mesh.nbTriangles if( obj.mesh.TRIANGLES(m,4)== 4 ) K = K0; else K = K2; end nodos = obj.mesh.TRIANGLES(m,1:3); x12 = obj.mesh.POS(nodos(2),1)obj.mesh.POS(nodos(1),1); x13 = obj.mesh.POS(nodos(3),1)obj.mesh.POS(nodos(1),1); y12 = obj.mesh.POS(nodos(2),2)obj.mesh.POS(nodos(1),2); y13 = obj.mesh.POS(nodos(3),2)obj.mesh.POS(nodos(1),2); det = abs(x12*y13 - x13*y12); alfa12 = 1/det*(x12^2 + y12^2); alfa13 = 1/det*(x13^2 + y13^2); alfa123 = 1/det*(x12*x13 + y12*y13); for k=1:3 a2 = alfa123*PSI_psi(k) + alfa13*PSI_eta(k); a3 = -alfa12*PSI_psi(k) - alfa123*PSI_eta(k); Página 46 M( nodos(k), nodos(1) ) = M( nodos(k), nodos(1) ) - K*(a2+a3); M( nodos(k), nodos(2) ) = M( nodos(k), nodos(2) ) + K*a2; M( nodos(k), nodos(3) ) = M( nodos(k), nodos(3) ) + K*a3; end end %Condiciones de borde %Deteccion de nodos de borde nodosBordeC0 = []; nodosBordeC1 = []; for i=1:obj.mesh.nbLines if( obj.mesh.LINES(i,3) == 1 ) nodosBordeC0 = union(nodosBordeC0, obj.mesh.LINES(i, 1:2)); elseif ( obj.mesh.LINES(i,3) == 2 ) nodosBordeC1 = union(nodosBordeC1, obj.mesh.LINES(i, 1:2)); end end %Valores de la condición de Dirichlet U(nodosBordeC0)=20; U(nodosBordeC1)=100; % Sacar filas de valores conocidos de la matriz global M([nodosBordeC0 nodosBordeC1],:) = []; % Término independiente b = - M(:,[nodosBordeC0 nodosBordeC1])*U([nodosBordeC0 nodosBordeC1]); % Sacar columnas de valores conocidos de la matriz global M(:,[nodosBordeC0 nodosBordeC1]) = []; % Cálculo de incógnitas (X: vector de soluciones) X = M\b; %Se guarda la solución en un archivo de salida si se requiere %y se traspasan las incógnitas X al vector de soluciones U if (salida == 1) pathSalida = strrep(obj.pathMesh,'.msh','Resuelto.msh'); copyfile(obj.pathMesh, pathSalida); fileID = fopen(pathSalida,'a'); fprintf(fileID,'\r\n$NodeData\r\n1\r\n"Temperatura [*C]"\r\n1\r\n0\r\n3\r\n0\r\n1\r\n'); fprintf(fileID,'%d\r\n',obj.mesh.nbNod); end Página 47 j = 1; for i=1:obj.mesh.nbNod if ~( ismember(i,nodosBordeC0) || ismember(i,nodosBordeC1) ) U(i)=X(j); j = j+1; end if (salida == 1) fprintf(fileID,'%d %.15f\r\n',i,U(i)); end end if (salida == 1) fprintf(fileID,'$EndNodeData\r\n'); fclose(fileID); end obj.sol = U; obj.nodosBorde = union(nodosBordeC0,nodosBordeC1); end end end Página 48