上篇文章中已经介绍了湍流模型框架中三个重要的模板类,本篇接着讲解雷诺平均 Navier-Stokes (RANS)方法和大涡模拟方法(LES)在该框架下的实现。

RANS 方法和 LES 方法从代码结构的框架上分开, RANS 方法类型派生自 RASModel,而 LES 方法类型派生自 LESModel

RASModel

从代码的结构框架上来看,RASModel 中的具体湍流模型类型目前可以分为五类:第一类是既可用于不可压/可压缩,也可用于单相/多相的;第二类是只可用于不可压缩单相流的;第三类是只可用于可压缩单相流流的;第三类是只可用于不可压缩多相流的;第五类是只可用于可压缩多相流的。目前第四种还没有模型,剩余4种模型的源码分别位于:

  • $FOAM_SRC/TurbulenceModels/turbulenceModels/RAS
  • $FOAM_SRC/TurbulenceModels/incompressible/turbulentTransportModels/RAS
  • $FOAM_SRC/TurbulenceModels/compressible/RAS
  • $FOAM_SRC/TurbulenceModels/phaseCompressible/RAS

对于第一类模型,每个模型需要对应不可压/可压缩、单相/多相流四个版本的模型类型,因此这些模型都设计为类模板,且采用基于原则设计。以 kEpsilon 为例,其声明如下:

1
2
3
4
5
6
7
8
// $FOAM_SRC/TurbulenceModels/turbulenceModels/RAS/kEpsilon/kEpsilon.H
template<class BasicTurbulenceModel>
class kEpsilon
:
    public eddyViscosity<RASModel<BasicTurbulenceModel>>
{
    // ...

这个类模板有一个模板参数,通过给这个模板参数传递不同的类型,将其特化为不可压缩或可压缩版本的 kEpsilon 模型。通过 makeRASModel(kEpsilon) 实现模板特化。

  • 单相、不可压(IncompressibleTurbulenceModel):
1
$FOAM_SRC/TurbulenceModels/incompressible/turbulentTransportModels/turbulentTransportModels.C
  • 单相、可压(CompressibleTurbulenceModel):
1
2
$FOAM_SRC/TurbulenceModels/compressible/turbulentFluidThermoModels/turbulentFluidThermoModels.C
$FOAM_SOLVERS/multiphase/driftFluxFoam/compressibleTurbulenceModels.C
  • 多相、不可压(PhaseIncompressibleTurbulenceModel):
1
$FOAM_SOLVERS/lagrangian/DPMFoam/DPMTurbulenceModels/DPMTurbulenceModels.C
  • 多相、可压(PhaseCompressibleTurbulenceModel):
1
2
3
4
$FOAM_SOLVERS/multiphase/compressibleInterFoam/VoFphaseCompressibleTurbulenceModels/VoFphaseCompressibleTurbulenceModels.C
$FOAM_SOLVERS/multiphase/reactingEulerFoam/reactingMultiphaseEulerFoam/multiphaseCompressibleTurbulenceModels/multiphaseCompressibleTurbulenceModels.C
$FOAM_SOLVERS/multiphase/reactingEulerFoam/reactingTwoPhaseEulerFoam/twoPhaseCompressibleTurbulenceModels/phaseCompressibleTurbulenceModels.C
$FOAM_SOLVERS/multiphase/twoPhaseEulerFoam/phaseCompressibleTurbulenceModels/phaseCompressibleTurbulenceModels.C

可以看出多相流的模型都在求解器中特化,而不像单相流模型那样具有通用性。

对于第二类模型,只需要设计一个单相不可压版本的模型类型,因此不需要用到类模板。第二类模型的例子见 kkLOmega,其声明如下:

1
2
3
4
5
6
class kkLOmega
:
    public eddyViscosity<incompressible::RASModel>
{
    // ...

由于 kkLOmega 类只有不可压版本,因此其传递给基类的模板参数也直接赋为 incompressible::RASModel

第三类模型目前只有一个:buoyantKEpsilon。这是考虑浮力修正的一个湍流模型,其定义如下:

1
2
3
4
5
6
7
template<class BasicTurbulenceModel>
class buoyantKEpsilon
:
    public kEpsilon<BasicTurbulenceModel>
{
    // ...

注意

这里的 buoyantKEpsilon 也有模板参数,但只用可压缩湍流模型调用 makeRASModel 对其进行特化。在不可压缩湍流模型中没有对其进行特化。博主认为这是历史代码遗留问题,因为 Henry G. Weller 本人说过在当前的湍流模型框架中并不能很好地实现考虑浮力修正湍流模型的通用代码。

第四类模型目前没有。

第五类模型和第三类模型类似,也设计成类模板,但是只为多相可压缩流特化。例如 kOmegaSSTSato

1
2
3
4
5
6
7
template<class BasicTurbulenceModel>
class kOmegaSSTSato
:
    public kOmegaSST<BasicTurbulenceModel>
{
    // ...

这个模型在 twoPhaseEulerFoamreactingTwoPhaseEulerFoam 中进行模板特化使用。

RASModel 的继承关系

RASModel 的继承关系(点击图片放大)

上图表示 RASModel 的继承关系,左侧为第一类模型,右侧为第二类模型,红色标注的为第三类模型(CompressibleTurbulenceModel),绿色标注的为第五类模型(PhaseCompressibleTurbulenceModel)。左侧的第一类模型都带有模板参数 BasicTurbulenceModel, 右侧的 incompressible::RASModellinearViscousStresseddyViscosity 为用 incompressible::turbulenceModel 模板特化后的版本,其派生出的 kkLOmega 等用蓝色框线标注出的类专门为不可压缩流使用。

LESModel

LESModel 中可以按类似的方法分类。发现只有两个地方有相应代码:

  • $FOAM_SRC/TurbulenceModels/turbulenceModels/LES
  • $FOAM_SRC/TurbulenceModels/phaseCompressible/LES

前一个是通用模型,后一个为多相可压缩专用模型。

LESModel 的继承关系

LESModel 的继承关系(点击图片放大)

上图表示 LESModel 的继承关系,大部分是通用模型,只有左下角绿色标注的三个模型为多相可压缩流专用模型。

几个关键的类

在以上继承关系的图中中,有几个比较关键的类:

  • linearViscousStress
  • eddyViscosity
  • nonlinearEddyViscosity
  • ReynoldsStress
  • LESeddyViscosity

这几个类的含义涉及到计算流体力学的知识,我们以后有机会再详细讲解。

写在最后

本系列不涉及计算流体力学的知识,单纯从 C++ 代码层面分析 OpenFOAM 湍流模型框架的设计架构。以后有时间会再写一个系列,从计算流体力学理论出发,介绍框架下各模型的具体实现。