当前位置: 首页 > 文档资料 > OpenFOAM 编程入门 >

基本语句

优质
小牛编辑
133浏览
2023-12-01

现在,同学们已经使用了最基本的OpenFOAM的类型(如Info),在OpenFOAM的环境下编写了输出hello CFD的代码。OpenFOAM中的内置类型非常多,比如:

  • volScalarField体标量场:比如CFD中定义在网格上的温度场;

  • volVectirField体矢量场:比如CFD中定义在网格上的速度场;

  • fvScalarMatrix标量矩阵:比如CFD中离散湍流动能生成的稀疏线性系统;

  • autoPtrOpenFOAM智能指针:OpenFOAM自定义的智能指针;

  • processor处理器边界类型:并行计算的处理器边界类型;

在这里并不能够全部列举。这需要同学们在以后使用OpenFOAM的过程中持续的摸索。

接下来,本章将介绍C++另一个基本内容:基本语句。这些内容均是为了介绍C++的类型做铺垫。

for循环

OpenFOAM有非常多的循环语句,比如对所有网格点进行遍历加和,对边界进行遍历赋值等。OpenFOAM中的forAll语句处理这些OpenFOAM类型中的循环信手拈来。对于标准的C++,同学们需要熟悉for语句的使用。

举例,如果要对1-10进行加和,C++可以这样写:

int results = 0;

for (int k = 1, k < 11, k++)
{
    results = results + k;    
}

for语句在OpenFOAM中的用法95%的情况下为初级用法,在此不进行深入扩展,更高级的for用法可参考其他上千页的C++教材。

while循环

OpenFOAM中while循环主要用于速度压力迭代循环中以及一些xxx修正中。while循环是没有初始化和更新部分的for循环,只有判断语句和循环体。例如,如果外迭代次数nOuterCorrectors小于3,则执行压力修正函数pCorr(),可写为:

while (nOuterCorrectors < 3)
{
    pCorr();
}

if语句

if主要用于判断,在OpenFOAM中也非常常用。举例,如果外迭代次数nOuterCorrectors为最后一次,即=2,则执行最终的压力修正函数pFinalCorr(),其可以这样写:

if (nOuterCorrectors == 2)
{
    pFinalCorr();
}

在前述while循环的框架下,可以写为:

while (nOuterCorrectors < 3)
{
    pCorr();
    if (nOuterCorrectors == 2)
    {
        pFinalCorr();
    }
}

逻辑操作符

if判断语句中,需要注意一些逻辑操作符如||&&等:

if (5 == 5 && 4 == 4) //条件为真,因为5确实等于5,且4确实等于4

if (5 == 5 && 4 == 3) //条件为假,因为5确实等于5,且4不等于3。在使用&&操作符的时候,需要保证&&前后的语句全部为真,整体才为真

if (5 == 5 || 4 == 3) //条件为真,因为5等于5,虽然4不等于3。在使用||操作符的时候,||前后的语句有一个为真,整体即为真

if判断语句非常简单在此不进行深入扩展,更高级的用法如三目运算符可参考其他上千页的C++教材。

其他语句如do while循环,go语句在OpenFOAM非常少,在此不做介绍。

OpenFOAM实例

OpenFOAM中包含了一些自定义的宏,其中一些语句可用来执行CFD专属的循环。比如forAll()语句是非常常用的OpenFOAM语句。看下面的代码:

forAll(U, cellI)
{
    U[cellI] = vector(1, 0, 0);
}

其中forAll()为一种遍历,其需要传入两个参数,在上面的例子中,第一个参数为U(一个volScalarField),则此forAll()表示对整个计算域的网格进行循环。括号内的U[cellI] = vector(1, 0, 0);表示对每个网格的U[cellI]进行赋值。需要注意的是,上面的例子并不对U的边界进行处理。

如果forAll()内传入surfaceScalarField,则对内部的面进行循环,例如:

forAll(phi, index)
{
    phi[index] = 0.0;
}

上面的代码将phi内部的面赋值为0。同样的,本例子不对phi的边界进行处理。