reactingParcleFileFoam
为Euler-Lagrangian框架下的多项流瞬态求解器,可以模拟液滴与液膜的相互作用,例如splash
等。通常由于液滴在气相中分布很稀疏,所以连续相求解仍求解的为单相流(控制方程中未加入孔隙率的影响
),颗粒对流体的作用以源项的方式添加到控制方程中;而颗粒的运动则借助牛顿第二定理来求解(cloud类
),不考虑颗粒之间的碰撞。由于单向流求解器解析比较常见,在此不多做介绍,下面主要介绍在进行PIMPLE迭代前的关于parcel和surfaceFilm的evolve函数。
离散粒子相求解:parcels.evolve()
- parcels的原型为
creatClouds.H
中的
basicReactingCloud parcels
(
"reactingCloud1",
rho,
U,
g,
slgThermo
);
basicReactingCloud
,该原型定义位于:/opt/OpenFOAM/OpenFOAM-2.3.x/src/lagrangian/intermediate/clouds/derived/basicReactingCloud/basicReactingCloud.H
namespace Foam
{
typedef ReactingCloud
<
ThermoCloud
<
KinematicCloud
<
Cloud
<
basicReactingParcel
>
>
>
> basicReactingCloud;
}
这是一个层层相扣的模板类,这些模板类的定义位于/opt/OpenFOAM/OpenFOAM-2.3.x/src/lagrangian/intermediate/clouds/Templates
类模板最中心为basicReactingParcel
该原型的定义位于 /opt/OpenFOAM/OpenFOAM2.3.x/src/lagrangian/intermediate/parcels/derived/basicReactingParcel
2. evolve()函数:
evlove()
函数定义位于/src/largrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.C/
template<class CloudType>
void Foam::ReactingCloud<CloudType>::evolve()
{
if (this->solution().canEvolve())
{
typename parcelType::template
TrackingData<ReactingCloud<CloudType> > td(*this);
this->solve(td);
}
}
可以发现调用了solve函数,该函数定义位于
/src/largrangian/intermediate/clouds/Templates/KinematicColud/KinematicColud.C
template<class CloudType>
template<class TrackData>
void Foam::KinematicCloud<CloudType>::solve(TrackData& td)
{
if (solution_.steadyState())
{
td.cloud().storeState();
td.cloud().preEvolve();
evolveCloud(td);
if (solution_.coupled())
{
td.cloud().relaxSources(td.cloud().cloudCopy());
}
}
else
{
td.cloud().preEvolve();
evolveCloud(td);
if (solution_.coupled())
{
td.cloud().scaleSources();
}
}
td.cloud().info();
td.cloud().postEvolve();
if (solution_.steadyState())
{
td.cloud().restoreState();
}
}
其中主要是调用3个*Evolve()
函数开track parcel的运动。其中evolveCloud(td)最终调用了/opt/OpenFOAM/OpenFOAM-2.3.x/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
中的move()
函数来实现颗粒的运动。
surfaceFilm.evolve()
关于surfaceFilm的官方文档,由于该文档比较简单,我将从源代码的角度进行介绍。
关于surfaceFilm的求解是在Euler的框架下,在指定边界处extrude的一层网格内求解局部连续性方程,动量方程以及能量方程。
void Foam::regionModels::regionModel::evolve()
{
if (active_)
{
Info<< "\nEvolving " << modelName_ << " for region "
<< regionMesh().name() << endl;
//read();
preEvolveRegion();
evolveRegion();
postEvolveRegion();
// Provide some feedback
if (infoOutput_)
{
Info<< incrIndent;
info();
Info<< endl << decrIndent;
}
if (time_.outputTime())
{
outputProperties().writeObject
(
IOstream::ASCII,
IOstream::currentVersion,
time_.writeCompression()
);
}
}
}
位于:/opt/OpenFOAM/OpenFOAM-2.3.x/src/regionModels/regionModel/regionModel/regionModel.C
同样该函数中主要调用了(preEvolve, evolve, postEvolve)Region
函数,其中surfaceFilm的求解是在evolveRegion()函数中进行的;该函数在regionModel.C中的定义为一个虚函数,只提供了一个接口,具体函数实现在不同的模型中,例如本求解其中的实现位于/opt/OpenFOAM/OpenFOAM-2.3.x/src/regionModels/surfaceFilmModels/thermoSingleLayer/thermoSingleLayer.C
,分别求解了连续性方程,动量方程,能量方程以及厚度方程,以能量方程为例:
void thermoSingleLayer::solveEnergy()
{
if (debug)
{
Info<< "thermoSingleLayer::solveEnergy()" << endl;
}
updateSurfaceTemperatures();
solve
(
fvm::ddt(deltaRho_, hs_)
+ fvm::div(phi_, hs_)
==
- hsSp_
+ q(hs_)
+ radiation_->Shs()
// - fvm::SuSp(rhoSp_, hs_)
- rhoSp_*hs_
);
correctThermoFields();
// evaluate viscosity from user-model
viscosity_->correct(pPrimary_, T_);
}