TFM Digital
TFM Digital
TFM Digital
DESARROLLO DE CÓDIGOS
NUMÉRICOS EN OPENFOAM
PARA LA SIMULACIÓN DE
PROCESOS DE TRANSMISIÓN
DE CALOR
Julio, 2018
Universidad de Jaén
Escuela Politécnica Superior de Jaén
Departamento de Ingeniería Mecánica y Minera
Don Patricio Bohórquez Rodríguez de Medina , tutor del Proyecto Fin de Carrera
titulado: Desarrollo de códigos numéricos en OpenFOAM para la simulación de
procesos de transmisión de calor, que presenta Alejandro Ruiz Martínez, autoriza
su presentación para defensa y evaluación en la Escuela Politécnica Superior de Jaén.
Índice
1 Introducción y motivación. ................................................... 6
1.1 Objetivo del Trabajo de fin Máster ............................................................................. 7
1.2 Software: OpenFoam ................................................................................................. 7
1.2.1 Breve descripción sobre OpenFOAM .................................................................... 7
1.2.2 Fundamentos ......................................................................................................... 8
1.2.3 La estructura de OpenFOAM ............................................................................... 10
1.2.4 Códigos numéricos estándar ............................................................................... 12
1.2.5 Algunas utilidades estándar ................................................................................. 14
2
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
3
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Resumen
4
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Agradecimientos
5
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
1 Introducción y motivación.
6
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
OpenFOAM fue creada por Henry Weller en 1989 bajo el nombre de FOAM y fue
lanzada al mercado como “OpenFOAM”. Sus principales autores son Henry Weller,
Chris Greenshields y Mattijs Janssens desde diciembre de 2004. Desde entonces,
OpenFOAM ha continuado actualizándose y lanzando nuevas versiones para el
público cada año, actualmente la última versión es la 5.0.
7
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
1.2.2 Fundamentos
consigue que sea muy fácil de leer, entender, modificar y/o añadir nuevas
características.
Sin embargo, OpenFOAM no viene con una GUI (Graphical User Interface), todo
está controlado a través del terminal y esto puede crear problemas, especialmente si
el usuario no está familiarizado con el entorno LINUX.
9
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
10
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Destacar que en cada uno de los archivos de este software la cabecera y el sub-
diccionario FoamFile aparecerán siempre describiendo la versión del software que se
está utilizando, la clase, carpeta origen y objeto, etc.
/*-----------------------------------*- C++ -*--------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 2.3.1 |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*----------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application icoFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 0.005;
writeControl timeStep;
writeInterval 20;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //
Nota: Para mantener claridad y ahorrar espacio, la cabecera será omitida en futuros códigos que se
expondrán a lo largo de este trabajo.
11
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Debe recalcarse que los campos en OpenFOAM siempre deben ser inicializados,
incluso cuando la solución no lo requiera, como los problemas estáticos. Es también
muy común encontrar otros archivos, los cuales detallan otras características
adicionales utilizadas en la simulación. Este es el caso del directorio:
12
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
• Flujo incompresible:
• Flujo compresible:
13
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
También para esta versión existe una variante que utiliza para la
aproximación Boussinesq (buoyantBoussinesqPimpleFoam).
• Otros
Aquí se han señalado algunos, aunque existen mucho más y sus campos de
actuación pueden ser:
• Combustión.
• Flujos de partículas.
• Electromagnetismo.
• Finanzas.
• Pre-procesado:
14
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
• Generación de malla:
• Conversión de malla:
• Manipulación de malla:
15
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
o Co: calcula y escribe el número de Courant obtenido del campo phi como
un volScalarField.
• Post-processing en turbulencia:
• Procesamiento en paralelo:
16
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
17
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
2.1 Resumen
Por lo tanto, este documento presentará cuatro casos de gran interés ingenieril
para simular. El primero de ellos o Caso A, se basa en la transferencia de calor por
conducción y convección en un problema multiregión, es decir, la simulación se
realizará involucrando fluido y sólido de forma que la caracterización del mallado será
un parte fundamental de la simulación.
18
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Las ideas más sólidas sobre los métodos de solución numérica de ecuaciones
de derivadas parciales se establecieron hace más de un siglo, pero su uso práctico
solo comenzó a partir de 1950, cuando aparecieron las primeras computadoras.
Aunque los primeros ordenadores eran extremadamente costosos y tenían un
rendimiento relativamente bajo, la ratio coste-rendimiento ha ido aumentando
considerablemente hasta nuestros días e incluso ahora no muestra signos de
desaceleración. Con la incasable evolución de los ordenadores, el interés en las
técnicas numéricas ha aumentado drásticamente. El campo de la ingeniería
relacionado con la dinámica de fluidos computacional (CFD) ha experimentado un
gran avance gracias a este desarrollo pudiendo llegar a una solución de compromiso
de las ecuaciones que gobiernan la mecánica de fluidos.
19
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Como resultado, nosotros obtenemos una ecuación algebraica para cada CV, en
la cual un número de nodos vecinos aparecen. Este método se usa con cualquier tipo
de malla y es bastante aconsejable para geometrías complejas. Ya que la malla sólo
especifica las fronteras del volumen de control, no es necesario que esté emparejado
con un sistema de coordenadas.
21
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Utilidades Runner: son las encargadas de empezar y controlar los archivos run
(serie de comando secuenciales) en OpenFoam. La mayoría de estas herramientas
son usadas para comenzar simulaciones en paralelo (el número de procesadores y
host-file debe ser proporcionado por el usuario dependiendo de la implementación
MPI).
Utilidades para Logfiles: Estas herramientas son usadas para analizar los
resultados de los solvers de OpenFOAM que han sido escritos en un archivo .log:
• Utilidades Networking.
• Otras.
• Herramientas GUI.
• Utilidades especiales.
𝜕𝜌 (1)
⃗)=0
+ 𝛻 · (𝜌𝑉
𝜕𝑡
o Componente x:
23
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
o Componente y:
o Componente z:
• Ecuación de energía:
𝜕
⃗
(𝜌𝐸) + 𝛻 · 𝜌𝐸𝑉
𝜕𝑡
𝜕 𝜕𝑇 𝜕 𝜕𝑇 𝜕 𝜕𝑇 𝜕(𝑢𝑝) 𝜕(𝑣𝑝) 𝜕(𝑤𝑝)
= 𝜌𝑞̇ + (𝑘 ) + (𝑘 ) + (𝑘 ) − − −
𝜕𝑥 𝜕𝑥 𝜕𝑦 𝜕𝑦 𝜕𝑧 𝜕𝑧 𝜕𝑥 𝜕𝑦 𝜕𝑧
(5)
𝜕(𝑢𝜏𝑥𝑥 ) 𝜕(𝑢𝜏𝑦𝑥 ) 𝜕(𝑢𝜏𝑧𝑥 ) 𝜕(𝑢𝜏𝑥𝑦 ) 𝜕(𝑢𝜏𝑦𝑦 ) 𝜕(𝑢𝜏𝑧𝑦 ) 𝜕(𝑢𝜏𝑥𝑧 )
+ + + + + + +
𝜕𝑥 𝜕𝑦 𝜕𝑧 𝜕𝑥 𝜕𝑦 𝜕𝑧 𝜕𝑥
𝜕(𝑢𝜏𝑦𝑧 ) 𝜕(𝑢𝜏𝑧𝑧 )
+ + ⃗
+ 𝜌𝑓 · 𝑉
𝜕𝑦 𝜕𝑧
donde:
• 𝜌 es la densidad
• 𝑉 ⃗ = 𝑢𝑖 + 𝑣𝑗 + 𝑤𝑘⃗
⃗ es el vector velocidad; 𝑉
• 𝑝 es la presión
• 𝑔 es la gravedad
• 𝑇 es la temperatura
24
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
• 𝑘 es la conductividad térmica
ℎ = 𝑐𝑝 𝑇 (6)
𝜌 = 𝜌(𝑝, 𝑇)
(7)
𝑢̂ = 𝑢̂(𝑝, 𝑇)
25
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝑝 = 𝜌𝑅𝑇 (8)
𝑢̂ = 𝑐𝑣 𝑇 + 𝑐𝑡𝑒 (9)
𝑢
⃗ =𝑣=𝑧=0 (10)
𝑇 = 𝑇𝑤 (11)
𝜕𝑇 (12)
𝑞𝑤̇ = −(𝑘 )
𝜕𝑛 𝑤
Un caso especial para esta condición de contorno puede ser usada para modelar
paredes adiabáticas, estableciendo un gradiente nulo de temperatura a lo largo de
normal a la superficie. La expresión es:
𝜕𝑇 (13)
( ) =0
𝜕𝑛 𝑤
𝜕𝑇 (14)
𝑎𝑇 + 𝑏 =𝑔
𝜕𝑛
𝜕𝑇 (15)
𝑘 + ℎ(𝑇 − 𝑇∞ ) = 0
𝜕𝑛
𝑞̇ = ℎ(𝑇 − 𝑇∞ ) (16)
calor son uniformes. Además, las condiciones de contorno convectivas son usadas a
menudo donde los efectos combinados del flujo están agrupados con el coeficiente
térmico de convección, el cual se obtiene empíricamente. Este coeficiente no es una
propiedad del material, sino que depende de muchos factores como la geometría,
superficie, distribución de temperatura, condiciones de flujo, propiedades termo-
físicas del fluido, etc. Para muchas aplicaciones, puede no ser práctico o posible
obtener este parámetro empíricamente.
28
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
3 CASO A:
Transferencia de calor por conducción y convección en
problema multiregión.
29
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝑞 = −𝑘𝛻𝑇 (17)
donde:
• 𝑞 [𝑊 ⁄𝑚 ²] es la densidad de flujo.
30
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝑑𝑄 (18)
= ℎ𝐴(𝑇𝑠 (𝑡) − 𝑇∞ )
𝑑𝑡
donde:
32
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
donde:
#include "fvCFD.H"
#include "rhoThermo.H"
#include "turbulenceModel.H"
#include "fixedGradientFvPatchFields.H"
#include "regionProperties.H"
#include "compressibleCourantNo.H"
#include "solidRegionDiffNo.H"
#include "solidThermo.H"
#include "radiationModel.H"
#include "fvIOoptionList.H"
#include "coordinateSystem.H"
#include "fixedFluxPressureFvPatchScalarField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
#include "setRootCase.H"
#include "createTime.H"
regionProperties rp(runTime);
#include "createFluidMeshes.H"
#include "createSolidMeshes.H"
#include "createFluidFields.H"
33
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
#include "createSolidFields.H"
#include "initContinuityErrs.H"
#include "readTimeControls.H"
#include "readSolidTimeControls.H"
#include "compressibleMultiRegionCourantNo.H"
#include "solidRegionDiffusionNo.H"
#include "setInitialMultiRegionDeltaT.H"
while (runTime.run())
{
#include "readTimeControls.H"
#include "readSolidTimeControls.H"
#include "readPIMPLEControls.H"
#include "compressibleMultiRegionCourantNo.H"
#include "solidRegionDiffusionNo.H"
#include "setMultiRegionDeltaT.H"
runTime++
Info<< "Time = " << runTime.timeName() << nl << endl;
if (nOuterCorr != 1)
{
forAll(fluidRegions, i)
{
#include "setRegionFluidFields.H"
#include "storeOldFluidFields.H"
}
}
// --- PIMPLE loop
for (int oCorr=0; oCorr<nOuterCorr; oCorr++)
{
bool finalIter = oCorr == nOuterCorr-1;
forAll(fluidRegions, i)
{
Info<< "\nSolving for fluid region "
<< fluidRegions[i].name() << endl;
#include "setRegionFluidFields.H"
#include "readFluidMultiRegionPIMPLEControls.H"
#include "solveFluid.H"
}
forAll(solidRegions, i)
{
Info<< "\nSolving for solid region "
<< solidRegions[i].name() << endl;
#include "setRegionSolidFields.H"
#include "readSolidMultiRegionPIMPLEControls.H"
#include "solveSolid.H"
}
}
runTime.write();
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
}
Info<< "End\n" << endl;
return 0;
}
34
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Ahora dentro de la función main() los siguientes archivos están incluidos antes de
correr el ciclo de la simulación. Estas únicamente contienen trozos de código que son
insertados en cada una de las localizaciones en el código general.
35
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
36
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Otra importante parte del código es el ciclo PIMPLE. Esto es un algoritmo basado
en una combinación de los algoritmos PISO (pressure-implicit split-operator) y
SIMPLE (semi-implicit method for pressure-linked equations). Para la mayoría de
aplicaciones en OpenFOAM, se utiliza tanto PISO, SIMPLE o su combinación en el
algoritmo PIMPLE. Estos algoritmos son procedimientos de iteración para el
acoplamiento de las ecuaciones de conservación de masa y momento. PISO y
PIMPLE son usado para problemas transitorios y SIMPLE para problemas
estacionarios.
Dentro del algoritmo PIMPLE las regiones fluidas se calculan primero y después
las sólidas son calculadas a través de los datos obtenidos del campo fluido. Ambas
son calculadas al mismo paso de tiempo, aunque convergen en iteraciones
separadas.
ℎ = 𝑐𝑝 · 𝑑𝑇 (19)
if (oCorr == 0)
{
#include "rhoEqn.H" //Mass conservation equation
}
#include "Ueqn.H" //Momentum equation
#include "Eeqn.H" //Thermal energy equation
// --- PISO loop
for (int corr=0; corr<nCorr; corr++)
{
#include "pEqn.H" //Pressure equation
}
turb.correct();
rho = thermo.rho();
37
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
tmp<fvScalarMatrix> hEqn
(
fvm::ddt(betav*rho, h)
- (
thermo.isotropic()
? fvm::laplacian(betav*thermo.alpha(), h, "laplacian(alpha,h)")
: fvm::laplacian(betav*taniAlpha(), h, "laplacian(alpha,h)")
)
==
fvOptions(rho, h)
);
hEqn().relax();
fvOptions.constrain(hEqn());
hEqn().solve(mesh.solver(h.select(finalIter)));
fvOptions.correct(h);
}
}
thermo.correct();
Info<< "Min/max T:" << min(thermo.T()) << ' ' << max(thermo.T()) << endl;
38
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
|---- fullCylinderMultiRegionScripting2.3.1
| |----- 0
| | |----- alphat
| | |----- epsilon
| | |----- k
| | |----- p
| | |----- p_rgh
| | |----- rho
| | |----- T
| | |----- U
| |----- constant
| | |----- extAir
| | | |----- g
| | | |----- radiationProperties
| | | |----- RASProperties
| | | |----- thermophysicalProperties
| | | |----- turbulenceProperties
| | |----- midSolid
| | | |----- radiationProperties
| | | |----- thermophysicalProperties
| | |----- polyMesh
| | | |----- blockMeshDict
| | |----- regionProperties
| |----- system
| | |----- extAir
| | | |----- changeDictionatyDict
| | | |----- fvSchemes
| | | |----- fvSolution
| | |----- midSolid
| | | |----- changeDictionatyDict
| | | |----- fvSchemes
| | | |----- fvSolution
| | |----- controlDict
| | |----- decomposeParDict
| | |----- extrudeMeshDict
| | |----- fvSchemes
| | |----- fvSolution
| | |----- meshQualityDict
| | |----- snappyHexMeshDict
| |----- run
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0.01 0 0); // Velocidad de 0.01 m/s en dirección x
boundaryField
40
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
{
".*"
{
type calculated;
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Nota: los encabezados en rojo en los próximos códigos presentados en este documento serán omitidos por
motivos de simplicidad. Únicamente se mostrarán los párrafos de código que sean relevantes para el objetivo
de este proyecto.
dimensions [0 1 -2 0 0 0 0];
value (0 -9.81 0);
radiation off;
radiationModel none;
RASModel laminar;
turbulence on;
41
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
printCoeffs on;
thermoType
{
type heRhoThermo;
mixture pureMixture;
transport const;
thermo hConst;
equationOfState rhoConst;
specie specie;
energy sensibleEnthalpy;
}
mixture
{
specie
{
nMoles 1;
molWeight 18;
}
equationOfState
{
rho 1000;
}
thermodynamics
{
Cp 4181;
Hf 0;
}
transport
{
mu 959e-6;
Pr 6.62;
convertToMeters .1;
vertices
(
(-5 -3 -.1)
(20 -3 -.1)
(20 3 -.1)
42
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
(-5 3 -.1)
(-5 -3 0.1)
(20 -3 0.1)
(20 3 0.1)
(-5 3 0.1)
);
blocks
(
hex (0 1 2 3 4 5 6 7) (50 12 1) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
exterior
{
type wall;
faces
(
(3 7 6 2)
(1 5 4 0)
);
}
inlet
{
type patch;
faces
(
(0 4 7 3)
);
}
outlet
{
type patch;
faces
(
(2 6 5 1)
);
}
front
{
type empty;
faces
(
(0 3 2 1)
);
}
back
{
type empty;
faces
(
(4 5 6 7)
);
}
);
43
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
mergePatchPairs
(
);
regions
(
fluid (extAir)
solid (midSolid)
);
Nota: los diccionarios fvSchemes y fvSolution que se encuentran en la carpeta raíz, y no dentro
de las carpetas correspondiente a las regiones fluida y sólida están vacías. Pero su inclusión
en el caso es necesaria para el éxito de la simulación.
Fluido Sólido
ddtSchemes ddtSchemes
{ {
default Euler; default Euler;
} }
gradSchemes gradSchemes
{ {
default Gauss linear; default Gauss linear;
} }
divSchemes divSchemes
{ {
default none; default none;
}
div(phi,U) Gauss upwind;
div(phi,K) Gauss linear; laplacianSchemes
div(phi,h) Gauss upwind; {
div(phi,k) Gauss upwind; default none;
div(phi,epsilon) Gauss upwind; laplacian(alpha,h) Gauss linear
div(phi,R) Gauss upwind; corrected;
div(R) Gauss linear; }
div((muEff*dev2(T(grad(U))))) Gauss
linear; interpolationSchemes
} {
default linear;
laplacianSchemes }
{
44
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
fluxRequired
{
default no;
p_rgh;
}
solvers solvers
{ {
"(rho|rhoFinal)" h
{ {
solver PCG solver PCG;
preconditioner DIC; preconditioner DIC;
tolerance 1e-7; tolerance 1e-06;
relTol 0; relTol 0.1;
} }
p_rgh hFinal
{ {
solver GAMG; $h;
tolerance 1e-7; tolerance 1e-06;
relTol 0.01; relTol 0;
}
smoother GaussSeidel; }
p_rghFinal
{
$p_rgh;
tolerance 1e-7;
relTol 0;
}
"(U|h|k|epsilon|R)"
{
solver PBiCG;
preconditioner DILU;
tolerance 1e-7;
relTol 0.1;
}
45
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
"(U|h|k|epsilon|R)Final"
{
$U;
tolerance 1e-07;
relTol 0;
}
}
PIMPLE
{
momentumPredictor on;
nCorrectors 2;
nNonOrthogonalCorrectors 0;
}
relaxationFactors
{
fields
{
}
equations
{
"h.*" 1;
"U.*" 1; }
}
A continuación, se puede ver que contiene dicho diccionario para la región fluida,
la región sólida tiene la misma estructura, pero contenido ajustado a sus propiedades.
dictionaryReplacement
{
// Ahora definimos las condiciones de contorno en el diccionario para no tener que
introducirlas a mano.
U
{
internalField uniform (0.01 0 0);
boundaryField
{
exterior
{
type fixedValue;
value uniform (0 0 0);
46
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
}
outlet
{
type inletOutlet;
inletValue uniform ( 0 0 0 );
value uniform ( 0.01 0 0 );
}
inlet
{
type zeroGradient;
value uniform (0.01 0 0);
}
"extAir_to_.*"
{
type fixedValue;
value uniform (0 0 0);
}
}
}
T
{
internalField uniform 300;
boundaryField
{
inlet
{
type fixedValue;
value uniform 300;
}
outlet
{
type inletOutlet;
inletValue uniform 300;
value uniform 300;
}
exterior
{
type zeroGradient;
}
"extAir_to_.*"
{
type compressible::turbulentTemperatureCoupledBaffleMixed;
Tnbr T;
kappa fluidThermo;
kappaName none;
value uniform 300;
}
}
}
epsilon
{
internalField uniform 0.01;
boundaryField
{
inlet
{
type fixedValue;
47
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
k
{
internalField uniform 0.1;
boundaryField
{
inlet
{
type fixedValue;
value uniform 0.1;
}
outlet
{
type inletOutlet;
inletValue uniform 0.1;
value uniform 0.1;
}
exterior
{
type compressible::kqRWallFunction;
value uniform 0.1;
}
"extAir_to_.*"
{
type compressible::kqRWallFunction;
value uniform 0.1;
}
}
}
p
{
internalField uniform 100000;
boundaryField
{
inlet
{
type calculated;
value uniform 1e5;
48
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
}
outlet
{
type calculated;
value uniform 1e5;
}
exterior
{
type calculated;
value uniform 1e5;
}
"extAir_to_.*"
{
type calculated;
value uniform 1e5;
}
}
}
p_rgh
{
internalField uniform 100000;
boundaryField
{
inlet
{
type zeroGradient; //fixedFluxPressure; //fixedValue;
value uniform 1e5;
}
outlet
{
type fixedValue; //zeroGradient;
value uniform 1e5;
}
exterior
{
type zeroGradient; //fixedFluxPressure; //zeroGradient;
value uniform 1e5;
}
"extAir_to_.*"
{
type zeroGradient; //fixedFluxPressure; //zeroGradient;
//buoyantPressure;
value uniform 1e5;
}
}
}
}
49
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
geometry
{
midSolid
{
type searchableCylinder;
point1 (0 0 -0.01);
point2 (0 0 0.01);
radius 0.05;
}
extAir
{
type searchableBox;
min (-.5 -.3 -0.01);
max ( 2.0 .3 0.01);
}
};
castellatedMeshControls
{
// Refinement parameters
// ~~~~~~~~~~~~~~~~~~~~~
50
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
maxLocalCells 2000000;
maxGlobalCells 4000000;
minRefinementCells 0;
nCellsBetweenLevels 3;
// Specifies two levels for every surface. The first is the minimum level,
// every cell intersecting a surface gets refined up to the minimum level.
// The second level is the maximum level. Cells that 'see' multiple
// intersections where the intersections make an
// angle > resolveFeatureAngle get refined up to the maximum level.
refinementSurfaces
{
extAir
{
// Surface-wise min and max refinement level
level (1 2);
faceZone extAir;
cellZone extAir;
cellZoneInside inside;
}
midSolid
{
// Surface-wise min and max refinement level
level (2 3);
51
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
faceZone midSolid;
cellZone midSolid;
cellZoneInside inside;
}
}
// Region-wise refinement
// ~~~~~~~~~~~~~~~~~~~~~~
refinementRegions
{
}
// Mesh selection
// ~~~~~~~~~~~~~~
locationInMesh (0 0 0);
allowFreeStandingZoneFaces false;
}
snapControls
{
//- Number of patch smoothing iterations before finding correspondence
// to surface
nSmoothPatch 3;
52
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
// If points get not extruded do nGrow layers of connected faces that are
// also not grown. This helps convergence of the layer addition process
// close to features.
// Note: changed(corrected) w.r.t 17x! (didn't do anything in 17x)
nGrow 0;
// Advanced settings
53
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
// Overall max number of layer addition iterations. The mesher will exit
// if it reaches this number of iterations; possibly with an illegal
// mesh.
nLayerIter 50;
}
// Advanced
Como se dijo al inicio de este trabajo, OpenFOAM no trabaja con mallas 2D. Por
lo que es necesario otorgar de un espesor significativo a la geometría para poder
simular. La herramienta para ello es extrudeMesh (extrudeMeshDict). Esta
utilidad otorga de espesor a los hexaedros que ha creado blockMesh, dándole a la
simulación un carácter tridimensional. A continuación, se muestra el contenido de
dicho archivo.
54
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
// What to extrude:
// patch : from patch of another case ('sourceCase')
// mesh : as above but with original case included
// surface : from externally read surface
constructFrom patch;
sourceCase ".";
sourcePatches (front);
// If construct from patch: patch to use for back (can be same as sourcePatch)
exposedPatchName back;
// Flip surface normals before usage. Valid only for extrude from surface or
// patch.
flipNormals false;
nLayers 1;
expansionRatio 1.0;
linearNormalCoeffs
{
thickness 0.02;
}
// Do front and back need to be merged? Usually only makes sense for 360
// degree wedges.
mergeFaces false; //true;
Por lo tanto, una vez explicado los diccionarios que se encuentran en la carpeta
raíz del caso, se está en disposición de discretizar el dominio computacional y
establecer los preparativos necesarios para lanzar la simulación. El paso siguiente es
la preparación de malla. Para ello se aplicarán los siguientes diccionarios: blockMesh
seguido de extrudeMesh y por último snappyHexMesh. Con esto obtenemos unas
características de malla como se muestra en la ilustración 3, 4 y 5, respectivamente.
Destacar que la parte sólida y la fluida todavía no se han separado aún, todo es
un único dominio computacional. Si se ejecuta ahora la herramienta
splitMeshRegions en la consola de la siguiente forma:
55
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
56
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Finalmente, un objetivo adicional para los cuatros casos que se plantean en este
documento, es la creación de un script o conjunto de instrucciones que hagan todo el
proceso de mallado y lanzamiento de la simulación de manera automática.
57
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
for i in midSolid
do
rm -f 0*/$i/{mut,alphat,epsilon,k,U,p_rgh}
done
paraFoam -touchAll
chmod +x run
./run
58
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
3.5 Resultados
paraview
59
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
60
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
61
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
3.6 Conclusiones
El código numérico expuesto en este apartado ha servido para obtener una visión
global de cómo se puede simular un problema que involucra transferencia de calor
con dominios computacionales totalmente distintos. En conjunto se puede considerar
62
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Además, las simulaciones en el mundo industrial cada vez más están cobrando
relevancia debido al impacto económico que conllevan. Mediante los resultados
obtenidos se puede llegar a detectar errores o problemas mucho antes incluso que la
fase de prototipado, reduciendo el proceso de validación y el coste económico
significativamente. Todo esto se traduce, en líneas generales, en una mayor eficiencia
en todo el proceso de producción, repercutiendo directamente en la competitividad de
la empresa.
63
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
4 CASO B:
Incorporación de calentamiento de sólido por efecto Joule y
radiación.
64
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
siendo:
Por otra parte, el potencial eléctrico, 𝑉𝑒, está también relacionado con el trabajo
que se debe realizar para llevar una carga desde un punto a otro. Es decir, el cambio
65
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
−𝑑𝑊 −1 (22)
𝑑𝑉𝑒 = = 𝐹 (𝑥, 𝑦) · 𝑑𝑙 = −𝐸⃗ · 𝑑𝑙
𝑞 𝑞
expresando las componentes del campo eléctrico en función del potencial obtenemos:
𝐸⃗ = −𝛻 · 𝑉𝑒 (24)
siendo:
𝑉𝑒 = 𝑅 · 𝐼 (26)
𝐸 = 𝐼² · 𝑅 · 𝑡 (27)
66
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
4.1.2 Radiación
67
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
o
∞ 2𝜋 𝜋 ⁄2 (33)
𝐸 = ∫0 ∫0 ∫0 𝐼𝜆,𝑒 (𝜆, 𝜃, 𝛷)𝑐𝑜𝑠(𝜃)𝑠𝑖𝑛(𝜃)𝑑𝜃𝑑𝛷𝑑𝜆
𝐸 = 𝜋𝐼𝑒 (34)
68
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
a una longitud de onda, incide sobre una superficie por unidad de área y longitud
de onda. La ecuación característica es:
2𝜋 𝜋 ⁄2 (35)
𝐺𝜆 (𝜆) = ∫0 ∫0 𝐼𝜆,𝑖 (𝜆)𝑐𝑜𝑠(𝜃)𝑠𝑖𝑛(𝜃)𝑑𝜃𝑑𝛷
𝐺 = 𝐺𝑟 + 𝐺𝑡 + 𝐺𝑎 (37)
𝐼𝜆,𝑖,𝑟𝑒𝑓(𝜆,𝜃,𝛷) (38)
𝜌𝜆,𝜃 =
𝐼𝜆,𝑖(𝜆,𝜃,𝛷)
𝐼𝜆,𝑖,𝑎𝑏(𝜆,𝜃,𝛷) (40)
𝛼𝜆,𝜃 =
𝐼𝜆,𝑖(𝜆,𝜃,𝛷)
69
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Radiosidad: se define como toda la energía radiante que sale de una superficie.
Esta radiación incluye la parte de irradiación reflejada al igual que la emisión directa.
La radiosidad espectral 𝐽𝜆 (𝑊⁄𝑚 ² · 𝜇𝑚) representa la variación la cual la radiación con
una determinada longitud de onda sale por unidad de superficie y por unidad de
longitud de onda.
2𝜋 𝜋 ⁄2 (41)
𝐽𝜆 (𝜆) = ∫0 ∫0 𝐼𝜆,𝑒+𝑟 (𝜆, 𝜃, 𝛷)𝑐𝑜𝑠(𝜃)𝑠𝑖𝑛(𝜃)𝑑𝜃𝑑𝛷
Por lo tanto, la radiosidad total 𝐽(𝑊⁄𝑚 ²) asociada con todo es espectro es:
∞
(42)
𝐽 = ∫ 𝐽𝜆 (𝜆)𝑑𝜆
0
2ℎ𝑐02 (43)
𝐼𝜆,𝑏 (𝜆, 𝑇) =
𝜆⁵[𝑒𝑥𝑝(ℎ𝑐0 ⁄𝜆𝑘𝐵𝑇)−1]
70
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
71
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
EXE = $(FOAM_USER_APPBIN)/jouleChtMultiRegionFoam
72
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
{
for (int nonOrth=0; nonOrth<=nNonOrthCorr; nonOrth++)
{
solve
(
fvm::laplacian(sigma, Vel)
);
}
Info<< "Min/max V:" << min(Vel) << ' '
<< max(Vel) << endl;
}
Ahora se modifican la ecuación de la entalpía tanto para fluido (EEqn.H) como para
sólido (solveSolid.H) para acoplar ambos problemas. Para el dominio sólido
entonces:
fvOptions(rho, h)
hEqn().relax();
PtrList<volScalarField> VFluid(fluidRegions.size());
PtrList<volScalarField> sigmaFluid(fluidRegions.size());
fluidRegions[i], fluidRegions[i],
IOobject::MUST_READ, IOobject::MUST_READ,
IOobject::AUTO_WRITE IOobject::AUTO_WRITE
), ),
fluidRegions[i] fluidRegions[i]
) )
); );
PtrList<volScalarField> VSolid(solidRegions.size());
PtrList<volScalarField> sigmaSolid(solidRegions.size());
Info<< " Adding to VSolid\n" << endl; Info<<"Adding to sigmaSolid\n" << endl;
VSolid.set sigmaSolid.set
( (
i, i,
new volScalarField new volScalarField
( (
IOobject IOobject
( (
"Vel", "sigma",
runTime.timeName(), runTime.timeName(),
fluidRegions[i], fluidRegions[i],
IOobject::MUST_READ, IOobject::MUST_READ,
IOobject::AUTO_WRITE IOobject::AUTO_WRITE
), ),
solidRegions[i] solidRegions[i]
) )
); );
Finalmente, solo queda añadir el archivo que contiene el campo eléctrico Veqn.H en
los códigos principales de cada dominio computacional. Como ya se añadió En
solveFluid.H:
#include "UEqn.H"
#include "EEqn.H"
#include "VEqn.H"
74
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Y en solveSolid.H:
fvOptions.correct(h);
}
#include "VEqn.H"
}
thermo.correct();
Como último paso se debe de compilar (./Allwmake) el solver para comprobar que
se ha realizado todo correctamente.
FoamFile FoamFile
{ {
version 2.0; version 2.0;
format ascii; format ascii;
class volScalarField; class volScalarField;
object Vel; object sigma;
} }
// * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * //
boundaryField boundaryField
{ {
".*" ".*"
{ {
type calculated; type calculated;
} }
} }
Añadimos las propiedades de las regiones tanto fluida (extAir) como sólida
(midSolid) en Vel y sigma, en el diccionario changeDictionaryDict. Esto nos
permitirá cambiar las condiciones de contorno de dichas variables de una forma
rápida, en caso de obtener datos poco coherentes en la solución. En extAir:
Vel sigma
75
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
{ {
internalField uniform 25; internalField uniform 70;
boundaryField boundaryField
{ {
inlet inlet
{ {
type zeroGradient; type fixedValue;
} value uniform 70;
outlet }
{ outlet
type zeroGradient; {
} type fixedValue;
exterior value uniform 70;
{ }
type fixedValue; exterior
value uniform 0; {
} type fixedValue;
extAir_to_midSolid value uniform 70;
{ }
type fixedValue; extAir_to_midSolid
value uniform 50; {
} type fixedValue;
midSolid_to_extAir value uniform 70;
{ }
type fixedValue; midSolid_to_extAir
value uniform 50; {
} type fixedValue;
} value uniform 70;
} }
}}
en midSolid:
Vel sigma
{ {
internalField uniform 25; internalField uniform 70;
boundaryField boundaryField
{ {
".*" ".*"
{ {
type empty; type empty;
value uniform 25; value uniform 70;
} }
midSolid_to_extAir extAir_to_midSolid
{ {
type fixedValue; type fixedValue;
value uniform 50; value uniform 70;
} }
extAir_to_midSolid midSolid_to_extAir
{ {
type fixedValue; type fixedValue;
value uniform 50; value uniform 70;
} }
} } } }
76
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
laplacianSchemes
{
...
laplacian(sigma,Vel) Gauss linear corrected;
}
Vel VelFinal
{ {
solver PCG; solver PCG;
preconditioner DIC; preconditioner DIC;
tolerance 1e-14; tolerance 1e-14;
relTol 0.1; relTol 0;
} }
Con todo esto, el caso está listo para simular. De igual forma que el caso anterior
ejecutamos un script (run) para hacer todos los pasos necesarios de forma
automática cambiando únicamente la aplicación. Esto se muestra a continuación:
paraFoam -touchAll
77
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
4.5 Resultados
78
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Otra propiedad importante a observar sería el campo térmico que provoca el efecto
Joule en dicho dominio computacional. Esto se puede observar en la siguiente
imagen.
79
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
80
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Este apartado pretende añadir una propiedad física adicional al Caso B anterior.
Esta es la radiación, que se ha explicado de manera breve en la sección 4.1.2. La
preparación de este caso es relativamente sencilla ya que la aplicación principal que
se ha estado utilizando chtMultiRegionFoam y joulechtMultiRegionFoam
implementa este tipo de comportamiento mediante diferentes modelos
computacionales. De forma que no es necesario modificar el solver, aunque sí que se
deberán adecuar algunos diccionarios.
• solarLoad: este modelo incluye características del sol, como los flujos reflexivos
y flujos radiactivos difusos.
81
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
dimensions [1 0 -3 0 0 0 0];
internalField uniform 0;
boundaryField
{
".*"
{
type calculated;
}
}
radiation on;
radiationModel P1;
absorptionEmissionModel constantAbsorptionEmission;
constantAbsorptionEmissionCoeffs
{
absorptivity absorptivity [ 0 -1 0 0 0 0 0 ] 0.5;
emissivity emissivity [ 0 -1 0 0 0 0 0 ] 0.5;
E E [ 1 -1 -3 0 0 0 0 ] 0;
}
scatterModel constantScatter;
constantScatterCoeffs
{sigma sigma [0 -1 0 0 0 0 0] 0;
C C [0 0 0 0 0 0 0] 0;
}
sootModel none;
radiation off;
radiationModel opaqueSolid;
absorptionEmissionModel constantAbsorptionEmission;
constantAbsorptionEmissionCoeffs
{
absorptivity absorptivity [ 0 -1 0 0 0 0 0 ] 0.0; //opaque
emissivity emissivity [ 0 -1 0 0 0 0 0 ] 1; //black hole
E E [ 1 -1 -3 0 0 0 0 ] 0;
}
constantScatterCoeffs
{
sigma sigma [0 -1 0 0 0 0 0] 0;
82
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
C C [0 0 0 0 0 0 0] 0;
}
sootModel none;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
En changeDictionaryDict: En fvSolution:
G G
{
internalField uniform 0; {
boundaryField solver PCG;
{ preconditioner DIC;
exterior tolerance 1e-5;
{ relTol 0.1;
type MarshakRadiation; }
value uniform 0;
T T; GFinal
emissivityMode lookup; {
emissivity uniform 1; solver PCG;
} preconditioner DIC;
inlet tolerance 1e-5;
{ relTol 0.1;
type MarshakRadiation; }
value uniform 0;
T T;
emissivityMode lookup;
emissivity uniform 1;
}
outlet
{
type MarshakRadiation;
value uniform 0;
T T;
emissivityMode lookup;
emissivity uniform 1;
}
front
{
type empty;
}
back
{
type empty;
83
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
}
extAir_to_midSolid
{
type MarshakRadiation;
value uniform 0;
T T;
emissivityMode lookup;
emissivity uniform 1;
}
}
}
4.7 Resultados
84
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
85
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
4.8 Conclusiones
86
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
5 CASO C:
Flujos incompresibles e inmiscibles multifásicos con distinta
temperatura.
87
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝛻 · ⃗⃗⃗
𝑉𝑔 = 0 (46)
𝜕𝜌𝑔,𝑓 ⃗⃗⃗⃗⃗⃗⃗
𝑉𝑔,𝑓 (47)
+ 𝛻 · (𝜌𝑔,𝑓 ⃗⃗⃗⃗⃗⃗⃗
𝑉𝑔,𝑓 ⃗⃗⃗⃗⃗⃗⃗
𝑉𝑔,𝑓 ) = −𝛻𝑝𝑔,𝑓 + 𝛻 · (𝜏̅̅′𝑔,𝑓 + 𝜏̅̅′′𝑔,𝑓 )
𝜕𝑡
donde
• 𝑡 es el tiempo.
• 𝑝 es la presión reducida; 𝑝 = 𝑃 − 𝜌𝑔 · 𝑥
• 𝑃 es la presión absoluta.
• 𝜌 es la densidad.
Entre ambas fases existe una superficie libre o interfase en la que se acoplan las
ecuaciones (46) y (47). Esta condición de contorno está compuesta por una condición
cinemática y otra dinámica.
88
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝑥 ∈ 𝛤: ⃗⃗⃗
𝑉𝑓 = ⃗⃗⃗
𝑉𝑔 , (𝜏̅𝑓 − 𝜏̅𝑔 ) · 𝑛⃗ = (𝑃𝑓 − 𝑃𝑔 + 𝜎𝜅) · 𝑛⃗ (48)
siendo
⃗ = 0; 𝑥 ∈ 𝛺
𝛻·𝑉 (50)
• ⃗⃗⃗
𝑉𝑓 → 𝑥 ∈ 𝑙í𝑞𝑢𝑖𝑑𝑜
• ⃗⃗⃗
𝑉𝑓 = ⃗⃗⃗
𝑉𝑔 → 𝑥 ∈ 𝛤
• ⃗⃗⃗
𝑉𝑔 → 𝑥 ∈ 𝑎𝑖𝑟𝑒
89
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝜌 = 𝜌𝑓 𝛾 + 𝜌𝑔 (1 − 𝛾) (51)
𝜇 = 𝜇𝑓 𝛾 + 𝜇𝑔 (1 − 𝛾) (52)
⃗
𝜕𝜌𝑉
⃗𝑉
+ 𝛻 · (𝜌𝑉 ⃗ ) = −𝛻𝑝 + 𝛻 · (𝜏̅̅) − 𝜎𝜅𝛻𝛾 − ⃗⃗⃗⃗
𝑔 · 𝑥 𝛻𝜌 (54)
𝜕𝑡
𝜕𝛾 (55)
⃗ ) + 𝛻 · [𝛾(1 − 𝛾)(𝑉
+ 𝛻 · (𝛾𝑉 ⃗⃗⃗𝑓 − ⃗⃗⃗
𝑉𝑔 )] = 0
𝜕𝑡
90
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
| |----- LTSInterFoam.C
| |----- setrDeltaT.H
| |----- Make
| |----- options
| |----- files
|----- Make
| |----- files
| |----- options
|----- InterMixingFoam
|----- interMixingFoam.C
|----- createFields.H
|----- alphaEqnsSubCycle.H
|----- alphaEqns.H
|----- threephaseInterfaceproperties
| |----- threephaseInterfaceproperties.C
| |----- threephaseInterfaceproperties.H
|----- incompressibleThreePhaseMixture
| |----- incompressibleThreePhaseMixture.C
| |----- incompressibleThreePhaseMixture.H
|----- immiscibleIncompressibleThreePhaseMixture
| |----- immiscibleIncompressibleThreePhaseMixture.C
| |----- immiscibleIncompressibleThreePhaseMixture.H
|----- Make
| |----- options
| |----- files
|----- InterDyFoam
|----- correctPhi.C
|----- interDyMFoam.C
|----- pEqn.H
|----- readControls.H
|----- Make
| |----- options
| |----- files
En este código numérico existen archivos comunes a los explicados en los casos
anteriores. Por lo que se omitirá su descripción. El código principal es el archivo
interFoam.C, el lector puede consultar el código en la referencia [19]. Los demás
archivos tienen como objetivo:
91
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
• incompressibleThreePhaseMixture.C
• incompressibleThreePhaseMixture.H
• immiscibleIncompressibleThreePhaseMixture.C
• immiscibleIncompressibleThreePhaseMixture.H: modelo de
transporte para una mezcla inmiscible incompresible de fases.
ambas regiones. Por ello, el objetivo de este caso se resume al acoplamiento en dicho
solver de la ecuación de la energía y simular el llenado de una cavidad sencilla. El
código pasará a llamarse interThermalFoam.
$WM_PROJECT_USER_DIR/src/transportModels/myincompressible).
DimensionedScalar rho1_;
DimensionedScalar rho2_;
DimensionedScalar cp1_;
DimensionedScalar cp2_;
DimensionedScalar Pr1_;
DimensionedScalar Pr2_;
93
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
};
const dimensionedScalar& cp1() conts
{
return cp1_;
};
const dimensionedScalar& cp2() conts
{
return cp2_;
};
const dimensionedScalar& Pr1() conts
{
return Pr1_;
};
const dimensionedScalar& Pr2() conts
{
return Pr2_;
};
Nota: En este apartado, no se han detallado todas las líneas de código correspondientes a todos los archivos
a modificar, debido a que supondría una extensión desmesurada del documento. Sin embargo, se ha
representado con un color gris claro aquellas líneas de código previas a la modificación o adicción de
código.
Esto se debe hacer de igual manera para cp2_, Pr_1 y Pr_2. Ahora en la
función de read():
Foam::tmp<Foam::surfaceScalarField>
Foam::myincompressibleTwoPhaseMixture::kappaf() const
{
94
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Para iniciar los campos escalares 𝑐𝑝 y 𝑇 así las variables 𝜌𝑐𝑝 y 𝜌𝜙𝑐𝑝 , ya que
todas aparecen en la ecuación de la energía, primero se debe de modificar
createFields.H. Por lo tanto, añadimos:
95
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
volScalarField rhoCp
(
IOobject
(
"rhoCp",
runTime.timeName(),
mesh,
IOobject::READ_IF_PRESENT
),
alpha1*rho1*cp1 + alpha2*rho2*cp2,
alpha1.boundaryField().types()
);
rhoCp.oldTime();
volScalarField rhoCpPhi
(
IOobject
(
"rhoCpPhi",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
fvc::interpolate(rhoCp)*phi
);
96
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
97
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
Dimensions [0 0 0 1 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type fixedValue;
value uniform 400;
}
outlet
{
type zeroGradient;
}
Right
{
type symmetryPlane;
}
wall
{
type fixedValue;
value uniform 300;
}
frontAndBack
{
type empty;
}
}
En fvSchemes:
En fvSolutions:
T
{
98
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
solver BICCG;
preconditioner DILU;
tolerance 1e-07;
relTol 0;
}
Finalmente, en setFieldDict:
defaultFieldValues
(
volScalarFieldValue alpha.water 0
volScalarFieldValue T 0
);
regions
(
boxToCell
{
box (0 0 -1) (0.1461 0.292 1);
fieldValues
(
volScalarFieldValue alpha.water 1
);
}
boxToCell
{
box (0.2 0.3 -1) (0.3 0.4 1);
fieldValues
(
volScalarFieldValue T 300
);
}
);
pyFoamClearCase.py /home/alex/Desktop/damTempbreak
5.5 Resultados
Una vez terminada la simulación para 6000s, en la que se han ido guardando
instante de tiempo cada 100s, que no asuste la gráfica obtenida de residuales. Como
se ha nombrado en varias ocasiones a lo largo de este proyecto, el carácter transitorio
de la simulación se refleja de esta manera.
99
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
100
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
5.6 Conclusiones
101
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
102
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
103
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
104
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
𝑘 = 𝑘0 − 𝑚𝑘 (𝑇 − 𝑇0 ) (60)
donde
Por lo tanto, vamos a adaptar dicho modelo para que incluya primero la
dependencia con la temperatura y luego lo incorporaremos al solver simpleFoam.
Este solver resuelve las ecuaciones de continuidad, cantidad de movimiento y energía
explicadas al inicio de este documento y las expresiones relacionas con la Reología
(49) (50).
106
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
$WM_PROJECT_DIR/applications/solvers/incompressible/simpleFoam
#include "fvCFD.H"
#include "singlePhaseTransportModel.H"
#include "RASModel.H"
#include "simpleControl.H"
#include "fvIOoptionList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simpleControl simple(mesh);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
while (simple.loop())
{
Info<< "Time = " << runTime.timeName() << nl << endl;
turbulence->correct();
runTime.write();
return 0;
}
108
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
tmp<fvScalarMatrix> TEqn
( fvm::div(phi, T)
- fvm::laplacian(TempD_, T) );
Teqn().relax();
solve(TEqn());
dimensionedScalar TempD_(laminarTransport.lookup("TempD"));
dimensionedScalar n_;
dimensionedScalar kslope_;
dimensionedScalar Tbase_;
109
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
k_(tempdeppowerLawCoeffs_.lookup("k")),
n_(tempdeppowerLawCoeffs_.lookup("n")),
kslope_(tempdeppowerLawCoeffs_.lookup("kslope")),
Tbase_(tempdeppowerLawCoeffs_.lookup("Tbase")),
Y en el Member Funtions :
(k_-kslope_*(T-Tbase_))
Una vez terminado los pasos anteriores, se puede preparar el tutorial que se
utilizará como base para la simulación. La geometría será el misma que el apartado C
y la estructura organizativa de ficheros es la siguiente:
|---- damBreak
| |----- 0
| | |----- p
| | |----- T
| | |----- U
| |----- constant
| | |----- RASProperties
| | |----- transportProperties
| | |----- polyMesh
| | | |----- blockMeshDict
| | | |----- boundary
| | | |----- faces
| | | |----- neighbour
| | | |----- owner
| | | |----- points
| |----- system
| | |----- controlDict
| | |----- fvSchemes
| | |----- fvSolution
| |----- run
110
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
111
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
FoamFile FoamFile
{ {
version 2.0; version 2.0;
format ascii; format ascii;
class dictionary; class dictionary;
location "constant"; location "constant";
object RASProperties; object transportProperties;
} }
// * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * //
RASModel laminar; transportModel tempdeppowerLaw;
turbulence off; nu nu [ 0 2 -1 0 0 0 0 ] 1;
112
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
6.5 Resultados
Una vez terminada la simulación, al igual que los demás casos, la herramienta
de post-procesado de OpenFoam conocida como Paraview ayuda a obtener un
resultado gráfico de los resultados. Además, mediante la herramienta Pyfoam, en
concreto pyFoamPlotWatcher.py se representan los residuales de la simulación.
113
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
114
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
7 Conclusiones finales
115
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
8 Bibliografía
[1] Christopher J. Greenshields, (2016). OpenFOAM User Guide 4.0 . England: OpenFOAM
Foundation Ltd.
[2] John D. Andersonm Jr., (1995). Computational Fluid Dynamics: The basics with applications. New
York: Mc Graw Hill Education.
[3] Frank P. Incropera, David P. DeWitt, Adrienne S. Lavine & Theodore L. Bergman (2011).
Fundamentals of Heat and Mass Transfer – 4th Edition. Canada: John Wiley & Sons, Inc.
[4] John D. Andersonm Jr., (1995). Computational Fluid Dynamics: The basics with applications. New
York: Mc Graw Hill Education.
[5] Randall J. LeVeque, (2006). Finite Difference Methods for Differential Equations. Seattle,
Washington: Siam (Society for Industrial & Applied Mathematics).
[6] Antonio Crespo Martínez, (2006). Mecánica de Fluidos. España, Madrid: Paraninfo, S.A.
[7] Bernhard F.W. Gschaider (2009). pyFoam - Happy foaming with Python. ICE Strömungsforschung,
Gothenburg.
[8] Bernhard F.W. Gschaider (2010). Automatization with pyFoam. ICE Strömungsforschung ,
Gothenburg.
[9] Pijush K.Kundu & Ira M.Cohen (2008). Fluid Mechanics. Fourth Edition. Academic Press, Elsevier
Inc. San Diego, USA.
[10] Jonh C. Tannehill, Dale A. Anderson, Richard H. Pletcher (1997). Computational Fluid Mechanics
and Heat Transfer. Second Edition. Taylor&Francis Ltd. Philadelphia, USA.
[13] Henry Weller, Chris Greenshields, Cristel de Rouvray. OpenFOAM, the OpenFOAM Foundation.
https://openfoam.org/
[14] Alessandro Bottaro, Joel Guerrero, Damiano Natali, Jan Pralits. Mesh generation using
snappyHexMesh. Wolf-Dynamics. http://www.wolfdynamics.com/wiki/meshing_OF_SHM.pdf
[15] Yuzhu Pearl Li. Implementation of multiple time steps for the multi-physics solver based on
chtMultiRegionFoam (2017). University of Stavanger.
http://www.tfd.chalmers.se/~hani/kurser/OS_CFD_2016/YuzhuPearlLi/final_report_Jan2017.pdf
[16] OpenCFD Ltd, OpenFOAM Trademark. ESI Group. OpenFOAM v1712 API – Thermophysical
models: Radiation models.
https://www.openfoam.com/documentation/cppguide/html/group__grpRadiationModels.html
[17] Patricio Bohórquez & Luis Parras. Curso de Mecánica de Fluidos Computacional Aplicada. Técnicas
Reunidas S.A. Escuela Politécnica Superior de Jaén, Universidad de Jaén; Escuela Politécnica
Superior de Ingenieros Industriales, Universidad de Málaga. http://blogs.ujaen.es/prmedina/wp-
content/uploads/2014/04/slides.pdf
116
Escuela Politécnica Superior de Jaén
Alejandro Ruiz Martínez Universidad de Jaén
[18] Rong Zhen, Roger I. Tanner & Xi-Jun Fan. (2011) Injection Molding; Integration of Theory and
Modeling Methods. University of Sydney. Australia. Springer.
[19] OpenFOAM Ltd. OpenFOAM v1712, The open source CFD toolbox; Extended Code Guide. (2018).
https://www.openfoam.com/documentation/cpp-guide/html/index.html
117
Escuela Politécnica Superior de Jaén