基本语句
现在,同学们已经使用了最基本的OpenFOAM的类型(如Info
),在OpenFOAM的环境下编写了输出hello CFD的代码。OpenFOAM中的内置类型非常多,比如:
volScalarField
体标量场:比如CFD中定义在网格上的温度场;volVectirField
体矢量场:比如CFD中定义在网格上的速度场;fvScalarMatrix
标量矩阵:比如CFD中离散湍流动能生成的稀疏线性系统;autoPtr
OpenFOAM智能指针: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
的边界进行处理。