基于coalChemistryFoam的稠密气固两相求解器开发(

2021-01-02  本文已影响0人  charryzzz

基于coalChemistryFoam的稠密气固两相求解器开发

今天和大家一起学习一篇出自于Chalmers University of Technology的OpenFOAM课程的学生报告

对于气固两相流,如果颗粒间距远大于粒径,那么拉格朗日点源假设可以简化计算,但是当颗粒间距与粒径可比或者离散相的体积分数不可忽略,则常用的欧拉-拉格朗日方法可能不再适用,这篇报告的目的就是在欧拉-拉格朗日框架的基础上通过引入离散相的体积分数来魔改OF自带的coalChemistryFoam求解器(本报告针对的是OpenFOAMv1806)。

首先作者简要分析了coalChemistryFoam的框架,因为Lagrangian类比较复杂,有机会以后单独来讲,下面介绍关于体积分数的魔改
连续相控制方程如下(其实就是加了\alpha):
\frac{\partial\left(\alpha \rho_{g}\right)}{\partial t}+\nabla \cdot\left(\alpha \rho_{g} \mathbf{U}_{g}\right)=S_{m}
\frac{\partial( \alpha \rho_{g} \mathbf{U}_{g} )}{\partial t}+\nabla \cdot\left(\alpha \rho_{g} \mathbf{U}_{g} \mathbf{U}_{g}\right)-\nabla \cdot\left(\alpha \tau_{g}\right)-\nabla \cdot\left(\alpha \rho_{g} \mathbf{R}_{g}\right)=-\alpha \nabla p+\alpha \rho_{g} \mathbf{g}+S_{\mathbf{U}}
\frac{\partial\left(\alpha \rho_{g}(h+K)\right)}{\partial t}+\nabla \cdot\left(\alpha \rho_{g} \mathbf{U}_{g}(h+K)\right)-\nabla \cdot\left(\alpha \alpha_{e f f} \nabla(\mathrm{h})\right)=\alpha \nabla p+\alpha \rho_{g} \mathbf{U}_{g} \cdot \mathbf{g}+S_{h}
\frac{\partial\left(\alpha \rho_{g} Y_{i}\right)}{\partial t}+\nabla \cdot\left(\alpha \rho_{g} \mathbf{U}_{g} Y_{i}\right)-\nabla \cdot\left(\alpha D_{e f f} \nabla\left(\rho_{g} Y_{i}\right)\right)=S_{i}
在原有的coalChemistryFoam的基础上,需要做以下三点修改:

  1. 建立新的fields variables,主要就是体积分数\alpha
  2. 建立新的湍流模型
  3. 更新方程的求解

Alpha fields

createFields.H中将

#include "compressibleCreatePhi.H"

替换为

surfaceScalarField phi
(
    IOobject
    (
        "phi",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    linearInterpolate(U) & mesh.Sf()
);

这个OF中的phi在可压缩流中表示的就是质量通量,对比原来的compressibleCreatePhi.H

 surfaceScalarField phi
 (
     IOobject
     (
         "phi",
         runTime.timeName(),
         mesh,
         IOobject::READ_IF_PRESENT,
         IOobject::AUTO_WRITE
     ),
     linearInterpolate(rho*U) & mesh.Sf()
 );

不难发现\phi = \rho*U 被替换为\phi = U,为什么这么做大家可以思考一下
接着定义了连续相的体积分数

volScalarField alphac
(
    IOobject
    (
        "alpha",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    mesh,
    dimensionedScalar(dimless, Zero)
);

计算连续相体积分数

scalar alphacMin // 相体积分数的最小值 = 1 - 离散相体积分数的最大值
(
    1.0
  - readScalar
    (
        coalParcels.particleProperties().subDict("constantProperties")
       .lookup("alphaMax")
    )
);

// Update alphac from the particle locations
alphac = max(1.0 - coalParcels.theta() - limestoneParcels.theta(), alphacMin);
alphac.correctBoundaryConditions();

注意到这里调用了Lagrangian类中的theta()函数,这个函数应在OF源代码里是没有的,应该是作者自己定义的,但是作者提交的源代码里并没有Lagrangian类的部分,所以它是如何实现的我们不得而知,但是不难推断出theta()应该是返回离散相的体积。代码里coalParcelslimestoneParcels是离散相的名称,它们是在creatClouds.H文件中定义的:

Info<< "\nConstructing coal cloud" << endl;
coalCloud coalParcels
(
    "coalCloud1",
    rhoc,
    Uc,
    g,
    slgThermo
);

Info<< "\nConstructing limestone cloud" << endl;
basicThermoCloud limestoneParcels
(
    "limestoneCloud1",
    rhoc,
    Uc,
    g,
    slgThermo
);

因为以上的修改,phi不再表示质量通量,故定义新的rhoPhi

surfaceScalarField rhocPhic
(
    IOobject
    (
        "rhoPhi",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    fvc::interpolate(rhoc)*phic
);

surfaceScalarField alphaRhoPhic
(
    IOobject
    (
        "alphaRhoPhi",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    alphacf*rhocPhic
);

至此,体积分数\alpha及考虑体积分数的质量通量都定义好了,后续我们会继续学习余下部分:

  1. 建立新的湍流模型
  2. 更新方程的求解
上一篇下一篇

猜你喜欢

热点阅读