populationBalanceModel: Added Prince and Blanch (1990) coalescence model

Patch contributed by Institute of Fluid Dynamics, Helmholtz-Zentrum
Dresden - Rossendorf (HZDR)
This commit is contained in:
Will Bainbridge
2018-05-16 16:04:17 +01:00
parent fc76565a70
commit 018da5a3ce
12 changed files with 405 additions and 65 deletions

View File

@ -21,6 +21,7 @@ populationBalanceModel/coalescenceModels/coalescenceModel/coalescenceModel.C
populationBalanceModel/coalescenceModels/constantCoalescence/constantCoalescence.C populationBalanceModel/coalescenceModels/constantCoalescence/constantCoalescence.C
populationBalanceModel/coalescenceModels/CoulaloglouTavlaridesCoalescence/CoulaloglouTavlaridesCoalescence.C populationBalanceModel/coalescenceModels/CoulaloglouTavlaridesCoalescence/CoulaloglouTavlaridesCoalescence.C
populationBalanceModel/coalescenceModels/hydrodynamic/hydrodynamic.C populationBalanceModel/coalescenceModels/hydrodynamic/hydrodynamic.C
populationBalanceModel/coalescenceModels/PrinceBlanch/PrinceBlanch.C
populationBalanceModel/binaryBreakupModels/binaryBreakupModel/binaryBreakupModel.C populationBalanceModel/binaryBreakupModels/binaryBreakupModel/binaryBreakupModel.C
populationBalanceModel/binaryBreakupModels/powerLawUniformBinary/powerLawUniformBinary.C populationBalanceModel/binaryBreakupModels/powerLawUniformBinary/powerLawUniformBinary.C

View File

@ -26,7 +26,6 @@ License
#include "LaakkonenAlopaeusAittamaa.H" #include "LaakkonenAlopaeusAittamaa.H"
#include "addToRunTimeSelectionTable.H" #include "addToRunTimeSelectionTable.H"
#include "phaseCompressibleTurbulenceModel.H" #include "phaseCompressibleTurbulenceModel.H"
#include "phaseSystem.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -80,10 +79,6 @@ Foam::diameterModels::breakupModels::LaakkonenAlopaeusAittamaa::setBreakupRate
{ {
const phaseModel& continuousPhase = popBal_.continuousPhase(); const phaseModel& continuousPhase = popBal_.continuousPhase();
const sizeGroup& fi = *popBal_.sizeGroups()[i]; const sizeGroup& fi = *popBal_.sizeGroups()[i];
const volScalarField sigma
(
popBal_.fluid().sigma(phasePair(fi.phase(), continuousPhase))
);
breakupRate = breakupRate =
C1_*cbrt(continuousTurbulence().epsilon()) C1_*cbrt(continuousTurbulence().epsilon())
@ -91,7 +86,7 @@ Foam::diameterModels::breakupModels::LaakkonenAlopaeusAittamaa::setBreakupRate
( (
sqrt sqrt
( (
C2_*sigma C2_*popBal_.sigmaWithContinuousPhase(fi.phase())
/( /(
continuousPhase.rho()*pow(fi.d(), 5.0/3.0) continuousPhase.rho()*pow(fi.d(), 5.0/3.0)
*pow(continuousTurbulence().epsilon(), 2.0/3.0) *pow(continuousTurbulence().epsilon(), 2.0/3.0)

View File

@ -27,18 +27,18 @@ Class
Description Description
Model of Laakkonen et al. (2006). The total breakup rate is calculated by Model of Laakkonen et al. (2006). The total breakup rate is calculated by
\f[ \f[
C_1 \epsilon_c^{1/3} C_1 \epsilon_c^{1/3}
\mathrm{erfc} \mathrm{erfc}
\left( \left(
\sqrt \sqrt
{ {
C_2 \frac{\sigma}{\rho_c \epsilon_c^{2/3} (6v_i/\pi)^{5/9}} C_2 \frac{\sigma}{\rho_c \epsilon_c^{2/3} (6v_i/\pi)^{5/9}}
+ C_3 \frac{\mu_c}{\sqrt{\rho_c \rho_d} + C_3 \frac{\mu_c}{\sqrt{\rho_c \rho_d}
\epsilon_c^{1/3} (6v_i/\pi)^{4/9}} \epsilon_c^{1/3} (6v_i/\pi)^{4/9}}
} }
\right) \right)
\f] \f]
where where

View File

@ -84,7 +84,7 @@ addToCoalescenceRate
( (
- C2_*continuousPhase.mu()*continuousPhase.rho() - C2_*continuousPhase.mu()*continuousPhase.rho()
*continuousTurbulence().epsilon() *continuousTurbulence().epsilon()
/sqr(sigma(fi.phase().name(), continuousPhase.name())) /sqr(popBal_.sigmaWithContinuousPhase(fi.phase()))
/pow3(1 + popBal_.alphas()) /pow3(1 + popBal_.alphas())
*pow4(cbrt(fi.x())*cbrt(fj.x())/(cbrt(fi.x()) + cbrt(fj.x()))) *pow4(cbrt(fi.x())*cbrt(fj.x())/(cbrt(fi.x()) + cbrt(fj.x())))
); );

View File

@ -28,18 +28,18 @@ Description
Model of Coulaloglou and Tavlarides (1977). The coalescence rate is Model of Coulaloglou and Tavlarides (1977). The coalescence rate is
calculated by calculated by
\f[ \f[
C_1 (v_i^{2/3} + v_j^{2/3}) (v_i^{2/9} + v_j^{2/9})^{1/2} C_1 (v_i^{2/3} + v_j^{2/3}) (v_i^{2/9} + v_j^{2/9})^{1/2}
\frac{\epsilon_c^{1/3}}{1 + \alpha_d} \frac{\epsilon_c^{1/3}}{1 + \alpha_d}
\text{exp} \text{exp}
\left[ \left[
- C_2 \frac{\mu_c \rho_c}{\sigma^2} - C_2 \frac{\mu_c \rho_c}{\sigma^2}
\frac{\epsilon_c}{(1 + \alpha_d)^{3}} \frac{\epsilon_c}{(1 + \alpha_d)^{3}}
\left( \left(
\frac{v_i^{1/3} v_j^{1/3}}{v_i^{1/3} + v_j^{1/3}} \frac{v_i^{1/3} v_j^{1/3}}{v_i^{1/3} + v_j^{1/3}}
\right)^{4} \right)^{4}
\right] \right]
\f] \f]
where where

View File

@ -0,0 +1,146 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 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 "PrinceBlanch.H"
#include "addToRunTimeSelectionTable.H"
#include "mathematicalConstants.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
namespace coalescenceModels
{
defineTypeNameAndDebug(PrinceBlanch, 0);
addToRunTimeSelectionTable
(
coalescenceModel,
PrinceBlanch,
dictionary
);
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::diameterModels::coalescenceModels::PrinceBlanch::
PrinceBlanch
(
const populationBalanceModel& popBal,
const dictionary& dict
)
:
coalescenceModel(popBal, dict),
C1_("C1", dimless, dict.lookupOrDefault<scalar>("C1", 0.356)),
h0_("h0", dimLength, dict.lookupOrDefault<scalar>("h0", 1e-4)),
hf_("hf", dimLength, dict.lookupOrDefault<scalar>("h0", 1e-8)),
turbulentCollisions_(dict.lookup("turbulentCollisions")),
buoyantCollisions_(dict.lookup("buoyantCollisions")),
laminarShearCollisions_(dict.lookup("laminarShearCollisions"))
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void
Foam::diameterModels::coalescenceModels::PrinceBlanch::
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];
scalar pi = constant::mathematical::pi;
const uniformDimensionedVectorField& g =
popBal_.mesh().lookupObject<uniformDimensionedVectorField>("g");
dimensionedScalar rij = 1.0/(1.0/fi.d() + 1.0/fj.d());
volScalarField collisionEfficiency =
exp
(
- sqrt
(
pow3(rij)*continuousPhase.rho()
/(16.0*popBal_.sigmaWithContinuousPhase(fi.phase()))
)
*log(h0_/hf_)
*cbrt(continuousTurbulence().epsilon())/pow(rij, 2.0/3.0)
);
if (turbulentCollisions_)
{
coalescenceRate +=
(
C1_*pi*sqr(fi.d() + fj.d())
*cbrt(continuousTurbulence().epsilon())
*sqrt(pow(fi.d(), 2.0/3.0) + pow(fj.d(), 2.0/3.0))
)
*collisionEfficiency;
}
if (buoyantCollisions_)
{
dimensionedScalar Sij = pi/4.0*sqr(fi.d() + fj.d());
coalescenceRate +=
(
Sij
*mag
(
sqrt
(
2.14*popBal_.sigmaWithContinuousPhase(fi.phase())
/(continuousPhase.rho()*fi.d()) + 0.505*mag(g)*fi.d()
)
- sqrt
(
2.14*popBal_.sigmaWithContinuousPhase(fi.phase())
/(continuousPhase.rho()*fj.d()) + 0.505*mag(g)*fj.d()
)
)
)
*collisionEfficiency;
}
if (laminarShearCollisions_)
{
FatalErrorInFunction
<< "Laminar shear collision contribution not implemented for "
<< this->type() << " coalescence model."
<< exit(FatalError);
}
}
// ************************************************************************* //

View File

@ -0,0 +1,205 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2018 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::PrinceBlanch
Description
Model of Prince and Blanch (1990). The coalescence rate is calculated by
\f[
\left( \theta_{ij}^{T} + \theta_{ij}^{B} + \theta_{ij}^{LS} \right)
\lambda_{ij}
\f]
with the coalescence efficiency
\f[
\lambda_{ij} =
\mathrm{exp}
\left(
- \sqrt{\frac{r_{ij}^3 \rho_c}{16 \sigma}}
\mathrm{ln} \left(\frac{h_0}{h_f}\right)
\epsilon_c^{1/3}/r_{ij}^{2/3}
\right)\;,
\f]
the turbulent collision rate
\f[
\theta_{ij}^{T} =
C_1 \pi (d_i + d_j)^{2} \epsilon_c^{1/3}
\sqrt{d_{i}^{2/3} + d_{j}^{2/3}}\;,
\f]
and the buoyancy-driven collision rate
\f[
\theta_{ij}^{B} = S_{ij} \left| u_{ri} - u_{rj} \right|\;,
\f]
where the rise velocity of bubble i is calculated by
\f[
u_{ri} = \sqrt{2.14 \sigma / \left(\rho_c d_i \right) + 0.505 g d_i}\;,
\f]
the equivalent radius by
\f[
r_{ij} = \left( \frac{1}{d_i} + \frac{1}{d_j} \right)^{-1}
\f]
and the collision cross sectional area by
\f[
S_{ij} = \frac{\pi}{4} \left(d_i + d_j\right)^{2}\;.
\f]
Note that in equation 2, the bubble radius has been substituted by the
bubble diameter. Also the expression for the equivalent radius r_ij
(equation 19 in the paper of Prince and Blanch (1990)) was corrected.
The collision rate contribution due to laminar shear in the continuous phase
is currently neglected.
\vartable
\theta_{ij}^{T} | Turbulent collision rate [m3/s]
\theta_{ij}^{B} | Buoyancy-driven collision rate [m3/s]
\theta_{ij}^{LS} | Laminar shear collision rate [m3/s]
\lambda_{ij} | Coalescence efficiency [-]
r_{ij} | Equivalent radius [m]
\rho_c | Density of continous phase [kg/m3]
\sigma | Surface tension [N/m]
h_0 | Initial film thickness [m]
h_f | Critical film thickness [m]
\epsilon_c | Continuous phase turbulent dissipation rate [m2/s3]
d_i | Diameter of bubble i [m]
d_j | Diameter of bubble j [m]
u_{ri} | Rise velocity of bubble i [m/s]
S_{ij} | Collision cross sectional area [m2]
g | Gravitational constant [m/s2]
\endvartable
References:
\verbatim
"Bubble Coalescence and Break-Up in Air-Sparged Bubble-Columns"
Prince, M.J., Blanch, H.W.
AIChE Journal, Vol. 36, Issue 10, 1990, pp. 1485-1499
\endverbatim
Usage
\table
Property | Description | Required | Default value
C1 | Coefficient C1 | no | 0.089
\endtable
SourceFiles
PrinceBlanch.C
\*---------------------------------------------------------------------------*/
#ifndef PrinceBlanch_H
#define PrinceBlanch_H
#include "coalescenceModel.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace diameterModels
{
namespace coalescenceModels
{
/*---------------------------------------------------------------------------*\
Class PrinceBlanch Declaration
\*---------------------------------------------------------------------------*/
class PrinceBlanch
:
public coalescenceModel
{
// Private data
//- Optional coefficient C1, defaults to 0.089
dimensionedScalar C1_;
//- Initial film thickness, defaults to 1e-4m
dimensionedScalar h0_;
//- Critical film thickness, defaults to 1e-8m
dimensionedScalar hf_;
//- Switch for considering turbulent collisions
Switch turbulentCollisions_;
//- Switch for considering buoyancy-induced collisions
Switch buoyantCollisions_;
//- Switch for considering buoyancy-induced collisions
Switch laminarShearCollisions_;
public:
//- Runtime type information
TypeName("PrinceBlanch");
// Constructor
PrinceBlanch
(
const populationBalanceModel& popBal,
const dictionary& dict
);
//- Destructor
virtual ~PrinceBlanch()
{}
// Member Functions
//- Add to coalescenceRate
virtual void addToCoalescenceRate
(
volScalarField& coalescenceRate,
const label i,
const label j
);
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace coalescenceModels
} // End namespace diameterModels
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -24,7 +24,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "coalescenceModel.H" #include "coalescenceModel.H"
#include "phaseSystem.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -38,25 +37,6 @@ namespace diameterModels
} }
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
const Foam::tmp<Foam::volScalarField>
Foam::diameterModels::coalescenceModel::sigma
(
const word& phase1,
const word& phase2
) const
{
const phasePairKey key
(
phase1,
phase2
);
return popBal_.fluid().sigma(key);
}
// * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::diameterModels::coalescenceModel> Foam::autoPtr<Foam::diameterModels::coalescenceModel>

View File

@ -59,16 +59,6 @@ protected:
const populationBalanceModel& popBal_; const populationBalanceModel& popBal_;
// Protected member functions
//- Return the surface tension coefficient
const tmp<volScalarField> sigma
(
const word& phase1,
const word& phase2
) const;
public: public:
//- Runtime type information //- Runtime type information

View File

@ -32,10 +32,10 @@ Description
mass conservation following Kumar and Ramkrishna (1996). Also the internal mass conservation following Kumar and Ramkrishna (1996). Also the internal
coordinate was changed to particle volume, which gives coordinate was changed to particle volume, which gives
\f[ \f[
\frac{60}{v_j} \left(\frac{v_i}{v_j}\right)^{2} \frac{60}{v_j} \left(\frac{v_i}{v_j}\right)^{2}
\left(1 - \frac{v_i}{v_j}\right)^{2} \left(1 - \frac{v_i}{v_j}\right)^{2}
\f] \f]
where where

View File

@ -1145,6 +1145,22 @@ Foam::diameterModels::populationBalanceModel::gamma
} }
const Foam::tmp<Foam::volScalarField>
Foam::diameterModels::populationBalanceModel::sigmaWithContinuousPhase
(
const phaseModel& dispersedPhase
) const
{
const phasePairKey key
(
dispersedPhase.name(),
continuousPhase_.name()
);
return fluid_.sigma(key);
}
void Foam::diameterModels::populationBalanceModel::solve() void Foam::diameterModels::populationBalanceModel::solve()
{ {
const dictionary& solutionControls = mesh_.solverDict(name_); const dictionary& solutionControls = mesh_.solverDict(name_);

View File

@ -412,6 +412,13 @@ public:
const dimensionedScalar& v const dimensionedScalar& v
) const; ) const;
//- Return the surface tension coefficient between a given dispersed
// and the continuous phase
const tmp<volScalarField> sigmaWithContinuousPhase
(
const phaseModel& dispersedPhase
) const;
//- Solve the population balance equation //- Solve the population balance equation
void solve(); void solve();
}; };