OpenFOAM编程:VOF法与多孔介质模型相结合

目的

VOF法可以捕获两流体相的界面,可以将其中的一相区域设置为阻力很大的多孔介质,以模拟固体(流体不可侵入)。这样可以使VOF法捕获气-固界面。动量方程的源项为
S i = − D U i , 在 多 孔 介 质 区 域 内 S_{i}=-D U_{i},在多孔介质区域内 Si=DUi

OpenFOAM编程

找到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

添加key无量纲标量场

在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
        );
    }
);


// ************************************************************************* //

除此之外还应修改边界条件,使气体从左侧边界进入,右侧边界离开
最后,编译源程序,使用得到的可执行文件计算测试案例,这里不再赘述

计算结果

从速度场动图可以看出,上方多孔介质区域成功模拟了固体凸台的效果
在这里插入图片描述对比使用边界条件模拟固体(下方)和使用多孔介质模拟固体(上方),得到的流场几乎完全相同
在这里插入图片描述
以下是压力场在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jedi-knight

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值