mirror of
https://github.com/ParticulateFlow/CFDEMcoupling-PFM.git
synced 2025-12-08 06:37:44 +00:00
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.
This commit is contained in:
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -49,14 +49,26 @@ BeetstraDragPoly::BeetstraDragPoly
|
||||
:
|
||||
BeetstraDrag(dict,sm),
|
||||
fines_(propsDict_.lookupOrDefault<bool>("fines",false)),
|
||||
dSauter_(sm.mesh().lookupObject<volScalarField> ("dSauter"))
|
||||
dFine_(propsDict_.lookupOrDefault<scalar>("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<volScalarField&>(sm.mesh().lookupObject<volScalarField> ("alphaP")));
|
||||
alphaP_.set(&alphaP);
|
||||
volScalarField& alphaSt(const_cast<volScalarField&>(sm.mesh().lookupObject<volScalarField> ("alphaSt")));
|
||||
alphaSt_.set(&alphaSt);
|
||||
volScalarField& dSauterMix(const_cast<volScalarField&>(sm.mesh().lookupObject<volScalarField> ("dSauterMix")));
|
||||
dSauterMix_.set(&dSauterMix);
|
||||
volScalarField& dSauter(const_cast<volScalarField&>(sm.mesh().lookupObject<volScalarField> ("dSauterMix")));
|
||||
dSauter_.set(&dSauter);
|
||||
}
|
||||
else
|
||||
{
|
||||
volScalarField& dSauter(const_cast<volScalarField&>(sm.mesh().lookupObject<volScalarField> ("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];
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -43,16 +43,20 @@ class BeetstraDragPoly
|
||||
protected:
|
||||
|
||||
const bool fines_;
|
||||
|
||||
scalar dFine_;
|
||||
|
||||
autoPtr<volScalarField> alphaP_;
|
||||
|
||||
autoPtr<volScalarField> alphaSt_;
|
||||
|
||||
const volScalarField& dSauter_;
|
||||
|
||||
autoPtr<volScalarField> dSauterMix_;
|
||||
autoPtr<volScalarField> 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:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user