multiphaseEulerFoam: Added coalescence and breakup models of Liao et al. (2015)

Patch contributed by Institute of Fluid Dynamics,
Helmholtz-Zentrum Dresden - Rossendorf (HZDR)
This commit is contained in:
Will Bainbridge
2021-08-12 10:33:51 +01:00
parent 79a6b73547
commit fe98296668
7 changed files with 1178 additions and 0 deletions

View File

@ -51,6 +51,7 @@ $(coalescenceModels)/CoulaloglouTavlarides/CoulaloglouTavlarides.C
$(coalescenceModels)/DahnekeInterpolation/DahnekeInterpolation.C
$(coalescenceModels)/hydrodynamic/hydrodynamic.C
$(coalescenceModels)/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.C
$(coalescenceModels)/LiaoCoalescence/LiaoCoalescence.C
$(coalescenceModels)/Luo/Luo.C
$(coalescenceModels)/PrinceBlanch/PrinceBlanch.C
$(coalescenceModels)/turbulentShear/turbulentShear.C
@ -58,6 +59,8 @@ $(coalescenceModels)/turbulentShear/turbulentShear.C
binaryBreakupModels = populationBalanceModel/binaryBreakupModels
$(binaryBreakupModels)/binaryBreakupModel/binaryBreakupModel.C
$(binaryBreakupModels)/LehrMilliesMewes/LehrMilliesMewes.C
$(binaryBreakupModels)/Liao/LiaoBase.C
$(binaryBreakupModels)/Liao/Liao.C
$(binaryBreakupModels)/LuoSvendsen/LuoSvendsen.C
$(binaryBreakupModels)/powerLawUniformBinary/powerLawUniformBinary.C

View File

@ -0,0 +1,161 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "Liao.H"
#include "addToRunTimeSelectionTable.H"
#include "mathematicalConstants.H"
#include "fvcGrad.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
namespace binaryBreakupModels
{
defineTypeNameAndDebug(Liao, 0);
addToRunTimeSelectionTable
(
binaryBreakupModel,
Liao,
dictionary
);
}
}
}
using Foam::constant::mathematical::pi;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::diameterModels::binaryBreakupModels::Liao::Liao
(
const populationBalanceModel& popBal,
const dictionary& dict
)
:
binaryBreakupModel(popBal, dict),
LiaoBase(popBal, dict),
BTurb_(dimensionedScalar::lookupOrDefault("BTurb", dict, dimless, 1)),
BShear_(dimensionedScalar::lookupOrDefault("BShear", dict, dimless, 1)),
BEddy_(dimensionedScalar::lookupOrDefault("BEddy", dict, dimless, 1)),
BFric_(dimensionedScalar::lookupOrDefault("BFric", dict, dimless, 0.25)),
turbulence_(dict.lookup("turbulence")),
laminarShear_(dict.lookup("laminarShear")),
turbulentShear_(dict.lookup("turbulentShear")),
interfacialFriction_(dict.lookup("interfacialFriction"))
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::diameterModels::binaryBreakupModels::Liao::precompute()
{
LiaoBase::precompute();
}
void Foam::diameterModels::binaryBreakupModels::Liao::
addToBinaryBreakupRate
(
volScalarField& binaryBreakupRate,
const label i,
const label j
)
{
const phaseModel& continuousPhase = popBal_.continuousPhase();
const sizeGroup& fi = popBal_.sizeGroups()[i];
const sizeGroup& fj = popBal_.sizeGroups()[j];
dimensionedScalar dk(cbrt(pow3(fj.dSph()) - pow3(fi.dSph())));
const volScalarField tauCrit1
(
6*popBal_.sigmaWithContinuousPhase(fj.phase())/fj.dSph()
*(sqr(fi.dSph()/fj.dSph()) + sqr(dk/fj.dSph()) - 1)
);
const volScalarField tauCrit2
(
popBal_.sigmaWithContinuousPhase(fj.phase())/min(dk, fi.dSph())
);
const volScalarField tauCrit(max(tauCrit1, tauCrit2));
if (turbulence_)
{
const volScalarField tauTurb
(
pos(fj.dSph() - kolmogorovLengthScale_)*BTurb_*continuousPhase.rho()
*sqr(cbrt(popBal_.continuousTurbulence().epsilon()*fj.dSph()))
);
binaryBreakupRate +=
pos(tauTurb - tauCrit)*1/fj.dSph()
*sqrt(mag(tauTurb - tauCrit)/continuousPhase.rho())/fj.x();
}
if (laminarShear_)
{
const volScalarField tauShear
(
BShear_*continuousPhase.thermo().mu()*shearStrainRate_
);
binaryBreakupRate +=
pos(tauShear - tauCrit)*1/fj.dSph()
*sqrt(mag(tauShear - tauCrit)/continuousPhase.rho())/fj.x();
}
if (turbulentShear_)
{
const volScalarField tauEddy
(
pos0(kolmogorovLengthScale_ - fj.dSph())
*BEddy_*continuousPhase.thermo().mu()*eddyStrainRate_
);
binaryBreakupRate +=
pos(tauEddy - tauCrit)*1/fj.dSph()
*sqrt(mag(tauEddy - tauCrit)/continuousPhase.rho())/fj.x();
}
if (interfacialFriction_)
{
const volScalarField tauFric
(
BFric_*0.5*continuousPhase.rho()*sqr(uTerminal_[j])*Cd_[j]
);
binaryBreakupRate +=
pos(tauFric - tauCrit)*1/fj.dSph()
*sqrt(mag(tauFric - tauCrit)/continuousPhase.rho())/fj.x();
}
}
// ************************************************************************* //

View File

@ -0,0 +1,159 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::diameterModels::binaryBreakupModels::Liao
Description
Bubble breakup model of Liao et al. (2015). The terminal velocities and drag
coefficients are computed by an iterative procedure based on the drag model
of Ishii and Zuber (1979) at the beginning of the simulation, assuming
single bubbles rising in quiescent liquid.
References:
\verbatim
Liao, Y.; Rzehak, R.; Lucas, D.; Krepper, E. (2015).
Baseline closure models for dispersed bubbly flow: Bubble coalescence
and breakup.
Chemical Engineering Science, 122, 336-349.
Ishii, M., & Zuber, N. (1979).
Drag coefficient and relative velocity in bubbly, droplet or particulate
flows.
AIChE Journal, 25(5), 843-855.
\endverbatim
Usage
\table
Property | Description | Required | Default value
BTurb | coefficient BTurb | no | 1.0
BShear | coefficient Bbuoy | no | 1.0
BEddy | coefficient BEddy | no | 1.0
BFric | coefficient Bwake | no | 1.0
turbulence | Switch for turbulence | yes | none
laminarShear | Switch for laminar shear | yes | none
turbulentShear | Switch for eddies | yes | none
friction | Switch for friction | yes | none
\endtable
SourceFiles
Liao.C
\*---------------------------------------------------------------------------*/
#ifndef Liao_H
#define Liao_H
#include "binaryBreakupModel.H"
#include "LiaoBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
namespace binaryBreakupModels
{
/*---------------------------------------------------------------------------*\
Class Liao Declaration
\*---------------------------------------------------------------------------*/
class Liao
:
public binaryBreakupModel,
public LiaoBase
{
// Private Data
//- Optional coefficient BTurb
dimensionedScalar BTurb_;
//- Optional coefficient BShear
dimensionedScalar BShear_;
//- Optional coefficient BEddy
dimensionedScalar BEddy_;
//- Optional coefficient BFric
dimensionedScalar BFric_;
//- Switch for considering turbulent velocity fluctuation
Switch turbulence_;
//- Switch for considering velocity gradients in the bulk
Switch laminarShear_;
//- Switch for considering eddies
Switch turbulentShear_;
//- Switch for considering interfacial friction
Switch interfacialFriction_;
public:
//- Runtime type information
TypeName("Liao");
// Constructor
Liao
(
const populationBalanceModel& popBal,
const dictionary& dict
);
//- Destructor
virtual ~Liao()
{}
// Member Functions
//- Precompute diameter independent expressions
virtual void precompute();
//- Add to binary breakupRate
virtual void addToBinaryBreakupRate
(
volScalarField& binaryBreakupRate,
const label i,
const label j
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace binaryBreakupModels
} // End namespace diameterModels
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,221 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "LiaoBase.H"
#include "fvcGrad.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::diameterModels::LiaoBase::LiaoBase
(
const populationBalanceModel& popBal,
const dictionary& dict
)
:
populationBalance_(popBal),
kolmogorovLengthScale_
(
IOobject
(
"kolmogorovLengthScale",
populationBalance_.time().timeName(),
populationBalance_.mesh()
),
populationBalance_.mesh(),
dimensionedScalar
(
"kolmogorovLengthScale",
dimLength,
Zero
)
),
shearStrainRate_
(
IOobject
(
"shearStrainRate",
populationBalance_.time().timeName(),
populationBalance_.mesh()
),
populationBalance_.mesh(),
dimensionedScalar
(
"shearStrainRate",
dimVelocity/dimLength,
Zero
)
),
eddyStrainRate_
(
IOobject
(
"eddyStrainRate",
populationBalance_.time().timeName(),
populationBalance_.mesh()
),
populationBalance_.mesh(),
dimensionedScalar
(
"eddyStrainRate",
dimVelocity/dimLength,
Zero
)
)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::diameterModels::LiaoBase::precompute()
{
kolmogorovLengthScale_ =
pow025
(
pow3(populationBalance_.continuousPhase().thermo().nu())
/populationBalance_.continuousTurbulence().epsilon()
);
shearStrainRate_ =
sqrt(2.0)
*mag(symm(fvc::grad(populationBalance_.continuousPhase().U())));
eddyStrainRate_ =
sqrt
(
populationBalance_.continuousPhase().rho()
*populationBalance_.continuousTurbulence().epsilon()
/populationBalance_.continuousPhase().thermo().mu()
);
if (uTerminal_.empty())
{
const fvMesh& mesh = populationBalance_.mesh();
const uniformDimensionedVectorField& g =
mesh.lookupObject<uniformDimensionedVectorField>("g");
const dimensionedScalar nuc
(
"nuc",
dimViscosity,
gAverage(populationBalance_.continuousPhase().thermo().nu()())
);
const dimensionedScalar rhoc
(
"rhoc",
dimDensity,
gAverage(populationBalance_.continuousPhase().rho()())
);
const dimensionedScalar rhod
(
"rhod",
dimDensity,
gAverage(populationBalance_.sizeGroups()[1].phase().rho()())
);
const dimensionedScalar sigma
(
"sigma",
dimForce/dimLength,
gAverage
(
populationBalance_.sigmaWithContinuousPhase
(
populationBalance_.sizeGroups()[1].phase()
)()
)
);
for(int m = 0; m < populationBalance_.sizeGroups().size(); m++)
{
const sizeGroup& f = populationBalance_.sizeGroups()[m];
dimensionedScalar uTerminal("uTerminal", dimVelocity, 0.2);
dimensionedScalar Cd("Cd", dimless, 0.44);
dimensionedScalar CdEllipse("CdEllipse", dimless, 1);
dimensionedScalar Re(uTerminal*f.dSph()/nuc);
const dimensionedScalar Eo
(
mag(g)*mag(rhoc - rhod)*sqr(f.dSph())/sigma
);
dimensionedScalar F("F", dimForce/dimArea, 1);
dimensionedScalar dF("dF", dimForce/dimArea/dimVelocity, 1);
const dimensionedScalar uTerminalX("uTerminalX", dimVelocity, 1e-5);
dimensionedScalar ReX("ReX", dimless, Re.value());
dimensionedScalar CdX("CdX", dimless, Cd.value());
dimensionedScalar dCd("dCd", Cd.dimensions()/dimVelocity, Zero);
int n = 0;
while(mag(F.value()) >= 1.0e-05 && n++ <= 20)
{
Re = uTerminal*f.dSph()/nuc;
Cd =
pos0(1000 - Re)*24/Re*(1 + 0.1*pow(Re, 0.75))
+ neg(1000 - Re)*0.44;
CdEllipse = 0.6666*sqrt(Eo);
Cd =
pos0(CdEllipse - Cd)
*min(CdEllipse.value(), 8.0/3.0)
+ neg(CdEllipse - Cd)*Cd;
F =
4.0/3.0*(rhoc - rhod)*mag(g)*f.dSph()
- rhoc*Cd*sqr(uTerminal);
ReX = (uTerminal + uTerminalX)*f.dSph()/nuc;
CdX =
pos0(1000 - ReX)
*24/ReX*(1 + 0.1*pow(ReX, 0.75))
+ neg(1000 - ReX)*0.44;
CdX =
pos0(CdEllipse - CdX)
*min(CdEllipse.value(), 2.66667)
+ neg(CdEllipse - CdX)*CdX;
dCd = (CdX - Cd)/uTerminalX;
dF = -(2*rhoc*uTerminal*Cd + rhoc*sqr(uTerminal)*dCd);
uTerminal -= F/dF;
}
uTerminal_.append(new dimensionedScalar("uTerminal", uTerminal));
Cd_.append(new dimensionedScalar("Cd", Cd));
}
}
}
// ************************************************************************* //

View File

@ -0,0 +1,118 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::diameterModels::LiaoBase
Description
Base class for coalescence and breakup models of Liao et al. (2015).
Reference:
\verbatim
Liao, Y.; Rzehak, R.; Lucas, D.; Krepper, E. (2015).
Baseline closure models for dispersed bubbly flow:
Bubble coalescence and breakup.
Chemical Engineering Science, 122, 336-349.
\endverbatim
Usage
SourceFiles
LiaoBase.C
\*---------------------------------------------------------------------------*/
#ifndef LiaoBase_H
#define LiaoBase_H
#include "populationBalanceModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
/*---------------------------------------------------------------------------*\
Class LiaoBase Declaration
\*---------------------------------------------------------------------------*/
class LiaoBase
{
protected:
// Protected Data
//- Reference to the populationBalanceModel
const populationBalanceModel& populationBalance_;
//- Kolmogorov length scale
volScalarField kolmogorovLengthScale_;
//- Shear strain rate
volScalarField shearStrainRate_;
//- Eddy strain rate
volScalarField eddyStrainRate_;
//- Terminal velocities
PtrList<dimensionedScalar> uTerminal_;
//- Drag coefficients
PtrList<dimensionedScalar> Cd_;
public:
// Constructor
LiaoBase
(
const populationBalanceModel& popBal,
const dictionary& dict
);
//- Destructor
virtual ~LiaoBase()
{}
// Member Functions
//- Precompute diameter independent expressions
virtual void precompute();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace diameterModels
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,309 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "LiaoCoalescence.H"
#include "addToRunTimeSelectionTable.H"
#include "mathematicalConstants.H"
#include "fvcGrad.H"
#include "dragModel.H"
#include "phaseSystem.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
namespace coalescenceModels
{
defineTypeNameAndDebug(LiaoCoalescence, 0);
addToRunTimeSelectionTable
(
coalescenceModel,
LiaoCoalescence,
dictionary
);
}
}
}
using Foam::constant::mathematical::pi;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::diameterModels::coalescenceModels::LiaoCoalescence::
LiaoCoalescence
(
const populationBalanceModel& popBal,
const dictionary& dict
)
:
coalescenceModel(popBal, dict),
LiaoBase(popBal, dict),
PMax_(dimensionedScalar::lookupOrDefault("PMax", dict, dimless, 0.8)),
AH_(dimensionedScalar::lookupOrDefault("AH", dict, dimEnergy, 3.7e-20)),
CEff_(dimensionedScalar::lookupOrDefault("CEff", dict, dimless, 2.5)),
CTurb_(dimensionedScalar::lookupOrDefault("CTurb", dict, dimless, 1)),
CBuoy_(dimensionedScalar::lookupOrDefault("CBuoy", dict, dimless, 1)),
CShear_(dimensionedScalar::lookupOrDefault("CShear", dict, dimless, 1)),
CEddy_(dimensionedScalar::lookupOrDefault("CEddy", dict, dimless, 1)),
CWake_(dimensionedScalar::lookupOrDefault("CWake", dict, dimless, 1)),
turbulence_(dict.lookup("turbulence")),
buoyancy_(dict.lookup("buoyancy")),
laminarShear_(dict.lookup("laminarShear")),
eddyCapture_(dict.lookup("eddyCapture")),
wakeEntrainment_(dict.lookup("wakeEntrainment")),
CPack_
(
IOobject
(
"CPack",
popBal_.time().timeName(),
popBal_.mesh()
),
popBal_.mesh(),
dimensionedScalar
(
"CPack",
dimless,
Zero
)
),
CPackMax_
(
dimensionedScalar::lookupOrDefault("CPackMax", dict, dimless, 1e5)
),
dCrit_
(
IOobject
(
"dCrit",
popBal_.time().timeName(),
popBal_.mesh()
),
popBal_.mesh(),
dimensionedScalar
(
"dCrit",
dimLength,
Zero
)
),
uRelTurb_
(
IOobject
(
"uRelTurb",
popBal_.time().timeName(),
popBal_.mesh()
),
popBal_.mesh(),
dimensionedScalar
(
"uRelTurb",
dimVelocity,
Zero
)
),
uRelBuoy_
(
IOobject
(
"uRelBuoy",
popBal_.time().timeName(),
popBal_.mesh()
),
popBal_.mesh(),
dimensionedScalar
(
"uRelBuoy",
dimVelocity,
Zero
)
),
uRelShear_
(
IOobject
(
"uRelShear",
popBal_.time().timeName(),
popBal_.mesh()
),
popBal_.mesh(),
dimensionedScalar
(
"uRelShear",
dimVelocity,
Zero
)
)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::diameterModels::coalescenceModels::LiaoCoalescence::precompute()
{
LiaoBase::precompute();
CPack_ = min(PMax_/max(PMax_ - popBal_.alphas(), SMALL), CPackMax_);
const uniformDimensionedVectorField& g =
popBal_.mesh().lookupObject<uniformDimensionedVectorField>("g");
dCrit_ =
4*sqrt
(
popBal_.sigmaWithContinuousPhase(popBal_.sizeGroups()[1].phase())()
/(mag(g)*(popBal_.continuousPhase().rho()
- popBal_.sizeGroups()[1].phase().rho()()))
);
}
void Foam::diameterModels::coalescenceModels::LiaoCoalescence::
addToCoalescenceRate
(
volScalarField& coalescenceRate,
const label i,
const label j
)
{
const phaseModel& continuousPhase = popBal_.continuousPhase();
const sizeGroup& fi = popBal_.sizeGroups()[i];
const sizeGroup& fj = popBal_.sizeGroups()[j];
dimensionedScalar dEq(2*fi.dSph()*fj.dSph()/(fi.dSph() + fj.dSph()));
dimensionedScalar Aij(pi*0.25*sqr(fi.dSph() + fj.dSph()));
if (turbulence_)
{
uRelTurb_ =
CTurb_*sqrt(2.0)
*sqrt(sqr(cbrt(fi.dSph())) + sqr(cbrt(fj.dSph())))
*cbrt(popBal_.continuousTurbulence().epsilon());
}
if (buoyancy_)
{
uRelBuoy_ = CBuoy_*mag(uTerminal_[i] - uTerminal_[j]);
}
if (laminarShear_)
{
uRelShear_ = CShear_*0.5/pi*(fi.dSph() + fj.dSph())*shearStrainRate_;
}
const volScalarField collisionEfficiency
(
neg(kolmogorovLengthScale_ - (fi.dSph() + fj.dSph()))
*exp
(
- CEff_*sqrt
(
continuousPhase.rho()*dEq
/popBal_.sigmaWithContinuousPhase(fi.phase())
*sqr(max(uRelTurb_, max(uRelBuoy_, uRelShear_)))
)
)
+ pos0(kolmogorovLengthScale_ - (fi.dSph() + fj.dSph()))
*exp
(
- 3*continuousPhase.thermo().mu()*dEq*eddyStrainRate_
/(4*popBal_.sigmaWithContinuousPhase(fi.phase()))
*log
(
cbrt
(
pi*popBal_.sigmaWithContinuousPhase(fi.phase())*sqr(dEq)
/(32*AH_)
)
)
)
);
if (turbulence_)
{
coalescenceRate +=
neg(kolmogorovLengthScale_ - (fi.dSph() + fj.dSph()))
*CPack_*Aij*uRelTurb_*collisionEfficiency;
}
if (buoyancy_)
{
coalescenceRate += CPack_*0.5*Aij*uRelBuoy_*collisionEfficiency;
}
if (laminarShear_)
{
coalescenceRate += CPack_*0.5*Aij*uRelShear_*collisionEfficiency;
}
if (eddyCapture_)
{
const volScalarField uRelEddy
(
CEddy_*0.5/pi*(fi.dSph() + fj.dSph())*eddyStrainRate_
);
coalescenceRate +=
pos0(kolmogorovLengthScale_ - (fi.dSph() + fj.dSph()))
*CPack_*0.5*Aij*uRelEddy*collisionEfficiency;
}
if (wakeEntrainment_)
{
const dimensionedScalar uRelWakeI
(
CWake_*uTerminal_[i]*cbrt(Cd_[i])
);
const dimensionedScalar uRelWakeJ
(
CWake_*uTerminal_[j]*cbrt(Cd_[j])
);
coalescenceRate +=
CPack_*0.125*pi
*(
sqr(fi.dSph())*uRelWakeI
*pos0(fi.dSph() - 0.5*dCrit_)
*(
pow6(fi.dSph() - 0.5*dCrit_)
/(pow6(fi.dSph() - 0.5*dCrit_) + pow6(0.5*dCrit_))
)
+ sqr(fj.dSph())*uRelWakeJ
*pos0(fj.dSph() - 0.5*dCrit_)
*(
pow6(fj.dSph() - 0.5*dCrit_)
/(pow6(fj.dSph() - 0.5*dCrit_) + pow6(0.5*dCrit_))
)
);
}
}
// ************************************************************************* //

View File

@ -0,0 +1,207 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::diameterModels::coalescenceModels::LiaoCoalescence
Description
Bubble coalescence model of Liao et al. (2015). The terminal velocities and
drag coefficients are computed by an iterative procedure based on the drag
model of Ishii and Zuber (1979) at the beginning of the simulation, assuming
single bubbles rising in quiescent liquid.
Note that the original article contains a mistake concerning the value of
the coefficient CEff. A value of 2.5 instead of 5.0 should be used when
following the Weber number definition in the paper.
References:
\verbatim
Liao, Y.; Rzehak, R.; Lucas, D.; Krepper, E. (2015).
Baseline closure models for dispersed bubbly flow: Bubble coalescence
and breakup.
Chemical Engineering Science, 122, 336-349.
Liao, Y., Rzehak, R., Lucas, D., & Krepper, E. (2021).
Corrigendum to "Baseline closure model for dispersed bubbly flow:
Bubble coalescence and breakup" [Chem. Eng. Sci. 122 (2015) 336349].
Chemical Engineering Science, 241, 116708.
Ishii, M., & Zuber, N. (1979).
Drag coefficient and relative velocity in bubbly, droplet or particulate
flows.
AIChE Journal, 25(5), 843-855.
\endverbatim
Usage
\table
Property | Description | Required | Default value
PMax | Maximum packing limit | no | 0.8
CPackMax | Maximum CPack coefficient | no | 1.0e5
AH | Hamaker constant | no | 3.7e-20
CEff | coefficient CEff | no | 2.5
CTurb | coefficient CTurb | no | 1.0
CBuoy | coefficient CBuoy | no | 1.0
CShear | coefficient CShear | no | 1.0
CEddy | coefficient CEddy | no | 1.0
CWake | coefficient CWake | no | 1.0
turbulence | Switch for turbulence | yes | none
buoyancy | Switch for buoyancy | yes | none
laminarShear | Switch for laminar shear | yes | none
eddyCapture | Switch for eddy capture | yes | none
wake | Switch for wake entrainment | yes | none
\endtable
SourceFiles
LiaoCoalescence.C
\*---------------------------------------------------------------------------*/
#ifndef LiaoCoalescence_H
#define LiaoCoalescence_H
#include "coalescenceModel.H"
#include "LiaoBase.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
namespace coalescenceModels
{
/*---------------------------------------------------------------------------*\
Class LiaoCoalescence Declaration
\*---------------------------------------------------------------------------*/
class LiaoCoalescence
:
public coalescenceModel,
public LiaoBase
{
// Private Data
//- Maximum packing limit of bubbles
dimensionedScalar PMax_;
//- Hamaker constant AH
dimensionedScalar AH_;
//- Optional coefficient CEff
dimensionedScalar CEff_;
//- Optional coefficient CTurb
dimensionedScalar CTurb_;
//- Optional coefficient CBuoy
dimensionedScalar CBuoy_;
//- Optional coefficient CShear
dimensionedScalar CShear_;
//- Optional coefficient CEddy
dimensionedScalar CEddy_;
//- Optional coefficient CWake
dimensionedScalar CWake_;
//- Switch for turbulent collisions
Switch turbulence_;
//- Switch for buoyancy-induced collisions
Switch buoyancy_;
//- Switch for velocity gradient-induced collisions
Switch laminarShear_;
//- Switch for eddy capture-induced collisions
Switch eddyCapture_;
//- Switch for wake entrainment-induced collisions
Switch wakeEntrainment_;
//- Coefficient containing maximum packing limit
volScalarField CPack_;
//- Limiter for the CPack coefficient
dimensionedScalar CPackMax_;
//- Critical diameter
volScalarField dCrit_;
//- Relative velocity for turbulent collisions
volScalarField uRelTurb_;
//- Relative velocity for buoyancy-induced collisions
volScalarField uRelBuoy_;
//- Relative velocity for shear-induced collisions
volScalarField uRelShear_;
public:
//- Runtime type information
TypeName("Liao");
// Constructor
LiaoCoalescence
(
const populationBalanceModel& popBal,
const dictionary& dict
);
//- Destructor
virtual ~LiaoCoalescence()
{}
// Member Functions
//- Precompute diameter independent expressions
virtual void precompute();
//- Add to coalescenceRate
virtual void addToCoalescenceRate
(
volScalarField& coalescenceRate,
const label i,
const label j
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coalescenceModels
} // End namespace diameterModels
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //