lagrangian::ThermoSurfaceFilm: Updated adhesion->splash transition Weber number
according to
Bai et al, `Modelling of gasoline spray impingement', Atom. Sprays,
vol 12, pp 1-27, 2002
Resolves bug-report https://bugs.openfoam.org/view.php?id=2478
This commit is contained in:
parent
86bf44de10
commit
78e40da8ac
2 changed files with 36 additions and 36 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
|
|
@ -111,13 +111,13 @@ Foam::vector Foam::ThermoSurfaceFilm<CloudType>::splashDirection
|
||||||
const vector& nf
|
const vector& nf
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// azimuthal angle [rad]
|
// Azimuthal angle [rad]
|
||||||
const scalar phiSi = twoPi*rndGen_.sample01<scalar>();
|
const scalar phiSi = twoPi*rndGen_.sample01<scalar>();
|
||||||
|
|
||||||
// ejection angle [rad]
|
// Ejection angle [rad]
|
||||||
const scalar thetaSi = pi/180.0*(rndGen_.sample01<scalar>()*(50 - 5) + 5);
|
const scalar thetaSi = pi/180.0*(rndGen_.sample01<scalar>()*(50 - 5) + 5);
|
||||||
|
|
||||||
// direction vector of new parcel
|
// Direction vector of new parcel
|
||||||
const scalar alpha = sin(thetaSi);
|
const scalar alpha = sin(thetaSi);
|
||||||
const scalar dcorr = cos(thetaSi);
|
const scalar dcorr = cos(thetaSi);
|
||||||
const vector normal = alpha*(tanVec1*cos(phiSi) + tanVec2*sin(phiSi));
|
const vector normal = alpha*(tanVec1*cos(phiSi) + tanVec2*sin(phiSi));
|
||||||
|
|
@ -226,7 +226,7 @@ void Foam::ThermoSurfaceFilm<CloudType>::drySplashInteraction
|
||||||
const vector& Up = this->owner().U().boundaryField()[pp.index()][facei];
|
const vector& Up = this->owner().U().boundaryField()[pp.index()][facei];
|
||||||
const vector& nf = pp.faceNormals()[facei];
|
const vector& nf = pp.faceNormals()[facei];
|
||||||
|
|
||||||
// local pressure
|
// Local pressure
|
||||||
const scalar pc = thermo_.thermo().p()[p.cell()];
|
const scalar pc = thermo_.thermo().p()[p.cell()];
|
||||||
|
|
||||||
// Retrieve parcel properties
|
// Retrieve parcel properties
|
||||||
|
|
@ -247,13 +247,13 @@ void Foam::ThermoSurfaceFilm<CloudType>::drySplashInteraction
|
||||||
// Critical Weber number
|
// Critical Weber number
|
||||||
const scalar Wec = Adry_*pow(La, -0.183);
|
const scalar Wec = Adry_*pow(La, -0.183);
|
||||||
|
|
||||||
if (We < Wec) // adhesion - assume absorb
|
if (We < Wec) // Adhesion - assume absorb
|
||||||
{
|
{
|
||||||
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
||||||
}
|
}
|
||||||
else // splash
|
else // Splash
|
||||||
{
|
{
|
||||||
// ratio of incident mass to splashing mass
|
// Ratio of incident mass to splashing mass
|
||||||
const scalar mRatio = 0.2 + 0.6*rndGen_.sample01<scalar>();
|
const scalar mRatio = 0.2 + 0.6*rndGen_.sample01<scalar>();
|
||||||
splashInteraction
|
splashInteraction
|
||||||
(filmModel, p, pp, facei, mRatio, We, Wec, sigma, keepParticle);
|
(filmModel, p, pp, facei, mRatio, We, Wec, sigma, keepParticle);
|
||||||
|
|
@ -282,7 +282,7 @@ void Foam::ThermoSurfaceFilm<CloudType>::wetSplashInteraction
|
||||||
const vector& Up = this->owner().U().boundaryField()[pp.index()][facei];
|
const vector& Up = this->owner().U().boundaryField()[pp.index()][facei];
|
||||||
const vector& nf = pp.faceNormals()[facei];
|
const vector& nf = pp.faceNormals()[facei];
|
||||||
|
|
||||||
// local pressure
|
// Local pressure
|
||||||
const scalar pc = thermo_.thermo().p()[p.cell()];
|
const scalar pc = thermo_.thermo().p()[p.cell()];
|
||||||
|
|
||||||
// Retrieve parcel properties
|
// Retrieve parcel properties
|
||||||
|
|
@ -305,31 +305,31 @@ void Foam::ThermoSurfaceFilm<CloudType>::wetSplashInteraction
|
||||||
// Critical Weber number
|
// Critical Weber number
|
||||||
const scalar Wec = Awet_*pow(La, -0.183);
|
const scalar Wec = Awet_*pow(La, -0.183);
|
||||||
|
|
||||||
if (We < 1) // adhesion - assume absorb
|
if (We < 2) // Adhesion - assume absorb
|
||||||
{
|
{
|
||||||
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
||||||
}
|
}
|
||||||
else if ((We >= 1) && (We < 20)) // bounce
|
else if ((We >= 2) && (We < 20)) // Bounce
|
||||||
{
|
{
|
||||||
// incident angle of impingement
|
// Incident angle of impingement
|
||||||
const scalar theta = pi/2 - acos(U/mag(U) & nf);
|
const scalar theta = pi/2 - acos(U/mag(U) & nf);
|
||||||
|
|
||||||
// restitution coefficient
|
// Restitution coefficient
|
||||||
const scalar epsilon = 0.993 - theta*(1.76 - theta*(1.56 - theta*0.49));
|
const scalar epsilon = 0.993 - theta*(1.76 - theta*(1.56 - theta*0.49));
|
||||||
|
|
||||||
// update parcel velocity
|
// Update parcel velocity
|
||||||
U = -epsilon*(Un) + 5/7*(Ut);
|
U = -epsilon*(Un) + 5/7*(Ut);
|
||||||
|
|
||||||
keepParticle = true;
|
keepParticle = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if ((We >= 20) && (We < Wec)) // spread - assume absorb
|
else if ((We >= 20) && (We < Wec)) // Spread - assume absorb
|
||||||
{
|
{
|
||||||
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
||||||
}
|
}
|
||||||
else // splash
|
else // Splash
|
||||||
{
|
{
|
||||||
// ratio of incident mass to splashing mass
|
// Ratio of incident mass to splashing mass
|
||||||
// splash mass can be > incident mass due to film entrainment
|
// splash mass can be > incident mass due to film entrainment
|
||||||
const scalar mRatio = 0.2 + 0.9*rndGen_.sample01<scalar>();
|
const scalar mRatio = 0.2 + 0.9*rndGen_.sample01<scalar>();
|
||||||
splashInteraction
|
splashInteraction
|
||||||
|
|
@ -371,24 +371,24 @@ void Foam::ThermoSurfaceFilm<CloudType>::splashInteraction
|
||||||
const vector& posC = mesh.C()[p.cell()];
|
const vector& posC = mesh.C()[p.cell()];
|
||||||
const vector& posCf = mesh.Cf().boundaryField()[pp.index()][facei];
|
const vector& posCf = mesh.Cf().boundaryField()[pp.index()][facei];
|
||||||
|
|
||||||
// total mass of (all) splashed parcels
|
// Total mass of (all) splashed parcels
|
||||||
const scalar mSplash = m*mRatio;
|
const scalar mSplash = m*mRatio;
|
||||||
|
|
||||||
// number of splashed particles per incoming particle
|
// Number of splashed particles per incoming particle
|
||||||
const scalar Ns = 5.0*(We/Wec - 1.0);
|
const scalar Ns = 5.0*(We/Wec - 1.0);
|
||||||
|
|
||||||
// average diameter of splashed particles
|
// Average diameter of splashed particles
|
||||||
const scalar dBarSplash = 1/cbrt(6.0)*cbrt(mRatio/Ns)*d + ROOTVSMALL;
|
const scalar dBarSplash = 1/cbrt(6.0)*cbrt(mRatio/Ns)*d + ROOTVSMALL;
|
||||||
|
|
||||||
// cumulative diameter splash distribution
|
// Cumulative diameter splash distribution
|
||||||
const scalar dMax = 0.9*cbrt(mRatio)*d;
|
const scalar dMax = 0.9*cbrt(mRatio)*d;
|
||||||
const scalar dMin = 0.1*dMax;
|
const scalar dMin = 0.1*dMax;
|
||||||
const scalar K = exp(-dMin/dBarSplash) - exp(-dMax/dBarSplash);
|
const scalar K = exp(-dMin/dBarSplash) - exp(-dMax/dBarSplash);
|
||||||
|
|
||||||
// surface energy of secondary parcels [J]
|
// Surface energy of secondary parcels [J]
|
||||||
scalar ESigmaSec = 0;
|
scalar ESigmaSec = 0;
|
||||||
|
|
||||||
// sample splash distribution to determine secondary parcel diameters
|
// Sample splash distribution to determine secondary parcel diameters
|
||||||
scalarList dNew(parcelsPerSplash_);
|
scalarList dNew(parcelsPerSplash_);
|
||||||
scalarList npNew(parcelsPerSplash_);
|
scalarList npNew(parcelsPerSplash_);
|
||||||
forAll(dNew, i)
|
forAll(dNew, i)
|
||||||
|
|
@ -399,26 +399,26 @@ void Foam::ThermoSurfaceFilm<CloudType>::splashInteraction
|
||||||
ESigmaSec += npNew[i]*sigma*p.areaS(dNew[i]);
|
ESigmaSec += npNew[i]*sigma*p.areaS(dNew[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// incident kinetic energy [J]
|
// Incident kinetic energy [J]
|
||||||
const scalar EKIn = 0.5*m*magSqr(Urel);
|
const scalar EKIn = 0.5*m*magSqr(Urel);
|
||||||
|
|
||||||
// incident surface energy [J]
|
// Incident surface energy [J]
|
||||||
const scalar ESigmaIn = np*sigma*p.areaS(d);
|
const scalar ESigmaIn = np*sigma*p.areaS(d);
|
||||||
|
|
||||||
// dissipative energy
|
// Dissipative energy
|
||||||
const scalar Ed = max(0.8*EKIn, np*Wec/12*pi*sigma*sqr(d));
|
const scalar Ed = max(0.8*EKIn, np*Wec/12*pi*sigma*sqr(d));
|
||||||
|
|
||||||
// total energy [J]
|
// Total energy [J]
|
||||||
const scalar EKs = EKIn + ESigmaIn - ESigmaSec - Ed;
|
const scalar EKs = EKIn + ESigmaIn - ESigmaSec - Ed;
|
||||||
|
|
||||||
// switch to absorb if insufficient energy for splash
|
// Switch to absorb if insufficient energy for splash
|
||||||
if (EKs <= 0)
|
if (EKs <= 0)
|
||||||
{
|
{
|
||||||
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
absorbInteraction(filmModel, p, pp, facei, m, keepParticle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// helper variables to calculate magUns0
|
// Helper variables to calculate magUns0
|
||||||
const scalar logD = log(d);
|
const scalar logD = log(d);
|
||||||
const scalar coeff2 = log(dNew[0]) - logD + ROOTVSMALL;
|
const scalar coeff2 = log(dNew[0]) - logD + ROOTVSMALL;
|
||||||
scalar coeff1 = 0.0;
|
scalar coeff1 = 0.0;
|
||||||
|
|
@ -427,7 +427,7 @@ void Foam::ThermoSurfaceFilm<CloudType>::splashInteraction
|
||||||
coeff1 += sqr(log(dNew[i]) - logD);
|
coeff1 += sqr(log(dNew[i]) - logD);
|
||||||
}
|
}
|
||||||
|
|
||||||
// magnitude of the normal velocity of the first splashed parcel
|
// Magnitude of the normal velocity of the first splashed parcel
|
||||||
const scalar magUns0 =
|
const scalar magUns0 =
|
||||||
sqrt(2.0*parcelsPerSplash_*EKs/mSplash/(1.0 + coeff1/sqr(coeff2)));
|
sqrt(2.0*parcelsPerSplash_*EKs/mSplash/(1.0 + coeff1/sqr(coeff2)));
|
||||||
|
|
||||||
|
|
@ -448,7 +448,7 @@ void Foam::ThermoSurfaceFilm<CloudType>::splashInteraction
|
||||||
pPtr->typeId() = splashParcelType_;
|
pPtr->typeId() = splashParcelType_;
|
||||||
}
|
}
|
||||||
|
|
||||||
// perturb new parcels towards the owner cell centre
|
// Perturb new parcels towards the owner cell centre
|
||||||
pPtr->position() += 0.5*rndGen_.sample01<scalar>()*(posC - posCf);
|
pPtr->position() += 0.5*rndGen_.sample01<scalar>()*(posC - posCf);
|
||||||
|
|
||||||
pPtr->nParticle() = npNew[i];
|
pPtr->nParticle() = npNew[i];
|
||||||
|
|
@ -466,7 +466,7 @@ void Foam::ThermoSurfaceFilm<CloudType>::splashInteraction
|
||||||
nParcelsSplashed_++;
|
nParcelsSplashed_++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// transfer remaining part of parcel to film 0 - splashMass can be -ve
|
// Transfer remaining part of parcel to film 0 - splashMass can be -ve
|
||||||
// if entraining from the film
|
// if entraining from the film
|
||||||
const scalar mDash = m - mSplash;
|
const scalar mDash = m - mSplash;
|
||||||
absorbInteraction(filmModel, p, pp, facei, mDash, keepParticle);
|
absorbInteraction(filmModel, p, pp, facei, mDash, keepParticle);
|
||||||
|
|
@ -613,11 +613,11 @@ bool Foam::ThermoSurfaceFilm<CloudType>::transferParcel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// transfer parcel/parcel interactions complete
|
// Transfer parcel/parcel interactions complete
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parcel not interacting with film
|
// Parcel not interacting with film
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
|
|
@ -36,7 +36,7 @@ Description
|
||||||
Bai and Gosman, `Mathematical modelling of wall films formed by
|
Bai and Gosman, `Mathematical modelling of wall films formed by
|
||||||
impinging sprays', SAE 960626, 1996
|
impinging sprays', SAE 960626, 1996
|
||||||
|
|
||||||
Bai et al, `Modelling off gasoline spray impingement', Atom. Sprays,
|
Bai et al, `Modelling of gasoline spray impingement', Atom. Sprays,
|
||||||
vol 12, pp 1-27, 2002
|
vol 12, pp 1-27, 2002
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue