Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires Sistemas Complejos en Máquinas Paralelas Introducción a OpenFOAM Ejercicios Nicolas D. Badano Noviembre 2014 1. Introducción 1.1. Configuración del entorno Para poder utilizar los comandos y librerı́as de OpenFOAM es necesario cargar las rutas correspondientes en el entorno de Bash. Para eso, vamos a editar el script donde se inicializa el entorno de la terminal. Podemos utilizar cualquier editor de texto (nano, gedit , vim, etc). Por ejemplo: $ g e d i t $HOME/ . b a s h r c En la linea final de ese archivo agregar la linea: . / opt / openfoam230 / e t c / b a s h r c Luego de guardar el archivo, es necesario cerrar la terminal y abrir una nueva. Esta cargará en su inicialización los directorios de los ejecutables y las librerı́as de OpenFOM. Para verificar que la ruta a los ejecutables están correctamente configurada puede ejecutarse el comando: $ which blockMesh que deberı́a devolver el siguiente resultado: / opt / openfoam230 / p l a t f o r m s / linux64GccDPOpt / b i n / blockMesh 1.2. Directorios de utilidad Manual de usuario y programador: / opt / openfoam230 / doc Casos listos para correr / opt / openfoam230 / t u t o r i a l s Código fuente de los solvers y utilidades / opt / openfoam230 / a p p l i c a t i o n s Código fuente de las librerı́as / opt / openfoam230 / s r c Directorio donde se compilan los solvers de usuario $HOME/OpenFOAM/ u s u a r i o − 2 . 3 . 0 / p l a t f o r m s / linux64GccDPOpt / bin / 1 2. Trabajando con la ecuación de difusión A continuación dentro de la carpeta de usuario vamos a crear un directorio para almacenar las corridas de la clase: $ mkdir c o r r i d a s && cd c o r r i d a s Luego descargamos el primero de los casos para trabajar, lo descomprimimos y entramos al nuevo directorio: $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ c a s o D i f u s i o n . t a r . gz $ t a r −x z f c a s o D i f u s i o n . t a r . gz $ cd c a s o D i f u s i o n Una vez dentro del caso, el primer paso consiste en generar la malla de cálculo, en este caso utlizando la utilizad blockMesh. Esta lee el archivo constant/polyMesh/blockMeshDict, que contiene una estructura de nodos, aristas y bloques, ası́ como la definición de los nombres que reciben cada uno de los bordes. $ blockMesh Una vez generada la malla, ya podemos hacer una primera visualización del caso en Paraview, para ver la geometrı́a ya los nombres de las condiciones de borde. Para poder abrir el caso en Paraview es necesario crear un archivo vacio con el nombre de la corrida y extensión .foam : $ touch c a s o D i f u s i o n . foam Y luego podemos abrir ese archivo: $ paraview c a s o D i f u s i o n . foam Una vez revisado, la simulación se realiza ejecutando el solver correspondiente: $ laplacianFoam Los resultados pueden observarse abriendo nuevamente el caso en paraview. 2.1. Ejercicios 2.1.1. Ejercicio 1 Visualizar los resultados de temperatura con paraview. ¿Cuantos segundos dura la simulación? ¿Puede considerarse que se halla alcanzado el estado 2 estacionario? Volver a correr la simulación durante más tiempo hasta obtener una mejor estabilización. Ayuda: El perı́odo de simulación se encuentra configurado en system/controlDict . 2.1.2. Ejercicio 2 Utilizar la misma geometrı́a para ensayar otro juego de condiciones de borde. Suponer las siguientes condiciones de borde: Temperatura constante de 273 K en los bordes up y left . Gradiente de temperatura entrante de 1000K/m en el borde. Ningún flujo de calor en el resto de los bordes (gradiente cero). Repetir la simulación bajo esas condiciones y comparar los resultados. Ayuda: La condición de borde de gradiente se expresa como: hole { type gradient } 2.1.3. fixedGradient ; uniform 2 0 0 ; Ejercicio 3 El código fuente del solver laplacianFoam está ubicado en: / opt / openfoam230 / a p p l i c a t i o n s / s o l v e r s / b a s i c / l a p l a c i a n F o a m / Analizar el código fuente. ¿Donde se lee el campo de T con sus condiciones de borde? ¿Donde se resuelve la ecuación en derivadas parciales? Ayuda: La ecuación diferencial del problema es: ∂T = ∇ · (Dt ∇T ) ∂t 3 (1) 2.1.4. Ejercicio 4 Correr alguno de los casos de las ecuación de difusión en paralelo. Copiar alguna de las corridas y borrar todos los pasos de tiempo simulados (dejar solo el 0) Colocar el archivo decomposeParDict en el directorio system de la corrida. $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ decomposeParDict $ mv decomposeParDict system / Editar en ese archivo el número de procesadores a usar. Descomponer el dominio y la condición inicial: $ decomposePar Ejecutar el solver correspondiente en paralelo: $ mpirun −np 4 l a p l a c i a n F o a m − p a r a l l e l 3. Trabajando con la ecuación de transporte Ubicarse en la terminal dentro de la carpeta de corridas antes creada. Luego copiar uno de los ejemplos presentes en la carpeta de OpenFOAM: $ cp −r / opt / openfoam230 / t u t o r i a l s / b a s i c / scalarTransportFoam / p i t z D a i l y / . $ cd p i t z D a i l y Este caso corresponde a un flujo dentro de una geometrı́a en que existe un escalón. El campo de velocidades en sı́ no se resuelve, sino que se toma como un resultado previo, de un solver distinto. Lo que se simula en este caso es el transporte advectivo y la difusión de un escalar en ese campo de velocidades. Al igual que en el caso anterior, el caso está prácticamenete listo para correr. Solo hace falta crear la malla y lanzar la corrida: $ blockMesh $ scalarTransportFoam 4 Y para observar los resultados: $ touch p i t z D a i l y . foam $ paraview p i t z D a i l y . foam 3.1. Ejercicios El solver scalarTransportFoam solo resuelve el transporte de un escalar pasivo. ∂T − ∇ · (U T ) − ∇ · (Dt ∇T ) = 0 (2) ∂t En este ejercicio vamos a modificar el solver para agregar un decaimiento lineal al escalar. ∂T − ∇ · (U T ) − ∇ · (Dt ∇T ) = −Cd T ∂t 3.1.1. (3) Ejercicio 1 Modificar el solver. Para eso es necesario: Copiar el código del solver por defecto a la carpeta de usuario y cambiarle el nombre a scalarTransportDecayFoam. Por ejemplo: $ cp −r / opt / openfoam230 / a p p l i c a t i o n s / s o l v e r s / b a s i c / s c a l a r T r a n s p o r t F o a m / $HOME/ scalarTransportDecayFoam Cambiar el nombre del archivo principal del solver (scalarTransportDecayFoam .C) Dentro del archivo Make/files: • Corregir el nombre del archivo fuente y del archivo ejecutable resultante • Reemplazar en el directorio de destino FOAM APPBIN por FOAM USER APPBIN . Esto indica a OpenFOAM que el archivo compilado debe colocarse en una carpeta dentro del home del usuario, y no en donde están los binarios originales de OpenFOAM (que el usuuario normal no tiene privilegios para escribir). 5 Dentro del código fuente ( createFields .H) agregar un nuevo parámetro que se lee desde el diccionario transportProperties: I n f o << ” Reading d i f f u s i v i t y DT\n” << e n d l ; d i m e n s i o n e d S c a l a r DT ( t r a n s p o r t P r o p e r t i e s . lookup ( ”DT” ) ); I n f o << ” Reading decay c o e f f i c i e n t Cd\n” << e n d l ; d i m e n s i o n e d S c a l a r CD ( t r a n s p o r t P r o p e r t i e s . lookup ( ”CD” ) ); Dentro de la rutina principal agregar el término de decaimiento. Simplemente: solve ( fvm : : ddt (T) + fvm : : d i v ( phi , T) − fvm : : l a p l a c i a n (DT, T) + CD ∗ T == f v O p t i o n s (T) ); Compilar el solver $ wmake 3.1.2. Ejercicio 2 Modificar el caso para correrlo con el nuevo solver: Copiar la corrida con otro nombre. Borrar los pasos de cálculo anteriores si es necesario. 6 En el archivo constant/transportProperties agregar: CD CD [ 0 0 −1 0 0 0 0 ] 1 0 ; Correr el solver con decaimiento: $ scalarTransportDecayFoam Comparar los resultados con los simulados sin decaimiento. Experimentar con distintos valores de Dt y Cd . 4. Archivos adicionales $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ c a s o D i f u s i o n . t a r . gz $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ p i t z D a i l y . t a r . gz $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ p i t z D a i l y D e c a i m i e n t o . t a r . gz $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ scalarTransportDecayFoam . t a r . gz $ wget h t t p s : / / d l . d r o p b o x u s e r c o n t e n t . com/u /19198096/ decomposeParDict 7