基于coalChemistryFoam的稠密气固两相求解器开发
今天和大家一起学习一篇出自于Chalmers University of Technology的OpenFOAM课程的学生报告
对于气固两相流,如果颗粒间距远大于粒径,那么拉格朗日点源假设可以简化计算,但是当颗粒间距与粒径可比或者离散相的体积分数不可忽略,则常用的欧拉-拉格朗日方法可能不再适用,这篇报告的目的就是在欧拉-拉格朗日框架的基础上通过引入离散相的体积分数来魔改OF自带的coalChemistryFoam求解器(本报告针对的是OpenFOAMv1806)。
首先作者简要分析了coalChemistryFoam的框架,因为Lagrangian类比较复杂,有机会以后单独来讲,下面介绍关于体积分数的魔改
连续相控制方程如下(其实就是加了):
在原有的coalChemistryFoam的基础上,需要做以下三点修改:
- 建立新的fields variables,主要就是体积分数
- 建立新的湍流模型
- 更新方程的求解
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()应该是返回离散相的体积。代码里coalParcels 和limestoneParcels是离散相的名称,它们是在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
);
至此,体积分数及考虑体积分数的质量通量都定义好了,后续我们会继续学习余下部分:
- 建立新的湍流模型
- 更新方程的求解
网友评论