From 860a40d237033a7bf9778a3f23880c607261a0c1 Mon Sep 17 00:00:00 2001 From: Will Bainbridge Date: Fri, 1 Feb 2019 12:40:57 +0000 Subject: [PATCH] reactingEulerFoam: populationBalanceModel: Added breakup and coalescence models Added the breakup and coalescence models of Lehr et al. (2002), and the coalescence model of Luo (1993). Patch contributed by Institute of Fluid Dynamics, Helmholtz-Zentrum Dresden - Rossendorf (HZDR) --- .../reactingEulerFoam/phaseSystems/Make/files | 3 + .../phaseSystems/phaseSystem/phaseSystem.H | 14 +- .../phaseSystem/phaseSystemTemplates.C | 51 +++++- .../LehrMilliesMewes/LehrMilliesMewes.C | 112 ++++++++++++ .../LehrMilliesMewes/LehrMilliesMewes.H | 149 ++++++++++++++++ .../LehrMilliesMewesCoalescence.C | 107 ++++++++++++ .../LehrMilliesMewesCoalescence.H | 156 +++++++++++++++++ .../coalescenceModels/Luo/Luo.C | 135 +++++++++++++++ .../coalescenceModels/Luo/Luo.H | 162 ++++++++++++++++++ 9 files changed, 887 insertions(+), 2 deletions(-) create mode 100644 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.C create mode 100644 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.H create mode 100644 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.C create mode 100644 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.H create mode 100644 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.C create mode 100644 applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.H diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/Make/files b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/Make/files index 099876ada3..ee98c2c786 100644 --- a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/Make/files +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/Make/files @@ -22,10 +22,13 @@ populationBalanceModel/coalescenceModels/coalescenceModel/coalescenceModel.C populationBalanceModel/coalescenceModels/constantCoalescence/constantCoalescence.C populationBalanceModel/coalescenceModels/CoulaloglouTavlaridesCoalescence/CoulaloglouTavlaridesCoalescence.C populationBalanceModel/coalescenceModels/hydrodynamic/hydrodynamic.C +populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.C +populationBalanceModel/coalescenceModels/Luo/Luo.C populationBalanceModel/coalescenceModels/PrinceBlanch/PrinceBlanch.C populationBalanceModel/binaryBreakupModels/binaryBreakupModel/binaryBreakupModel.C populationBalanceModel/binaryBreakupModels/LuoSvendsen/LuoSvendsen.C +populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.C populationBalanceModel/binaryBreakupModels/powerLawUniformBinary/powerLawUniformBinary.C populationBalanceModel/breakupModels/breakupModel/breakupModel.C diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystem.H b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystem.H index 830af8e7b3..a1ad7f7f5b 100644 --- a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystem.H +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystem.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2015-2018 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2015-2019 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -357,10 +357,22 @@ public: // Sub-model lookup + //- Check availability of a sub model for a given phase pair + template + bool foundSubModel(const phasePair& key) const; + //- Return a sub model between a phase pair template const modelType& lookupSubModel(const phasePair& key) const; + //- Check availability of a sub model between two phases + template + bool foundSubModel + ( + const phaseModel& dispersed, + const phaseModel& continuous + ) const; + //- Return a sub model between two phases template const modelType& lookupSubModel diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystemTemplates.C b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystemTemplates.C index dc5773edd8..a94c363113 100644 --- a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystemTemplates.C +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/phaseSystem/phaseSystemTemplates.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2015-2018 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2015-2019 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -370,6 +370,44 @@ void Foam::phaseSystem::fillFields } +template +bool Foam::phaseSystem::foundSubModel(const phasePair& key) const +{ + const word name(IOobject::groupName(modelType::typeName, key.name())); + + if (key.ordered()) + { + if (mesh().foundObject(name)) + { + return true; + } + else + { + return false; + } + } + else + { + if + ( + mesh().foundObject(name) + || + mesh().foundObject + ( + IOobject::groupName(modelType::typeName, key.otherName()) + ) + ) + { + return true; + } + else + { + return false; + } + } +} + + template const modelType& Foam::phaseSystem::lookupSubModel(const phasePair& key) const { @@ -390,6 +428,17 @@ const modelType& Foam::phaseSystem::lookupSubModel(const phasePair& key) const } +template +bool Foam::phaseSystem::foundSubModel +( + const phaseModel& dispersed, + const phaseModel& continuous +) const +{ + return foundSubModel(orderedPhasePair(dispersed, continuous)); +} + + template const modelType& Foam::phaseSystem::lookupSubModel ( diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.C b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.C new file mode 100644 index 0000000000..cec2189177 --- /dev/null +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.C @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2019 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 . + +\*---------------------------------------------------------------------------*/ + +#include "LehrMilliesMewes.H" +#include "addToRunTimeSelectionTable.H" +#include "phaseCompressibleTurbulenceModel.H" +#include "mathematicalConstants.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace diameterModels +{ +namespace binaryBreakupModels +{ + defineTypeNameAndDebug(LehrMilliesMewes, 0); + addToRunTimeSelectionTable + ( + binaryBreakupModel, + LehrMilliesMewes, + dictionary + ); +} +} +} + +using Foam::constant::mathematical::pi; + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::diameterModels::binaryBreakupModels::LehrMilliesMewes::LehrMilliesMewes +( + const populationBalanceModel& popBal, + const dictionary& dict +) +: + binaryBreakupModel(popBal, dict) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::diameterModels::binaryBreakupModels::LehrMilliesMewes:: +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]; + + volScalarField L + ( + pow + ( + popBal_.sigmaWithContinuousPhase(fj.phase())/continuousPhase.rho(), + 3.0/5.0 + ) + /pow(popBal_.continuousTurbulence().epsilon(), 2.0/5.0) + ); + + // Reset of dimension to pure length to avoid problems in transcendental + // functions due to small exponents + L.dimensions().reset(dimLength); + + const volScalarField T + ( + pow + ( + popBal_.sigmaWithContinuousPhase(fj.phase())/continuousPhase.rho(), + 2.0/5.0 + ) + /pow(popBal_.continuousTurbulence().epsilon(), 3.0/5.0) + ); + + binaryBreakupRate += + 0.5*pow(fj.d()/L, 5.0/3.0) + *exp(-sqrt(2.0)/pow3(fj.d()/L)) + *6.0/pow(pi, 1.5)/pow3(fi.d()/L) + *exp(-9.0/4.0*sqr(log(pow(2.0, 0.4)*fi.d()/L))) + /max(1.0 + erf(1.5*log(pow(2.0, 1.0/15.0)*fj.d()/L)), SMALL) + /(T*pow3(L)); +} + + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.H b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.H new file mode 100644 index 0000000000..2651ff25ae --- /dev/null +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/binaryBreakupModels/LehrMilliesMewes/LehrMilliesMewes.H @@ -0,0 +1,149 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2019 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 . + +Class + Foam::diameterModels::binaryBreakupModels::LehrMilliesMewes + +Description + Model of Lehr et al. (2002). The breakup rate is calculated by + + \f[ + 0.5 d_j^{*^{5/3}} \mathrm{exp}\left(-\frac{\sqrt{2}}{d_j^{*^{3}}}\right) + \frac{6}{\pi^{3/2}d_i^{*^{3}}} + \mathrm{exp} + \left( + - \frac{9}{4}\left[\mathrm{ln}\left(2^{2/5} d_i^{*}\right)\right]^{2} + \right) + \left( + 1 + + \mathrm{erf} + \left[ + \frac{3}{2}\mathrm{ln} \left(2^{1/15} d_j^{*}\right) + \right] + \right)^{-1} + \frac{1}{L^{3}T} + \f] + + with the time scale + + \f[ + T = \left(\frac{\sigma}{\rho_c}\right)^{2/5} \frac{1}{\epsilon_c^{3/5}} + \f] + + the dimensionless diameter + + \f[ + d^{*} = \frac{d}{L} + \f] + + and the length scale + + \f[ + L = \left(\frac{\sigma}{\rho_c}\right)^{3/5} \frac{1}{\epsilon_c^{2/5}} + \f] + + \vartable + \rho_c | Density of continuous phase [kg/m3] + \sigma | Surface tension [N/m] + \epsilon_c | Continuous phase turbulent dissipation rate [m2/s3] + d_i | Diameter of daughter bubble i [m] + d_j | Diameter of mother bubble j [m] + \endvartable + + References: + \verbatim + Lehr, F., Millies, M., & Mewes, D. (2002). + Bubble‐size distributions and flow fields in bubble columns. + AIChE Journal, 48(11), 2426-2443. + Eq. 12-16, p. 2429-2430. + \endverbatim + +SourceFiles + LehrMilliesMewes.C + +\*---------------------------------------------------------------------------*/ + +#ifndef LehrMilliesMewes_H +#define LehrMilliesMewes_H + +#include "binaryBreakupModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace diameterModels +{ +namespace binaryBreakupModels +{ + +/*---------------------------------------------------------------------------*\ + Class LehrMilliesMewes Declaration +\*---------------------------------------------------------------------------*/ + +class LehrMilliesMewes +: + public binaryBreakupModel +{ +public: + + //- Runtime type information + TypeName("LehrMilliesMewes"); + + // Constructor + + LehrMilliesMewes + ( + const populationBalanceModel& popBal, + const dictionary& dict + ); + + + //- Destructor + virtual ~LehrMilliesMewes() + {} + + + // Member Functions + + //- 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 + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.C b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.C new file mode 100644 index 0000000000..4239ca4345 --- /dev/null +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.C @@ -0,0 +1,107 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2019 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 . + +\*---------------------------------------------------------------------------*/ + +#include "LehrMilliesMewesCoalescence.H" +#include "addToRunTimeSelectionTable.H" +#include "mathematicalConstants.H" +#include "phaseCompressibleTurbulenceModel.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace diameterModels +{ +namespace coalescenceModels +{ + defineTypeNameAndDebug(LehrMilliesMewesCoalescence, 0); + addToRunTimeSelectionTable + ( + coalescenceModel, + LehrMilliesMewesCoalescence, + dictionary + ); +} +} +} + +using Foam::constant::mathematical::pi; + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::diameterModels::coalescenceModels::LehrMilliesMewesCoalescence:: +LehrMilliesMewesCoalescence +( + const populationBalanceModel& popBal, + const dictionary& dict +) +: + coalescenceModel(popBal, dict), + uCrit_ + ( + dimensionedScalar::lookupOrDefault("uCrit", dict, dimVelocity, 0.08) + ), + alphaMax_ + ( + dimensionedScalar::lookupOrDefault("alphaMax", dict, dimless, 0.6) + ) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void +Foam::diameterModels::coalescenceModels::LehrMilliesMewesCoalescence:: +addToCoalescenceRate +( + volScalarField& coalescenceRate, + const label i, + const label j +) +{ + const sizeGroup& fi = popBal_.sizeGroups()[i]; + const sizeGroup& fj = popBal_.sizeGroups()[j]; + + volScalarField uChar + ( + max + ( + sqrt(2.0)*cbrt(popBal_.continuousTurbulence().epsilon()) + *sqrt(cbrt(sqr(fi.d())) + cbrt(sqr(fj.d()))), + mag(fi.phase().U() - fj.phase().U()) + ) + ); + + coalescenceRate += + pi/4.0*sqr(fi.d() + fj.d())*min(uChar, uCrit_) + *exp + ( + - sqr(cbrt(alphaMax_) + /cbrt(max(popBal_.alphas(), fi.phase().residualAlpha())) - 1.0) + ); +} + + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.H b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.H new file mode 100644 index 0000000000..89382aaa80 --- /dev/null +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/LehrMilliesMewesCoalescence/LehrMilliesMewesCoalescence.H @@ -0,0 +1,156 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2019 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 . + +Class + Foam::diameterModels::coalescenceModels::LehrMilliesMewesCoalescence + +Description + Model of Lehr et al. (2002). The coalescence rate is calculated by + + \f[ + \frac{\pi}{4} (d_i + d_j)^2 \mathrm{min}(u^{\prime}, u_{\mathrm{crit}}) + \mathrm{exp} + \left[ + - \left(\frac{\alpha_{\mathrm{max}}^{1/3}}{\alpha^{1/3}} - 1\right)^2 + \right]\,, + \f] + + where + + \f[ + u^{\prime} + = + \mathrm{max} + \left( + \sqrt{2} \epsilon_c^{1/3} \sqrt{d_i^{2/3} + d_j^{2/3}}, + |\vec{u}_i - \vec{u}_j| + \right) + \f] + + is the characteristic velocity for coalescence. Note that a velocity + difference between bubble i and j is only present if the corresponding + size groups are assigned to different velocity groups. + + \vartable + d_i | Diameter of bubble i [m] + d_j | Diameter of bubble j [m] + \epsilon_c | Turbulent dissipation rate of continuous phase [m2/s3] + \alpha | Total void fraction of the bubbles [-] + \alpha_{max} | Maximum packing density of the bubbles [-] + u_{crit} | Critical velocity for coalescence [m/s] + \vec{u}_i | Velocity vector of bubble i [m/s] + \vec{u}_j | Velocity vector of bubble j [m/s] + \endvartable + + Reference: + \verbatim + Lehr, F., Millies, M., & Mewes, D. (2002). + Bubble‐size distributions and flow fields in bubble columns. + AIChE Journal, 48(11), 2426-2443. + \endverbatim + +Usage + \table + Property | Description | Required | Default value + uCrit | Crit. coalescence velocity | no | 0.08 + alphaMax | Maximum packing density | no | 0.6 + \endtable + +SourceFiles + LehrMilliesMewesCoalescence.C + +\*---------------------------------------------------------------------------*/ + +#ifndef LehrMilliesMewesCoalescence_H +#define LehrMilliesMewesCoalescence_H + +#include "coalescenceModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace diameterModels +{ +namespace coalescenceModels +{ + +/*---------------------------------------------------------------------------*\ + Class LehrMilliesMewesCoalescence Declaration +\*---------------------------------------------------------------------------*/ + +class LehrMilliesMewesCoalescence +: + public coalescenceModel +{ + // Private data + + //- Critical velocity for coalescence, defaults to 0.08 m/s + dimensionedScalar uCrit_; + + //- Maximum packing density of the bubbles, defaults to 0.6 + dimensionedScalar alphaMax_; + + +public: + + //- Runtime type information + TypeName("LehrMilliesMewes"); + + // Constructor + + LehrMilliesMewesCoalescence + ( + const populationBalanceModel& popBal, + const dictionary& dict + ); + + + //- Destructor + virtual ~LehrMilliesMewesCoalescence() + {} + + + // 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 + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.C b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.C new file mode 100644 index 0000000000..98c4aad648 --- /dev/null +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.C @@ -0,0 +1,135 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2019 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 . + +\*---------------------------------------------------------------------------*/ + +#include "Luo.H" +#include "addToRunTimeSelectionTable.H" +#include "mathematicalConstants.H" +#include "phaseCompressibleTurbulenceModel.H" +#include "virtualMassModel.H" +#include "phaseSystem.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace diameterModels +{ +namespace coalescenceModels +{ + defineTypeNameAndDebug(Luo, 0); + addToRunTimeSelectionTable + ( + coalescenceModel, + Luo, + dictionary + ); +} +} +} + +using Foam::constant::mathematical::pi; + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::diameterModels::coalescenceModels::Luo:: +Luo +( + const populationBalanceModel& popBal, + const dictionary& dict +) +: + coalescenceModel(popBal, dict), + beta_(dimensionedScalar::lookupOrDefault("beta", dict, dimless, 2.05)), + C1_(dimensionedScalar::lookupOrDefault("C1", dict, dimless, 1.0)) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::diameterModels::coalescenceModels::Luo:: +addToCoalescenceRate +( + volScalarField& coalescenceRate, + const label i, + const label j +) +{ + const sizeGroup& fi = popBal_.sizeGroups()[i]; + const sizeGroup& fj = popBal_.sizeGroups()[j]; + const phaseModel& continuousPhase = popBal_.continuousPhase(); + + if + ( + popBal_.fluid().foundSubModel + ( + fi.phase(), + popBal_.continuousPhase() + ) + ) + { + const virtualMassModel& vm = + popBal_.fluid().lookupSubModel + ( + fi.phase(), + popBal_.continuousPhase() + ); + + dimensionedScalar xi = fi.d()/fj.d(); + + volScalarField uij + ( + sqrt(beta_) + *cbrt(popBal_.continuousTurbulence().epsilon()*fi.d()) + *sqrt(1.0 + pow(xi, -2.0/3.0)) + ); + + coalescenceRate += + pi/4.0*sqr(fi.d() + fj.d())*uij + *exp + ( + - C1_ + *sqrt(0.75*(1.0 + sqr(xi))*(1.0 + pow3(xi))) + /( + sqrt(fi.phase().rho()/continuousPhase.rho() + + vm.Cvm())*pow3(1.0 + xi) + ) + *sqrt + ( + continuousPhase.rho()*fi.d()*sqr(uij) + /popBal_.sigmaWithContinuousPhase(fi.phase()) + ) + ); + } + else + { + FatalErrorInFunction + << "A virtual mass model for " << fi.phase().name() << " in " + << popBal_.continuousPhase().name() << " is not specified. This is " + << "required by the Luo coalescence model." << exit(FatalError); + } +} + + +// ************************************************************************* // diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.H b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.H new file mode 100644 index 0000000000..eafc7db02c --- /dev/null +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/Luo/Luo.H @@ -0,0 +1,162 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2019 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 . + +Class + Foam::diameterModels::coalescenceModels::Luo + +Description + Model of Luo (1993). The coalescence rate is calculated by + + \f[ + &\frac{\pi}{4} (d_i + d_j)^2 u_{ij} + \mathrm{exp} + \left[ + - C_1 + \frac + {[0.75(1 + \xi_{ij}^2)(1 + \xi_{ij}^3)]^{1/2}} + {(\rho_d/\rho_c + C_{vm})^{1/2} (1 + \xi_{ij})^3} + \left(\frac{\rho_c d_i u_{ij}^2}{\sigma}\right)^{1/2} + \right]\,, + \f] + + where + + \f[ + u_{ij} = \sqrt{\beta} (\epsilon_c d_i)^{1/3} \sqrt{1 + \xi_{ij}^{-2/3}} + \f] + + is the mean approach velocity of the bubbles and + + \f[ + \xi_{ij} = d_i/d_j + \f] + + their size ratio. + + \vartable + d_i | Diameter of bubble i [m] + d_j | Diameter of bubble j [m] + u_{ij} | Mean approach velocity [m/s] + \xi_{ij} | Bubble size ratio [-] + \rho_d | Density of dispersed phase [kg/m3] + \rho_c | Density of continuous phase [kg/m3] + \sigma | Surface tension [N/m] + C_{vm} | Virtual mass coefficient [-] + C_1 | Coefficient [-] + \beta | Coefficient [-] + \epsilon_c | Continuous phase turbulent dissipation rate [m2/s3] + \endvartable + + Reference: + \verbatim + Luo, H. (1993). + Coalescence, breakup and liquid circulation in bubble column reactors. + Dr. Ing (Doctoral dissertation, Thesis, Department of Chemical + Engineering, The Norwegian Institute of Technology, Trondheim, Norway). + \endverbatim + +Usage + \table + Property | Description | Required | Default value + beta | Coefficient beta | no | 2.0 + C1 | Coefficient C1 | no | 1.0 + \endtable + +SourceFiles + Luo.C + +\*---------------------------------------------------------------------------*/ + +#ifndef Luo_H +#define Luo_H + +#include "coalescenceModel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace diameterModels +{ +namespace coalescenceModels +{ + +/*---------------------------------------------------------------------------*\ + Class Luo Declaration +\*---------------------------------------------------------------------------*/ + +class Luo +: + public coalescenceModel +{ + // Private data + + //- Coefficient beta, defaults to 2.0 + dimensionedScalar beta_; + + //- Optional coefficient C1, defaults to 1.0 + dimensionedScalar C1_; + + +public: + + //- Runtime type information + TypeName("Luo"); + + // Constructor + + Luo + ( + const populationBalanceModel& popBal, + const dictionary& dict + ); + + + //- Destructor + virtual ~Luo() + {} + + + // 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 + +// ************************************************************************* //