首页/文章/ 详情

OpenFOAM|21 创建新边界

精品
作者优秀平台推荐
详细信息
文章亮点
作者优秀
优秀教师/意见领袖/博士学历/特邀专家
平台推荐
内容稀缺
3年前浏览3741

本文描述在OpenFOAM中编程实现自定义边界类型。

注:本文参考自http://www.tfd.chalmers.se/~hani/kurser/OS_CFD/#YEAR_2019。


前文描述了利用codeStream、codeFixedValue实现自定义边界上物理场分布:OpenFOAM|20 自定义边界条件。这种方式操作起来简单,但是功能也比较单一。若想要实现更加复杂的边界条件类型,可以编程实现新的边界类型。OpenFOAM中所有的边界条件定义均位于文件夹$FOAM_SRC/finiteVolume/fields/fvPatchFields中,用户可以利用文件夹中的边界类型为模板,开发自己的边界条件类型。

本文以一个沿y方向速度成抛物线分布的边界为例,描述新建一个边界条件的基本流程。

1 文件准备

打开Linux终端或Windows WSL,通过下面的命令创建一个文件夹。

mkdir $WM_PROJECT_USER_DIR/src
cd $WM_PROJECT_USER_DIR/src
foamNewBC -f -v parabolicVelocity

这里利用程序foamNewBC快速构造一个边界条件定义框架。关于foamNewBC的用法,可以使用命令foamNewBC -help进行查看,如下图所示。

图片

上面的命令中,-f表示创建一个fixedValue型边界;-v表示创建一个矢量边界。

此时在当前路径下创建了一个名为parabolicVelocity的文件夹,其内文件结构如下图所示。

图片

文件夹parabolicVelocity中包含了一个Make文件夹与parabolicVelocityFvPatchVectorField.CparabolicVelocityFvPatchVectorField.H文件。这里不需要改动Make文件夹中的任何内容。

2 修改头文件

在头文件parabolicVelocityFvPatchVectorField.H中指定成员变量及构造函数。

  • 删除多余的成员变量,添加新的成员变量
// 指定最大速度值
scalar maxvalue_;
// 指定流动方向
vector n_;
// 指定y坐标方向
vector y_;

如下图所示。

图片

  • 注释掉虚函数autoMap与rmap的定义

图片

3 修改源文件

在源文件parabolicVelocityFvPatchVectorField.C中定义功能实现。

  • 在第一个构造函数中添加参数初始化程序代码
fixedValueFvPatchVectorField(p, iF),
maxvalue_(0),
n_(1,0,0),
y_(0,1,0)

如下图所示。

图片

  • 修改第二个构造函数
Foam::parabolicVelocityFvPatchVectorField::
parabolicVelocityFvPatchVectorField
(
   const fvPatch& p,
   const DimensionedField<vector, volMesh>& iF,
   const dictionary& dict
)
:
   fixedValueFvPatchVectorField(p, iF),
   maxvalue_(readScalar(dict.lookup("maxvalue"))),
   n_(dict.lookup("n")),
   y_(dict.lookup("y"))
{
   Info << "Using the parabolicVelocity boundary condition" << endl;
   if (mag(n_) < SMALL || mag(y_) < SMALL)
   {
       FatalErrorIn("parabolicVelocityFvPatchVectorField(dict)")
       << "n or y given with zero size not correct"
       << abort(FatalError);
   }
   n_ /= mag(n_);
   y_ /= mag(y_);

   fixedValueFvPatchVectorField::evaluate();
}

  • 修改第三个构造函数
fixedValueFvPatchVectorField(ptf, p, iF, mapper),
maxvalue_(ptf.maxvalue_),
n_(ptf.n_),
y_(ptf.y_)

如下图所示。

图片

  • 修改第四个构造函数
fixedValueFvPatchVectorField(ptf),
maxvalue_(ptf.maxvalue_),
n_(ptf.n_),
y_(ptf.y_)

如下图所示。

图片

  • 修改第五个构造函数
fixedValueFvPatchVectorField(ptf, iF),
maxvalue_(ptf.maxvalue_),
n_(ptf.n_),
y_(ptf.y_)

如下图所示。

图片

  • 删除aotuMap及rmap函数

这里直接将这两个函数给注释掉。

图片

  • 修改updateCoeffs()函数

抛物线边界的功能实现是在函数updateCoeffs()中完成的。修改其函数内容:

void Foam::parabolicVelocityFvPatchVectorField::updateCoeffs()
{
   if (updated())
   {
       return;
   }

   boundBox bb(patch().patch().localPoints(),true);
   vector ctr = 0.5*(bb.max() bb.min());
   const vectorField &c = patch().Cf();

   scalarField coord = 2*((c-ctr)&y_)/((bb.max()-bb.min())&y_);
   vectorField :: operator =(n_*maxvalue_ * (1.0-sqr(coord)));

   fixedValueFvPatchVectorField::updateCoeffs();
}
  • 修改write函数
void Foam::parabolicVelocityFvPatchVectorField::write
(
   Ostream& os
) const
{
   fvPatchVectorField::write(os);
   writeEntry(os,"n",n_);
   writeEntry(os,"y",y_);
   writeEntry(os,"maxvalue",maxvalue_);
   writeEntry(os,"value", *this);
}

这里注意writeEntry的调用方式,原文中的写法在新版OpenFOAM中会编译出错。

  • 保存源文件。

4 编译库

进入到源代码路径,执行下面的命令进行编译。

wmake libso

如果没有问题的话,编译完成后终端显示如图所示。

图片

5 测试边界

利用算例库中的pitzDaily算例进行测试。利用下面的代码拷贝文件。

run
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily pitzDailyParabolicInlet
cd pitzDailyParabolicInlet/
  • 修改0/U文件

修改边界inlet的参数:

inlet
{
   type            parabolicVelocity;
   n               (1 0 0);
   y               (0 1 0);
   maxvalue        2;
}
  • 修改system/controlDict文件

添加语句*libs ("libparabolicVelocity.so");,如下图所示。

图片

  • 进行计算
blockMesh
simpleFoam
  • 计算结果

速度分布如下图所示。

图片

入口速度分布曲线如下图所示。

图片

可以看到入口速度是按照要求成抛物线分布。

声明:原创文章,欢迎留言与我讨论,如需转载留言

理论科普代码&命令求解技术OpenFOAM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-04-12
最近编辑:3年前
CFD之道
博士 | 教师 探讨CFD职场生活,闲谈CFD里外
获赞 2559粉丝 11231文章 732课程 27
点赞
收藏
作者推荐
未登录
1条评论
黄建达
签名征集中
2年前
你好,我按照这个步骤实现了,可openfoam提示没有这个边界条件?编译已经通过了
回复
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈