本篇探讨如何增加一个新的热物理模型。
有了前面的基础,增加一个模型应该不在话下了,这里给出一个例子。
关键在调用 makeThermo
宏函数,来将各个子模型组合起来,形成一个新的热物理模型,并添加到合适的 hashTable 里。
这里只看看怎么来增加状态方程模型,transport 模型(描述黏度 随温度的变化),thermo 模型(描述 cp 随温度的变化),energy 模型。将 perfectGas
, constTransport
, hConstThermo
,以及 sensibleInternalEnergy
拷贝出来到一个目录下,并分别重命名为 my+原始模型名
的形式。同时,修改各个模型的typeName,比如, perfectGas
修改为 myperfectGas
, myperfectGas.H
的 typeName
修改为:1
2
3
4static 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
11makeThermo
(
rhoThermo,
heRhoThermo,
pureMixture,
constTransport,
sensibleInternalEnergy,
hConstThermo,
myperfectGas,
specie
);
灵活组合就好了。
最后,将 src/thermophysicalModels/basic
目录下的 Make
拷贝到新模型所在目录下。并将 files
和 options
如下:
files
1
2
3rhoThermos.C
LIB = $(FOAM_USER_LIBBIN)/libMyTestfluidThermophysicalModelsoptions
1
2
3
4
5
6
7
8
9
10
11EXE_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
,就能编译得到一个新的库了。
那么怎么调用新增的模型呢?分两步:
- 修改 controlDict,增加一条
libs ( "libMyTestfluidThermophysicalModels.so" );
- 修改
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
31thermoType
{
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
。实际应用场景肯定会比这个复杂,这里只是给出一个最基本的流程来供大家参考。