VOF法可以捕获两流体相的界面,可以将其中的一相区域设置为阻力很大的多孔介质,以模拟固体(流体不可侵入)。这样可以使VOF法捕获气-固界面。动量方程的源项为
S i = − D U i , 在 多 孔 介 质 区 域 内 S_{i}=-D U_{i},在多孔介质区域内 Si=−DUi,在多孔介质区域内
找到interFoam求解器的源代码/opt/openfoam9/applications/solvers/multiphase/interFoam
,将代码和Make文件夹一同复制到自己的工作目录。然后找到案例库中的溃坝模型/opt/openfoam9/tutorials/multiphase/interFoam/laminar/damBreak
,也放入工作目录
.
├── damBreak #测试案例
├── Make #编译规则
├── alphaSuSp.H #以下是interFoam的源代码
├── correctPhi.H
├── createFieldRefs.H
├── createFields.H
├── initCorrectPhi.H
├── interFoam.C
├── pEqn.H
├── rhofs.H
└── UEqn.H
在createFields.H中补充以下代码
//定义单位
const dimensionSet mydimension(1, -3, -1, 0, 0, 0, 0);//kg*m^-3*s^-1
//定义key场
volScalarField key(
IOobject(
"key",
runTime.timeName(),
mesh,
IOobject::NO_READ, //不从文件中读,而是直接在代码中生成
IOobject::AUTO_WRITE),
alpha1);
自定义单位并初始化key场,其中key场与alpha1场完全相同
为了添加源项,UEqn.H中最上方的若干行需要修改
MRF.correctBoundaryVelocity(U);
//根据alpha1场更新key场
for (label cellI=0; cellI<mesh.C().size(); cellI++)
{
if(alpha1[cellI]>0.001)
{
key[cellI]=alpha1[cellI];
}
else
{
key[cellI]=0;
}
}
fvVectorMatrix UEqn
(
fvm::ddt(rho, U) + fvm::div(rhoPhi, U)
+ MRF.DDt(rho, U)
+ turbulence->divDevTau(rho, U)
==
phaseChange.SU(rho, rhoPhi, U)
+ fvModels.source(rho, U)
- fvm::Sp(dimensionedScalar("tmp", mydimension, 1e10)*key,U)//根据key场定义源项
);
代码首先根据alpha1场更新key场,然后根据根据key场定义源项。需要注意的是使用fvm::Sp()
函数定义隐式的源项,可以大大提升收敛性
修改测试案例中constant/transportProperties文件。由于原本的“water”已经成为多孔介质,可以将其属性修改为外界的空气,同时不考虑张力
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
phases (water air);
water
{
transportModel Newtonian;
nu 1.48e-05;
rho 1;
}
air
{
transportModel Newtonian;
nu 1.48e-05;
rho 1;
}
sigma 0;
// ************************************************************************* //
修改测试案例中constant/setFieldsDict文件
/*--------------------------------*- C++ -*----------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Version: 9
\\/ M anipulation |
\*---------------------------------------------------------------------------*/
FoamFile
{
format ascii;
class dictionary;
location "system";
object setFieldsDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
defaultFieldValues
(
volScalarFieldValue alpha.water 0
);
regions
(
boxToCell
{
box (0.292 0.536 -1) (0.315999 0.584 1);
fieldValues
(
volScalarFieldValue alpha.water 1
);
}
);
// ************************************************************************* //
除此之外还应修改边界条件,使气体从左侧边界进入,右侧边界离开
最后,编译源程序,使用得到的可执行文件计算测试案例,这里不再赘述
从速度场动图可以看出,上方多孔介质区域成功模拟了固体凸台的效果
对比使用边界条件模拟固体(下方)和使用多孔介质模拟固体(上方),得到的流场几乎完全相同
以下是压力场