La importancia de no partir desde cero. Inicializar los campos fluidos con datos previos, un ejemplo interesante.

En las siguientes líneas se muestran un ejemplo del impacto sobre la solución del empleo de campos fluidos previamente calculados mediante solvers simples como punto de partida de solvers más completos. Los casos que se comparan son idénticos; mismos solvers, mallas, algoritmos de resolución, tolerancias… etc.
Soy consciente de que la malla usada no puede emplearse con la intención de obtener resultados de calidad, sin embargo no dispongo de recursos para emplear mallas de mayor resolución.
Tal vez recordarás con orgullo la primera vez que conseguiste que aparecieran en tu pantalla los colorines degradados fruto de tu primera simulación CFD. Seguramente pulsar botones y desplegar opciones, poner algún valor que te sonaba y seleccionar muchas otras cosas de las que no habías oído hablar nunca te condujeron al resultado.
Y es que esto del CFD siempre es confuso y algo frustrante desde el principio. Tal vez en aquella simulación llegaste sin querer, trasteando las opciones, a ver una gráfica fea que decía algo así como “Residuales”. Con el tiempo conseguir que las líneas de esa gráfica convergiesen de algún modo sería tu único y primordial objetivo, los colores quedarían en un segundo plano.
Ahora, aunque sabes que la convergencia no lo es todo -aunque sí parte- del proceso que te acerca a una solución realista del problema sigues persiguiendo esa convergencia de las variables.
En primer lugar tenemos que pensar en el significado que tiene “convergencia” para nuestro solver. Un solver, como lo entendemos en CFD, no es más que un modo de resolver unas determinadas ecuaciones de forma iterativa. Los procesos iterativos siempre tienen un criterio de parada que lleva a la finalización del algoritmo. En nuestro caso, nuestros solvers son algoritmos de resolución de sistemas de ecuaciones diferenciales, o más simple, de sistemas de ecuaciones lineales.
Estos sistemas se abordan de distinta forma según el algoritmo con el fin de hacer el proceso eficiente, pero en esencia su objetivo es el mismo que el algoritmo de Gauss-Seidel (el más conocido). El criterio de parada que se impone en estos algoritmos es que el valor de cada una de las variables en un determinada iteración (no necesariamente de ha de ser de todas) difiera “poco” del valor de esa misma variable en la siguiente iteración. La diferencia entre los valores de las variables en una iteración y la siguiente son lo que conocemos como ‘residuales’. Podemos hacer más cercana esa idea pensando en una “estabilidad” de la solución.
Seguramente ese “poco” del párrafo anterior te ha dejado algunos cabos sueltos. Bien, esa diferencia queda bien definida dentro de cada solver, veamos como se plantea en OpenFOAM mirando el fichero fvSolution:
solvers
{
   p
   {
     solver GAMG;
     tolerance 1e-06;
     relTol 0.1;
     smoother GaussSeidel;
     nPreSweeps 0;
     nPostSweeps 2;
     cacheAgglomeration true;
     nCellsInCoarsestLevel 10;
     agglomerator faceAreaPair;
     mergeLevels 1;
   }

   U
   {
     solver smoothSolver;
     smoother GaussSeidel;
     nSweeps 2;
     tolerance 1e-08;
     relTol 0.1;
   }

   nuTilda
   {
     solver smoothSolver;
     smoother GaussSeidel;
     nSweeps 2;
     tolerance 1e-08;
     relTol 0.1;
   }
}

SIMPLE
   {
     nNonOrthogonalCorrectors 0;
     pRefCell 0;
     pRefValue 0;

   residualControl
   {
     p 1e-5;
     U 1e-5;
     nuTilda 1e-5;
   }
}
Como podemos ver el criterio de parada para las tres variables en este caso es el mismo, 1e-5. OpenFOAM nos da acceso a esto para modificarlo libremente (=
Otro criterio interesante que podemos tocar en este punto son los factores de relajación. Éstos valores varían dependiendo del algoritmo que empleemos pero en esencia nos indican la variación máxima que permitimos a nuestras variables entre una iteración y la siguiente:
relaxationFactors
{
 fields
 {
 p 0.3;
 }
 equations
 {
 U 0.7;
 nuTilda 0.7;
 }
}
Aquí tenemos un ejemplo que he realizado con la misma malla y el mismo solver que empleé en el post anterior.
OpenFOAM nos permite emplear las condiciones finales (o las que deseemos) como punto de partida en otro solver. Sobra decir que los casos han de ser geométricamente iguales*.
Vamos a ver los resultados de los residuales:
Únicamente empleando simpleFoam.

residuales para simplefoam

simpleFoam + potentialFoam (solver para flujo potencial del cual extraemos una aproximación del campo de presiones y velocidades).residuales simplefoam + potentialfoam

 

Como podéis ver los resultados hablan por sí mismos. Iniciar los solvers con los valores de los campos fluidos de otros solvers más simples es un recurso básico pero potente que nos ayuda a alcanzar la convergencia en nuestras simulaciones. Esta es una regla recurrente que podemos aplicar múltiples veces siempre que los solvers crezcan en complejidad, por ejemplo:
potencial -> incompresible estacionario -> incompresible transitorio.
Sin embargo, como decía hace unas líneas, lograr la convergencia no significa todo, más bien nada. Vamos a pararnos a analizar los datos un minuto, podéis refrescar la memoria en el post anterior sobre cómo se han extraído los datos.
Los datos de presión que extraemos del campo son los siguientes, recordad que ambas soluciones habían alcanzado la convergencia*:
simpleFoam

presiones solo simplefoam

simpleFoam a partir de potentialFoam.presiones simpleFoam + potentialFoam
No estamos acostumbrados a ver los datos en este formato cuando se trata de analizar perfiles, así que vamos a hacer un poco de magia con Gnuplot y vamos a hacer que nos muestre el coeficiente de presiones directamente, os dejo de paso el script:

set title 'NACA 0012 alfa 0. \n simpleFoam.'
set yrange [] reverse
set ylabel 'Pressure coeff. Cp'
set xlabel 'chord x/c'
set grid
plot "sets/812/upper_surf_p.xy" u 1:($4/(0.5*30*30)) w lp pi 10 t 'Upper surface.',\
 "sets/812/lower_surf_p.xy" u 1:($4/(0.5*30*30)) w lp pi 10 t 'Lower surface.'

Volvamos a echar otro vistazo:
simpleFoam

coeficiente presiones simpleFoam

simpleFoam + potentialFoamcoeficiente de presiones simplefoam + potencial
Ahora son más familiares… pero, si ambas convergen para las mismas ecuaciones y la misma malla, ¿cómo puede ser que los resultados sean distintos?. La magia del CFD… Sin embargo nos asalta la duda, ¿cuál de los dos es cierto más aproximado? Vamos a por papers. Que empleemos el perfil Naca 0012 no es fortuito, seguramente sea el más documentado de los perfiles y no tardamos en encontrar información de calidad sobre él, como en este enlace de la NASA:
Datos publicados por la NASA en la web citada anteriormente.

Datos publicados por la NASA en la web citada anteriormente.

No cabe duda de que los datos conseguidos por el solver iniciado a partir de los datos del flujo potencial son los más acerdados.
Seguro que después de ver esto más de uno dedica un minuto al postprocesado de los datos..
*No necesariamente es cierto, OpenFOAM permite emplear por ejemplo datos de un patch extraído de otro caso y muchas cosas más, sin embargo en este artículo nos ocupa sólo el caso de inicializar dominios fluidos completos.
*simpleFoam no había alcanzado realmente la convergencia, pero la gráfica de residuales no cambia de tendencia, al menos hasta las 5000 iteraciones donde he llegado.
Esta entrada fue publicada en Aerodinamica, cfd, OpenFOAM y etiquetada , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s