El pasado mes de enero la borrasca Filomena nos regaló en Madrid la mayor nevada que yo haya visto, y vivo aquí desde 1999. Este hecho unido a que por otros motivos llevaba un tiempo dándole al coco sobre formas de aislamiento en climas fríos, me inspiró definitivamente para tratar de hacer algunas simulaciones de transmisión del calor (clic sobre la imagen para verla en todo su esplendor).
En este artículo vamos a modelar la Ecuación del calor por elementos finitos valiéndonos de las facultades matriciales de R. Es un tipo de cálculos intensivos que en cualquier lenguaje no vectorizado requeriría compilar bucles anidados para lograr una velocidad de ejecución aceptable.
Esta ecuación en derivadas parciales rige la transferencia de energía inducida cuando cuerpos a diferente temperatura entran en contacto. En esa situación se produce un flujo de calor desde el cuerpo más caliente al más frío a un ritmo proporcional al gradiente térmico, flujo que solo cesa cuando se igualan las temperaturas. En coordenadas cartesianas:
La anterior ecuación solo tiene solución cerrada para geometrías muy básicas, pero podemos resolver estructuras arbitrarias complejas con aproximaciones de las derivadas parciales. Discretizando espacio y tiempo en elementos finitos, el cálculo de la temperatura en cualquier punto en un instante se puede obtener de forma sencilla a partir de la temperatura en el instante discreto inmediatamente anterior y de las condiciones térmicas de su entorno.
Existen métodos implícitos para formular estas aproximaciones que son incondicionalmente estables, resolviéndose con un sistema de ecuaciones que implica llegar a una matriz tridiagonal que debe invertirse para resolver el sistema. Sin embargo vamos a utilizar una formulación explícita mucho más simple, con el único coste de requerir una condición de estabilidad. Más sobre estas diferencias de métodos en 'Numerical Modeling Of Earth Systems'.
La siguiente ecuación explícita define, para el caso unidimensional, la temperatura en el instante discreto (n+1)
para la localización también discreta i
del espacio, en función de su temperatura y de las de celdas adyacentes en el instante anterior (n)
. El primer término modela la transferencia de calor por conducción y el segundo permite introducir fuentes internas de calor (hacer clic para verla con más detalle):
La fórmula se adapta a cambios de conductividad al pasar de un medio a otro, simplificándose en la forma estándar para material uniforme cuando se asume una conductividad (k) constante en el espacio. El término Ti+1 - 2Ti + Ti-1 podemos verlo como un filtro detector de gradientes de temperatura. Al sumarse a la temperatura local (ponderado por la difusividad térmica del material), tiende a reducir las diferencias respecto a celdas vecinas, garantizando siempre que los flujos de calor intercambiados entre celdas contiguas sean iguales a ambos lados de la frontera.
Extender el cálculo al caso 2D o 3D resulta trivial, ya que al ser los términos en derivadas parciales independientes para cada eje solo hay que añadir los sumandos correspondientes a las nuevas dimensiones. En nuestro simulador nos vamos a plantar en un desarrollo 2D ya que permite una buena flexibilidad para modelar estructuras, pero sin entrar en tiempos de cálculo excesivamente largos ni definiciones laboriosas del espacio simulado.
La condición de estabilidad a la que hacíamos referencia antes relaciona la velocidad de propagación del algoritmo (en cada iteración la propagación del calor no puede ser más rápida que una unidad espacial discreta por unidad de tiempo discreto, es decir Δx/Δt) y la difusividad (α) de los materiales participantes en la simulación. Concretando, como se explica en 'Stability of Finite Difference Schemes on the Diffusion Equation with Discontinuous Coefficients' es condición suficiente de estabilidad que se cumpla:
Con las herramientas matemáticas construidas vamos a enumerar los materiales que nos planteamos simular:
'solid'
: cualquier tipo de material sólido definido por su difusividad (α) y su conductividad (k) térmicas. Serán la base principal de nuestras simulaciones.'source'
: se trata de sólidos a los que añadimos una fuente de calor interna (q). El parámetro admite valores negativos en cuyo caso estaríamos modelando un sumidero de calor.'fluid'
: los fluidos se definirán igual que los sólidos por sus parámetros conductivos de difusividad (α) y conductividad (k). Sin embargo para respetar su comportamiento convectivo se acudirá a una aproximación que se explica más adelante.'boundary'
: materiales sobre los que imponemos una condición de contorno de temperatura constante. Es decir, aunque intercambien calor con objetos vecinos nunca varían su temperatura (p.ej. aire exterior a una construcción).'insulate'
: material aislante ideal. Se modela forzando a replicar en su periferia la temperatura de los objetos colindantes, bloqueando así todo intercambio de calor al anularse el gradiente térmico.'isoflux'
: material que "deja pasar" el flujo de calor, ya sea entrante o saliente, existente en su periferia. Se modela forzando a replicar el gradiente térmico local existente en los objetos colindantes. NOTA: material no suficientemente probado.
'heatobjects.png'
donde el color identifica el tipo de material. No hay limitación en el número de materiales pero algunos por su implementación tienen restricciones:- 'solid', 'source',
'boundary'
: pueden tener cualquier geometría desde píxeles sueltos a formas complejas. Objetos inconexos pueden compartir el mismo material ahorrándonos descriptivo. - 'fluid', 'insulate', 'isoflux': deben obligatoriamente definirse como materiales independientes contiguos (es decir cada objeto ha de ser único, con un color y descripción propios), y en el caso de 'insulate' y 'isoflux' por sencillez del código deben ser piezas rectangulares, teniendo un tamaño mínimo de 2x2 celdas. Para formas más complejas deberán combinarse varios de estos rectángulos (NOTA: cada uno debe definirse como un material independiente) o en el caso de buscar un aislante acudir a sólidos de muy baja difusividad (α).
'heatobjects.png'
:'heatobjects.csv'
, siendo especificados estrictamente en el mismo orden en que aparecían ordenados de izquierda a derecha los píxeles de color en la imagen anterior, ya que dicho orden es lo que asocia cada material simulado con su definición térmica. Los parámetros de cada material son:Temp
: temperatura inicial a la que se encuentra el material (K o ºC)alpha
: difusividad térmica (m2/s)k
: conductividad térmica (W/(m·K))q
: fuente de calor interna (W/m3) (se ignora si el objeto no es 'source')type
: tipo de material a elegir entre 'boundary', 'solid', 'insulate', 'fluid' o 'source'desc
descriptivo alfanumérico opcional del material (p.ej. "suelo")
'heatparams.csv'
se especifican los parámetros de simulación:cell size (m)
: tamaño de las celdas discretas (el mismo para las dos dimensiones)time step (s)
: salto temporal entre iteracionesnumber of iterations
: número total de iteraciones a simularnumber of snapshots
: número de archivos PNG de salida con la representación instantánea de la temperatura en el espacio simuladogamma
: si distinto de 1 deslinealización de la salida para resaltar diferencias de temperatura (OUT = IN1/gamma)
- Tratar cada fluido como un sólido más (definido por su difusividad y conductividad), calculando el intercambio de calor con todos sus vecinos de acuerdo a las ecuaciones de conducción estándar.
- Tras cada iteración se calcula la temperatura media del fluido reasignándola en todas las celdas que lo constituyen, lo cual es consistente con el Principio de conservación de la energía.
No hay comentarios:
Publicar un comentario
Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.