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 中。 因此,湍流模型的调用过程大致为: