ENH: Updated cloud source term computations

This commit is contained in:
andy
2011-05-06 12:29:43 +01:00
parent 241d0946f5
commit 2ac008348b
6 changed files with 188 additions and 289 deletions

View File

@ -104,13 +104,10 @@ void Foam::KinematicParcel<ParcelType>::calc
// Define local properties at beginning of time step // Define local properties at beginning of time step
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const scalar np0 = nParticle_; const scalar np0 = nParticle_;
const scalar d0 = d_;
const vector U0 = U_;
const scalar rho0 = rho_;
const scalar mass0 = mass(); const scalar mass0 = mass();
// Reynolds number // Reynolds number
const scalar Re = this->Re(U0, d0, rhoc_, muc_); const scalar Re = this->Re(U_, d_, rhoc_, muc_);
// Sources // Sources
@ -119,6 +116,9 @@ void Foam::KinematicParcel<ParcelType>::calc
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
// Linearised momentum source coefficient
scalar Spu = 0.0;
// Momentum transfer from the particle to the carrier phase // Momentum transfer from the particle to the carrier phase
vector dUTrans = vector::zero; vector dUTrans = vector::zero;
@ -127,23 +127,7 @@ void Foam::KinematicParcel<ParcelType>::calc
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
scalar Spu = 0.0; this->U_ = calcVelocity(td, dt, cellI, Re, muc_, mass0, Su, dUTrans, Spu);
vector U1 =
calcVelocity
(
td,
dt,
cellI,
Re,
muc_,
d0,
U0,
rho0,
mass0,
Su,
dUTrans,
Spu
);
// Accumulate carrier phase source terms // Accumulate carrier phase source terms
@ -156,11 +140,6 @@ void Foam::KinematicParcel<ParcelType>::calc
// Update momentum transfer coefficient // Update momentum transfer coefficient
td.cloud().UCoeff()[cellI] += np0*Spu; td.cloud().UCoeff()[cellI] += np0*Spu;
} }
// Set new particle properties
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
U_ = U1;
} }
@ -173,9 +152,6 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
const label cellI, const label cellI,
const scalar Re, const scalar Re,
const scalar mu, const scalar mu,
const scalar d,
const vector& U,
const scalar rho,
const scalar mass, const scalar mass,
const vector& Su, const vector& Su,
vector& dUTrans, vector& dUTrans,
@ -205,7 +181,7 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity
Spu = dt*Feff.Sp(); Spu = dt*Feff.Sp();
IntegrationScheme<vector>::integrationResult Ures = IntegrationScheme<vector>::integrationResult Ures =
td.cloud().UIntegrator().integrate(U, dt, abp, bp); td.cloud().UIntegrator().integrate(U_, dt, abp, bp);
vector Unew = Ures.value(); vector Unew = Ures.value();

View File

@ -297,9 +297,6 @@ protected:
const label cellI, // owner cell const label cellI, // owner cell
const scalar Re, // Reynolds number const scalar Re, // Reynolds number
const scalar mu, // local carrier viscosity const scalar mu, // local carrier viscosity
const scalar d, // diameter
const vector& U, // velocity
const scalar rho, // density
const scalar mass, // mass const scalar mass, // mass
const vector& Su, // explicit particle momentum source const vector& Su, // explicit particle momentum source
vector& dUTrans, // momentum transfer to carrier vector& dUTrans, // momentum transfer to carrier

View File

@ -172,12 +172,11 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
// Define local properties at beginning of timestep // Define local properties at beginning of timestep
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const scalar np0 = this->nParticle_; const scalar np0 = this->nParticle_;
const scalar d0 = this->d_; const scalar d0 = this->d_;
const vector& U0 = this->U_; const vector& U0 = this->U_;
const scalar rho0 = this->rho_;
const scalar T0 = this->T_; const scalar T0 = this->T_;
const scalar Cp0 = this->Cp_;
const scalar mass0 = this->mass(); const scalar mass0 = this->mass();
const scalar pc = this->pc_; const scalar pc = this->pc_;
@ -189,11 +188,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
// Calc surface values // Calc surface values
// ~~~~~~~~~~~~~~~~~~~
scalar Ts, rhos, mus, Prs, kappas; scalar Ts, rhos, mus, Prs, kappas;
this->calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Prs, kappas); this->calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Prs, kappas);
// Reynolds number
scalar Res = this->Re(U0, d0, rhos, mus); scalar Res = this->Re(U0, d0, rhos, mus);
@ -203,16 +199,25 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
// Linearised momentum source coefficient
scalar Spu = 0.0;
// Momentum transfer from the particle to the carrier phase // Momentum transfer from the particle to the carrier phase
vector dUTrans = vector::zero; vector dUTrans = vector::zero;
// Explicit enthalpy source for particle // Explicit enthalpy source for particle
scalar Sh = 0.0; scalar Sh = 0.0;
// Linearised enthalpy source coefficient
scalar Sph = 0.0;
// 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;
// 1. Compute models that contribute to mass transfer - U, T held constant
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Phase change in liquid phase // Phase change in liquid phase
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -310,28 +315,78 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
); );
// Correct surface values due to emitted species // 2. Update the parcel properties due to change in mass
this->correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Res = this->Re(U0, d0, rhos, mus);
// Update component mass fractions
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
scalarField dMassGas(dMassDV + dMassSRGas); scalarField dMassGas(dMassDV + dMassSRGas);
scalarField dMassLiquid(dMassPC + dMassSRLiquid); scalarField dMassLiquid(dMassPC + dMassSRLiquid);
scalarField dMassSolid(dMassSRSolid); scalarField dMassSolid(dMassSRSolid);
scalar mass1 = scalar mass1 =
updateMassFractions(mass0, dMassGas, dMassLiquid, dMassSolid); updateMassFractions(mass0, dMassGas, dMassLiquid, dMassSolid);
this->Cp_ = CpEff(td, pc, T0, idG, idL, idS);
// Update particle density or diameter
if (td.cloud().constProps().constantVolume())
{
this->rho_ = mass1/this->volume();
}
else
{
this->d_ = cbrt(mass1/this->rho_*6.0/pi);
}
// Remove the particle when mass falls below minimum threshold
if (np0*mass1 < td.cloud().constProps().minParticleMass())
{
td.keepParticle = false;
if (td.cloud().solution().coupled())
{
scalar dm = np0*mass1;
// Absorb parcel into carrier phase
forAll(YGas_, i)
{
label gid = composition.localToGlobalCarrierId(GAS, i);
td.cloud().rhoTrans(gid)[cellI] += dm*YMix[GAS]*YGas_[i];
}
forAll(YLiquid_, i)
{
label gid = composition.localToGlobalCarrierId(LIQ, i);
td.cloud().rhoTrans(gid)[cellI] += dm*YMix[LIQ]*YLiquid_[i];
}
/*
// No mapping between solid components and carrier phase
forAll(YSolid_, i)
{
label gid = composition.localToGlobalCarrierId(SLD, i);
td.cloud().rhoTrans(gid)[cellI] += dm*YMix[SLD]*YSolid_[i];
}
*/
td.cloud().UTrans()[cellI] += dm*U0;
td.cloud().hsTrans()[cellI] += dm*HsEff(td, pc, T0, idG, idL, idS);
td.cloud().addToMassPhaseChange(dm);
}
return;
}
// Correct surface values due to emitted species
this->correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas);
Res = this->Re(U0, this->d_, rhos, mus);
// 3. Compute heat- and momentum transfers
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Heat transfer // Heat transfer
// ~~~~~~~~~~~~~ // ~~~~~~~~~~~~~
// Calculate new particle temperature // Calculate new particle temperature
scalar Sph = 0.0; this->T_ =
scalar T1 =
this->calcHeatTransfer this->calcHeatTransfer
( (
td, td,
@ -340,10 +395,6 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
Res, Res,
Prs, Prs,
kappas, kappas,
d0,
rho0,
T0,
Cp0,
NCpW, NCpW,
Sh, Sh,
dhsTrans, dhsTrans,
@ -351,35 +402,23 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
); );
this->Cp_ = CpEff(td, pc, this->T_, idG, idL, idS);
// Motion // Motion
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
scalar Spu = 0; this->U_ =
vector U1 = this->calcVelocity(td, dt, cellI, Res, mus, mass1, Su, dUTrans, Spu);
this->calcVelocity
(
td,
dt,
cellI,
Res,
mus,
d0,
U0,
rho0,
mass0,
Su,
dUTrans,
Spu
);
// Accumulate carrier phase source terms // 4. Accumulate carrier phase source terms
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (td.cloud().solution().coupled()) if (td.cloud().solution().coupled())
{ {
// Transfer mass lost from particle to carrier mass source // Transfer mass lost to carrier mass, momentum and enthalpy sources
forAll(YGas_, i) forAll(YGas_, i)
{ {
scalar dm = np0*dMassGas[i]; scalar dm = np0*dMassGas[i];
@ -421,76 +460,12 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
// Update momentum transfer // Update momentum transfer
td.cloud().UTrans()[cellI] += np0*dUTrans; td.cloud().UTrans()[cellI] += np0*dUTrans;
// Update momentum transfer coefficient
td.cloud().UCoeff()[cellI] += np0*Spu; td.cloud().UCoeff()[cellI] += np0*Spu;
// Update sensible enthalpy transfer // Update sensible enthalpy transfer
td.cloud().hsTrans()[cellI] += np0*dhsTrans; td.cloud().hsTrans()[cellI] += np0*dhsTrans;
// Update sensible enthalpy coefficient
td.cloud().hsCoeff()[cellI] += np0*Sph; td.cloud().hsCoeff()[cellI] += np0*Sph;
} }
// Remove the particle when mass falls below minimum threshold
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (np0*mass1 < td.cloud().constProps().minParticleMass())
{
td.keepParticle = false;
if (td.cloud().solution().coupled())
{
scalar dm = np0*mass1;
// Absorb parcel into carrier phase
forAll(YGas_, i)
{
label gid = composition.localToGlobalCarrierId(GAS, i);
td.cloud().rhoTrans(gid)[cellI] += dm*YMix[GAS]*YGas_[i];
}
forAll(YLiquid_, i)
{
label gid = composition.localToGlobalCarrierId(LIQ, i);
td.cloud().rhoTrans(gid)[cellI] += dm*YMix[LIQ]*YLiquid_[i];
}
/*
// No mapping between solid components and carrier phase
forAll(YSolid_, i)
{
label gid = composition.localToGlobalCarrierId(SLD, i);
td.cloud().rhoTrans(gid)[cellI] += dm*YMix[SLD]*YSolid_[i];
}
*/
td.cloud().UTrans()[cellI] += dm*U1;
td.cloud().hsTrans()[cellI] += dm*HsEff(td, pc, T1, idG, idL, idS);
td.cloud().addToMassPhaseChange(dm);
}
}
// Set new particle properties
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
else
{
this->Cp_ = CpEff(td, pc, T1, idG, idL, idS);
this->T_ = T1;
this->U_ = U1;
// Update particle density or diameter
if (td.cloud().constProps().constantVolume())
{
this->rho_ = mass1/this->volume();
}
else
{
this->d_ = cbrt(mass1/this->rho_*6.0/pi);
}
}
} }

View File

@ -267,21 +267,17 @@ void Foam::ReactingParcel<ParcelType>::calc
// Define local properties at beginning of time step // Define local properties at beginning of time step
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const scalar np0 = this->nParticle_; const scalar np0 = this->nParticle_;
const scalar d0 = this->d_; const scalar d0 = this->d_;
const vector& U0 = this->U_; const vector& U0 = this->U_;
const scalar rho0 = this->rho_;
const scalar T0 = this->T_; const scalar T0 = this->T_;
const scalar Cp0 = this->Cp_;
const scalar mass0 = this->mass(); const scalar mass0 = this->mass();
// Calc surface values // Calc surface values
// ~~~~~~~~~~~~~~~~~~~
scalar Ts, rhos, mus, Prs, kappas; scalar Ts, rhos, mus, Prs, kappas;
this->calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Prs, kappas); this->calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Prs, kappas);
// Reynolds number
scalar Res = this->Re(U0, d0, rhos, mus); scalar Res = this->Re(U0, d0, rhos, mus);
@ -291,16 +287,25 @@ void Foam::ReactingParcel<ParcelType>::calc
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
// Linearised momentum source coefficient
scalar Spu = 0.0;
// Momentum transfer from the particle to the carrier phase // Momentum transfer from the particle to the carrier phase
vector dUTrans = vector::zero; vector dUTrans = vector::zero;
// Explicit enthalpy source for particle // Explicit enthalpy source for particle
scalar Sh = 0.0; scalar Sh = 0.0;
// Linearised enthalpy source coefficient
scalar Sph = 0.0;
// 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;
// 1. Compute models that contribute to mass transfer - U, T held constant
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Phase change // Phase change
// ~~~~~~~~~~~~ // ~~~~~~~~~~~~
@ -338,96 +343,26 @@ void Foam::ReactingParcel<ParcelType>::calc
Cs Cs
); );
// Correct surface values due to emitted species
correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas);
Res = this->Re(U0, d0, rhos, mus);
// Update particle component mass and mass fractions // 2. Update the parcel properties due to change in mass
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
scalarField dMass(dMassPC); scalarField dMass(dMassPC);
scalar mass1 = updateMassFraction(mass0, dMass, Y_); scalar mass1 = updateMassFraction(mass0, dMass, Y_);
this->Cp_ = composition.Cp(0, Y_, pc_, T0);
// Heat transfer // Update particle density or diameter
// ~~~~~~~~~~~~~ if (td.cloud().constProps().constantVolume())
// Calculate new particle temperature
scalar Sph = 0.0;
scalar T1 =
this->calcHeatTransfer
(
td,
dt,
cellI,
Res,
Prs,
kappas,
d0,
rho0,
T0,
Cp0,
NCpW,
Sh,
dhsTrans,
Sph
);
// Motion
// ~~~~~~
// Calculate new particle velocity
scalar Spu = 0.0;
vector U1 =
this->calcVelocity
(
td,
dt,
cellI,
Res,
mus,
d0,
U0,
rho0,
mass0,
Su,
dUTrans,
Spu
);
// Accumulate carrier phase source terms
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (td.cloud().solution().coupled())
{ {
// Transfer mass lost to carrier mass and enthalpy sources this->rho_ = mass1/this->volume();
forAll(dMass, i) }
{ else
scalar dm = np0*dMass[i]; {
label gid = composition.localToGlobalCarrierId(0, i); this->d_ = cbrt(mass1/this->rho_*6.0/pi);
scalar hs = composition.carrier().Hs(gid, T0);
td.cloud().rhoTrans(gid)[cellI] += dm;
td.cloud().UTrans()[cellI] += dm*U0;
td.cloud().hsTrans()[cellI] += dm*hs;
}
// Update momentum transfer
td.cloud().UTrans()[cellI] += np0*dUTrans;
// Update momentum transfer coefficient
td.cloud().UCoeff()[cellI] += np0*Spu;
// Update sensible enthalpy transfer
td.cloud().hsTrans()[cellI] += np0*dhsTrans;
// Update sensible enthalpy coefficient
td.cloud().hsCoeff()[cellI] += np0*Sph;
} }
// Remove the particle when mass falls below minimum threshold // Remove the particle when mass falls below minimum threshold
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (np0*mass1 < td.cloud().constProps().minParticleMass()) if (np0*mass1 < td.cloud().constProps().minParticleMass())
{ {
td.keepParticle = false; td.keepParticle = false;
@ -441,36 +376,81 @@ void Foam::ReactingParcel<ParcelType>::calc
{ {
scalar dmi = dm*Y_[i]; scalar dmi = dm*Y_[i];
label gid = composition.localToGlobalCarrierId(0, i); label gid = composition.localToGlobalCarrierId(0, i);
scalar hs = composition.carrier().Hs(gid, T1); scalar hs = composition.carrier().Hs(gid, T0);
td.cloud().rhoTrans(gid)[cellI] += dmi; td.cloud().rhoTrans(gid)[cellI] += dmi;
td.cloud().hsTrans()[cellI] += dmi*hs; td.cloud().hsTrans()[cellI] += dmi*hs;
} }
td.cloud().UTrans()[cellI] += dm*U1; td.cloud().UTrans()[cellI] += dm*U0;
td.cloud().addToMassPhaseChange(dm); td.cloud().addToMassPhaseChange(dm);
} }
return;
} }
// Correct surface values due to emitted species
correctSurfaceValues(td, cellI, Ts, Cs, rhos, mus, Prs, kappas);
Res = this->Re(U0, this->d_, rhos, mus);
// Set new particle properties
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
else // 3. Compute heat- and momentum transfers
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Heat transfer
// ~~~~~~~~~~~~~
// Calculate new particle temperature
this->T_ =
this->calcHeatTransfer
(
td,
dt,
cellI,
Res,
Prs,
kappas,
NCpW,
Sh,
dhsTrans,
Sph
);
this->Cp_ = composition.Cp(0, Y_, pc_, T0);
// Motion
// ~~~~~~
// Calculate new particle velocity
this->U_ =
this->calcVelocity(td, dt, cellI, Res, mus, mass1, Su, dUTrans, Spu);
// 4. Accumulate carrier phase source terms
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (td.cloud().solution().coupled())
{ {
this->Cp_ = composition.Cp(0, Y_, pc_, T1); // Transfer mass lost to carrier mass, momentum and enthalpy sources
this->T_ = T1; forAll(dMass, i)
this->U_ = U1; {
scalar dm = np0*dMass[i];
label gid = composition.localToGlobalCarrierId(0, i);
scalar hs = composition.carrier().Hs(gid, T0);
// Update particle density or diameter td.cloud().rhoTrans(gid)[cellI] += dm;
if (td.cloud().constProps().constantVolume()) td.cloud().UTrans()[cellI] += dm*U0;
{ td.cloud().hsTrans()[cellI] += dm*hs;
this->rho_ = mass1/this->volume();
}
else
{
this->d_ = cbrt(mass1/this->rho_*6.0/pi);
} }
// Update momentum transfer
td.cloud().UTrans()[cellI] += np0*dUTrans;
td.cloud().UCoeff()[cellI] += np0*Spu;
// Update sensible enthalpy transfer
td.cloud().hsTrans()[cellI] += np0*dhsTrans;
td.cloud().hsCoeff()[cellI] += np0*Sph;
} }
} }

View File

@ -172,21 +172,16 @@ void Foam::ThermoParcel<ParcelType>::calc
// Define local properties at beginning of time step // Define local properties at beginning of time step
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
const scalar np0 = this->nParticle_; const scalar np0 = this->nParticle_;
const scalar d0 = this->d_;
const vector U0 = this->U_;
const scalar rho0 = this->rho_;
const scalar T0 = this->T_;
const scalar Cp0 = this->Cp_;
const scalar mass0 = this->mass(); const scalar mass0 = this->mass();
// Calc surface values // Calc surface values
// ~~~~~~~~~~~~~~~~~~~ // ~~~~~~~~~~~~~~~~~~~
scalar Ts, rhos, mus, Pr, kappas; scalar Ts, rhos, mus, Pr, kappas;
calcSurfaceValues(td, cellI, T0, Ts, rhos, mus, Pr, kappas); calcSurfaceValues(td, cellI, this->T_, Ts, rhos, mus, Pr, kappas);
// Reynolds number // Reynolds number
scalar Re = this->Re(U0, d0, rhos, mus); scalar Re = this->Re(this->U_, this->d_, rhos, mus);
// Sources // Sources
@ -195,12 +190,18 @@ void Foam::ThermoParcel<ParcelType>::calc
// Explicit momentum source for particle // Explicit momentum source for particle
vector Su = vector::zero; vector Su = vector::zero;
// Linearised momentum source coefficient
scalar Spu = 0.0;
// Momentum transfer from the particle to the carrier phase // Momentum transfer from the particle to the carrier phase
vector dUTrans = vector::zero; vector dUTrans = vector::zero;
// Explicit enthalpy source for particle // Explicit enthalpy source for particle
scalar Sh = 0.0; scalar Sh = 0.0;
// Linearised enthalpy source coefficient
scalar Sph = 0.0;
// 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;
@ -212,8 +213,7 @@ void Foam::ThermoParcel<ParcelType>::calc
scalar NCpW = 0.0; scalar NCpW = 0.0;
// Calculate new particle temperature // Calculate new particle temperature
scalar Sph = 0.0; this->T_ =
scalar T1 =
this->calcHeatTransfer this->calcHeatTransfer
( (
td, td,
@ -222,10 +222,6 @@ void Foam::ThermoParcel<ParcelType>::calc
Re, Re,
Pr, Pr,
kappas, kappas,
d0,
rho0,
T0,
Cp0,
NCpW, NCpW,
Sh, Sh,
dhsTrans, dhsTrans,
@ -237,23 +233,8 @@ void Foam::ThermoParcel<ParcelType>::calc
// ~~~~~~ // ~~~~~~
// Calculate new particle velocity // Calculate new particle velocity
scalar Spu = 0.0; this->U_ =
vector U1 = this->calcVelocity(td, dt, cellI, Re, mus, mass0, Su, dUTrans, Spu);
this->calcVelocity
(
td,
dt,
cellI,
Re,
mus,
d0,
U0,
rho0,
mass0,
Su,
dUTrans,
Spu
);
// Accumulate carrier phase source terms // Accumulate carrier phase source terms
@ -272,11 +253,6 @@ void Foam::ThermoParcel<ParcelType>::calc
// Update sensible enthalpy coefficient // Update sensible enthalpy coefficient
td.cloud().hsCoeff()[cellI] += np0*Sph; td.cloud().hsCoeff()[cellI] += np0*Sph;
} }
// Set new particle properties
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
this->U_ = U1;
T_ = T1;
} }
@ -290,10 +266,6 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
const scalar Re, const scalar Re,
const scalar Pr, const scalar Pr,
const scalar kappa, const scalar kappa,
const scalar d,
const scalar rho,
const scalar T,
const scalar Cp,
const scalar NCpW, const scalar NCpW,
const scalar Sh, const scalar Sh,
scalar& dhsTrans, scalar& dhsTrans,
@ -302,9 +274,12 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
{ {
if (!td.cloud().heatTransfer().active()) if (!td.cloud().heatTransfer().active())
{ {
return T; return T_;
} }
const scalar d = this->d();
const scalar rho = this->rho();
// Calc heat transfer coefficient // Calc heat transfer coefficient
scalar htc = td.cloud().heatTransfer().htc(d, Re, Pr, kappa, NCpW); scalar htc = td.cloud().heatTransfer().htc(d, Re, Pr, kappa, NCpW);
@ -313,7 +288,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
return return
max max
( (
T + dt*Sh/(this->volume(d)*rho*Cp), T_ + dt*Sh/(this->volume(d)*rho*Cp_),
td.cloud().constProps().TMin() td.cloud().constProps().TMin()
); );
} }
@ -322,7 +297,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
const scalar As = this->areaS(d); const scalar As = this->areaS(d);
scalar ap = Tc_ + Sh/As/htc; scalar ap = Tc_ + Sh/As/htc;
scalar bp = 6.0*(Sh/As + htc*(Tc_ - T)); scalar bp = 6.0*(Sh/As + htc*(Tc_ - T_));
if (td.cloud().radiation()) if (td.cloud().radiation())
{ {
tetIndices tetIs = this->currentTetIndices(); tetIndices tetIs = this->currentTetIndices();
@ -330,20 +305,20 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer
const scalar sigma = physicoChemical::sigma.value(); const scalar sigma = physicoChemical::sigma.value();
const scalar epsilon = td.cloud().constProps().epsilon0(); const scalar epsilon = td.cloud().constProps().epsilon0();
ap = (ap + epsilon*Gc/(4.0*htc))/(1.0 + epsilon*sigma*pow3(T)/htc); ap = (ap + epsilon*Gc/(4.0*htc))/(1.0 + epsilon*sigma*pow3(T_)/htc);
bp += 6.0*(epsilon*(Gc/4.0 - sigma*pow4(T))); bp += 6.0*(epsilon*(Gc/4.0 - sigma*pow4(T_)));
} }
bp /= rho*d*Cp*(ap - T) + ROOTVSMALL; bp /= rho*d*Cp_*(ap - T_) + ROOTVSMALL;
// Integrate to find the new parcel temperature // Integrate to find the new parcel temperature
IntegrationScheme<scalar>::integrationResult Tres = IntegrationScheme<scalar>::integrationResult Tres =
td.cloud().TIntegrator().integrate(T, dt, ap*bp, bp); td.cloud().TIntegrator().integrate(T_, dt, ap*bp, bp);
scalar Tnew = max(Tres.value(), td.cloud().constProps().TMin()); scalar Tnew = max(Tres.value(), td.cloud().constProps().TMin());
Sph = dt*htc*As; Sph = dt*htc*As;
dhsTrans += Sph*(0.5*(T + Tnew) - Tc_); dhsTrans += Sph*(0.5*(T_ + Tnew) - Tc_);
return Tnew; return Tnew;
} }

View File

@ -236,10 +236,6 @@ protected:
const scalar Re, // Reynolds number const scalar Re, // Reynolds number
const scalar Pr, // Prandtl number - surface const scalar Pr, // Prandtl number - surface
const scalar kappa, // Thermal conductivity - surface const scalar kappa, // Thermal conductivity - surface
const scalar d, // diameter
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 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