为什么要将声明和定义分离

OpenFOAM 中的类基本都遵循类的声明和定义分开在不同文件的规则。具体来说,一般是类的声明放在 “xxx.H”,类的成员函数的具体定义 “xxx.C”,如果有内联函数(inline),则还有 “xxxI.H”,并且,”xxx.H” 文件的最后会有 #include "xxxI.H"。这么做不仅是一种代码规范,真正的目的应该是为了防止重复定义的问题。本篇博文用一个简单的例子来说明这个问题。

Read More

swak4Foam 如何用于名字形如 alpha.water 的场?

swak4Foam 的 groovyBC 边界条件提供了一种很灵活的用表达式定义边界条件的方法。但是,从 OpenFOAM-2.3 开始,两相流求解器如 interFoamtwoPhaseEulerFoam 开始采用类似于 alpha.water 的场,这种场名默认情况下 groovyBC 是无法正确识别的,因为 . 在 swak4Foam 表达式中有特殊的作用。
所幸的是,开发人员也早就意识到这个问题了,并给出了解决方案,那就是用 aliases。这个东西真是不知道就很难,知道了就很简单,下面举一个我实际用过的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
solid_inlet_left
{
type groovyBC;
valueExpression "-inVel*normal()"
value uniform (0 0 0);
variables (
"A=sum(area());"
"outFlow{outlet_left}=sum(Uparticles&normal()*area()*alphaparticles);"
"myFlow=outFlow/alphaparticles;"
"inVel=myFlow/A;"
);
aliases {
Uparticles U.particles;
alphaparticles alpha.particles;
}
}

我想我应该不用再解释什么。

主要参考这个网页

OpenFOAM 中的单相流湍流模型之一

相信有不少 OpenFOAM 用户有添加湍流模型的需求,我自己最早用 OpenFOAM 完成的一项工作就是在其中添加了一些单相流的湍流模型,并进行了一些计算。这里将我对单相湍流模型代码框架的理解记录下来,供大家参考。本系列将包含三篇,第一篇介绍湍流模型类的继承派生关系,第二篇具体分析几个 OpenFOAM 中带的湍流模型,并给出修改或增加新模型的方法,第三篇分析湍流模型的运行时选择机制(Run Time Selection)的原理。

Read More

blockMesh 的新功能:multi/sectional grading in a block

从 OpenFOAM-2.3.x 的 “commit cf370883644ec59782be375041b2434eb3e2c4ed“ 开始,blockMesh 有了一项新功能:multi/sectional grading in a block。这项功能说起来很简单即可以在同一个block里面设置多个方向的大小渐变网格。举个例子,假设你想画一个简单的二维槽道流网格,你希望两边靠近壁面处的网格更密一点,而中心的网格稀疏一点。以前版本的 blockMesh 由于只支持让网格大小在某一个方向上渐变(通过设置 simpleGrading),要实现上述网格,你需要将整个槽道分成两个block,然后分别设置 simpleGrading。现在有了 “multi/sectional grading”以后,只需要一个block,并设置好simpleGrading便可实现了。下面解释一下新版 blockMesh 具体设置,并以一个二维方腔流例子来说明。

Read More