OpenFOAM技术内幕:热物理模型中的能量场——thermo.he()

摘要

OpenFOAM的原始开发团队应该可以说已经把C++的高级特性(泛型编程)玩的炉火纯青了! 我基于OpenFOAM平台开发自己研究项目所需要的求解器的时候,常常会这样感叹。 整个框架搭建起来之后,只需要很少的代码就可以非常优雅的实现非常复杂的功能。 比如它的热物理模型(thermoPhysical model)框架,同一个求解器在不改变代码的情况下适用于其他的同类问题,只是流体不同了而已。 比如同一个求解器既可以用于石油在孔隙介质中的流动问题,也可以用于温泉或海底热液系统中的热液流动问题,只需要给出相应流体的热物理模型即可。 当然了,对于具体的问题,OpenFOAM并没有提供方案,将这种高级的框架应用于实际问题正是我们需要研究的问题。 本文就介绍热物理模型中的能量问题。

流体力学中的能量表达方式

比焓形式

总能量形式

温度形式

流体的状态方程及及其热力学性质

OpenFOAM中热物理模型框架

热物理模型最基本的类是basicThermo, 它是继承自IOdictionary。 我们在流体动力学模拟中比较常用的是其派生类fluidThermoheThermo。 而 thermo.he() 函数就是在heThermo类中进行了重写,返回 he_ 这个表示能量场的成员变量。 对其初始是在成员函数 init(...) 中实现的,在里面定义了 he_ 的边界条件和内部场的计算方式。 内部场通过 HE(p,T) 函数计算,而这个 HE 函数是通过mixture实现的,也就是后面我们在energy的类中进行实现。 比如在 sensibleEnthalpy 这个能量类型中,它的 HE 函数调用了 thermo类的 Hs 函数, 这个函数最终在状态方程的类中进行实例化。 所以不同的能量类型情况下,如何通过状态方程计算 he 的值,可以在能量类中的 HE 函数具体指定,然后在状态方程类中实现。

calculate函数里面调用的 mixture_.THE$FOAM_SRC/thermophysicalModels/specie/thermo/thermoI.H 中定义的THE函数, 这个THE函数直接调用能量类型中定义的THE函数,比如 sensibleEnthalpy ,一般在能量类中指定的THE函数,就可以调用所有thermo可以调用的函数,比如thermo.rho(p,T). 因为这个函数中第一个参数就传回了thermo的引用。