OpenFOAM 中的模块广泛使用 Run Time Selection(RTS)机制,因此 OpenFOAM 的求解器中,只需要设定模型的调用接口。算例具体使用的是哪个模型,则是在运行时才确定的,而且可以在算例运行过程中修改选中的模型。
Run Time Selection(RTS) 机制的系列博文可以参考 www.sourceflux.de
这里主要分析 OpenFOAM 中湍流模型框架中的 RTS。
下面来看这些宏函数在湍流模型框架中是如何使用的。
1
turbulenceModel 类
类体中,调用:
declareRunTimeNewSelectionTable
宏函数。
注意这里用的是 declareRunTimeNewSelectionTable
!与 declareRunTimeSelectionTable
区别在于:declareRunTimeNewSelectionTable
这个宏函数定义的插入到 hashTable
中的那个函数,返回值不是派生类的对象,而是派生类中的 New
函数的返回值!
RASModel
将不会作为一个具体的湍流模型来使用。而是用来选择 RAS
类型的具体湍流模型的一个跳板。 类体外,调用
addToRunTimeSelectionTable
宏函数, turbulenceModel
类是基类,也不会作为具体的湍流模型来调用,所以不需要将它自己添加到 hashTable
。 turbulenceModel
类下一层的派生类是 RASModel
和 LESModel
。
先来看 RASModel
,这个类类体里调用了 declareRunTimeSelectionTable
。
类体外调用了
hashTable
, 用的是 declareRunTimeSelectionTable
和 defineRunTimeSelectionTable(RASModel, dictionary);
同时,RASModel类 本身又添加到了 turbulenceModel
中建立的 hashTable
里: addToRunTimeSelectionTable(turbulenceModel, RASModel, turbulenceModel);
RASModel
类之下的派生类,就是具体的湍流模型了,以 kEpsilon
模型为例:
kEpsilon
具体的湍流模型,如kEpsilon
,只需要添加到上面基类中创建的 hashTable
中,就能保证其能被调用到。
这里是添加到了 RASModel 中创建的 hashTable
里。
3
LESModel
LESModel
类也是继承自 turbulenceModel
的,所以其处理方法跟 RASModel
是一样的。不过 LES
类的模型的继承关系略比 RAS
类的复杂一点。
LES 模型继承关系图
在这个图中,中间层的 GenEddyVisc
等4个虚线框中的类不是作为具体的湍流模型来调用的,这里有必要看一下这样的中间类在 RTS 机制中是怎么处理的。
检查这几个类的代码,可以发现:
GenEddyVisc
和 GenSGSStress
中只是在类体外调用了 defineTypeNameWithName(GenEddyVisc, "GenEddyVisc");
scaleSimilarity
在类体中调用了 TypeName
,类体外调用了 defineTypeNameAndDebug
DESModel
中没有任何处理。
typeName
做了处理,并没有调用 addToRunTimeSelectionTable
。 RASModel
一样, LESModel
之下派生的具体的湍流模型则需要调用 addToRunTimeSelectionTable
来将自己添加到 LESModel
中定义的 hashTable
中。 因此,湍流模型的调用过程大致为: