OpenFOAM-3.0 的湍流模型(三)

有了上一篇的基础,就很容易做到添加新的湍流模型了,这里分别给出对四类湍流模型增加新模型的方法。探索过程不详述了,仅给出结果。

3. 添加新模型的方法。

添加湍流模型,关键的有两个,一是如果将新湍流模型添加到合适的 hashTable,以便能被求解器调用,另一个是 Make/files 和 Make/options 的写法以使湍流模型能被编译。

这里不给出具体湍流模型的代码,仅给出 Make 的写法,以及一个 .C 文件。编译湍流模型的时候,新建一个目录,将需要编译的湍流模型代码、这里给出的对应类型的 .C 文件和 Make 文件夹都拷贝到新建的目录,然后运行 wmake libso 即可。

3.1 单相不可压缩湍流模型
  • makeTuebulenceModels.C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "IncompressibleTurbulenceModel.H"
#include "incompressible/transportModel/transportModel.H"
#include "addToRunTimeSelectionTable.H"
#include "makeTurbulenceModel.H"

#include "RASModel.H"
#include "LESModel.H"


// 宏函数定义
#define makeRASModel(Type) \
makeTemplatedTurbulenceModel \
(transportModelIncompressibleTurbulenceModel, RAS, Type)


#define makeLESModel(Type) \
makeTemplatedTurbulenceModel \
(transportModelIncompressibleTurbulenceModel, LES, Type)


// -------------------------------------------------------------------------- //
// RAS models
// -------------------------------------------------------------------------- //
namespace Foam
{
typedef IncompressibleTurbulenceModel<transportModel> transportModelIncompressibleTurbulenceModel;

typedef RASModel<transportModelIncompressibleTurbulenceModel> RAStransportModelIncompressibleTurbulenceModel;

typedef LESModel<transportModelIncompressibleTurbulenceModel> LEStransportModelIncompressibleTurbulenceModel;
}
// 这里说明一下,编译新的模型,最重要的是将作为模板类的通用湍流模型代入合适的模板参数以实例化,然后将实例化的模型添加到合适的 hashTable。
// 上面定义的几个别名,是为了下面将模型添加到 hashTable 而服务的,至于为什么要定义这几个别名,参考前一篇的 `makeBaseTurbulenceModel` 宏函数的展开部分。


#include "mykEpsilon.H"
makeRASModel(mykEpsilon); // 如前篇所属,这个宏函数,先对模板类进行了实例化,然后调用 `addToRunTimeSelectionTable` 宏函数,将实例化模型添加到 hashTable。

// -------------------------------------------------------------------------- //
// LES models
// -------------------------------------------------------------------------- //

#include "mySmagorinsky.H"
makeLESModel(mySmagorinsky);
  • Make/files

    1
    2
    3
    makeTuebulenceModels.C

    LIB = $(FOAM_USER_LIBBIN)/libTestincompressibleTurbulenceModels
  • Make/options

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    EXE_INC = \
    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \

    LIB_LIBS = \
    -lincompressibleTransportModels \
    -lturbulenceModels \
    -lfiniteVolume \
    -lmeshTools

3.2 单相可压缩湍流模型
  • makeTurbulenceModels.C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include "CompressibleTurbulenceModel.H"
    #include "compressibleTransportModel.H"
    #include "fluidThermo.H"
    #include "addToRunTimeSelectionTable.H"
    #include "makeTurbulenceModel.H"

    #include "ThermalDiffusivity.H"
    #include "EddyDiffusivity.H"

    #include "RASModel.H"
    #include "LESModel.H"

    #define makeRASModel(Type) \
    makeTemplatedTurbulenceModel \
    (fluidThermoCompressibleTurbulenceModel, RAS, Type)


    #define makeLESModel(Type) \
    makeTemplatedTurbulenceModel \
    (fluidThermoCompressibleTurbulenceModel, LES, Type)


    namespace Foam
    {
    typedef ThermalDiffusivity<CompressibleTurbulenceModel<fluidThermo> > fluidThermoCompressibleTurbulenceModel;

    typedef RASModel<EddyDiffusivity<fluidThermoCompressibleTurbulenceModel> > RASfluidThermoCompressibleTurbulenceModel;

    typedef LESModel<EddyDiffusivity<fluidThermoCompressibleTurbulenceModel> > LESfluidThermoCompressibleTurbulenceModel;
    }

    // -------------------------------------------------------------------------- //
    // RAS models
    // -------------------------------------------------------------------------- //
    #include "mykEpsilon.H"
    makeRASModel(mykEpsilon);

    #include "mybuoyantKEpsilon.H"
    makeRASModel(mybuoyantKEpsilon);

    // -------------------------------------------------------------------------- //
    // LES models
    // -------------------------------------------------------------------------- //
    #include "mySmagorinsky.H"
    makeLESModel(mySmagorinsky);
  • Make/files

    1
    2
    3
    makeTurbulenceModels.C

    LIB = $(FOAM_USER_LIBBIN)/libTestcompressibleTurbulenceModels
  • Make/options

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    EXE_INC = \
    -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/solidThermo/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/solidSpecie/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude \

    LIB_LIBS = \
    -lcompressibleTransportModels \
    -lfluidThermophysicalModels \
    -lsolidThermo \
    -lsolidSpecie \
    -lturbulenceModels \
    -lspecie \
    -lfiniteVolume \
    -lmeshTools

注意,由于在 TurbulenceModels/compressible/lnIncludeTurbulenceModels/turbulenceModels/lnInclude 两个目录下,都存在 makeTurbulenceModel.H 头文件,内容是不一样的,这里需要 include 的是前者,所以在 Make/options 里, TurbulenceModels/compressible/lnInclude 一定要写在前面才能编译成功。

3.3 多相不可压缩湍流模型
  • DPMTurbulenceModels.C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include "PhaseIncompressibleTurbulenceModel.H"
    #include "singlePhaseTransportModel.H"
    #include "addToRunTimeSelectionTable.H"
    #include "makeTurbulenceModel.H"

    //#include "laminar.H"
    #include "turbulentTransportModel.H"
    #include "LESModel.H"

    #define makeRASModel(Type) \
    makeTemplatedTurbulenceModel \
    (singlePhaseTransportModelPhaseIncompressibleTurbulenceModel, RAS, Type)


    #define makeLESModel(Type) \
    makeTemplatedTurbulenceModel \
    (singlePhaseTransportModelPhaseIncompressibleTurbulenceModel, LES, Type)


    namespace Foam
    {
    typedef PhaseIncompressibleTurbulenceModel<singlePhaseTransportModel> singlePhaseTransportModelPhaseIncompressibleTurbulenceModel;

    typedef RASModel<singlePhaseTransportModelPhaseIncompressibleTurbulenceModel> RASsinglePhaseTransportModelPhaseIncompressibleTurbulenceModel;

    typedef LESModel<singlePhaseTransportModelPhaseIncompressibleTurbulenceModel> LESsinglePhaseTransportModelPhaseIncompressibleTurbulenceModel;
    }

    #include "mykEpsilon.H"
    makeRASModel(mykEpsilon);

    #include "mySmagorinsky.H"
    makeLESModel(mySmagorinsky);
  • Make/files

    1
    2
    3
    DPMTurbulenceModels.C

    LIB = $(FOAM_USER_LIBBIN)/libTestDPMTurbulenceModels
  • Make/options

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    EXE_INC = \
    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
    -I$(LIB_SRC)/transportModels \
    -I$(LIB_SRC)/transportModels/incompressible/singlePhaseTransportModel \
    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/incompressible/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/phaseIncompressible/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude

注意,这里的湍流模型是给 DPMFoam 求解器用的,如果要给其他求解器写湍流模型,可能需要做些修改。

3.4 多相可压缩湍流模型
  • phaseCompressibleTurbulenceModels.C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include "PhaseCompressibleTurbulenceModel.H"
    #include "phaseModel.H"
    #include "twoPhaseSystem.H"
    #include "addToRunTimeSelectionTable.H"
    #include "makeTurbulenceModel.H"

    #include "ThermalDiffusivity.H"
    #include "EddyDiffusivity.H"

    //#include "laminar.H"
    #include "RASModel.H"
    #include "LESModel.H"

    #define makeRASModel(Type) \
    makeTemplatedTurbulenceModel \
    (phaseModelPhaseCompressibleTurbulenceModel, RAS, Type)


    #define makeLESModel(Type) \
    makeTemplatedTurbulenceModel \
    (phaseModelPhaseCompressibleTurbulenceModel, LES, Type)


    namespace Foam
    {
    typedef ThermalDiffusivity<PhaseCompressibleTurbulenceModel<phaseModel> > phaseModelPhaseCompressibleTurbulenceModel;

    typedef RASModel<EddyDiffusivity<phaseModelPhaseCompressibleTurbulenceModel> > RASphaseModelPhaseCompressibleTurbulenceModel;

    typedef LESModel<EddyDiffusivity<phaseModelPhaseCompressibleTurbulenceModel> > LESphaseModelPhaseCompressibleTurbulenceModel;
    }

    #include "mykEpsilon.H"
    makeRASModel(mykEpsilon);

    #include "mySmagorinsky.H"
    makeLESModel(mySmagorinsky);

    #include "myphasePressureModel.H"
    makeTurbulenceModel
    (phaseModelPhaseCompressibleTurbulenceModel, RAS, myphasePressureModel);
  • Make/files

    1
    2
    3
    4
    phaseCompressibleTurbulenceModels.C
    phasePressureModel/myphasePressureModel.C

    LIB = $(FOAM_USER_LIBBIN)/libTestphaseCompressibleTurbulenceModels
  • Make/options

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    EXE_INC = \
    -I$(WM_PROJECT_DIR)/applications/solvers/multiphase/twoPhaseEulerFoam/twoPhaseSystem/lnInclude \
    -I$(WM_PROJECT_DIR)/applications/solvers/multiphase/twoPhaseEulerFoam/interfacialModels/lnInclude \
    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
    -I$(LIB_SRC)/transportModels/incompressible/transportModel \
    -I$(LIB_SRC)/TurbulenceModels/compressible/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude \
    -I$(LIB_SRC)/TurbulenceModels/phaseCompressible/lnInclude \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude

注意,这里的湍流模型是给求解器 twoPhaseEulerFoam 用的,如果要给其他求解器开发湍流模型,可能需要做些修改。