library updates + introduction of thermal shielding

This commit is contained in:
andy
2009-09-01 19:40:00 +01:00
parent 49faec23f9
commit 68ad701335
32 changed files with 706 additions and 195 deletions

View File

@ -103,7 +103,7 @@ Foam::scalar Foam::COxidationDiffusionLimitedRate<CloudType>::calculate
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -131,7 +131,7 @@ public:
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -111,7 +111,7 @@ Foam::scalar Foam::COxidationKineticDiffusionLimitedRate<CloudType>::calculate
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -139,7 +139,7 @@ public:
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -107,7 +107,7 @@ Foam::scalar Foam::COxidationMurphyShaddix<CloudType>::calculate
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,
@ -143,9 +143,6 @@ Foam::scalar Foam::COxidationMurphyShaddix<CloudType>::calculate
// Far field partial pressure O2 [Pa] // Far field partial pressure O2 [Pa]
const scalar ppO2 = rhoO2/WO2_*specie::RR*Tc; const scalar ppO2 = rhoO2/WO2_*specie::RR*Tc;
// Molar emission rate of volatiles per unit surface area
const scalar qVol = sum(dMassVolatile)/(WVol_*Ap);
// Total molar concentration of the carrier phase [kmol/m^3] // Total molar concentration of the carrier phase [kmol/m^3]
const scalar C = pc/(specie::RR*Tc); const scalar C = pc/(specie::RR*Tc);
@ -174,7 +171,7 @@ Foam::scalar Foam::COxidationMurphyShaddix<CloudType>::calculate
while ((mag(qCs - qCsOld)/qCs > tolerance_) && (iter <= maxIters_)) while ((mag(qCs - qCsOld)/qCs > tolerance_) && (iter <= maxIters_))
{ {
qCsOld = qCs; qCsOld = qCs;
const scalar PO2Surface = ppO2*exp(-(qCs + qVol)*d/(2*C*D)); const scalar PO2Surface = ppO2*exp(-(qCs + N)*d/(2*C*D));
qCs = A_*exp(-E_/(specie::RR*T))*pow(PO2Surface, n_); qCs = A_*exp(-E_/(specie::RR*T))*pow(PO2Surface, n_);
qCs = (100.0*qCs + iter*qCsOld)/(100.0 + iter); qCs = (100.0*qCs + iter*qCsOld)/(100.0 + iter);
qCs = min(qCs, qCsLim); qCs = min(qCs, qCsLim);

View File

@ -152,7 +152,7 @@ public:
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -101,6 +101,12 @@ void Foam::KinematicParcel<ParcelType>::calc
const scalar rho0 = rho_; const scalar rho0 = rho_;
const scalar mass0 = mass(); const scalar mass0 = mass();
// Reynolds number
const scalar Re = this->Re(U0, d0, muc_);
// Sources
//~~~~~~~~
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
@ -113,7 +119,8 @@ void Foam::KinematicParcel<ParcelType>::calc
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Su, dUTrans); vector U1 =
calcVelocity(td, dt, cellI, Re, muc_, d0, U0, rho0, mass0, Su, dUTrans);
// Accumulate carrier phase source terms // Accumulate carrier phase source terms
@ -138,6 +145,8 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
TrackData& td, TrackData& td,
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar mu,
const scalar d, const scalar d,
const vector& U, const vector& U,
const scalar rho, const scalar rho,
@ -149,8 +158,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
const polyMesh& mesh = this->cloud().pMesh(); const polyMesh& mesh = this->cloud().pMesh();
// Momentum transfer coefficient // Momentum transfer coefficient
const scalar utc = const scalar utc = td.cloud().drag().utc(Re, d, mu) + ROOTVSMALL;
td.cloud().drag().utc(U - Uc_, d, rhoc_, muc_) + ROOTVSMALL;
// Momentum source due to particle forces // Momentum source due to particle forces
const vector FCoupled = const vector FCoupled =

View File

@ -238,6 +238,8 @@ protected:
TrackData& td, TrackData& td,
const scalar dt, // timestep const scalar dt, // timestep
const label cellI, // owner cell const label cellI, // owner cell
const scalar Re, // Reynolds number
const scalar mu, // local carrier viscosity
const scalar d, // diameter const scalar d, // diameter
const vector& U, // velocity const vector& U, // velocity
const scalar rho, // density const scalar rho, // density
@ -387,6 +389,14 @@ public:
//- Surface area for given diameter //- Surface area for given diameter
inline scalar areaS(const scalar d) const; inline scalar areaS(const scalar d) const;
//- Reynolds number - particle properties input
inline scalar Re
(
const vector& U,
const scalar d,
const scalar mu
) const;
// Main calculation loop // Main calculation loop

View File

@ -385,4 +385,17 @@ Foam::KinematicParcel<ParcelType>::areaS(const scalar d) const
} }
template <class ParcelType>
inline Foam::scalar
Foam::KinematicParcel<ParcelType>::Re
(
const vector& U,
const scalar d,
const scalar mu
) const
{
return rhoc_*mag(U - Uc_)*d/mu;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -206,6 +206,20 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
const label idL = td.cloud().composition().idLiquid(); const label idL = td.cloud().composition().idLiquid();
const label idS = td.cloud().composition().idSolid(); const label idS = td.cloud().composition().idSolid();
// Calc surface values
// ~~~~~~~~~~~~~~~~~~~
scalar Ts, rhos, mus, Pr, kappa;
ThermoParcel<ParcelType>::
calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Pr, kappa);
// Reynolds number
scalar Re = this->Re(U0, d0, mus);
// Sources
//~~~~~~~~
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
@ -219,6 +233,45 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
scalar dhsTrans = 0.0; scalar dhsTrans = 0.0;
// Phase change in liquid phase
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mass transfer due to phase change
scalarField dMassPC(YLiquid_.size(), 0.0);
// Molar flux of species emitted from the particle (kmol/m^2/s)
scalar Ne = 0.0;
// Sum Ni*Cpi*Wi of emission species
scalar NCpW = 0.0;
// Surface concentrations of emitted species
scalarField Cs(td.cloud().mcCarrierThermo().species().size(), 0.0);
// Calc mass and enthalpy transfer due to phase change
calcPhaseChange
(
td,
dt,
cellI,
Re,
Ts,
mus/rhos,
d0,
T0,
mass0,
idL,
YMix[LIQ],
YLiquid_,
dMassPC,
Sh,
dhsTrans,
Ne,
NCpW,
Cs
);
// Devolatilisation // Devolatilisation
// ~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~
@ -230,6 +283,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
( (
td, td,
dt, dt,
Ts,
d0,
T0, T0,
mass0, mass0,
this->mass0_, this->mass0_,
@ -239,9 +294,15 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
canCombust_, canCombust_,
dMassDV, dMassDV,
Sh, Sh,
dhsTrans dhsTrans,
Ne,
NCpW,
Cs
); );
// Correct surface values due to emitted species
correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Pr, kappa);
// Surface reactions // Surface reactions
// ~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~
@ -267,7 +328,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
T0, T0,
mass0, mass0,
canCombust_, canCombust_,
dMassDV, // assuming d(mass) due to phase change is non-volatile Ne,
YMix, YMix,
YGas_, YGas_,
YLiquid_, YLiquid_,
@ -281,31 +342,6 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
); );
// Phase change in liquid phase
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mass transfer due to phase change
scalarField dMassPC(YLiquid_.size(), 0.0);
// Calc mass and enthalpy transfer due to phase change
calcPhaseChange
(
td,
dt,
cellI,
d0,
T0,
U0,
mass0,
idL,
YMix[LIQ],
YLiquid_,
dMassPC,
Sh,
dhsTrans
);
// Update component mass fractions // Update component mass fractions
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -322,14 +358,30 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
// Calculate new particle temperature // Calculate new particle temperature
scalar T1 = scalar T1 =
calcHeatTransfer(td, dt, cellI, d0, U0, rho0, T0, cp0, Sh, dhsTrans); calcHeatTransfer
(
td,
dt,
cellI,
Re,
Pr,
kappa,
d0,
rho0,
T0,
cp0,
NCpW,
Sh,
dhsTrans
);
// Motion // Motion
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Su, dUTrans); vector U1 =
calcVelocity(td, dt, cellI, Re, mus, d0, U0, rho0, mass0, Su, dUTrans);
dUTrans += 0.5*(mass0 - mass1)*(U0 + U1); dUTrans += 0.5*(mass0 - mass1)*(U0 + U1);
@ -455,6 +507,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
( (
TrackData& td, TrackData& td,
const scalar dt, const scalar dt,
const scalar Ts,
const scalar d,
const scalar T, const scalar T,
const scalar mass, const scalar mass,
const scalar mass0, const scalar mass0,
@ -464,7 +518,10 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
bool& canCombust, bool& canCombust,
scalarField& dMassDV, scalarField& dMassDV,
scalar& Sh, scalar& Sh,
scalar& dhsTrans scalar& dhsTrans,
scalar& N,
scalar& NCpW,
scalarField& Cs
) const ) const
{ {
// Check that model is active, and that the parcel temperature is // Check that model is active, and that the parcel temperature is
@ -496,6 +553,30 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
td.cloud().addToMassDevolatilisation(this->nParticle_*dMassTot); td.cloud().addToMassDevolatilisation(this->nParticle_*dMassTot);
Sh -= dMassTot*td.constProps().LDevol()/dt; Sh -= dMassTot*td.constProps().LDevol()/dt;
// Molar average molecular weight of carrier mix
const scalar Wc = this->rhoc_*specie::RR*this->Tc_/this->pc_;
// Update molar emissions
forAll(dMassDV, i)
{
// Note: hardcoded gaseous diffusivities for now
// TODO: add to carrier thermo
const scalar beta = sqr(cbrt(15.0) + cbrt(15.0));
const label id =
td.cloud().composition().localToGlobalCarrierId(GAS, i);
const scalar Cp = td.cloud().mcCarrierThermo().speciesData()[id].Cp(Ts);
const scalar W = td.cloud().mcCarrierThermo().speciesData()[id].W();
const scalar Ni = dMassDV[i]/(this->areaS(d)*dt*W);
// Dab calc'd using API vapour mass diffusivity function
const scalar Dab =
3.6059e-3*(pow(1.8*Ts, 1.75))*sqrt(1.0/W + 1.0/Wc)/(this->pc_*beta);
N += Ni;
NCpW += Ni*Cp*W;
Cs[id] += Ni*d/(2.0*Dab);
}
} }
@ -510,7 +591,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions
const scalar T, const scalar T,
const scalar mass, const scalar mass,
const bool canCombust, const bool canCombust,
const scalarField& dMassVolatile, const scalar N,
const scalarField& YMix, const scalarField& YMix,
const scalarField& YGas, const scalarField& YGas,
const scalarField& YLiquid, const scalarField& YLiquid,
@ -544,7 +625,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions
YLiquid, YLiquid,
YSolid, YSolid,
YMix, YMix,
dMassVolatile, N,
dMassSRGas, dMassSRGas,
dMassSRLiquid, dMassSRLiquid,
dMassSRSolid, dMassSRSolid,

View File

@ -227,6 +227,8 @@ protected:
( (
TrackData& td, TrackData& td,
const scalar dt, // timestep const scalar dt, // timestep
const scalar Ts, // Surface temperature
const scalar d, // diameter
const scalar T, // temperature const scalar T, // temperature
const scalar mass, // mass const scalar mass, // mass
const scalar mass0, // mass (initial on injection) const scalar mass0, // mass (initial on injection)
@ -236,7 +238,10 @@ protected:
bool& canCombust, // 'can combust' flag bool& canCombust, // 'can combust' flag
scalarField& dMassDV, // mass transfer - local to particle scalarField& dMassDV, // mass transfer - local to particle
scalar& Sh, // explicit particle enthalpy source scalar& Sh, // explicit particle enthalpy source
scalar& dhsTrans // sensible enthalpy transfer to carrier scalar& dhsTrans, // sensible enthalpy transfer to carrier
scalar& N, // flux of species emitted from particle
scalar& NCpW, // sum of N*Cp*W of emission species
scalarField& Cs // carrier conc. of emission species
) const; ) const;
//- Calculate surface reactions //- Calculate surface reactions
@ -250,7 +255,7 @@ protected:
const scalar T, // temperature const scalar T, // temperature
const scalar mass, // mass const scalar mass, // mass
const bool canCombust, // 'can combust' flag const bool canCombust, // 'can combust' flag
const scalarField& dMassVolatile, // mass transfer of volatiles const scalar N, // flux of species emitted from particle
const scalarField& YMix, // mixture mass fractions const scalarField& YMix, // mixture mass fractions
const scalarField& YGas, // gas-phase mass fractions const scalarField& YGas, // gas-phase mass fractions
const scalarField& YLiquid,// liquid-phase mass fractions const scalarField& YLiquid,// liquid-phase mass fractions

View File

@ -26,6 +26,9 @@ License
#include "ReactingParcel.H" #include "ReactingParcel.H"
#include "mathConstants.H" #include "mathConstants.H"
#include "specie.H"
using namespace Foam::constant;
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
@ -98,6 +101,92 @@ void Foam::ReactingParcel<ParcelType>::cellValueSourceCorrection
} }
template<class ParcelType>
template<class TrackData>
void Foam::ReactingParcel<ParcelType>::correctSurfaceValues
(
TrackData& td,
const label cellI,
const scalar T,
const scalarField& Cs,
scalar& rhos,
scalar& mus,
scalar& Pr,
scalar& kappa
)
{
// No correction if total concentration of emitted species is small
if (sum(Cs) < SMALL)
{
return;
}
// Far field gas molar fractions
scalarField Xinf(Y_.size());
forAll(Xinf, i)
{
Xinf[i] =
td.cloud().mcCarrierThermo().Y(i)[cellI]
/td.cloud().mcCarrierThermo().speciesData()[i].W();
}
Xinf /= sum(Xinf);
// Molar fraction of far field species at particle surface
const scalar Xsff = 1.0 - min(sum(Cs)*specie::RR*this->T_/pc_, 1.0);
// Surface gas total molar concentration
const scalar CsTot = pc_/(specie::RR*this->T_);
// Surface carrier composition (molar fraction)
scalarField Xs(Xinf.size());
// Surface carrier composition (mass fraction)
scalarField Ys(Xinf.size());
forAll(Xs, i)
{
// Molar concentration of species at particle surface
const scalar Csi = Cs[i] + Xsff*Xinf[i]*CsTot;
Xs[i] = (2.0*Csi + Xinf[i]*CsTot)/3.0;
Ys[i] = Xs[i]*td.cloud().mcCarrierThermo().speciesData()[i].W();
}
Xs /= sum(Xs);
Ys /= sum(Ys);
rhos = 0;
mus = 0;
kappa = 0;
scalar cps = 0.0;
scalar sumYiSqrtW = 0;
scalar sumYiCbrtW = 0;
forAll(Ys, i)
{
const scalar sqrtW =
sqrt(td.cloud().mcCarrierThermo().speciesData()[i].W());
const scalar cbrtW =
cbrt(td.cloud().mcCarrierThermo().speciesData()[i].W());
rhos += Xs[i]*td.cloud().mcCarrierThermo().speciesData()[i].W();
cps += Xs[i]*td.cloud().mcCarrierThermo().speciesData()[i].Cp(T);
mus += Ys[i]*sqrtW*td.cloud().mcCarrierThermo().speciesData()[i].mu(T);
kappa +=
Ys[i]*cbrtW*td.cloud().mcCarrierThermo().speciesData()[i].kappa(T);
sumYiSqrtW += Ys[i]*sqrtW;
sumYiCbrtW += Ys[i]*cbrtW;
}
rhos *= pc_/(specie::RR*T);
mus /= sumYiSqrtW;
kappa /= sumYiCbrtW;
Pr = cps*mus/kappa;
}
template<class ParcelType> template<class ParcelType>
Foam::scalar Foam::ReactingParcel<ParcelType>::updateMassFraction Foam::scalar Foam::ReactingParcel<ParcelType>::updateMassFraction
( (
@ -140,6 +229,20 @@ void Foam::ReactingParcel<ParcelType>::calc
const scalar cp0 = this->cp_; const scalar cp0 = this->cp_;
const scalar mass0 = this->mass(); const scalar mass0 = this->mass();
// Calc surface values
// ~~~~~~~~~~~~~~~~~~~
scalar Ts, rhos, mus, Pr, kappa;
ThermoParcel<ParcelType>::
calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Pr, kappa);
// Reynolds number
scalar Re = this->Re(U0, d0, mus);
// Sources
//~~~~~~~~
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
@ -159,24 +262,41 @@ void Foam::ReactingParcel<ParcelType>::calc
// Mass transfer due to phase change // Mass transfer due to phase change
scalarField dMassPC(Y_.size(), 0.0); scalarField dMassPC(Y_.size(), 0.0);
// Molar flux of species emitted from the particle (kmol/m^2/s)
scalar Ne = 0.0;
// Sum Ni*Cpi*Wi of emission species
scalar NCpW = 0.0;
// Surface concentrations of emitted species
scalarField Cs(td.cloud().mcCarrierThermo().species().size(), 0.0);
// Calc mass and enthalpy transfer due to phase change // Calc mass and enthalpy transfer due to phase change
calcPhaseChange calcPhaseChange
( (
td, td,
dt, dt,
cellI, cellI,
Ts,
mus/rhos,
Re,
d0, d0,
T0, T0,
U0,
mass0, mass0,
0, 0,
1.0, 1.0,
Y_, Y_,
dMassPC, dMassPC,
Sh, Sh,
dhsTrans dhsTrans,
Ne,
NCpW,
Cs
); );
// Correct surface values due to emitted species
correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Pr, kappa);
// Update particle component mass and mass fractions // Update particle component mass and mass fractions
scalar mass1 = updateMassFraction(mass0, dMassPC, Y_); scalar mass1 = updateMassFraction(mass0, dMassPC, Y_);
@ -186,14 +306,30 @@ void Foam::ReactingParcel<ParcelType>::calc
// Calculate new particle temperature // Calculate new particle temperature
scalar T1 = scalar T1 =
calcHeatTransfer(td, dt, cellI, d0, U0, rho0, T0, cp0, Sh, dhsTrans); calcHeatTransfer
(
td,
dt,
cellI,
Re,
Pr,
kappa,
d0,
rho0,
T0,
cp0,
NCpW,
Sh,
dhsTrans
);
// Motion // Motion
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Su, dUTrans); vector U1 =
calcVelocity(td, dt, cellI, Re, mus, d0, U0, rho0, mass0, Su, dUTrans);
dUTrans += 0.5*(mass0 - mass1)*(U0 + U1); dUTrans += 0.5*(mass0 - mass1)*(U0 + U1);
@ -258,7 +394,7 @@ void Foam::ReactingParcel<ParcelType>::calc
} }
else else
{ {
this->d_ = cbrt(mass1/this->rho_*6.0/constant::math::pi); this->d_ = cbrt(mass1/this->rho_*6.0/math::pi);
} }
} }
} }
@ -271,16 +407,21 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange
TrackData& td, TrackData& td,
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar Ts,
const scalar nus,
const scalar d, const scalar d,
const scalar T, const scalar T,
const vector& U,
const scalar mass, const scalar mass,
const label idPhase, const label idPhase,
const scalar YPhase, const scalar YPhase,
const scalarField& YComponents, const scalarField& YComponents,
scalarField& dMassPC, scalarField& dMassPC,
scalar& Sh, scalar& Sh,
scalar& dhsTrans scalar& dhsTrans,
scalar& N,
scalar& NCpW,
scalarField& Cs
) )
{ {
if if
@ -298,12 +439,12 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange
( (
dt, dt,
cellI, cellI,
Re,
d, d,
min(T, td.constProps().Tbp()), // Limit to boiling temperature nus,
T,
Ts,
pc_, pc_,
this->Tc_,
this->muc_/(this->rhoc_ + ROOTVSMALL),
U - this->Uc_,
dMassPC dMassPC
); );
@ -315,18 +456,38 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange
// Add to cumulative phase change mass // Add to cumulative phase change mass
td.cloud().addToMassPhaseChange(this->nParticle_*dMassTot); td.cloud().addToMassPhaseChange(this->nParticle_*dMassTot);
// Enthalphy transfer to carrier phase // Average molecular weight of carrier mix - assumes perfect gas
label id; scalar Wc = this->rhoc_*specie::RR*this->Tc_/this->pc_;
forAll(YComponents, i) forAll(YComponents, i)
{ {
id = td.cloud().composition().localToGlobalCarrierId(idPhase, i); const label idc =
const scalar hv = td.cloud().mcCarrierThermo().speciesData()[id].H(T); td.cloud().composition().localToGlobalCarrierId(idPhase, i);
const scalar hv = td.cloud().mcCarrierThermo().speciesData()[idc].H(T);
id = td.cloud().composition().globalIds(idPhase)[i]; const label idl = td.cloud().composition().globalIds(idPhase)[i];
const scalar hl = const scalar hl =
td.cloud().composition().liquids().properties()[id].h(pc_, T); td.cloud().composition().liquids().properties()[idl].h(pc_, T);
// Enthalphy transfer to carrier phase
Sh += dMassPC[i]*(hl - hv)/dt; Sh += dMassPC[i]*(hl - hv)/dt;
const scalar Dab =
td.cloud().composition().liquids().properties()[idl].D(pc_, Ts, Wc);
const scalar Cp =
td.cloud().mcCarrierThermo().speciesData()[idc].Cp(Ts);
const scalar W = td.cloud().mcCarrierThermo().speciesData()[idc].W();
const scalar Ni = dMassPC[i]/(this->areaS(d)*dt*W);
// Molar flux of species coming from the particle (kmol/m^2/s)
N += Ni;
// Sum of Ni*Cpi*Wi of emission species
NCpW += Ni*Cp*W;
// Concentrations of emission species
Cs[idc] += Ni*d/(2.0*Dab);
} }
} }

View File

@ -195,16 +195,21 @@ protected:
TrackData& td, TrackData& td,
const scalar dt, // timestep const scalar dt, // timestep
const label cellI, // owner cell const label cellI, // owner cell
const scalar Re, // Reynolds number
const scalar Ts, // Surface temperature
const scalar nus, // Surface kinematic viscosity
const scalar d, // diameter const scalar d, // diameter
const scalar T, // temperature const scalar T, // temperature
const vector& U, // velocity
const scalar mass, // mass const scalar mass, // mass
const label idPhase, // id of phase involved in phase change const label idPhase, // id of phase involved in phase change
const scalar YPhase, // total mass fraction const scalar YPhase, // total mass fraction
const scalarField& YComponents, // component mass fractions const scalarField& YComponents, // component mass fractions
scalarField& dMassPC, // mass transfer - local to particle scalarField& dMassPC, // mass transfer - local to particle
scalar& Sh, // explicit particle enthalpy source scalar& Sh, // explicit particle enthalpy source
scalar& dhsTrans // sensible enthalpy transfer to carrier scalar& dhsTrans, // sensible enthalpy transfer to carrier
scalar& N, // flux of species emitted from particle
scalar& NCpW, // sum of N*Cp*W of emission species
scalarField& Cs // carrier conc. of emission species
); );
//- Update mass fraction //- Update mass fraction
@ -316,6 +321,20 @@ public:
const label cellI const label cellI
); );
//- Correct surface values due to emitted species
template<class TrackData>
void correctSurfaceValues
(
TrackData& td,
const label cellI,
const scalar T,
const scalarField& Cs,
scalar& rhos,
scalar& mus,
scalar& Pr,
scalar& kappa
);
//- Update parcel properties over the time interval //- Update parcel properties over the time interval
template<class TrackData> template<class TrackData>
void calc void calc

View File

@ -27,6 +27,8 @@ License
#include "ThermoParcel.H" #include "ThermoParcel.H"
#include "physicoChemicalConstants.H" #include "physicoChemicalConstants.H"
using namespace Foam::constant;
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
template<class ParcelType> template<class ParcelType>
@ -78,6 +80,33 @@ void Foam::ThermoParcel<ParcelType>::cellValueSourceCorrection
} }
template<class ParcelType>
template<class TrackData>
void Foam::ThermoParcel<ParcelType>::calcSurfaceValues
(
TrackData& td,
const label cellI,
const scalar T,
scalar& Ts,
scalar& rhos,
scalar& mus,
scalar& Pr,
scalar& kappa
) const
{
// Surface temperature using two thirds rule
Ts = (2.0*T + Tc_)/3.0;
// Assuming thermo props vary linearly with T for small dT
scalar factor = td.TInterp().interpolate(this->position(), cellI)/Ts;
rhos = this->rhoc_*factor;
mus = td.muInterp().interpolate(this->position(), cellI)/factor;
Pr = td.constProps().Pr();
kappa = cpc_*mus/Pr;
}
template<class ParcelType> template<class ParcelType>
template<class TrackData> template<class TrackData>
void Foam::ThermoParcel<ParcelType>::calc void Foam::ThermoParcel<ParcelType>::calc
@ -97,6 +126,19 @@ void Foam::ThermoParcel<ParcelType>::calc
const scalar cp0 = this->cp_; const scalar cp0 = this->cp_;
const scalar mass0 = this->mass(); const scalar mass0 = this->mass();
// Calc surface values
// ~~~~~~~~~~~~~~~~~~~
scalar Ts, rhos, mus, Pr, kappa;
calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Pr, kappa);
// Reynolds number
scalar Re = this->Re(U0, d0, mus);
// Sources
// ~~~~~~~
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
@ -109,19 +151,39 @@ void Foam::ThermoParcel<ParcelType>::calc
// Sensible enthalpy transfer from the particle to the carrier phase // Sensible enthalpy transfer from the particle to the carrier phase
scalar dhsTrans = 0.0; scalar dhsTrans = 0.0;
// Heat transfer // Heat transfer
// ~~~~~~~~~~~~~ // ~~~~~~~~~~~~~
// Sum Ni*Cpi*Wi of emission species
scalar NCpW = 0.0;
// Calculate new particle velocity // Calculate new particle velocity
scalar T1 = scalar T1 =
calcHeatTransfer(td, dt, cellI, d0, U0, rho0, T0, cp0, Sh, dhsTrans); calcHeatTransfer
(
td,
dt,
cellI,
Re,
Pr,
kappa,
d0,
rho0,
T0,
cp0,
NCpW,
Sh,
dhsTrans
);
// Motion // Motion
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Su, dUTrans); vector U1 =
calcVelocity(td, dt, cellI, Re, mus, d0, U0, rho0, mass0, Su, dUTrans);
// Accumulate carrier phase source terms // Accumulate carrier phase source terms
@ -149,11 +211,14 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
TrackData& td, TrackData& td,
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar Pr,
const scalar kappa,
const scalar d, const scalar d,
const vector& U,
const scalar rho, const scalar rho,
const scalar T, const scalar T,
const scalar cp, const scalar cp,
const scalar NCpW,
const scalar Sh, const scalar Sh,
scalar& dhsTrans scalar& dhsTrans
) )
@ -164,16 +229,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
} }
// Calc heat transfer coefficient // Calc heat transfer coefficient
scalar htc = td.cloud().heatTransfer().h scalar htc = td.cloud().heatTransfer().htc(d, Re, Pr, kappa, NCpW);
(
d,
U - this->Uc_,
this->rhoc_,
rho,
cpc_,
cp,
this->muc_
);
const scalar As = this->areaS(d); const scalar As = this->areaS(d);
@ -189,7 +245,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
{ {
const scalarField& G = const scalarField& G =
td.cloud().mesh().objectRegistry::lookupObject<volScalarField>("G"); td.cloud().mesh().objectRegistry::lookupObject<volScalarField>("G");
const scalar sigma = constant::physicoChemical::sigma.value(); const scalar sigma = physicoChemical::sigma.value();
const scalar epsilon = td.constProps().epsilon0(); const scalar epsilon = td.constProps().epsilon0();
ap = ap =

View File

@ -97,6 +97,9 @@ public:
//- Particle scattering factor [] (radiation) //- Particle scattering factor [] (radiation)
const scalar f0_; const scalar f0_;
//- Default carrier Prandtl number []
const scalar Pr_;
public: public:
@ -124,6 +127,9 @@ public:
//- Return const access to the particle scattering factor [] //- Return const access to the particle scattering factor []
// Active for radiation only // Active for radiation only
inline scalar f0() const; inline scalar f0() const;
//- Return const access to the default carrier Prandtl number []
inline scalar Pr() const;
}; };
@ -217,11 +223,14 @@ protected:
TrackData& td, TrackData& td,
const scalar dt, // timestep const scalar dt, // timestep
const label cellI, // owner cell const label cellI, // owner cell
const scalar Re, // Reynolds number
const scalar Pr, // Prandtl number - surface
const scalar kappa, // Thermal conductivity - surface
const scalar d, // diameter const scalar d, // diameter
const vector& U, // velocity
const scalar rho, // density const scalar rho, // density
const scalar T, // temperature const scalar T, // temperature
const scalar cp, // specific heat capacity const scalar cp, // specific heat capacity
const scalar NCpW, // Sum of N*Cp*W of emission species
const scalar Sh, // explicit particle enthalpy source const scalar Sh, // explicit particle enthalpy source
scalar& dhsTrans // sensible enthalpy transfer to carrier scalar& dhsTrans // sensible enthalpy transfer to carrier
); );
@ -323,6 +332,20 @@ public:
const label cellI const label cellI
); );
//- Calculate surface thermo properties
template<class TrackData>
void calcSurfaceValues
(
TrackData& td,
const label cellI,
const scalar T,
scalar& Ts,
scalar& rhos,
scalar& mus,
scalar& Pr,
scalar& kappa
) const;
//- Update parcel properties over the time interval //- Update parcel properties over the time interval
template<class TrackData> template<class TrackData>
void calc void calc

View File

@ -37,7 +37,8 @@ inline Foam::ThermoParcel<ParcelType>::constantProperties::constantProperties
TMin_(dimensionedScalar(this->dict().lookup("TMin")).value()), TMin_(dimensionedScalar(this->dict().lookup("TMin")).value()),
cp0_(dimensionedScalar(this->dict().lookup("cp0")).value()), cp0_(dimensionedScalar(this->dict().lookup("cp0")).value()),
epsilon0_(dimensionedScalar(this->dict().lookup("epsilon0")).value()), epsilon0_(dimensionedScalar(this->dict().lookup("epsilon0")).value()),
f0_(dimensionedScalar(this->dict().lookup("f0")).value()) f0_(dimensionedScalar(this->dict().lookup("f0")).value()),
Pr_(dimensionedScalar(this->dict().lookup("Pr")).value())
{} {}
@ -159,6 +160,14 @@ Foam::ThermoParcel<ParcelType>::constantProperties::f0() const
} }
template <class ParcelType>
inline Foam::scalar
Foam::ThermoParcel<ParcelType>::constantProperties::Pr() const
{
return Pr_;
}
// * * * * * * * * * * * trackData Member Functions * * * * * * * * * * * * // // * * * * * * * * * * * trackData Member Functions * * * * * * * * * * * * //
template<class ParcelType> template<class ParcelType>

View File

@ -33,6 +33,7 @@ License
#include "NoHeatTransfer.H" #include "NoHeatTransfer.H"
#include "RanzMarshall.H" #include "RanzMarshall.H"
#include "RanzMarshallBirdCorrection.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -52,6 +53,12 @@ License
ThermoCloud, \ ThermoCloud, \
ParcelType \ ParcelType \
); \ ); \
makeHeatTransferModelType \
( \
RanzMarshallBirdCorrection, \
ThermoCloud, \
ParcelType \
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -34,6 +34,7 @@ License
#include "NoHeatTransfer.H" #include "NoHeatTransfer.H"
#include "RanzMarshall.H" #include "RanzMarshall.H"
#include "RanzMarshallBirdCorrection.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -74,6 +75,13 @@ License
ParcelType, \ ParcelType, \
ThermoType \ ThermoType \
); \ ); \
makeHeatTransferModelThermoType \
( \
RanzMarshallBirdCorrection, \
ThermoCloud, \
ParcelType, \
ThermoType \
);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -66,19 +66,14 @@ const Foam::dictionary& Foam::DragModel<CloudType>::dict() const
template<class CloudType> template<class CloudType>
Foam::scalar Foam::DragModel<CloudType>::utc Foam::scalar Foam::DragModel<CloudType>::utc
( (
const vector& Ur, const scalar Re,
const scalar d, const scalar d,
const scalar rhoc,
const scalar mu const scalar mu
) const ) const
{ {
const scalar magUr = mag(Ur);
const scalar Re = rhoc*magUr*d/(mu + ROOTVSMALL);
const scalar Cd = this->Cd(Re); const scalar Cd = this->Cd(Re);
return Cd*rhoc*magUr/8.0; return Cd*Re/d*mu/8.0;
} }

View File

@ -122,13 +122,7 @@ public:
//- Return momentum transfer coefficient //- Return momentum transfer coefficient
// Drag force per unit particle surface area = utc(U - Up) // Drag force per unit particle surface area = utc(U - Up)
scalar utc scalar utc(const scalar Re, const scalar d, const scalar mu) const;
(
const vector& Ur,
const scalar d,
const scalar rhoc,
const scalar mu
) const;
}; };

View File

@ -38,15 +38,14 @@ Foam::scalarField Foam::LiquidEvaporation<CloudType>::calcXc
{ {
scalarField Xc(this->owner().mcCarrierThermo().Y().size()); scalarField Xc(this->owner().mcCarrierThermo().Y().size());
scalar Winv = 0.0;
forAll(Xc, i) forAll(Xc, i)
{ {
scalar Y = this->owner().mcCarrierThermo().Y()[i][cellI]; Xc[i] =
Winv += Y/this->owner().mcCarrierThermo().speciesData()[i].W(); this->owner().mcCarrierThermo().Y()[i][cellI]
Xc[i] = Y/this->owner().mcCarrierThermo().speciesData()[i].W(); /this->owner().mcCarrierThermo().speciesData()[i].W();
} }
return Xc/Winv; return Xc/sum(Xc);
} }
@ -136,12 +135,12 @@ void Foam::LiquidEvaporation<CloudType>::calculate
( (
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar d, const scalar d,
const scalar nu,
const scalar T, const scalar T,
const scalar Ts,
const scalar pc, const scalar pc,
const scalar Tc,
const scalar nuc,
const vector& Ur,
scalarField& dMassPC scalarField& dMassPC
) const ) const
{ {
@ -151,29 +150,25 @@ void Foam::LiquidEvaporation<CloudType>::calculate
// droplet surface area // droplet surface area
scalar A = constant::math::pi*sqr(d); scalar A = constant::math::pi*sqr(d);
// Reynolds number
scalar Re = mag(Ur)*d/(nuc + ROOTVSMALL);
// film temperature evaluated using the 2/3 rule
scalar Tf = (2.0*T + Tc)/3.0;
// calculate mass transfer of each specie in liquid // calculate mass transfer of each specie in liquid
forAll(activeLiquids_, i) forAll(activeLiquids_, i)
{ {
label gid = liqToCarrierMap_[i]; label gid = liqToCarrierMap_[i];
label lid = liqToLiqMap_[i]; label lid = liqToLiqMap_[i];
// vapour diffusivity at film temperature and cell pressure [m2/s] // vapour diffusivity [m2/s]
scalar Dab = liquids_->properties()[lid].D(pc, Tf); scalar Dab = liquids_->properties()[lid].D(pc, Ts);
// saturation pressure for species i at film temperature and cell // Saturation pressure for species i [pa]
// pressure [pa] - carrier phase pressure assumed equal to the liquid // - carrier phase pressure assumed equal to the liquid vapour pressure
// vapour pressure close to the surface // close to the surface
// - limited to pc if pSat > pc // NOTE: if pSat > pc then particle is superheated
scalar pSat = min(liquids_->properties()[lid].pv(pc, Tf), pc); // calculated evaporation rate will be greater than that of a particle
// at boiling point, but this is not a boiling model
scalar pSat = liquids_->properties()[lid].pv(pc, T);
// Schmidt number // Schmidt number
scalar Sc = nuc/(Dab + ROOTVSMALL); scalar Sc = nu/(Dab + ROOTVSMALL);
// Sherwood number // Sherwood number
scalar Sh = this->Sh(Re, Sc); scalar Sh = this->Sh(Re, Sc);
@ -181,11 +176,11 @@ void Foam::LiquidEvaporation<CloudType>::calculate
// mass transfer coefficient [m/s] // mass transfer coefficient [m/s]
scalar kc = Sh*Dab/(d + ROOTVSMALL); scalar kc = Sh*Dab/(d + ROOTVSMALL);
// vapour concentration at droplet surface at film temperature [kmol/m3] // vapour concentration at droplet surface [kmol/m3] at film temperature
scalar Cs = pSat/(specie::RR*Tf); scalar Cs = pSat/(specie::RR*Ts);
// vapour concentration in bulk gas at film temperature [kmol/m3] // vapour concentration in bulk gas [kmol/m3] at film temperature
scalar Cinf = Xc[gid]*pc/(specie::RR*Tf); scalar Cinf = Xc[gid]*pc/(specie::RR*Ts);
// molar flux of vapour [kmol/m2/s] // molar flux of vapour [kmol/m2/s]
scalar Ni = max(kc*(Cs - Cinf), 0.0); scalar Ni = max(kc*(Cs - Cinf), 0.0);

View File

@ -106,12 +106,12 @@ public:
( (
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar d, const scalar d,
const scalar nu,
const scalar T, const scalar T,
const scalar Ts,
const scalar pc, const scalar pc,
const scalar Tc,
const scalar nuc,
const vector& Ur,
scalarField& dMassPC scalarField& dMassPC
) const; ) const;
}; };

View File

@ -65,7 +65,7 @@ void Foam::NoPhaseChange<CloudType>::calculate
const scalar, const scalar,
const scalar, const scalar,
const scalar, const scalar,
const vector&, const scalar,
scalarField& scalarField&
) const ) const
{ {

View File

@ -74,12 +74,12 @@ public:
( (
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar d, const scalar d,
const scalar nu,
const scalar T, const scalar T,
const scalar Ts,
const scalar pc, const scalar pc,
const scalar Tc,
const scalar nuc,
const vector& Ur,
scalarField& dMassPC scalarField& dMassPC
) const; ) const;
}; };

View File

@ -140,12 +140,12 @@ public:
( (
const scalar dt, const scalar dt,
const label cellI, const label cellI,
const scalar Re,
const scalar d, const scalar d,
const scalar nu,
const scalar T, const scalar T,
const scalar Ts,
const scalar pc, const scalar pc,
const scalar Tc,
const scalar nuc,
const vector& Ur,
scalarField& dMassPC scalarField& dMassPC
) const = 0; ) const = 0;
}; };

View File

@ -70,7 +70,7 @@ Foam::scalar Foam::NoSurfaceReaction<CloudType>::calculate
const scalarField&, const scalarField&,
const scalarField&, const scalarField&,
const scalarField&, const scalarField&,
const scalarField&, const scalar,
scalarField&, scalarField&,
scalarField&, scalarField&,
scalarField&, scalarField&,

View File

@ -88,7 +88,7 @@ public:
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -146,7 +146,7 @@ public:
const scalarField& YLiquid, const scalarField& YLiquid,
const scalarField& YSolid, const scalarField& YSolid,
const scalarField& YMixture, const scalarField& YMixture,
const scalarField& dMassVolatile, const scalar N,
scalarField& dMassGas, scalarField& dMassGas,
scalarField& dMassLiquid, scalarField& dMassLiquid,
scalarField& dMassSolid, scalarField& dMassSolid,

View File

@ -82,57 +82,21 @@ const Foam::dictionary& Foam::HeatTransferModel<CloudType>::coeffDict() const
template<class CloudType> template<class CloudType>
Foam::scalar Foam::HeatTransferModel<CloudType>::h Foam::scalar Foam::HeatTransferModel<CloudType>::htc
( (
const scalar dp, const scalar dp,
const vector& Ur, const scalar Re,
const scalar rhoc, const scalar Pr,
const scalar rhop, const scalar kappa,
const scalar cpc, const scalar NCpW
const scalar cpp,
const scalar muc
) const ) const
{ {
const scalar Re = rhoc*mag(Ur)*dp/(muc + ROOTVSMALL);
// const scalar Pr = muc/alphac;
const scalar Pr = this->Pr();
const scalar Nu = this->Nu(Re, Pr); const scalar Nu = this->Nu(Re, Pr);
const scalar kappa = cpc*muc/Pr;
return Nu*kappa/dp; return Nu*kappa/dp;
} }
template<class CloudType>
Foam::scalar Foam::HeatTransferModel<CloudType>::Cu
(
const scalar dp,
const vector& Ur,
const scalar rhoc,
const scalar rhop,
const scalar cpc,
const scalar cpp,
const scalar muc
) const
{
const scalar Re = rhoc*mag(Ur)*dp/(muc + ROOTVSMALL);
// const scalar Pr = muc/alphac;
const scalar Pr = this->Pr();
const scalar Nu = this->Nu(Re, Pr);
const scalar kappa = cpc*muc/Pr;
const scalar htc = Nu*kappa/dp;
return 6.0*htc/(dp*rhop*cpp);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "NewHeatTransferModel.C" #include "NewHeatTransferModel.C"

View File

@ -138,27 +138,13 @@ public:
virtual scalar Pr() const = 0; virtual scalar Pr() const = 0;
//- Return heat transfer coefficient //- Return heat transfer coefficient
virtual scalar h virtual scalar htc
( (
const scalar dp, const scalar dp,
const vector& Ur, const scalar Re,
const scalar rhoc, const scalar Pr,
const scalar rhop, const scalar kappa,
const scalar cpc, const scalar NCpW
const scalar cpp,
const scalar muc
) const;
//- Return linearised coefficient for temperature equation
virtual scalar Cu
(
const scalar dp,
const vector& Ur,
const scalar rhoc,
const scalar rhop,
const scalar cpc,
const scalar cpp,
const scalar muc
) const; ) const;
}; };

View File

@ -0,0 +1,79 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
\*---------------------------------------------------------------------------*/
#include "RanzMarshallBirdCorrection.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template <class CloudType>
Foam::RanzMarshallBirdCorrection<CloudType>::RanzMarshallBirdCorrection
(
const dictionary& dict,
CloudType& cloud
)
:
RanzMarshall<CloudType>(dict, cloud)
{}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template <class CloudType>
Foam::RanzMarshallBirdCorrection<CloudType>::~RanzMarshallBirdCorrection()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
Foam::scalar Foam::RanzMarshallBirdCorrection<CloudType>::htc
(
const scalar dp,
const scalar Re,
const scalar Pr,
const scalar kappa,
const scalar NCpW
) const
{
scalar htc = RanzMarshall<CloudType>::htc(dp, Re, Pr, kappa, NCpW);
// Bird correction
if (mag(htc) > ROOTVSMALL && mag(NCpW) > ROOTVSMALL)
{
const scalar phit = min(NCpW/htc, 50);
scalar fBird = 1.0;
if (phit > 0.001)
{
fBird = phit/(exp(phit) - 1.0);
}
htc *= fBird;
}
return htc;
}
// ************************************************************************* //

View File

@ -0,0 +1,101 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
Foam::RanzMarshallBirdCorrection
Description
The Ranz-Marshall correlation for heat transfer with the Bird correction
to account for the local shielding effect due to emitted species.
\*---------------------------------------------------------------------------*/
#ifndef RanzMarshallBirdCorrection_H
#define RanzMarshallBirdCorrection_H
#include "RanzMarshall.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class RanzMarshallBirdCorrection Declaration
\*---------------------------------------------------------------------------*/
template <class CloudType>
class RanzMarshallBirdCorrection
:
public RanzMarshall<CloudType>
{
public:
//- Runtime type information
TypeName("RanzMarshallBirdCorrection");
// Constructors
//- Construct from dictionary
RanzMarshallBirdCorrection
(
const dictionary& dict,
CloudType& cloud
);
//- Destructor
virtual ~RanzMarshallBirdCorrection();
// Member Functions
//- Return heat transfer coefficient
virtual scalar htc
(
const scalar dp,
const scalar Re,
const scalar Pr,
const scalar kappa,
const scalar NCpW
) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
# include "RanzMarshallBirdCorrection.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //