以一个很简单的例子分析 OpenFOAM 中的 Run Time Selection,如有错误,欢迎指正!
本文内容主要是为了消化 Giskard 博客 而作,在此致谢!
首先简单说下 RTS 的功能:就是在 solver 中创建模型对象的时候,可以使用基类中的 New
函数创建一个基类的指针,然后在 case 的字典文件中选择所需的子模型(派生类),即运行时选择(Run Time Selection)。这对代码的要求就是,通过给定模型的名字(从字典中获取),然后能获取该模型的对象,这就是 New
函数的功能。
代码路径
\src\OpenFOAM\db\runTimeSelection\construction
\src\combustionModels\FSD\reactionRateFlameAreaModels
基类(模型类别):reactionRateFlameArea
基类头文件体内调用宏
TypeName("reactionRateFlameArea");
基类头文件体内调用宏
declareRunTimeSelectionTable
(详细代码见本文末尾),作用如下:- 给
HashTable
起别名,argNames##ConstructorTable
,并创建一个该类的指针argNames##ConstructorTablePtr_
。 - 定义类
add##argNames##ConstructorToTable
,模板是baseType##Type
。该类的New
函数很关键,返回基类指针,指向一个临时new
的对象,对象类型是baseType##Type
。该类的构造函数也很关键,它向argNames##ConstructorTablePtr_
中insert
一组 key and value:baseType##Type::typeName
和New
函数。
所以关键在于创建
add##argNames##ConstructorToTable
的对象时它的模板是什么类型。如果模板是基类,那么往哈希表中insert
的是基类的typeName
和返回指向基类对象的基类指针的New
函数。如果模板是派生类,那么往哈希表中insert
的是派生类的typeName
和返回指向派生类对象的基类指针的New
函数。declareRunTimeSelectionTable
(
autoPtr,
reactionRateFlameArea,
dictionary,
(
const word modelType,
const dictionary& dict,
const fvMesh& mesh,
const combustionModel& combModel
),
(modelType, dict, mesh, combModel)
);- 给
基类头文件体内申明
New
函数static autoPtr<reactionRateFlameArea> New
(
const dictionary& dict,
const fvMesh& mesh,
const combustionModel& combModel
);基类C文件体外调用宏
defineTypeNameAndDebug(reactionRateFlameArea, 0);
defineRunTimeSelectionTable(reactionRateFlameArea, dictionary);
reactionRateFlameAreaNew.C 文件中定义了 New
函数,这个函数在 FSD 的构造函数里调用,用于创建本文所说的基类指针。
Foam::autoPtr<Foam::reactionRateFlameArea> Foam::reactionRateFlameArea::New |
派生类(具体模型):relaxation
派生类头文件体内调用宏 TypeName("relaxation");
派生类C文件体外调用宏
defineTypeNameAndDebug(relaxation, 0); |
派生类调用 addToRunTimeSelectionTable
的时候,创建了一个 baseType::add##argNames##ConstructorToTable<thisType>
类的对象,这里 thisType
是 relaxation
,作为类的模板传入 。我们可以看到,当我们把派生类的类名作为 add
的模板时,New
函数返回的是指向派生类对象的基类指针。而这个 New
函数在 add
的构造函数中随同派生类的 typeName
被插入到哈希表中。
//- Add to hash-table of functions with typename as the key |
declareRunTimeSelectionTable
//- Declare a run-time selection |