OpenFOAM不可压求解器pimpleFoam研究(一)粘度实现

OpenFOAM提供了几个单相的不可压求解器:icoFoam(瞬态,层流)、simpleFoam(稳态,湍流)、pisoFoam(瞬态,湍流)和pimpleFoam(瞬态,湍流)。这几个求解器的不同之处主要在于其使用的算法不一样,主要有SIMPLE和PISO两种。icoFoam和simpleFoam的解析在李东岳的网站里能找到,写得十分详细。pisoFoam算是icoFoam的进阶版,可以处理湍流的情况,使用湍流模型。而pimpleFoam是PISO和SIMPLE算法的一个结合,为瞬态处理器,也能处理湍流。

icoFoam(下左图)和pimpleFoam(下右图)的动量方程在形式上有一些不一样。

OpenFOAM不可压求解器pimpleFoam研究(一)粘度实现_第1张图片OpenFOAM不可压求解器pimpleFoam研究(一)粘度实现_第2张图片

1. pim用tmp 来定义动量方程的矩阵类型,而ico则是直接用fvVectorMatrix。tmp是一个包装类,详细的介绍可以在OpenFOAM中的tmp类_寒冰彻骨的博客-CSDN博客看到。简单来说,tmp不是必须的,但在场量数据(fields)十分大的时候,tmp可以帮助处理场量空间,减少峰值内存,从而提高程序的计算效率。

2. pimpleFoam中多了MRF.DDt(U)这一项是关于旋转坐标系(滑移网格)下用于修正时间项的科里奥利力。详细介绍在MRF.DDt(U)---MRF模型简介_寒冰彻骨的博客-CSDN博客_mrf模型也可以看到。

3. fvOptions(U)是动量方程的源项。目前可以添加体积力、多孔介质等多种性质的源项。

4. 粘度项turbulence->divDevReff(U)。这个是pimpleFoam用来处理湍流(有效粘度)的。在icoFoam中,粘度项是层流粘度,不考虑湍流带来的湍流粘度的影响。当雷诺数较大时,icoFoam计算就不适用了。pimple的粘度项的介绍可以看turbulence->divDevReff(U)代码解读_寒冰彻骨的博客-CSDN博客。

在transportPropertiesDict文件里我们可以设置粘度nu的大小,但是在pimpleFoam的源码中找不到nu的创建代码(icoFoam的是可以在createFields.H里找到的)。我想这个应该在某个头文件里被定义好了,所以查看singlePhaseTransportModel.H:

OpenFOAM不可压求解器pimpleFoam研究(一)粘度实现_第3张图片

就是说,这个类它在构造的时候,会自动读取transportPropertiesDict文件,并读取nu作为粘度。在pim的createFields里:

OpenFOAM不可压求解器pimpleFoam研究(一)粘度实现_第4张图片

新建一个类laminarTransport(U,phi),在新建的时候会读取文件里的nu并作为其privateData。

所以,如果在pimpleFoam里想引用nu的话,需要改成laminarTransrpot.nu()。而且在类型上,icoFoam里nu是一个dimensionedScalar,但是在pimpleFoam里是一个volScalarField,创建时要注意区分,如:

volScalarField nu
(
    IOobject
    (
        "nu",
        runTime.timeName(),
        mesh,
        IOobject::NO_READ,
        IOobject::NO_WRITE
    ),
    laminarTransport.nu()
);

这样,nu就会是一个新建的层流粘度场,供后续使用。

你可能感兴趣的:(cfd,openfoam,源代码,cfd,openfoam)