本文跟着文献学习OpenFOAM,菜鸟根据文献做了一遍,总结记录一下。
输运方程
OpenFOAM中的interFoam 求解器是基于VOF模型,用于求解两相不可压缩流体,具体可以参考东岳流体。
在interFooam求解器中添加温度输运方程:
∂
ρ
T
∂
t
+
∇
⋅
(
ρ
U
T
)
−
∇
⋅
(
D
e
f
f
∇
T
)
=
0
\frac{\partial \rho T}{\partial t}+\nabla\cdot ( \rho \mathbf{U} T )-\nabla\cdot ( D_{eff} \nabla T )=0
∂t∂ρT+∇⋅(ρUT)−∇⋅(Deff∇T)=0
D
e
f
f
D_{eff}
Deff是混合相的导热系数:
D
e
f
f
=
α
k
1
C
v
1
+
(
1
−
α
)
k
2
C
v
2
D_{eff}=\frac{\alpha k_1}{C_{v1}}+\frac{(1-\alpha) k_2}{C_{v2}}
Deff=Cv1αk1+Cv2(1−α)k2
其中
k
1
,
k
2
,
C
v
1
,
C
v
2
k_1, \ k_2, \ C_{v1}, \ C_{v2}
k1, k2, Cv1, Cv2表示各相的导热系数和热容。
具体步骤
将interFoam求解器拷贝到用户工作目录下并重命名为heatTransferTwoPhaseSolver:
cp -r $FOAM_SOLVERS/multiphase/interFoam/ \ $FOAM_RUN/../applications/
cd $FOAM_RUN/../applications/
mv interFoam heatTransferTwoPhaseSolver
cd heatTransferTwoPhaseSolver
mv interFoam.C heatTransferTwoPhaseSolver.C
相应的Make目录中files文件中的内容也需要修改:
sed -i s/"interFoam"/"heatTransferTwoPhaseSolver"/g heatTransferTwoPhaseSolver.C
sed -i s/"interFoam"/"heatTransferTwoPhaseSolver"/g Make/files
sed -i s/"FOAM_APPBIN"/"FOAM_USER_APPBIN"/g Make/files
删除其中不需要修改的文件:
rm -rf interMixingFoam/overInterDyMFoam/
rm alphaSuSp.H createFields.H correctPhi.H initCorrectPhi.H rhofs.H pEqn.H UEqn.H
修改Make目录中options文件中的内容,使求解器使用interFoam中的文件以及VoF中的文件:
INC=\
-I$(FOAM_SOLVERS)/multiphase/interFoam \
-I$(FOAM_SOLVERS)/multiphase/VoF \
...
然后使用wmake可以编译新的求解器heatTransferTwoPhaseSolver,此时这个新求解器和interFoam是完全一样的。
接下来需要创建两个新文件:createHeatTransferFields.H和TEqn.H。
createHeatTransferFields.H,用于添加温度场和热传导系数:
// 从twoPhaseProperties中读取各相导热系数等
const dictionary& phase1dict = mixture.subDict ("phase1");
const dictionary& phase2dict = mixture.subDict ("phase2");
auto k1 (phase1dict.get<dimensionedScalar>("k"));
auto Cv1(phase1dict.get <dimensionedScalar>("Cv"));
auto k2(phase2dict.get <dimensionedScalar>("k"));
auto Cv2(phase2dict.get <dimensionedScalar>("Cv"));
volScalarField T
(
IOobject
(
"T", // 文件名
runTime.timeName(), // 文件位置
mesh, // Object registry
IOobject::MUST_READ, // 必须读取
IOobject::AUTO_WRITE // 自动保存
),
mesh
);
volScalarField Deff
(
"Deff",
(alpha1*k1/Cv1 + (1.0 - alpha1)*k2/Cv2)
);
TEqn.H:
Deff == alpha1*k1/Cv1 + (1.0 - alpha1)*k2/Cv2;
solve
(
fvm::ddt(rho, T)
+ fvm::div(rhoPhi, T)
- fvm::laplacian(Deff, T)
);
在heatTransferTwoPhaseSolver.C中,需要包含上面两个新创建的文件:
int main(int argc, char *argv[])
{
#include "postProcess.H"
#include "addCheckCaseOptions.H"
#include "setRootCaseLists.H"
#include "createTime.H"
#include "createDynamicFvMesh.H"
#include "initContinuityErrs.H"
#include "createDyMControls.H"
#include "createFields.H"
#include "createAlphaFluxes.H"
#include "initCorrectPhi.H"
#include "createUfIfPresent.H"
#include "createHeatTransferFields.H"
...
while (pimple.loop())
{
...
mixture.correct();
if (pimple.frozenFlow())
{
continue;
}
#include "TEqn.H"
#include "UEqn.H"
...
}
最后,编译新的求解器:
wclean
wmake
设置算例
算例模拟一个2D上升的气泡。
在0文件夹中温度场T:
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2012 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
location "0";
object T;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 0 0 1 0 0 0];
internalField uniform 300;
boundaryField
{
bottom
{
type zeroGradient;
}
top
{
type zeroGradient;
}
left
{
type zeroGradient;
}
right
{
type zeroGradient;
}
frontAndBack
{
type empty;
}
}
// ************************************************************************* //
在system文件夹中setFieldsDict文件用于初始化温度场:
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2012 |
| \\ / A nd | Website: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object setFieldsDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
defaultFieldValues
(
volScalarFieldValue alpha.phase1 0
volVectorFieldValue U (0 0 0)
volScalarFieldValue T 300
);
regions
(
sphereToCell
{
centre (1 1 0);
radius 0.2;
fieldValues
(
volScalarFieldValue alpha.phase1 1
volScalarFieldValue T 500
);
}
);
// ************************************************************************* //
constant目录下,transportProperties文件包含了两相性质:
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM Extend Project: Open Source CFD |
| \\ / O peration | Version: v2012 |
| \\ / A nd | Website: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.2;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
phases (phase1 phase2);
phase1
{
transportModel Newtonian;
nu nu [ 0 2 -1 0 0 0 0 ] 1e-02;
rho rho [ 1 -3 0 0 0 0 0 ] 100;
k k [ 1 1 -3 -1 0 0 0] 100;
Cv Cv [ 0 2 -2 -1 0 0 0] 100;
...
}
phase2
{
transportModel Newtonian;
nu nu [ 0 2 -1 0 0 0 0 ] 1e-02;
rho rho [ 1 -3 0 0 0 0 0 ] 1000;
k k [ 1 1 -3 -1 0 0 0] 1000;
Cv Cv [ 0 2 -2 -1 0 0 0] 1000;
...
}
sigma sigma [ 1 0 -2 0 0 0 0 ] 24.5;
// ************************************************************************* //
添加Allclean,Allrun脚本,运行算例。
气泡温度场模拟结果如图:
[1]: MARIĆ T, HÖPKEN J, MOONEY K G. The OpenFOAM® Technology Primer[J]. 424.