From 19dd9c96469d561c39eed7f8274327c8c7a751cb Mon Sep 17 00:00:00 2001 From: Thomas Lichtenegger Date: Fri, 18 May 2018 12:08:56 +0200 Subject: [PATCH] Beetstra drag model. For polydisp case, BeetstraDragPoly overrides functions for diameter. Effect of fines phase in terms of static hold-up field is included in BeetstraDragPoly. --- .../forceModel/BeetstraDrag/BeetstraDrag.C | 7 ++-- .../forceModel/BeetstraDrag/BeetstraDrag.H | 4 +- .../BeetstraDragPoly/BeetstraDragPoly.C | 40 ++++++++++++++----- .../BeetstraDragPoly/BeetstraDragPoly.H | 12 ++++-- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C index b771773b..98182357 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.C @@ -163,6 +163,7 @@ void BeetstraDrag::setForce() const vector Ur(0,0,0); scalar ds(0); scalar ds_scaled(0); + scalar dSauter(0); scalar scaleDia3 = typeCG_[0]*typeCG_[0]*typeCG_[0]; scalar nuf(0); scalar rho(0); @@ -225,20 +226,20 @@ void BeetstraDrag::setForce() const magUr = mag(Ur); ds = 2*particleCloud_.radius(index); ds_scaled = ds/cg; + dSauter = meanSauterDiameter(ds_scaled, cellI); rho = rhoField[cellI]; nuf = nufField[cellI]; - Rep=0.0; localPhiP = 1.0f-voidfraction+SMALL; // calc particle's drag coefficient (i.e., Force per unit slip velocity and Stokes drag) - Rep=ds_scaled*voidfraction*magUr/nuf + SMALL; + Rep=dSauter*voidfraction*magUr/nuf + SMALL; dragCoefficient = F(voidfraction, Rep) *3*M_PI*nuf*rho*voidfraction - *effDiameter(ds_scaled, voidfraction, cellI, index) + *effDiameter(ds_scaled, cellI, index) *scaleDia3*scaleDrag_; // calculate filtering corrections diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H index 8b8c0055..c2128855 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDrag/BeetstraDrag.H @@ -85,7 +85,9 @@ protected: virtual void adaptVoidfraction(double&, label) const {} - virtual scalar effDiameter(double d, double voidfraction, label cellI, label index) const {return d;} + virtual scalar effDiameter(double d, label cellI, label index) const {return d;} + + virtual scalar meanSauterDiameter(double d, label cellI) const {return d;} double F(double, double) const; diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C index fe4024cd..3fb66969 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.C @@ -49,14 +49,26 @@ BeetstraDragPoly::BeetstraDragPoly : BeetstraDrag(dict,sm), fines_(propsDict_.lookupOrDefault("fines",false)), - dSauter_(sm.mesh().lookupObject ("dSauter")) + dFine_(propsDict_.lookupOrDefault("dFine",1.0)) { + // if fines are present, take mixture dSauter, otherwise normal dSauter if (fines_) { + if (!propsDict_.found("dFine")) + { + FatalError << "forceModel BeetstraDragPoly: Define fines diameter." << abort(FatalError); + } + volScalarField& alphaP(const_cast(sm.mesh().lookupObject ("alphaP"))); + alphaP_.set(&alphaP); volScalarField& alphaSt(const_cast(sm.mesh().lookupObject ("alphaSt"))); alphaSt_.set(&alphaSt); - volScalarField& dSauterMix(const_cast(sm.mesh().lookupObject ("dSauterMix"))); - dSauterMix_.set(&dSauterMix); + volScalarField& dSauter(const_cast(sm.mesh().lookupObject ("dSauterMix"))); + dSauter_.set(&dSauter); + } + else + { + volScalarField& dSauter(const_cast(sm.mesh().lookupObject ("dSauter"))); + dSauter_.set(&dSauter); } } @@ -75,24 +87,30 @@ void BeetstraDragPoly::adaptVoidfraction(double& voidfraction, label cellI) cons if (voidfraction < minVoidfraction_) voidfraction = minVoidfraction_; } -scalar BeetstraDragPoly::effDiameter(double d, double voidfraction, label cellI, label index) const +scalar BeetstraDragPoly::effDiameter(double d, label cellI, label index) const { - scalar dS = dSauter_[cellI]; - scalar effD = d*d/dS; + scalar dS = dSauter_()[cellI]; + scalar effD = d*d / dS + 0.064*d*d*d*d / (dS*dS*dS); + if (fines_) { - scalar pureVoidfraction = voidfraction_[cellI]; - scalar dSmix = dSauterMix_()[cellI]; - effD *= pureVoidfraction / voidfraction * (1 - voidfraction) / (1 - pureVoidfraction); - effD *= dS * dS / (dSmix * dSmix); + scalar fineCorr = dFine_*dFine_ / dS + 0.064*dFine_*dFine_*dFine_*dFine_ / (dS*dS*dS); + fineCorr *= d*d*d / (dFine_*dFine_*dFine_) * alphaSt_()[cellI] / alphaP_()[cellI]; + effD += fineCorr; } + if (particleCloud_.getParticleEffVolFactors()) { scalar effVolFac = particleCloud_.particleEffVolFactor(index); effD *= effVolFac; } + return effD; - +} + +scalar BeetstraDragPoly::meanSauterDiameter(double d, label cellI) const +{ + return dSauter_()[cellI]; } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H index 12bde2a3..88965010 100644 --- a/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H +++ b/src/lagrangian/cfdemParticle/subModels/forceModel/BeetstraDragPoly/BeetstraDragPoly.H @@ -43,16 +43,20 @@ class BeetstraDragPoly protected: const bool fines_; + + scalar dFine_; + autoPtr alphaP_; + autoPtr alphaSt_; - const volScalarField& dSauter_; - - autoPtr dSauterMix_; + autoPtr dSauter_; void adaptVoidfraction(double&, label) const; - scalar effDiameter(double, double, label, label) const; + scalar effDiameter(double, label, label) const; + + scalar meanSauterDiameter(double, label) const; public: