第46章 reactingTwoPhaseEulerFoam (2)
46.2 相建模
相建模库的代码库是封装、抽象和通用编程原理的一个很好的例子。
46.2.1 相模型类
有许多相模型模板类,每个模板类都实现了多相建模的不同方面,例如动量传递、传热等。因此,对于特定的模型,必须以类似于拉格朗日粒子模型的方式嵌套这些模板,因为拉格朗日粒子模型是通过将模板类相互插入来构建的。
提供某个方面建模的类模板也可以有相反的双重实现。这允许通过在编译时选择一组特定的模板来构建包含或不包含特定方面的相模型。这种双重实现的一个例子是反应。相可以是反应相,也可以是惰性相。因此,有两个处理反应的模板类:模板InertPhaseModel和ReactionPhaseModel。模板类的名称明显的暗示了每个类如何实现反应。
*phaseModel
这是所有相模型的基类,它定义了相的行为。这个类本身是从类volScalarField派生而来的。因此,相模型是其自身的体积分数场。除了相的索引、名称和指向相直径模型的指针之外,这个类只包含很少的数据。
然而,这个类定义了大量的抽象方法,各种模板类都需要实现这些方法。
*MovingPhaseModel
该类模板提供了移动相的功能和数据,即它包含速度场和通量场。这个类还提供了相的动量方程。这个类还拥有一个指向湍流模型的指针。
1 template < class BasePhaseModel >
2 Foam :: tmp < Foam :: fvVectorMatrix >
3 Foam :: MovingPhaseModel < BasePhaseModel >:: UEqn ()
4 {
5 const volScalarField & alpha = * this ;
6 const volScalarField & rho = this - > thermo () . rho () ;
7
8 return
9 (
10 fvm :: ddt ( alpha , rho , U_ )
11 + fvm :: div ( alphaRhoPhi_ , U_ )
12 + fvm :: SuSp (- this - > continuityError () , U_ )
13 + this -> fluid () . MRF () . DDt ( alpha * rho , U_ )
14 + turbulence_ -> divDevRhoReff ( U_ )
15 );
16 }
清单305:在类MovingPhaseModel中构造运动相的动量方程
该类模板提供的动量方程与可压缩求解器的动量方程惊人地相似。如果我们比较清单305和306,我们会发现清单305中的五项中的四项和清单306动量方程相似。唯一的区别是,多相动量方程的项包含体积分数场α,其在单相求解器中取统一值1。
1 tmp < fvVectorMatrix > tUEqn
2 (
3 fvm :: ddt ( rho , U)
4 + fvm :: div ( phi , U)
5 + MRF . DDt ( rho , U)
6 + turbulence -> divDevRhoReff (U)
7 ==
8 fvOptions ( rho , U)
9 );
清单306:以rhoPimpleFoam为例,构造可压缩单相求解器的动量方程
当求解器读取并创建选项列表时,相模型会忽略任何选项的存在。因此,在相模型中没有对fvOptions框架的调用。这是求解器处理fvOptions框架中选项的任务。
*AnisothermalPhaseModel
该类模板提供了实现能量传递所需的数据和方法,即能量方程。
*IsothermalPhaseModel
该类和AniothermalPhaseModel基本对等,它以琐碎的方式实现了与热能传输相关的所有抽象方法。
*MultiComponentPhaseModel
该模板类提供了与一个相中的物质迁移相关的数据和方法,例如由几种气体组成的气相。
*PurePhaseModel
该模板类用于由单种物质组成的相。因此,不需要求解物质迁移方程。这个类模板以一种繁琐的方式实现了基类phaseModel中定义的所有抽象方法,例如,当调用方法phaseModel::Y()时,它返回一个空的质量分数列表,该列表旨在返回物质质量分数。
*InertPhaseModel
这个模板类用于非反应阶段,因此,对于热释放速率和质量传递速率,它返回零。
*ReactingPhaseModel
该模板类用于反应相。因此,热释放速率和传质速率通过后面的反应模型计算并返回。
未完待续~~
文章来源:OpenFOAM