以一个很简单的例子分析 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 |

