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


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

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

计算结果

从速度场动图可以看出,上方多孔介质区域成功模拟了固体凸台的效果
对比使用边界条件模拟固体(下方)和使用多孔介质模拟固体(上方),得到的流场几乎完全相同
OpenFOAM编程:VOF法与多孔介质模型相结合_第1张图片
以下是压力场OpenFOAM编程:VOF法与多孔介质模型相结合_第2张图片

你可能感兴趣的:(流体力学,固体火箭发动机仿真,学习,经验分享)