OpenFOAM 中的热物理类之添加新模型

本篇探讨如何增加一个新的热物理模型。

有了前面的基础,增加一个模型应该不在话下了,这里给出一个例子。
关键在调用 makeThermo 宏函数,来将各个子模型组合起来,形成一个新的热物理模型,并添加到合适的 hashTable 里。

这里只看看怎么来增加状态方程模型,transport 模型(描述黏度 随温度的变化),thermo 模型(描述 cp 随温度的变化),energy 模型。将 perfectGasconstTransporthConstThermo,以及 sensibleInternalEnergy 拷贝出来到一个目录下,并分别重命名为 my+原始模型名 的形式。同时,修改各个模型的typeName,比如, perfectGas 修改为 myperfectGasmyperfectGas.HtypeName 修改为:

1
2
3
4
static word typeName()
{

return "myperfectGas<" + word(Specie::typeName_()) + '>';
}

注意,这里 typeName 一定要改,否则,将在运行算例的时候,出现 duplicate entry 的错误,根本原因在于,将模型添加到 hashTable 的时候,hashTable 的 key 是由 typeName 组合而成的,如果新模型使用了跟旧模型一样的 typeName 就可能会在 hashTable 出现两个一个一样的 key,即 duplicate entry

然后,将 src/thermophysicalModels/basic/rhoThermo 目录下的 rhoThermos.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
44
45
46
47
48
49
#include "rhoThermo.H"
#include "makeThermo.H"

#include "specie.H"
#include "perfectGas.H"
#include "myperfectGas.H" // 新加的
#include "incompressiblePerfectGas.H"
#include "rhoConst.H"
#include "perfectFluid.H"
#include "PengRobinsonGas.H"
#include "adiabaticPerfectFluid.H"

#include "hConstThermo.H"
#include "myhConstThermo.H" // 新加的
#include "janafThermo.H"
#include "sensibleEnthalpy.H"
#include "sensibleInternalEnergy.H"
#include "mysensibleInternalEnergy.H" // 新加的
#include "thermo.H"

#include "constTransport.H"
#include "myconstTransport.H" // 新加的
#include "sutherlandTransport.H"

#include "icoPolynomial.H"
#include "hPolynomialThermo.H"
#include "polynomialTransport.H"

#include "heRhoThermo.H"
#include "pureMixture.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

namespace Foam
{

makeThermo
(
rhoThermo,
heRhoThermo,
pureMixture,
myconstTransport,
mysensibleInternalEnergy,
myhConstThermo,
myperfectGas,
specie
);

} // End namespace Foam

注意,头文件里有四个是新加的。 makeThermo 宏只调用了一次,即这里只增加了一个模型。其他的组合当然也是可以的,比如像这样

1
2
3
4
5
6
7
8
9
10
11
makeThermo
(
rhoThermo,
heRhoThermo,
pureMixture,
constTransport,
sensibleInternalEnergy,
hConstThermo,
myperfectGas,
specie
);

灵活组合就好了。

最后,将 src/thermophysicalModels/basic 目录下的 Make 拷贝到新模型所在目录下。并将 filesoptions 如下:

  • files

    1
    2
    3
    rhoThermos.C

    LIB = $(FOAM_USER_LIBBIN)/libMyTestfluidThermophysicalModels
  • options

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    EXE_INC = \
    -I$(LIB_SRC)/finiteVolume/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
    -I$(LIB_SRC)/meshTools/lnInclude


    LIB_LIBS = \
    -lfiniteVolume \
    -lspecie \
    -lfluidThermophysicalModels

注意,这里也作了修改, EXE_INC 里增加了 -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \LIB_LIBS 里增加了两条: -lspecie-lfluidThermophysicalModels

有了这些,就万事具备了,下面给出一个目录树:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
├── const
│   ├── myconstTransport.C
│   ├── myconstTransport.H
│   └── myconstTransportI.H
├── hConst
│   ├── myhConstThermo.C
│   ├── myhConstThermo.H
│   └── myhConstThermoI.H
├── Make
│   ├── files
│   └── options
├── perfectGas
│   ├── myperfectGas.C
│   ├── myperfectGas.H
│   └── myperfectGasI.H
├── rhoThermos.C
└── sensibleInternalEnergy
└── mysensibleInternalEnergy.H

运行 wmake libso,就能编译得到一个新的库了。

那么怎么调用新增的模型呢?分两步:

  1. 修改 controlDict,增加一条 libs ( "libMyTestfluidThermophysicalModels.so" );
  2. 修改 constant/thermophysicalProperties,改为如下
    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
    thermoType
    {
    type heRhoThermo;
    mixture pureMixture;
    transport myconst;
    thermo myhConst;
    equationOfState myperfectGas;
    specie specie;
    energy mysensibleInternalEnergy;
    }

    pRef 100000;

    mixture
    {
    specie
    {
    nMoles 1;
    molWeight 28.9;
    }
    thermodynamics
    {
    Cp 1000;
    Hf 0;
    }
    transport
    {
    mu 1.8e-05;
    Pr 0.7;
    }
    }

这样改好以后,新模型就会被调用了。当运行求解器的时候出现如下内容,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
......
......
Reading thermophysical properties

Selecting thermodynamics package
{
type heRhoThermo;
mixture pureMixture;
transport myconst;
thermo myhConst;
equationOfState myperfectGas;
specie specie;
energy mysensibleInternalEnergy;
}
.......

.......

就表示新模型调用成功了。

最后提醒一下,这里的测试,只是将原有模型原封不动地拷贝出来了,只是改了 tpeName。实际应用场景肯定会比这个复杂,这里只是给出一个最基本的流程来供大家参考。