mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: MOved Dij and penetration calcs to Kinematic Cloud
This commit is contained in:
@ -462,6 +462,12 @@ public:
|
||||
//- Total rotational kinetic energy in the system
|
||||
inline scalar rotationalKineticEnergyOfSystem() const;
|
||||
|
||||
//- Penetration for percentage of the current total mass
|
||||
inline scalar penetration(const scalar& prc) const;
|
||||
|
||||
//- Mean diameter Dij
|
||||
inline scalar Dij(const label i, const label j) const;
|
||||
|
||||
|
||||
// Fields
|
||||
|
||||
|
||||
@ -278,6 +278,131 @@ Foam::KinematicCloud<CloudType>::rotationalKineticEnergyOfSystem() const
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
inline Foam::scalar Foam::KinematicCloud<CloudType>::Dij
|
||||
(
|
||||
const label i,
|
||||
const label j
|
||||
) const
|
||||
{
|
||||
scalar si = 0.0;
|
||||
scalar sj = 0.0;
|
||||
forAllConstIter(typename KinematicCloud<CloudType>, *this, iter)
|
||||
{
|
||||
const parcelType& p = iter();
|
||||
si += p.nParticle()*pow(p.d(), i);
|
||||
sj += p.nParticle()*pow(p.d(), j);
|
||||
}
|
||||
|
||||
reduce(si, sumOp<scalar>());
|
||||
reduce(sj, sumOp<scalar>());
|
||||
sj = max(sj, VSMALL);
|
||||
|
||||
return si/sj;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
inline Foam::scalar Foam::KinematicCloud<CloudType>::penetration
|
||||
(
|
||||
const scalar& prc
|
||||
) const
|
||||
{
|
||||
scalar distance = 0.0;
|
||||
scalar mTot = 0.0;
|
||||
|
||||
label np = this->size();
|
||||
|
||||
// arrays containing the parcels mass and
|
||||
// distance from injector in ascending order
|
||||
scalarField mass(np);
|
||||
scalarField dist(np);
|
||||
|
||||
if (np > 0)
|
||||
{
|
||||
label n = 0;
|
||||
|
||||
// first arrange the parcels in ascending order
|
||||
// the first parcel is closest to its injection position
|
||||
// and the last one is most far away.
|
||||
forAllConstIter(typename KinematicCloud<CloudType>, *this, iter)
|
||||
{
|
||||
const parcelType& p = iter();
|
||||
scalar mi = p.nParticle()*p.mass();
|
||||
scalar di = mag(p.position() - p.position0());
|
||||
mTot += mi;
|
||||
|
||||
// insert at the last place
|
||||
mass[n] = mi;
|
||||
dist[n] = di;
|
||||
|
||||
label i = 0;
|
||||
bool found = false;
|
||||
|
||||
// insert the parcel in the correct place
|
||||
// and move the others
|
||||
while ((i < n) && (!found))
|
||||
{
|
||||
if (di < dist[i])
|
||||
{
|
||||
found = true;
|
||||
for (label j=n; j>i; j--)
|
||||
{
|
||||
mass[j] = mass[j-1];
|
||||
dist[j] = dist[j-1];
|
||||
}
|
||||
mass[i] = mi;
|
||||
dist[i] = di;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
reduce(mTot, sumOp<scalar>());
|
||||
|
||||
if (np > 0)
|
||||
{
|
||||
scalar mLimit = prc*mTot;
|
||||
scalar mOff = (1.0 - prc)*mTot;
|
||||
|
||||
if (np > 1)
|
||||
{
|
||||
// 'prc' is large enough that the parcel most far
|
||||
// away will be used, no need to loop...
|
||||
if (mLimit > mTot - mass[np-1])
|
||||
{
|
||||
distance = dist[np-1];
|
||||
}
|
||||
else
|
||||
{
|
||||
scalar mOffSum = 0.0;
|
||||
label i = np;
|
||||
|
||||
while ((mOffSum < mOff) && (i>0))
|
||||
{
|
||||
i--;
|
||||
mOffSum += mass[i];
|
||||
}
|
||||
distance =
|
||||
dist[i+1]
|
||||
+ (dist[i] - dist[i+1])*(mOffSum - mOff)
|
||||
/mass[i+1] ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
distance = dist[0];
|
||||
}
|
||||
}
|
||||
|
||||
reduce(distance, maxOp<scalar>());
|
||||
|
||||
return distance;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
inline Foam::cachedRandom& Foam::KinematicCloud<CloudType>::rndGen()
|
||||
{
|
||||
|
||||
@ -185,9 +185,10 @@ void Foam::SprayCloud<CloudType>::checkParcelProperties
|
||||
parcel.position0() = parcel.position();
|
||||
parcel.d0() = parcel.d();
|
||||
|
||||
|
||||
parcel.y() = breakup().y0();
|
||||
parcel.yDot() = breakup().yDot0();
|
||||
|
||||
parcel.liquidCore() = atomization().initLiquidCore();
|
||||
}
|
||||
|
||||
|
||||
@ -337,137 +338,12 @@ void Foam::SprayCloud<CloudType>::motion(TrackData& td)
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
Foam::scalar Foam::SprayCloud<CloudType>::D
|
||||
(
|
||||
const label i,
|
||||
const label j
|
||||
) const
|
||||
{
|
||||
scalar si = 0.0;
|
||||
scalar sj = 0.0;
|
||||
forAllConstIter(typename SprayCloud<CloudType>, *this, iter)
|
||||
{
|
||||
const parcelType& p = iter();
|
||||
si += p.nParticle()*pow(p.d(), i);
|
||||
sj += p.nParticle()*pow(p.d(), j);
|
||||
}
|
||||
|
||||
reduce(si, sumOp<scalar>());
|
||||
reduce(sj, sumOp<scalar>());
|
||||
sj = max(sj, VSMALL);
|
||||
|
||||
return si/sj;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
Foam::scalar Foam::SprayCloud<CloudType>::liquidPenetration
|
||||
(
|
||||
const scalar& prc
|
||||
) const
|
||||
{
|
||||
scalar distance = 0.0;
|
||||
scalar mTot = 0.0;
|
||||
|
||||
label np = this->size();
|
||||
|
||||
// arrays containing the parcels mass and
|
||||
// distance from injector in ascending order
|
||||
scalarField mass(np);
|
||||
scalarField dist(np);
|
||||
|
||||
if (np > 0)
|
||||
{
|
||||
label n = 0;
|
||||
|
||||
// first arrange the parcels in ascending order
|
||||
// the first parcel is closest to its injection position
|
||||
// and the last one is most far away.
|
||||
forAllConstIter(typename SprayCloud<CloudType>, *this, iter)
|
||||
{
|
||||
const parcelType& p = iter();
|
||||
scalar mi = p.nParticle()*p.mass();
|
||||
scalar di = mag(p.position() - p.position0());
|
||||
mTot += mi;
|
||||
|
||||
// insert at the last place
|
||||
mass[n] = mi;
|
||||
dist[n] = di;
|
||||
|
||||
label i = 0;
|
||||
bool found = false;
|
||||
|
||||
// insert the parcel in the correct place
|
||||
// and move the others
|
||||
while (( i < n ) && (!found))
|
||||
{
|
||||
if (di < dist[i])
|
||||
{
|
||||
found = true;
|
||||
for (label j=n; j>i; j--)
|
||||
{
|
||||
mass[j] = mass[j-1];
|
||||
dist[j] = dist[j-1];
|
||||
}
|
||||
mass[i] = mi;
|
||||
dist[i] = di;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
reduce(mTot, sumOp<scalar>());
|
||||
|
||||
if (np > 0)
|
||||
{
|
||||
scalar mLimit = prc*mTot;
|
||||
scalar mOff = (1.0 - prc)*mTot;
|
||||
|
||||
if (np > 1)
|
||||
{
|
||||
// 'prc' is large enough that the parcel most far
|
||||
// away will be used, no need to loop...
|
||||
if (mLimit > mTot - mass[np-1])
|
||||
{
|
||||
distance = dist[np-1];
|
||||
}
|
||||
else
|
||||
{
|
||||
scalar mOffSum = 0.0;
|
||||
label i = np;
|
||||
|
||||
while ((mOffSum < mOff) && (i>0))
|
||||
{
|
||||
i--;
|
||||
mOffSum += mass[i];
|
||||
}
|
||||
distance =
|
||||
dist[i+1]
|
||||
+ (dist[i] - dist[i+1])*(mOffSum - mOff)
|
||||
/mass[i+1] ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
distance = dist[0];
|
||||
}
|
||||
}
|
||||
|
||||
reduce(distance, maxOp<scalar>());
|
||||
|
||||
return distance;
|
||||
}
|
||||
|
||||
|
||||
template<class CloudType>
|
||||
void Foam::SprayCloud<CloudType>::info() const
|
||||
{
|
||||
CloudType::info();
|
||||
scalar d32 = 1.0e+6*D(3, 2);
|
||||
scalar pen = liquidPenetration(0.95);
|
||||
scalar d32 = 1.0e+6*this->Dij(3, 2);
|
||||
scalar pen = this->penetration(0.95);
|
||||
|
||||
Info << " D32 (mu) = " << d32 << endl;
|
||||
Info << " Liquid penetration 95% mass (m) = " << pen << endl;
|
||||
|
||||
@ -203,12 +203,6 @@ public:
|
||||
|
||||
// Check
|
||||
|
||||
//- Calculate the liquid penetration for prc % of the mass
|
||||
scalar liquidPenetration(const scalar& prc) const;
|
||||
|
||||
//- Calculate the diameter Dij
|
||||
scalar D(const label i, const label j) const;
|
||||
|
||||
//- Print cloud information
|
||||
void info() const;
|
||||
|
||||
|
||||
@ -38,7 +38,6 @@ inline Foam::SprayParcel<ParcelType>::SprayParcel
|
||||
ParcelType(mesh, position, cellI, tetFaceI, tetPtI),
|
||||
d0_(this->d()),
|
||||
position0_(position),
|
||||
// liquidCore_(owner.atomization().initLiquidCore()),
|
||||
liquidCore_(0.0),
|
||||
KHindex_(0.0),
|
||||
y_(0.0),
|
||||
|
||||
Reference in New Issue
Block a user