version: v1812
twoPhaseEulerFoam 中,diameterModel 有三种类型:
- constant
- isothermal
- IATE
- constant 分散相的粒径为常数
在 constant/phaseProperties 中,
water // water 的性质
{
type purePhaseModel;
diameterModel constant;
constantCoeffs
{
d 1e-4;
}
residualAlpha 1e-6;
}
源代码 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/diameterModels/constantDiameter/constantDiameter.C
Foam::tmp<Foam::volScalarField> Foam::diameterModels::constant::d() const
{
return tmp<Foam::volScalarField>
(
new volScalarField
(
IOobject
(
"d",
phase_.time().timeName(),
phase_.mesh()
),
phase_.mesh(),
d_
)
);
}
- isothermal 分散相的粒径跟压力有关,等温的
在 constant/phaseProperties 中,
air // air 的性质
{
type purePhaseModel; //
diameterModel isothermal; // 等温的分散相粒径模型
isothermalCoeffs // 系数
{
d0 3e-3; // 初始直径
p0 1e5; // 初始压力
}
residualAlpha 1e-6; // 相分数残差控制
}
等温粒径模型为
p \times \frac{4}{3} \pi \left( \frac{d}{2} \right)^3 = p_0 \times \frac{4}{3} \pi \left( \frac{d_0}{2} \right)^3
变换后
d=d_0 \left(\frac{p_0}{p}\right) ^{1/3}
源代码 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/diameterModels/isothermalDiameter/isothermalDiameter.C
Foam::tmp<Foam::volScalarField> Foam::diameterModels::isothermal::d() const
{
const volScalarField& p = phase_.db().lookupObject<volScalarField>
(
"p"
);
return d0_*pow(p0_/p, 1.0/3.0);
}
- IATE (Interfacial Area Transport Equation) 界面面积传输方程
air
{
diameterModel IATE;
IATECoeffs
{
dMax 1e-2;
dMin 1e-4;
residualAlpha 1e-6;
sources
(
wakeEntrainmentCoalescence
{
Cwe 0.002;
}
randomCoalescence
{
Crc 0.04;
C 3;
alphaMax 0.75;
}
turbulentBreakUp
{
Cti 0.085;
WeCr 6;
}
);
}
residualAlpha 1e-6;
}
本模型中,考虑了以下三种机制
- wakeEntrainmentCoalescence
Bubble coalescence by wake entrainment - randomCoalescence
随机碰撞聚并 Bubble coalescence by random collision - turbulentBreakUp
Bubble break-up due to the impact of turbulent eddies
\phi_{TI} = \frac{C_{ti}}{3} \frac{U_t}{d} \sqrt{1 – \frac{We_{Cr}}{We}} e^{-{We_{Cr}}/{We}}
源码 applications/solvers/multiphase/twoPhaseEulerFoam/twoPhaseSystem/diameterModels/IATE/IATE.C
Foam::tmp<Foam::volScalarField> Foam::diameterModels::IATE::dsm() const
{
return max(6/max(kappai_, 6/dMax_), dMin_);
}
// Placeholder for the nucleation/condensation model
// Foam::tmp<Foam::volScalarField> Foam::diameterModels::IATE::Rph() const
// {
// const volScalarField& T = phase_.thermo().T();
// const volScalarField& p = phase_.thermo().p();
//
// scalar A, B, C, sigma, vm, Rph;
//
// volScalarField ps(1e5*pow(10, A - B/(T + C)));
// volScalarField Dbc
// (
// 4*sigma*vm/(constant::physicoChemical::k*T*log(p/ps))
// );
//
// return constant::mathematical::pi*sqr(Dbc)*Rph;
// }
void Foam::diameterModels::IATE::correct()
{
// Initialise the accumulated source term to the dilatation effect
volScalarField R
(
(
(1.0/3.0)
/max
(
fvc::average(phase_ + phase_.oldTime()),
residualAlpha_
)
)
*(fvc::ddt(phase_) + fvc::div(phase_.alphaPhi()))
);
// Accumulate the run-time selectable sources
forAll(sources_, j)
{
R -= sources_[j].R();
}
fv::options& fvOptions(fv::options::New(phase_.mesh()));
// Construct the interfacial curvature equation
fvScalarMatrix kappaiEqn
(
fvm::ddt(kappai_) + fvm::div(phase_.phi(), kappai_)
- fvm::Sp(fvc::div(phase_.phi()), kappai_)
==
- fvm::SuSp(R, kappai_)
//+ Rph() // Omit the nucleation/condensation term
+ fvOptions(kappai_)
);
kappaiEqn.relax();
fvOptions.constrain(kappaiEqn);
kappaiEqn.solve();
// Update the Sauter-mean diameter
d_ = dsm();
}
kappai_
(\kappa_i=\alpha\times A_i, A_i is the interfacial area) is the interfacial curvature, the equation is
\frac{d\kappa_i}{dt} + \nabla\cdot(\kappa_i U) - \kappa_i \nabla\cdot U = R\kappa_i + \kappa_i
where R=\dfrac{1}{3\alpha}\left(\dfrac{d\alpha}{dt}+\nabla\cdot(U\alpha)\right)