diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C index 21e51a9e63b68ba6f0c9eb05d0940164dc859255..cdea75f6a4c164996c0a9ad9eb5db6ac9d804f5b 100644 --- a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C @@ -103,7 +103,7 @@ Foam::scalar Foam::COxidationDiffusionLimitedRate<CloudType>::calculate const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H index 9ab6a5c0f940450b350f8100b6217c387ecc5afe..c7fb7c05ea657da9cbfcb4340433b6ba513e487c 100644 --- a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H @@ -131,7 +131,7 @@ public: const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C index a96c2ee507ce48b68628931336a0d520e36cef48..d2cfccc5a3f00cf0fb2267578f2433920dc93956 100644 --- a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C @@ -111,7 +111,7 @@ Foam::scalar Foam::COxidationKineticDiffusionLimitedRate<CloudType>::calculate const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H index 6500b24c4ffd82f89501bbaf350e433ceb79ac1f..794aaf431f0294cf27126036b06092b2c58b5543 100644 --- a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H @@ -139,7 +139,7 @@ public: const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.C b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.C index 6ee7419b8aadef98b1f132d4ba49de820926a08c..39f4f2d28a762ce9c77c0b5d4f09553de5325b39 100644 --- a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.C +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.C @@ -107,7 +107,7 @@ Foam::scalar Foam::COxidationMurphyShaddix<CloudType>::calculate const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, @@ -143,9 +143,6 @@ Foam::scalar Foam::COxidationMurphyShaddix<CloudType>::calculate // Far field partial pressure O2 [Pa] 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] 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_)) { 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 = (100.0*qCs + iter*qCsOld)/(100.0 + iter); qCs = min(qCs, qCsLim); diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.H b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.H index 7864fc63372bc1b34489e9bdedc49b6d402dd54a..1abd05190ba543b3a904e708422ca6fd48fe901f 100644 --- a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.H +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationMurphyShaddix/COxidationMurphyShaddix.H @@ -152,7 +152,7 @@ public: const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index c7a4b464c5b977c10243e645e6e71215b136cb92..cb301d82102cf54e31b1c6ca091f50a6f8148759 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -101,6 +101,12 @@ void Foam::KinematicParcel<ParcelType>::calc const scalar rho0 = rho_; const scalar mass0 = mass(); + // Reynolds number + const scalar Re = this->Re(U0, d0, muc_); + + + // Sources + //~~~~~~~~ // Explicit momentum source for particle vector Su = vector::zero; @@ -113,7 +119,8 @@ void Foam::KinematicParcel<ParcelType>::calc // ~~~~~~ // 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 @@ -138,6 +145,8 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity TrackData& td, const scalar dt, const label cellI, + const scalar Re, + const scalar mu, const scalar d, const vector& U, const scalar rho, @@ -149,8 +158,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity const polyMesh& mesh = this->cloud().pMesh(); // Momentum transfer coefficient - const scalar utc = - td.cloud().drag().utc(U - Uc_, d, rhoc_, muc_) + ROOTVSMALL; + const scalar utc = td.cloud().drag().utc(Re, d, mu) + ROOTVSMALL; // Momentum source due to particle forces const vector FCoupled = diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H index 04615ab6055b7761fcfeaacf2683cf87039be00d..29979d106d27a2917cf7a2aa74dc3b40a56147b5 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -238,6 +238,8 @@ protected: TrackData& td, const scalar dt, // timestep const label cellI, // owner cell + const scalar Re, // Reynolds number + const scalar mu, // local carrier viscosity const scalar d, // diameter const vector& U, // velocity const scalar rho, // density @@ -387,6 +389,14 @@ public: //- Surface area for given diameter 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 diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H index 30dc8ca1e7c22e1e2998674ede813bfe567acd0a..d847ac38e05f30e873cf60be4b7e6d522fad1935 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H @@ -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; +} + + // ************************************************************************* // diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C index a215242cbc7f95a4e4fde5357c66bde45d804ae8..31d8e9b2d614f6db668cb195153948a3a02bf3e6 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C @@ -206,6 +206,20 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc const label idL = td.cloud().composition().idLiquid(); 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 vector Su = vector::zero; @@ -219,6 +233,45 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc 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 // ~~~~~~~~~~~~~~~~ @@ -230,6 +283,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc ( td, dt, + Ts, + d0, T0, mass0, this->mass0_, @@ -239,9 +294,15 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc canCombust_, dMassDV, Sh, - dhsTrans + dhsTrans, + Ne, + NCpW, + Cs ); + // Correct surface values due to emitted species + correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Pr, kappa); + // Surface reactions // ~~~~~~~~~~~~~~~~~ @@ -267,7 +328,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc T0, mass0, canCombust_, - dMassDV, // assuming d(mass) due to phase change is non-volatile + Ne, YMix, YGas_, 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 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -322,14 +358,30 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc // Calculate new particle temperature 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 // ~~~~~~ // 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); @@ -455,6 +507,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation ( TrackData& td, const scalar dt, + const scalar Ts, + const scalar d, const scalar T, const scalar mass, const scalar mass0, @@ -464,7 +518,10 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation bool& canCombust, scalarField& dMassDV, scalar& Sh, - scalar& dhsTrans + scalar& dhsTrans, + scalar& N, + scalar& NCpW, + scalarField& Cs ) const { // 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); 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 mass, const bool canCombust, - const scalarField& dMassVolatile, + const scalar N, const scalarField& YMix, const scalarField& YGas, const scalarField& YLiquid, @@ -544,7 +625,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions YLiquid, YSolid, YMix, - dMassVolatile, + N, dMassSRGas, dMassSRLiquid, dMassSRSolid, diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H index e4e311ed90c37ac860a52be6c7a3332ef5c11913..fabe2f6136de2182d8c67f1eeb7f3e312a6864b9 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H @@ -227,6 +227,8 @@ protected: ( TrackData& td, const scalar dt, // timestep + const scalar Ts, // Surface temperature + const scalar d, // diameter const scalar T, // temperature const scalar mass, // mass const scalar mass0, // mass (initial on injection) @@ -236,7 +238,10 @@ protected: bool& canCombust, // 'can combust' flag scalarField& dMassDV, // mass transfer - local to particle 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; //- Calculate surface reactions @@ -250,7 +255,7 @@ protected: const scalar T, // temperature const scalar mass, // mass 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& YGas, // gas-phase mass fractions const scalarField& YLiquid,// liquid-phase mass fractions diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index 3d534e39d44e30131a0aebb96ce48264ac33bed6..fdc4d91a28b4c93ead40572eab70585cb1aad74d 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -26,6 +26,9 @@ License #include "ReactingParcel.H" #include "mathConstants.H" +#include "specie.H" + +using namespace Foam::constant; // * * * * * * * * * * * 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> Foam::scalar Foam::ReactingParcel<ParcelType>::updateMassFraction ( @@ -140,6 +229,20 @@ void Foam::ReactingParcel<ParcelType>::calc const scalar cp0 = this->cp_; 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 vector Su = vector::zero; @@ -159,24 +262,41 @@ void Foam::ReactingParcel<ParcelType>::calc // Mass transfer due to phase change 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 calcPhaseChange ( td, dt, cellI, + Ts, + mus/rhos, + Re, d0, T0, - U0, mass0, 0, 1.0, Y_, dMassPC, 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 scalar mass1 = updateMassFraction(mass0, dMassPC, Y_); @@ -186,14 +306,30 @@ void Foam::ReactingParcel<ParcelType>::calc // Calculate new particle temperature 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 // ~~~~~~ // 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); @@ -258,7 +394,7 @@ void Foam::ReactingParcel<ParcelType>::calc } 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, const scalar dt, const label cellI, + const scalar Re, + const scalar Ts, + const scalar nus, const scalar d, const scalar T, - const vector& U, const scalar mass, const label idPhase, const scalar YPhase, const scalarField& YComponents, scalarField& dMassPC, scalar& Sh, - scalar& dhsTrans + scalar& dhsTrans, + scalar& N, + scalar& NCpW, + scalarField& Cs ) { if @@ -298,12 +439,12 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange ( dt, cellI, + Re, d, - min(T, td.constProps().Tbp()), // Limit to boiling temperature + nus, + T, + Ts, pc_, - this->Tc_, - this->muc_/(this->rhoc_ + ROOTVSMALL), - U - this->Uc_, dMassPC ); @@ -315,18 +456,38 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange // Add to cumulative phase change mass td.cloud().addToMassPhaseChange(this->nParticle_*dMassTot); - // Enthalphy transfer to carrier phase - label id; + // Average molecular weight of carrier mix - assumes perfect gas + scalar Wc = this->rhoc_*specie::RR*this->Tc_/this->pc_; + forAll(YComponents, i) { - id = td.cloud().composition().localToGlobalCarrierId(idPhase, i); - const scalar hv = td.cloud().mcCarrierThermo().speciesData()[id].H(T); + const label idc = + 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 = - 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; + + 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); } } diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H index f17cd211714c23e918d766d2e66555cc2bb986e5..c3910a46ab7523d31b8e224677ae0cf71b1c7a37 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H @@ -195,16 +195,21 @@ protected: TrackData& td, const scalar dt, // timestep 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 T, // temperature - const vector& U, // velocity const scalar mass, // mass const label idPhase, // id of phase involved in phase change const scalar YPhase, // total mass fraction const scalarField& YComponents, // component mass fractions scalarField& dMassPC, // mass transfer - local to particle 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 @@ -316,6 +321,20 @@ public: 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 template<class TrackData> void calc diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C index 8bd9a3a1268ef1e4e09f7847930a4a959b2e6374..94b71f7d1ae5874af0bac578b3afbda22ac28f77 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C @@ -27,6 +27,8 @@ License #include "ThermoParcel.H" #include "physicoChemicalConstants.H" +using namespace Foam::constant; + // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // 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 TrackData> void Foam::ThermoParcel<ParcelType>::calc @@ -97,6 +126,19 @@ void Foam::ThermoParcel<ParcelType>::calc const scalar cp0 = this->cp_; 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 vector Su = vector::zero; @@ -109,19 +151,39 @@ void Foam::ThermoParcel<ParcelType>::calc // Sensible enthalpy transfer from the particle to the carrier phase scalar dhsTrans = 0.0; + // Heat transfer // ~~~~~~~~~~~~~ + // Sum Ni*Cpi*Wi of emission species + scalar NCpW = 0.0; + // Calculate new particle velocity 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 // ~~~~~~ // 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 @@ -149,11 +211,14 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer TrackData& td, const scalar dt, const label cellI, + const scalar Re, + const scalar Pr, + const scalar kappa, const scalar d, - const vector& U, const scalar rho, const scalar T, const scalar cp, + const scalar NCpW, const scalar Sh, scalar& dhsTrans ) @@ -164,16 +229,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer } // Calc heat transfer coefficient - scalar htc = td.cloud().heatTransfer().h - ( - d, - U - this->Uc_, - this->rhoc_, - rho, - cpc_, - cp, - this->muc_ - ); + scalar htc = td.cloud().heatTransfer().htc(d, Re, Pr, kappa, NCpW); const scalar As = this->areaS(d); @@ -189,7 +245,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer { const scalarField& 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(); ap = diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H index c11fecd11dc9166cfe5f1753686cf6bcd6030132..f0e728bc1f638a7d1702f37c6c516026db6aba17 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H @@ -97,6 +97,9 @@ public: //- Particle scattering factor [] (radiation) const scalar f0_; + //- Default carrier Prandtl number [] + const scalar Pr_; + public: @@ -124,6 +127,9 @@ public: //- Return const access to the particle scattering factor [] // Active for radiation only inline scalar f0() const; + + //- Return const access to the default carrier Prandtl number [] + inline scalar Pr() const; }; @@ -217,11 +223,14 @@ protected: TrackData& td, const scalar dt, // timestep 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 vector& U, // velocity const scalar rho, // density const scalar T, // temperature const scalar cp, // specific heat capacity + const scalar NCpW, // Sum of N*Cp*W of emission species const scalar Sh, // explicit particle enthalpy source scalar& dhsTrans // sensible enthalpy transfer to carrier ); @@ -323,6 +332,20 @@ public: 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 template<class TrackData> void calc diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H index 8ce0cb56915196a30a7348af7582c64161d17523..284c46eb4222270904c6a16fa7006c2c6ebe2437 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H @@ -37,7 +37,8 @@ inline Foam::ThermoParcel<ParcelType>::constantProperties::constantProperties TMin_(dimensionedScalar(this->dict().lookup("TMin")).value()), cp0_(dimensionedScalar(this->dict().lookup("cp0")).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 * * * * * * * * * * * * // template<class ParcelType> diff --git a/src/lagrangian/intermediate/parcels/include/makeParcelHeatTransferModels.H b/src/lagrangian/intermediate/parcels/include/makeParcelHeatTransferModels.H index a2ce1942020b529d3ec1c651296ae8bc53ebeead..b55cdebd96788c98bc2cc3c0c12adf0303745354 100644 --- a/src/lagrangian/intermediate/parcels/include/makeParcelHeatTransferModels.H +++ b/src/lagrangian/intermediate/parcels/include/makeParcelHeatTransferModels.H @@ -33,6 +33,7 @@ License #include "NoHeatTransfer.H" #include "RanzMarshall.H" +#include "RanzMarshallBirdCorrection.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -52,6 +53,12 @@ License ThermoCloud, \ ParcelType \ ); \ + makeHeatTransferModelType \ + ( \ + RanzMarshallBirdCorrection, \ + ThermoCloud, \ + ParcelType \ + ); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/intermediate/parcels/include/makeReactingParcelHeatTransferModels.H b/src/lagrangian/intermediate/parcels/include/makeReactingParcelHeatTransferModels.H index 0bfe7af9a8a6e3222cead0703e94ae700e5ba107..e26f99e25ca2353232faa0e953809adfe341401e 100644 --- a/src/lagrangian/intermediate/parcels/include/makeReactingParcelHeatTransferModels.H +++ b/src/lagrangian/intermediate/parcels/include/makeReactingParcelHeatTransferModels.H @@ -34,6 +34,7 @@ License #include "NoHeatTransfer.H" #include "RanzMarshall.H" +#include "RanzMarshallBirdCorrection.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -74,6 +75,13 @@ License ParcelType, \ ThermoType \ ); \ + makeHeatTransferModelThermoType \ + ( \ + RanzMarshallBirdCorrection, \ + ThermoCloud, \ + ParcelType, \ + ThermoType \ + ); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C index ae4e2a20629b5a917668e0787509f05f0bec7549..8fd449e75648c4702eff30750cbd3cfcd52507e3 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C @@ -66,19 +66,14 @@ const Foam::dictionary& Foam::DragModel<CloudType>::dict() const template<class CloudType> Foam::scalar Foam::DragModel<CloudType>::utc ( - const vector& Ur, + const scalar Re, const scalar d, - const scalar rhoc, const scalar mu ) const { - const scalar magUr = mag(Ur); - - const scalar Re = rhoc*magUr*d/(mu + ROOTVSMALL); - const scalar Cd = this->Cd(Re); - return Cd*rhoc*magUr/8.0; + return Cd*Re/d*mu/8.0; } diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H index 4b4d6c4dd83b46efae005017e1759445e3705326..e0c60b526e584bb0ab28ff58dba0fe1bc7c4edb6 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.H @@ -122,13 +122,7 @@ public: //- Return momentum transfer coefficient // Drag force per unit particle surface area = utc(U - Up) - scalar utc - ( - const vector& Ur, - const scalar d, - const scalar rhoc, - const scalar mu - ) const; + scalar utc(const scalar Re, const scalar d, const scalar mu) const; }; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C index 324e4f80bc8f279af55a0da190caab3b796f92fc..ae1ee890744884cfc7713b31b38bc4167a755137 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.C @@ -38,15 +38,14 @@ Foam::scalarField Foam::LiquidEvaporation<CloudType>::calcXc { scalarField Xc(this->owner().mcCarrierThermo().Y().size()); - scalar Winv = 0.0; forAll(Xc, i) { - scalar Y = this->owner().mcCarrierThermo().Y()[i][cellI]; - Winv += Y/this->owner().mcCarrierThermo().speciesData()[i].W(); - Xc[i] = Y/this->owner().mcCarrierThermo().speciesData()[i].W(); + Xc[i] = + this->owner().mcCarrierThermo().Y()[i][cellI] + /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 label cellI, + const scalar Re, const scalar d, + const scalar nu, const scalar T, + const scalar Ts, const scalar pc, - const scalar Tc, - const scalar nuc, - const vector& Ur, scalarField& dMassPC ) const { @@ -151,29 +150,25 @@ void Foam::LiquidEvaporation<CloudType>::calculate // droplet surface area 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 forAll(activeLiquids_, i) { label gid = liqToCarrierMap_[i]; label lid = liqToLiqMap_[i]; - // vapour diffusivity at film temperature and cell pressure [m2/s] - scalar Dab = liquids_->properties()[lid].D(pc, Tf); + // vapour diffusivity [m2/s] + scalar Dab = liquids_->properties()[lid].D(pc, Ts); - // saturation pressure for species i at film temperature and cell - // pressure [pa] - carrier phase pressure assumed equal to the liquid - // vapour pressure close to the surface - // - limited to pc if pSat > pc - scalar pSat = min(liquids_->properties()[lid].pv(pc, Tf), pc); + // Saturation pressure for species i [pa] + // - carrier phase pressure assumed equal to the liquid vapour pressure + // close to the surface + // NOTE: if pSat > pc then particle is superheated + // 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 - scalar Sc = nuc/(Dab + ROOTVSMALL); + scalar Sc = nu/(Dab + ROOTVSMALL); // Sherwood number scalar Sh = this->Sh(Re, Sc); @@ -181,11 +176,11 @@ void Foam::LiquidEvaporation<CloudType>::calculate // mass transfer coefficient [m/s] scalar kc = Sh*Dab/(d + ROOTVSMALL); - // vapour concentration at droplet surface at film temperature [kmol/m3] - scalar Cs = pSat/(specie::RR*Tf); + // vapour concentration at droplet surface [kmol/m3] at film temperature + scalar Cs = pSat/(specie::RR*Ts); - // vapour concentration in bulk gas at film temperature [kmol/m3] - scalar Cinf = Xc[gid]*pc/(specie::RR*Tf); + // vapour concentration in bulk gas [kmol/m3] at film temperature + scalar Cinf = Xc[gid]*pc/(specie::RR*Ts); // molar flux of vapour [kmol/m2/s] scalar Ni = max(kc*(Cs - Cinf), 0.0); diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H index 6f0bf06c4b6387202d42aa66ae90988a5bf0c41e..2426f374c8bf808ea53a7604f26086f98f664b63 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/LiquidEvaporation/LiquidEvaporation.H @@ -106,12 +106,12 @@ public: ( const scalar dt, const label cellI, + const scalar Re, const scalar d, + const scalar nu, const scalar T, + const scalar Ts, const scalar pc, - const scalar Tc, - const scalar nuc, - const vector& Ur, scalarField& dMassPC ) const; }; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C index 32a0c449eaed93fe6666ec5d5d0d4520a54dcc68..f6b51d6b9abe5004d4c928776c39a7fd36a83da2 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C @@ -65,7 +65,7 @@ void Foam::NoPhaseChange<CloudType>::calculate const scalar, const scalar, const scalar, - const vector&, + const scalar, scalarField& ) const { diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H index 3b6effa40292cbf645fb3ad174941b5ed165d25a..95fb6201ae2fb1d8934806228ac86b00cce2c0af 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H @@ -74,12 +74,12 @@ public: ( const scalar dt, const label cellI, + const scalar Re, const scalar d, + const scalar nu, const scalar T, + const scalar Ts, const scalar pc, - const scalar Tc, - const scalar nuc, - const vector& Ur, scalarField& dMassPC ) const; }; diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H index 7445ea6264ca0d8d31dd69d9769d0ad109338701..e19856a0648c83c7cf70386ad7e3c60f0fd01f4d 100644 --- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H +++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H @@ -140,12 +140,12 @@ public: ( const scalar dt, const label cellI, + const scalar Re, const scalar d, + const scalar nu, const scalar T, + const scalar Ts, const scalar pc, - const scalar Tc, - const scalar nuc, - const vector& Ur, scalarField& dMassPC ) const = 0; }; diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C index 53eecf01f92c3452f6abd714291d02f765c644bf..c6fb74f00d8e00ad01d5c12a2a0893a06a1916d3 100644 --- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C +++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.C @@ -70,7 +70,7 @@ Foam::scalar Foam::NoSurfaceReaction<CloudType>::calculate const scalarField&, const scalarField&, const scalarField&, - const scalarField&, + const scalar, scalarField&, scalarField&, scalarField&, diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H index d3c99ebd5dad8546cda80b8469a8a0bdab536ee3..da002eaf1f276ccf6e9fdf75c5e007726b659c04 100644 --- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H +++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/NoSurfaceReaction/NoSurfaceReaction.H @@ -88,7 +88,7 @@ public: const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H index f876563fec613eadc020828d1ab89e9cea0bcaf9..f22cc2acac452c3c68900ceda3b76ba1c0bd3b81 100644 --- a/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H +++ b/src/lagrangian/intermediate/submodels/ReactingMultiphase/SurfaceReactionModel/SurfaceReactionModel/SurfaceReactionModel.H @@ -146,7 +146,7 @@ public: const scalarField& YLiquid, const scalarField& YSolid, const scalarField& YMixture, - const scalarField& dMassVolatile, + const scalar N, scalarField& dMassGas, scalarField& dMassLiquid, scalarField& dMassSolid, diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C index 37b5276269d3f01e9563f6f4b087c13afc63647a..3db839ea15a41d3f56c13500b0e30227ab70c60e 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.C @@ -82,57 +82,21 @@ const Foam::dictionary& Foam::HeatTransferModel<CloudType>::coeffDict() const template<class CloudType> -Foam::scalar Foam::HeatTransferModel<CloudType>::h +Foam::scalar Foam::HeatTransferModel<CloudType>::htc ( const scalar dp, - const vector& Ur, - const scalar rhoc, - const scalar rhop, - const scalar cpc, - const scalar cpp, - const scalar muc + const scalar Re, + const scalar Pr, + const scalar kappa, + const scalar NCpW ) 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; - 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" diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H index baf61f2395e973377c975c5f21b4c8f5c6b313fd..44cf7c392890f29e8f9b5c61273217450d8f149f 100644 --- a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/HeatTransferModel/HeatTransferModel.H @@ -138,27 +138,13 @@ public: virtual scalar Pr() const = 0; //- Return heat transfer coefficient - virtual scalar h + virtual scalar htc ( const scalar dp, - const vector& Ur, - const scalar rhoc, - const scalar rhop, - const scalar cpc, - 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 scalar Re, + const scalar Pr, + const scalar kappa, + const scalar NCpW ) const; }; diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshallBirdCorrection/RanzMarshallBirdCorrection.C b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshallBirdCorrection/RanzMarshallBirdCorrection.C new file mode 100644 index 0000000000000000000000000000000000000000..9ea771fcc1d5e538aa0858be6384de34b020b715 --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshallBirdCorrection/RanzMarshallBirdCorrection.C @@ -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; +} + + +// ************************************************************************* // diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshallBirdCorrection/RanzMarshallBirdCorrection.H b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshallBirdCorrection/RanzMarshallBirdCorrection.H new file mode 100644 index 0000000000000000000000000000000000000000..e8efca9f587441b9dc7bcc6b7e0ee92b3a9c48da --- /dev/null +++ b/src/lagrangian/intermediate/submodels/Thermodynamic/HeatTransferModel/RanzMarshallBirdCorrection/RanzMarshallBirdCorrection.H @@ -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 + +// ************************************************************************* //