OpenFOAM分段边界条件的设置

问题描述

在实际使用OpenFOAM中,我们经常会遇到根据平面上点的坐标给出边界条件的情况,例如一个三维方腔,在距离墙壁底端3m的位置上有一个直径0.5m的管道入口,流体从其中以恒定的流量流入计算域。在这样的背景下,我们就需要对这个壁面给定分段的边界条件。在本文中我们就具体讨论一下如何设置这样的边界条件。
壁面上的入流

具体步骤

我们用到的两个工具是creatPatch和topoSet。 creatPatch需要在算例的system文件下调用creatPatchDict文件,其原本用来调整周期性边界条件的位置,在这里我们直接用它来创建新的边界条件:

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  8
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      createPatchDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //


pointSync false;


writeCyclicMatch  false;


patches
(
    {

        name flowIn;   //新边界条件的名字
        patchInfo
        {
            type patch;  //新边界条件的类型,可以是patch,wall,cyclic等基础类型
        }
        constructFrom set; //从哪里新建边界条件,关键词可以设置为patch或者set,如果设置为patch则表示从已有的边界上创建新的边界条件,相当于修改边界条件的类型。在这里我们选择set,表示从一个face Set选区创建新的边界条件。
        set flowInSet;//选区的名字
    }

);

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

creatPatch在调整周期性边界条件位置时候还有许多高级用法,读者可以自行查阅OpenFOAM自带算例中的设置。
通过以上creatPatchDict文件,我们可以在flowInSet选区的位置上新建一个名为flowIn的边界。现在的核心问题转变为了如何创建这个flowInSet的选区。在这里,我们使用topoSet工具。在system文件夹下新建topoSetDict,其内容如下:

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  8
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      topoSetDict;
}

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

actions
(

    {
        name    flowInSetPri;
        type    cellSet;
        action  new;
        source  cylindeToCell;
	    sourceInfo
	    {
            p1 (-1 0 3);
            p2 (1 0 3);
            radius 0.5;
	    }
    }
    {
        name    flowInSet;
        type    faceSet;
        action  new;
        source  cellToFace;
        sourceInfo
        {
	        set	flowInSetPri;
	        option all;
        }
    }
    {
        name    flowInSet;
        type    faceSet;
        action  subset;
        source  patchToFace;
        sourceInfo
        {
            name  myWall;
        }
    }
    
);

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

在我们的案例中,原始壁面位于yoz平面,底边z坐标为0,壁面边界名字为myWall。在topoSetDict中,我们首先新建了一个名为flowInSetPri的圆柱体选区,这个圆柱体选区在myWall边界上的投影就是我们要定义的新边界条件的位置。紧接着我们又使用cellToface命令将flowInSetPri选区转化为一系列面选区flowInSet,在这些面选区中,与myWall边界重合的那个面就是我们最后要提取的面。为了提取这个选区,我们对flowInSet选区进行subset动作,表示取子集,选取子集的依据是patchToFace,即根据边界条件选取。我们将相应的patch选择为壁面myWall,这样就取出了flowInSet这个面集合与myWall壁面的交集,即我们要定义的新边界条件区域。
然后我们仅需要在算例目录下打开终端输入以下命令便可以得到一个名为flowIn的新边界条件了:

topoSet
createPatch -overwrite
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenFOAM 是一个开源的计算流体力学(CFD)软件包,它提供了广泛的功能和工具来模拟流体流动和传热问题。在 OpenFOAM 中,二次边界条件是指在边界上定义的非线性边界条件。 要定义一个二次边界条件,你需要在边界条件文件中指定一个函数,该函数描述了该边界上的非线性关系。下面是一个示例,展示了如何在 OpenFOAM 中定义一个二次边界条件: ```cpp // 在边界条件文件中定义二次边界条件 #include "fvCFD.H" // 定义边界条件 void fixedValueParabolicVelocityFvPatchVectorField::updateCoeffs() { const volScalarField& alpha = mesh().alphaEff(); const surfaceScalarField& phi = boundaryField()[patchI()].phi(); const scalarField& U = this->patchInternalField(); const vectorField& gradU = fvc::grad(U); const scalarField A = 1.0 - alpha; const vectorField gradA = fvc::grad(A); const scalarField C = A*phi - 0.5*alpha*magSqr(gradU) - dot(gradA, gradU); const vectorField D = U - dot(U, gradA)*gradA; const surfaceScalarField& alphaSf = alpha.boundaryField()[patchI()]; forAll(faceFlux_, faceI) { faceFlux_[faceI] = alphaSf[faceI]*C[faceI] + dot(D[faceI], Sf()[faceI]); } } ``` 上述示例中的函数 `fixedValueParabolicVelocityFvPatchVectorField::updateCoeffs()` 定义了一个二次边界条件,其中 `alpha` 是边界上的非线性系数,`phi` 是边界上的标量场,`U` 是速度场。这个函数根据定义的关系计算边界上的二次边界条件。 需要注意的是,定义二次边界条件需要对 OpenFOAM 的源代码进行修改,并重新编译。因此,在使用二次边界条件之前,请确保你已经熟悉了 OpenFOAM 的基本操作和编译流程。 希望这个回答能帮到你!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值