From 281f8ba40cb568b3e9121cd5c9de971d6be53a45 Mon Sep 17 00:00:00 2001 From: Will Bainbridge Date: Wed, 26 Aug 2020 14:22:01 +0100 Subject: [PATCH] multiphaseEulerFoam/.../BrownianCollisions: Added slip correction Patch contributed by Institute of Fluid Dynamics, Helmholtz-Zentrum Dresden - Rossendorf (HZDR) --- .../phaseSystems/Make/files | 2 +- .../sizeGroup/shapeModels/fractal/fractal.H | 2 +- .../BrownianCollisions.C} | 60 +++++++++++--- .../BrownianCollisions.H} | 78 ++++++++++++++++--- .../DahnekeInterpolation.C | 36 +++++---- .../DahnekeInterpolation.H | 27 +++++-- .../ballisticCollisions/ballisticCollisions.C | 4 +- .../ballisticCollisions/ballisticCollisions.H | 4 +- .../turbulentShear/turbulentShear.H | 2 +- .../populationBalanceModel.H | 2 +- .../titaniaSynthesis/constant/phaseProperties | 5 +- .../constant/phaseProperties | 5 +- 12 files changed, 171 insertions(+), 56 deletions(-) rename applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/{brownianCollisions/brownianCollisions.C => BrownianCollisions/BrownianCollisions.C} (61%) rename applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/{brownianCollisions/brownianCollisions.H => BrownianCollisions/BrownianCollisions.H} (52%) diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files index e3c9be13a3..9b190dfb67 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/Make/files @@ -42,7 +42,7 @@ populationBalanceModel/populationBalanceModel/populationBalanceModel.C coalescenceModels = populationBalanceModel/coalescenceModels $(coalescenceModels)/coalescenceModel/coalescenceModel.C $(coalescenceModels)/ballisticCollisions/ballisticCollisions.C -$(coalescenceModels)/brownianCollisions/brownianCollisions.C +$(coalescenceModels)/BrownianCollisions/BrownianCollisions.C $(coalescenceModels)/constantCoalescence/constantCoalescence.C $(coalescenceModels)/CoulaloglouTavlaridesCoalescence/CoulaloglouTavlaridesCoalescence.C $(coalescenceModels)/DahnekeInterpolation/DahnekeInterpolation.C diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/fractal.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/fractal.H index 1d76f83112..666a5e55cb 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/fractal.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/diameterModels/velocityGroup/sizeGroup/shapeModels/fractal/fractal.H @@ -33,7 +33,7 @@ Description area is taken into account by a separate source term. Kappa is transported between the size groups as a secondary property by - means of coalescence (coagulation/aggregation), breakup as well as drift. + means of coalescence (coagulation), breakup as well as drift. By assuming a monodisperse size distribution of the primary particles in the aggregate, the collisional diameter of a size group can then be computed by diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/brownianCollisions/brownianCollisions.C b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/BrownianCollisions/BrownianCollisions.C similarity index 61% rename from applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/brownianCollisions/brownianCollisions.C rename to applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/BrownianCollisions/BrownianCollisions.C index ef627aa10f..3f569c9832 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/brownianCollisions/brownianCollisions.C +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/BrownianCollisions/BrownianCollisions.C @@ -23,9 +23,10 @@ License \*---------------------------------------------------------------------------*/ -#include "brownianCollisions.H" +#include "BrownianCollisions.H" #include "addToRunTimeSelectionTable.H" #include "fundamentalConstants.H" +#include "mathematicalConstants.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -35,11 +36,11 @@ namespace diameterModels { namespace coalescenceModels { - defineTypeNameAndDebug(brownianCollisions, 0); + defineTypeNameAndDebug(BrownianCollisions, 0); addToRunTimeSelectionTable ( coalescenceModel, - brownianCollisions, + BrownianCollisions, dictionary ); } @@ -47,24 +48,55 @@ namespace coalescenceModels } using Foam::constant::physicoChemical::k; +using Foam::constant::mathematical::pi; + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::diameterModels::coalescenceModels::brownianCollisions:: -brownianCollisions +Foam::diameterModels::coalescenceModels::BrownianCollisions:: +BrownianCollisions ( const populationBalanceModel& popBal, const dictionary& dict ) : - coalescenceModel(popBal, dict) + coalescenceModel(popBal, dict), + A1_(dict.lookupOrDefault("A1", 2.514)), + A2_(dict.lookupOrDefault("A2", 0.8)), + A3_(dict.lookupOrDefault("A3", 0.55)), + sigma_("sigma", dimLength, dict), + lambda_ + ( + IOobject + ( + "lambda", + popBal_.time().timeName(), + popBal_.mesh() + ), + popBal_.mesh(), + dimensionedScalar + ( + "lambda", + dimLength, + Zero + ) + ) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +void Foam::diameterModels::coalescenceModels::BrownianCollisions::correct() +{ + const volScalarField& T = popBal_.continuousPhase().thermo().T(); + const volScalarField& p = popBal_.continuousPhase().thermo().p(); + + lambda_ = k*T/(sqrt(2.0)*pi*p*sqr(sigma_)); +} + + void -Foam::diameterModels::coalescenceModels::brownianCollisions:: +Foam::diameterModels::coalescenceModels::BrownianCollisions:: addToCoalescenceRate ( volScalarField& coalescenceRate, @@ -78,9 +110,17 @@ addToCoalescenceRate const volScalarField& T = popBal_.continuousPhase().thermo().T(); const volScalarField& mu = popBal_.continuousPhase().thermo().mu(); - coalescenceRate += - 8.0*k*T/(3*mu)*(fi.d() + fj.d()) - *(1.0/fi.d() + 1.0/fj.d()); + const volScalarField Cci + ( + 1 + lambda_/fi.d()*(A1_ + A2_*exp(-A3_*fi.d()/lambda_)) + ); + + const volScalarField Ccj + ( + 1 + lambda_/fj.d()*(A1_ + A2_*exp(-A3_*fj.d()/lambda_)) + ); + + coalescenceRate += 8*k*T/(3*mu)*(fi.d() + fj.d())*(Cci/fi.d() + Ccj/fj.d()); } diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/brownianCollisions/brownianCollisions.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/BrownianCollisions/BrownianCollisions.H similarity index 52% rename from applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/brownianCollisions/brownianCollisions.H rename to applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/BrownianCollisions/BrownianCollisions.H index 46be60742d..ff4c8f3b79 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/brownianCollisions/brownianCollisions.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/BrownianCollisions/BrownianCollisions.H @@ -22,19 +22,54 @@ License along with OpenFOAM. If not, see . Class - Foam::diameterModels::coalescenceModels::brownianCollisions + Foam::diameterModels::coalescenceModels::BrownianCollisions Description - Model describing aggregation due to brownian motion. Utilizes physical, i.e. - collisional diameters. + Model describing coagulation due to Brownian motion. Utilizes collisional + diameters and the Cunningham slip correction. The slip correction + coefficient is implemented in the following form: + + \f[ + C_{c_i} = 1 + \lambda [A_1 + A_2 \exp(-A_3 d_i/\lambda)]/d_i\,. + \f] + + The coefficients default to the values proposed by Davis (1945). The mean + free path is computed by + + \f[ + \lambda = \frac{kT}{\sqrt{2} \pi p \sigma^{2}}\,. + \f] + + \vartable + A_1 | Coefficient [-] + A_2 | Coefficient [-] + A_3 | Coefficient [-] + \sigma | Lennard-Jones parameter [m] + \endvartable + + Reference: + \verbatim + Davies, C. N. (1945). + Definitive equations for the fluid resistance of spheres. + Proceedings of the Physical Society, 57(4), 259. + \endverbatim + +Usage + \table + Property | Description | Required | Default value + A1 | Coefficient A1 | no | 2.514 + A2 | Coefficient A2 | no | 0.8 + A3 | Coefficient A2 | no | 0.55 + sigma | Lennard-Jones parameter | yes | none + \endtable SourceFiles - brownianCollisions.C + BrownianCollisions.C \*---------------------------------------------------------------------------*/ -#ifndef brownianCollisions_H -#define brownianCollisions_H +#ifndef BrownianCollisions_H +#define BrownianCollisions_H #include "coalescenceModel.H" @@ -48,21 +83,39 @@ namespace coalescenceModels { /*---------------------------------------------------------------------------*\ - Class brownianCollisions Declaration + Class BrownianCollisions Declaration \*---------------------------------------------------------------------------*/ -class brownianCollisions +class BrownianCollisions : public coalescenceModel { + // Private Data + + //- Cunningham slip correction coefficient A1 + const dimensionedScalar A1_; + + //- Cunningham slip correction coefficient A2 + const dimensionedScalar A2_; + + //- Cunningham slip correction coefficient A3 + const dimensionedScalar A3_; + + //- Lennard-Jones sigma parameter + const dimensionedScalar sigma_; + + //- Mean free path + volScalarField lambda_; + + public: //- Runtime type information - TypeName("brownianCollisions"); + TypeName("BrownianCollisions"); // Constructor - brownianCollisions + BrownianCollisions ( const populationBalanceModel& popBal, const dictionary& dict @@ -70,12 +123,15 @@ public: //- Destructor - virtual ~brownianCollisions() + virtual ~BrownianCollisions() {} // Member Functions + //- Correct diameter independent expressions + virtual void correct(); + //- Add to coalescenceRate virtual void addToCoalescenceRate ( diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.C b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.C index 54809f86b9..8b4bafc3d5 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.C +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.C @@ -25,7 +25,7 @@ License #include "DahnekeInterpolation.H" #include "addToRunTimeSelectionTable.H" -#include "brownianCollisions.H" +#include "BrownianCollisions.H" #include "ballisticCollisions.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -58,20 +58,20 @@ DahnekeInterpolation ) : coalescenceModel(popBal, dict), - brownian_(new brownianCollisions(popBal, dict)), - brownianCollisionRate_ + Brownian_(new BrownianCollisions(popBal, dict)), + BrownianRate_ ( IOobject ( - "brownianCollisionRate", + "BrownianCollisionRate", popBal_.mesh().time().timeName(), popBal_.mesh() ), popBal_.mesh(), - dimensionedScalar("brownianCollisionRate", dimVolume/dimTime, 0.0) + dimensionedScalar("BrownianCollisionRate", dimVolume/dimTime, Zero) ), ballistic_(new ballisticCollisions(popBal, dict)), - ballisticCollisionRate_ + ballisticRate_ ( IOobject ( @@ -80,13 +80,19 @@ DahnekeInterpolation popBal_.mesh() ), popBal_.mesh(), - dimensionedScalar("ballisticCollisionRate", dimVolume/dimTime, 0.0) + dimensionedScalar("ballisticCollisionRate", dimVolume/dimTime, Zero) ) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +void Foam::diameterModels::coalescenceModels::DahnekeInterpolation::correct() +{ + Brownian_().correct(); +} + + void Foam::diameterModels::coalescenceModels::DahnekeInterpolation:: addToCoalescenceRate @@ -96,19 +102,15 @@ addToCoalescenceRate const label j ) { - brownianCollisionRate_ = Zero; - ballisticCollisionRate_ = Zero; + BrownianRate_ = Zero; + ballisticRate_ = Zero; - brownian_().addToCoalescenceRate(brownianCollisionRate_, i, j); - ballistic_().addToCoalescenceRate(ballisticCollisionRate_, i, j); + Brownian_().addToCoalescenceRate(BrownianRate_, i, j); + ballistic_().addToCoalescenceRate(ballisticRate_, i, j); - const volScalarField KnD - ( - brownianCollisionRate_/(2.0*ballisticCollisionRate_) - ); + const volScalarField KnD(BrownianRate_/(2*ballisticRate_)); - coalescenceRate += - brownianCollisionRate_*(1.0 + KnD)/(1.0 + 2.0*KnD + 2.0*sqr(KnD)); + coalescenceRate += BrownianRate_*(1 + KnD)/(1 + 2*KnD + 2*sqr(KnD)); } diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.H index 28c6f378d6..696abe7aae 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/DahnekeInterpolation/DahnekeInterpolation.H @@ -25,8 +25,8 @@ Class Foam::diameterModels::coalescenceModels::DahnekeInterpolation Description - Aggregation model of Dahneke (1983). Utilizes physical, i.e. collisional - diameters. + Interpolation formula of Dahneke (1983) as presented by Otto et al. (1999). + Utilizes collisional diameters. References: \verbatim @@ -35,6 +35,14 @@ Description In Theory of dispersed multiphase flow (pp. 97-133). Academic Press. \endverbatim + \verbatim + Otto, E., Fissan, H., Park, S. H., & Lee, K. W. (1999). + The log-normal size distribution theory of Brownian aerosol coagulation + for the entire particle size range: part II—analytical solution using + Dahneke’s coagulation kernel. + Journal of aerosol science, 30(1), 17-34. + \endverbatim + SourceFiles DahnekeInterpolation.C @@ -54,7 +62,7 @@ namespace diameterModels namespace coalescenceModels { -class brownianCollisions; +class BrownianCollisions; class ballisticCollisions; /*---------------------------------------------------------------------------*\ @@ -67,17 +75,17 @@ class DahnekeInterpolation { // Private Data - //- Model for coagulation due to brownian collisions - autoPtr brownian_; + //- Model for coagulation due to Brownian collisions + autoPtr Brownian_; - //- Rate for coagulation due to brownian collisions - volScalarField brownianCollisionRate_; + //- Rate for coagulation due to Brownian collisions + volScalarField BrownianRate_; //- Model for coagulation due to ballistic collisions autoPtr ballistic_; //- Rate for coagulation due to ballistic collisions - volScalarField ballisticCollisionRate_; + volScalarField ballisticRate_; public: @@ -101,6 +109,9 @@ public: // Member Functions + //- Correct diameter independent expressions + virtual void correct(); + //- Add to coalescenceRate virtual void addToCoalescenceRate ( diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.C b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.C index 129990c2c9..446a286e39 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.C +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.C @@ -79,8 +79,8 @@ addToCoalescenceRate const volScalarField& rhoP = fi.phase().rho(); coalescenceRate += - sqrt(3*k*T/rhoP)*sqr((fi.d() + fj.d())) - *sqrt(1.0/pow3(fi.d()) + 1.0/pow3(fj.d())); + sqrt(3*k*T/rhoP)*sqr(fi.d() + fj.d()) + *sqrt(1/pow3(fi.d()) + 1/pow3(fj.d())); } diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.H index 75da0bc84e..5e4f1ce9dd 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/ballisticCollisions/ballisticCollisions.H @@ -25,8 +25,8 @@ Class Foam::diameterModels::coalescenceModels::ballisticCollisions Description - Model describing aggregation due to ballistic collisions. Utilizes physical, - i.e. collisional diameters. + Model describing coagulation due to ballistic collisions. Utilizes + collisional diameters. SourceFiles ballisticCollisions.C diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/turbulentShear/turbulentShear.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/turbulentShear/turbulentShear.H index ed99d0d318..62de8663bd 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/turbulentShear/turbulentShear.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/coalescenceModels/turbulentShear/turbulentShear.H @@ -25,7 +25,7 @@ Class Foam::diameterModels::coalescenceModels::turbulentShear Description - Model describing aggregation due to turbulent shear. Utilizes physical, i.e. + Model describing coagulation due to turbulent shear. Utilizes physical, i.e. collisional diameters. SourceFiles diff --git a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.H b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.H index 9bde82474c..a8c675fc80 100644 --- a/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.H +++ b/applications/solvers/multiphase/multiphaseEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.H @@ -31,7 +31,7 @@ Description a transport equation of the volume-based number density function. The discretization is done using the fixed pivot technique of Kumar and Ramkrishna (1996). The source terms are written in a way that particle - number and mass are preserved. Coalescence (aggregation), breakup, drift + number and mass are preserved. Coalescence (coagulation), breakup, drift (growth and surface loss) as well as nucleation are supported. For the discrete breakup term two recipes are available, depending on the model choice. For models which state a total breakup rate and a separate diff --git a/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesis/constant/phaseProperties b/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesis/constant/phaseProperties index c7abeea110..621d6af6db 100644 --- a/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesis/constant/phaseProperties +++ b/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesis/constant/phaseProperties @@ -104,7 +104,10 @@ populationBalanceCoeffs coalescenceModels ( - DahnekeInterpolation{} + DahnekeInterpolation + { + sigma 340e-12; + } ); binaryBreakupModels diff --git a/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesisSurface/constant/phaseProperties b/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesisSurface/constant/phaseProperties index 8fc62fff8a..2dea3a65cd 100644 --- a/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesisSurface/constant/phaseProperties +++ b/tutorials/multiphase/multiphaseEulerFoam/laminar/titaniaSynthesisSurface/constant/phaseProperties @@ -110,7 +110,10 @@ populationBalanceCoeffs coalescenceModels ( - DahnekeInterpolation{} + DahnekeInterpolation + { + sigma 340e-12; + } ); binaryBreakupModels