mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
updates for reacting parcels
This commit is contained in:
@ -26,6 +26,18 @@ License
|
|||||||
|
|
||||||
#include "ReactingMultiphaseParcel.H"
|
#include "ReactingMultiphaseParcel.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class ParcelType>
|
||||||
|
const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::GAS(0);
|
||||||
|
|
||||||
|
template<class ParcelType>
|
||||||
|
const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::LIQUID(1);
|
||||||
|
|
||||||
|
template<class ParcelType>
|
||||||
|
const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::SOLID(2);
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
|
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class ParcelType>
|
template<class ParcelType>
|
||||||
@ -34,13 +46,16 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::cpEff
|
|||||||
(
|
(
|
||||||
TrackData& td,
|
TrackData& td,
|
||||||
const scalar p,
|
const scalar p,
|
||||||
const scalar T
|
const scalar T,
|
||||||
|
const label idG,
|
||||||
|
const label idL,
|
||||||
|
const label idS
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
this->Y_[0]*td.cloud().composition().cp(0, YGas_, p, T)
|
this->Y_[GAS]*td.cloud().composition().cp(idG, YGas_, p, T)
|
||||||
+ this->Y_[1]*td.cloud().composition().cp(0, YLiquid_, p, T)
|
+ this->Y_[LIQUID]*td.cloud().composition().cp(idL, YLiquid_, p, T)
|
||||||
+ this->Y_[2]*td.cloud().composition().cp(0, YSolid_, p, T);
|
+ this->Y_[SOLID]*td.cloud().composition().cp(idS, YSolid_, p, T);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -50,13 +65,45 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::HEff
|
|||||||
(
|
(
|
||||||
TrackData& td,
|
TrackData& td,
|
||||||
const scalar p,
|
const scalar p,
|
||||||
const scalar T
|
const scalar T,
|
||||||
|
const label idG,
|
||||||
|
const label idL,
|
||||||
|
const label idS
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
this->Y_[0]*td.cloud().composition().H(0, YGas_, p, T)
|
this->Y_[GAS]*td.cloud().composition().H(idG, YGas_, p, T)
|
||||||
+ this->Y_[1]*td.cloud().composition().H(0, YLiquid_, p, T)
|
+ this->Y_[LIQUID]*td.cloud().composition().H(idL, YLiquid_, p, T)
|
||||||
+ this->Y_[2]*td.cloud().composition().H(0, YSolid_, p, T);
|
+ this->Y_[SOLID]*td.cloud().composition().H(idS, YSolid_, p, T);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class ParcelType>
|
||||||
|
Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::updateMassFractions
|
||||||
|
(
|
||||||
|
const scalar mass0,
|
||||||
|
const scalarField& dMassGas,
|
||||||
|
const scalarField& dMassLiquid,
|
||||||
|
const scalarField& dMassSolid
|
||||||
|
)
|
||||||
|
{
|
||||||
|
scalarList& YMix = this->Y_;
|
||||||
|
|
||||||
|
scalar dMassGasTot = sum(dMassGas);
|
||||||
|
scalar dMassLiquidTot = sum(dMassLiquid);
|
||||||
|
scalar dMassSolidTot = sum(dMassSolid);
|
||||||
|
|
||||||
|
this->updateMassFraction(mass0*YMix[GAS], dMassGas, YGas_);
|
||||||
|
this->updateMassFraction(mass0*YMix[LIQUID], dMassLiquid, YLiquid_);
|
||||||
|
this->updateMassFraction(mass0*YMix[SOLID], dMassSolid, YSolid_);
|
||||||
|
|
||||||
|
scalar massNew = mass0 - (dMassGasTot + dMassLiquidTot + dMassSolidTot);
|
||||||
|
|
||||||
|
YMix[GAS] = (mass0*YMix[GAS] - dMassGas)/massNew;
|
||||||
|
YMix[LIQUID] = (mass0*YMix[LIQUID] - dMassLiquid)/massNew;
|
||||||
|
YMix[SOLID] = 1.0 - YMix[GAS] - YMix[LIQUID];
|
||||||
|
|
||||||
|
return massNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -93,6 +140,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
scalarField& YMix = this->Y_;
|
scalarField& YMix = this->Y_;
|
||||||
const label idG = td.cloud().composition().idGas();
|
const label idG = td.cloud().composition().idGas();
|
||||||
const label idL = td.cloud().composition().idLiquid();
|
const label idL = td.cloud().composition().idLiquid();
|
||||||
|
const label idS = td.cloud().composition().idSolid();
|
||||||
|
|
||||||
|
|
||||||
// Initialise transfer terms
|
// Initialise transfer terms
|
||||||
@ -105,13 +153,16 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
scalar dhTrans = 0.0;
|
scalar dhTrans = 0.0;
|
||||||
|
|
||||||
// Mass transfer due to phase change
|
// Mass transfer due to phase change
|
||||||
scalarList dMassPC(td.cloud().gases().size(), 0.0);
|
scalarField dMassPC(YLiquid_.size(), 0.0);
|
||||||
|
|
||||||
// Mass transfer due to devolatilisation
|
// Mass transfer due to devolatilisation
|
||||||
scalarList dMassDV(td.cloud().gases().size(), 0.0);
|
scalarField dMassDV(YGas_.size(), 0.0);
|
||||||
|
|
||||||
// Change in carrier phase composition due to surface reactions
|
// Change in carrier phase composition due to surface reactions
|
||||||
scalarList dMassSRc(td.cloud().gases().size(), 0.0);
|
scalarField dMassSRGas(YGas_.size(), 0.0);
|
||||||
|
scalarField dMassSRLiquid(YLiquid_.size(), 0.0);
|
||||||
|
scalarField dMassSRSolid(YSolid_.size(), 0.0);
|
||||||
|
scalarField dMassSRc(td.cloud().gases().size(), 0.0);
|
||||||
|
|
||||||
|
|
||||||
// Phase change in liquid phase
|
// Phase change in liquid phase
|
||||||
@ -121,26 +172,33 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
scalar ShPC =
|
scalar ShPC =
|
||||||
calcPhaseChange(td, dt, cellI, T0, idL, YMix[idL], YLiquid_, dMassPC);
|
calcPhaseChange(td, dt, cellI, T0, idL, YMix[idL], YLiquid_, dMassPC);
|
||||||
|
|
||||||
// Update particle component mass fractions
|
|
||||||
this->updateMassFraction(mass0, dMassPC, YLiquid_);
|
|
||||||
|
|
||||||
|
|
||||||
// Devolatilisation
|
// Devolatilisation
|
||||||
// ~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
// Return enthalpy source and calc mass transfer due to devolatilisation
|
// Return enthalpy source and calc mass transfer due to devolatilisation
|
||||||
scalar ShDV = calcDevolatilisation(td, dt, T0, mass0, idG, YMix, dMassDV);
|
scalar ShDV =
|
||||||
|
calcDevolatilisation(td, dt, T0, mass0, idG, YMix, dMassDV);
|
||||||
|
|
||||||
|
|
||||||
// Surface reactions
|
// Surface reactions
|
||||||
// ~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
// Mass transfer of volatile components from particle to carrier phase
|
|
||||||
const scalarList dMassMT = dMassPC + dMassDV;
|
|
||||||
|
|
||||||
// Return enthalpy source and calc mass transfer(s) due to surface reaction
|
// Return enthalpy source and calc mass transfer(s) due to surface reaction
|
||||||
scalar ShSR =
|
scalar ShSR =
|
||||||
calcSurfaceReactions(td, dt, cellI, T0, dMassMT, dMassSRc, dhTrans);
|
calcSurfaceReactions
|
||||||
|
(
|
||||||
|
td,
|
||||||
|
dt,
|
||||||
|
cellI,
|
||||||
|
T0,
|
||||||
|
dMassPC + dMassDV, // total volatiles evolved
|
||||||
|
dMassSRGas,
|
||||||
|
dMassSRLiquid,
|
||||||
|
dMassSRSolid,
|
||||||
|
dMassSRc,
|
||||||
|
dhTrans
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// Heat transfer
|
// Heat transfer
|
||||||
@ -154,12 +212,20 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
scalar T1 = calcHeatTransfer(td, dt, cellI, Sh, htc, dhTrans);
|
scalar T1 = calcHeatTransfer(td, dt, cellI, Sh, htc, dhTrans);
|
||||||
|
|
||||||
|
|
||||||
|
// Update component mass fractions
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
scalarField dMassGas = dMassDV + dMassSRGas;
|
||||||
|
scalarField dMassLiquid = dMassPC + dMassSRLiquid;
|
||||||
|
scalarField dMassSolid = dMassSRSolid;
|
||||||
|
|
||||||
|
scalar mass1 =
|
||||||
|
updateMassFractions(mass0, dMassGas, dMassLiquid, dMassSolid);
|
||||||
|
|
||||||
|
|
||||||
// Motion
|
// Motion
|
||||||
// ~~~~~~
|
// ~~~~~~
|
||||||
|
|
||||||
// Update mass (not to include cMassSR)
|
|
||||||
scalar mass1 = mass0 - sum(dMassPC) - sum(dMassDV);
|
|
||||||
|
|
||||||
// No additional forces
|
// No additional forces
|
||||||
vector Fx = vector::zero;
|
vector Fx = vector::zero;
|
||||||
|
|
||||||
@ -175,10 +241,25 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
if (td.cloud().coupled())
|
if (td.cloud().coupled())
|
||||||
{
|
{
|
||||||
// Transfer mass lost from particle to carrier mass source
|
// Transfer mass lost from particle to carrier mass source
|
||||||
forAll(dMassMT, i)
|
forAll(YGas_, i)
|
||||||
{
|
{
|
||||||
td.cloud().rhoTrans(i)[cellI] +=
|
label id = td.composition().localToGlobalGasId(GAS, i);
|
||||||
np0*(dMassPC[i] + dMassDV[i] + dMassSRc[i]);
|
td.cloud().rhoTrans(id)[cellI] += np0*dMassGas[i];
|
||||||
|
}
|
||||||
|
forAll(YLiquid_, i)
|
||||||
|
{
|
||||||
|
label id = td.composition().localToGlobalGasId(LIQUID, i);
|
||||||
|
td.cloud().rhoTrans(id)[cellI] += np0*dMassLiquid[i];
|
||||||
|
}
|
||||||
|
// No mapping between solid components and carrier phase
|
||||||
|
// forAll(YSolid_, i)
|
||||||
|
// {
|
||||||
|
// label id = td.composition().localToGlobalGasId(SOLID, i);
|
||||||
|
// td.cloud().rhoTrans(id)[cellI] += np0*dMassSolid[i];
|
||||||
|
// }
|
||||||
|
forAll(dMassSRc, i)
|
||||||
|
{
|
||||||
|
td.cloud().rhoTrans(i)[cellI] += np0*dMassSRc[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update momentum transfer
|
// Update momentum transfer
|
||||||
@ -203,13 +284,29 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
{
|
{
|
||||||
td.keepParticle = false;
|
td.keepParticle = false;
|
||||||
|
|
||||||
// Absorb particle(s) into carrier phase
|
if (td.cloud().coupled())
|
||||||
forAll(dMassMT, i)
|
|
||||||
{
|
{
|
||||||
td.cloud().rhoTrans(i)[cellI] += np0*dMassMT[i];
|
// Absorb particle(s) into carrier phase
|
||||||
|
forAll(YGas_, i)
|
||||||
|
{
|
||||||
|
label id = td.composition().localToGlobalGasId(GAS, i);
|
||||||
|
td.cloud().rhoTrans(id)[cellI] += np0*dMassGas[i];
|
||||||
|
}
|
||||||
|
forAll(YLiquid_, i)
|
||||||
|
{
|
||||||
|
label id = td.composition().localToGlobalGasId(LIQUID, i);
|
||||||
|
td.cloud().rhoTrans(id)[cellI] += np0*dMassLiquid[i];
|
||||||
|
}
|
||||||
|
// No mapping between solid components and carrier phase
|
||||||
|
// forAll(YSolid_, i)
|
||||||
|
// {
|
||||||
|
// label id = td.composition().localToGlobalGasId(SOLID, i);
|
||||||
|
// td.cloud().rhoTrans(id)[cellI] += np0*dMassSolid[i];
|
||||||
|
// }
|
||||||
|
|
||||||
|
td.cloud().hTrans()[cellI] += np0*mass1*HEff(td, pc, T1, idG, idL, idS);
|
||||||
|
td.cloud().UTrans()[cellI] += np0*mass1*U1;
|
||||||
}
|
}
|
||||||
td.cloud().hTrans()[cellI] += np0*mass1*HEff(td, pc, T1);
|
|
||||||
td.cloud().UTrans()[cellI] += np0*mass1*U1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -220,7 +317,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc
|
|||||||
{
|
{
|
||||||
this->U_ = U1;
|
this->U_ = U1;
|
||||||
this->T_ = T1;
|
this->T_ = T1;
|
||||||
this->cp_ = cpEff(td, pc, T1);
|
this->cp_ = cpEff(td, pc, T1, idG, idL, idS);
|
||||||
|
|
||||||
// Update particle density or diameter
|
// Update particle density or diameter
|
||||||
if (td.constProps().constantVolume())
|
if (td.constProps().constantVolume())
|
||||||
@ -244,8 +341,8 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
|
|||||||
const scalar T,
|
const scalar T,
|
||||||
const scalar mass,
|
const scalar mass,
|
||||||
const label idVolatile,
|
const label idVolatile,
|
||||||
scalarField& YMixture,
|
const scalarField& YMixture,
|
||||||
scalarList& dMassDV
|
scalarList& dMass
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Check that model is active, and that the parcel temperature is
|
// Check that model is active, and that the parcel temperature is
|
||||||
@ -268,15 +365,10 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
|
|||||||
mass,
|
mass,
|
||||||
T,
|
T,
|
||||||
td.cloud().composition().YMixture0()[idVolatile],
|
td.cloud().composition().YMixture0()[idVolatile],
|
||||||
YMixture[0],
|
YMixture[GAS],
|
||||||
canCombust_
|
canCombust_
|
||||||
);
|
);
|
||||||
|
|
||||||
// Update (total) mass fractions
|
|
||||||
YMixture[0] = (YMixture[0]*mass - dMassTot)/(mass - dMassTot);
|
|
||||||
YMixture[1] = YMixture[1]*mass/(mass - dMassTot);
|
|
||||||
YMixture[2] = 1.0 - YMixture[0] - YMixture[1];
|
|
||||||
|
|
||||||
// Add to cummulative mass transfer
|
// Add to cummulative mass transfer
|
||||||
forAll (YGas_, i)
|
forAll (YGas_, i)
|
||||||
{
|
{
|
||||||
@ -284,7 +376,7 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
|
|||||||
|
|
||||||
// Volatiles mass transfer
|
// Volatiles mass transfer
|
||||||
scalar volatileMass = YGas_[i]*dMassTot;
|
scalar volatileMass = YGas_[i]*dMassTot;
|
||||||
dMassDV[id] += volatileMass;
|
dMass[i] += volatileMass;
|
||||||
}
|
}
|
||||||
|
|
||||||
td.cloud().addToMassDevolatilisation(dMassTot);
|
td.cloud().addToMassDevolatilisation(dMassTot);
|
||||||
@ -301,7 +393,10 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions
|
|||||||
const scalar dt,
|
const scalar dt,
|
||||||
const label cellI,
|
const label cellI,
|
||||||
const scalar T,
|
const scalar T,
|
||||||
const scalarList& dMassMT,
|
const scalarList& dMassVolatile,
|
||||||
|
scalarField& dMassSRGas,
|
||||||
|
scalarField& dMassSRLiquid,
|
||||||
|
scalarField& dMassSRSolid,
|
||||||
scalarList& dMassSRc,
|
scalarList& dMassSRc,
|
||||||
scalar& dhTrans
|
scalar& dhTrans
|
||||||
)
|
)
|
||||||
@ -312,8 +407,7 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update mass transfer(s)
|
// Update surface reactions
|
||||||
// - Also updates Y()'s
|
|
||||||
scalar HReaction = td.cloud().surfaceReaction().calculate
|
scalar HReaction = td.cloud().surfaceReaction().calculate
|
||||||
(
|
(
|
||||||
dt,
|
dt,
|
||||||
@ -324,13 +418,15 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions
|
|||||||
this->pc_,
|
this->pc_,
|
||||||
this->rhoc_,
|
this->rhoc_,
|
||||||
this->mass(),
|
this->mass(),
|
||||||
dMassMT,
|
|
||||||
YGas_,
|
YGas_,
|
||||||
YLiquid_,
|
YLiquid_,
|
||||||
YSolid_,
|
YSolid_,
|
||||||
this->Y_,
|
this->Y_,
|
||||||
dMassSRc,
|
dMassVolatile,
|
||||||
HReaction
|
dMassSRGas,
|
||||||
|
dMassSRLiquid,
|
||||||
|
dMassSRSolid,
|
||||||
|
dMassSRc
|
||||||
);
|
);
|
||||||
|
|
||||||
// Heat of reaction divided between particle and carrier phase by the
|
// Heat of reaction divided between particle and carrier phase by the
|
||||||
|
|||||||
@ -149,17 +149,49 @@ private:
|
|||||||
|
|
||||||
//- Return the mixture effective specific heat capacity
|
//- Return the mixture effective specific heat capacity
|
||||||
template<class TrackData>
|
template<class TrackData>
|
||||||
scalar cpEff(TrackData& td, const scalar p, const scalar T) const;
|
scalar cpEff
|
||||||
|
(
|
||||||
|
TrackData& td,
|
||||||
|
const scalar p,
|
||||||
|
const scalar T,
|
||||||
|
const label idG,
|
||||||
|
const label idL,
|
||||||
|
const label idS
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Return the mixture effective enthalpy
|
//- Return the mixture effective enthalpy
|
||||||
template<class TrackData>
|
template<class TrackData>
|
||||||
scalar HEff(TrackData& td, const scalar p, const scalar T) const;
|
scalar HEff
|
||||||
|
(
|
||||||
|
TrackData& td,
|
||||||
|
const scalar p,
|
||||||
|
const scalar T,
|
||||||
|
const label idG,
|
||||||
|
const label idL,
|
||||||
|
const label idS
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Update the mass fractions (Y, YGas, YLiquid, YSolid)
|
||||||
|
scalar updateMassFractions
|
||||||
|
(
|
||||||
|
const scalar mass0,
|
||||||
|
const scalarField& dMassGas,
|
||||||
|
const scalarField& dMassLiquid,
|
||||||
|
const scalarField& dMassSolid
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
// Protected data
|
// Protected data
|
||||||
|
|
||||||
|
// IDs of phases in parent phase list
|
||||||
|
|
||||||
|
static const label GAS;
|
||||||
|
static const label LIQUID;
|
||||||
|
static const label SOLID;
|
||||||
|
|
||||||
|
|
||||||
// Parcel properties
|
// Parcel properties
|
||||||
|
|
||||||
//- Mass fractions of gases []
|
//- Mass fractions of gases []
|
||||||
@ -187,8 +219,8 @@ protected:
|
|||||||
const scalar T,
|
const scalar T,
|
||||||
const scalar mass,
|
const scalar mass,
|
||||||
const label idVolatile,
|
const label idVolatile,
|
||||||
scalarField& YMixture,
|
const scalarField& YMixture,
|
||||||
scalarList& dMassDV
|
scalarList& dMass
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Calculate surface reactions
|
//- Calculate surface reactions
|
||||||
@ -199,7 +231,10 @@ protected:
|
|||||||
const scalar dt,
|
const scalar dt,
|
||||||
const label cellI,
|
const label cellI,
|
||||||
const scalar T,
|
const scalar T,
|
||||||
const scalarList& dMassMT,
|
const scalarList& dMassVolatile,
|
||||||
|
scalarField& dMassSRGas,
|
||||||
|
scalarField& dMassSRLiquid,
|
||||||
|
scalarField& dMassSRSolid,
|
||||||
scalarList& dMassSRc,
|
scalarList& dMassSRc,
|
||||||
scalar& dhTrans
|
scalar& dhTrans
|
||||||
);
|
);
|
||||||
|
|||||||
@ -69,9 +69,9 @@ Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel
|
|||||||
|
|
||||||
// scale the mass fractions
|
// scale the mass fractions
|
||||||
const scalarList& YMix = this->Y_;
|
const scalarList& YMix = this->Y_;
|
||||||
YGas_ /= YMix[0] + ROOTVSMALL;
|
YGas_ /= YMix[GAS] + ROOTVSMALL;
|
||||||
YLiquid_ /= YMix[1] + ROOTVSMALL;
|
YLiquid_ /= YMix[LIQUID] + ROOTVSMALL;
|
||||||
YSolid_ /= YMix[2] + ROOTVSMALL;
|
YSolid_ /= YMix[SOLID] + ROOTVSMALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check state of Istream
|
// Check state of Istream
|
||||||
@ -134,7 +134,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
|
|||||||
forAllIter(typename Cloud<ParcelType>, c, iter)
|
forAllIter(typename Cloud<ParcelType>, c, iter)
|
||||||
{
|
{
|
||||||
ReactingMultiphaseParcel<ParcelType>& p = iter();
|
ReactingMultiphaseParcel<ParcelType>& p = iter();
|
||||||
p.YGas_[j] = YGas[i++]/(p.Y()[0] + ROOTVSMALL);
|
p.YGas_[j] = YGas[i++]/(p.Y()[GAS] + ROOTVSMALL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Populate YLiquid for each parcel
|
// Populate YLiquid for each parcel
|
||||||
@ -153,7 +153,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
|
|||||||
forAllIter(typename Cloud<ParcelType>, c, iter)
|
forAllIter(typename Cloud<ParcelType>, c, iter)
|
||||||
{
|
{
|
||||||
ReactingMultiphaseParcel<ParcelType>& p = iter();
|
ReactingMultiphaseParcel<ParcelType>& p = iter();
|
||||||
p.YLiquid_[j] = YLiquid[i++]/(p.Y()[1] + ROOTVSMALL);
|
p.YLiquid_[j] = YLiquid[i++]/(p.Y()[LIQUID] + ROOTVSMALL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Populate YSolid for each parcel
|
// Populate YSolid for each parcel
|
||||||
@ -172,7 +172,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields
|
|||||||
forAllIter(typename Cloud<ParcelType>, c, iter)
|
forAllIter(typename Cloud<ParcelType>, c, iter)
|
||||||
{
|
{
|
||||||
ReactingMultiphaseParcel<ParcelType>& p = iter();
|
ReactingMultiphaseParcel<ParcelType>& p = iter();
|
||||||
p.YSolid_[j] = YSolid[i++]/(p.Y()[2] + ROOTVSMALL);
|
p.YSolid_[j] = YSolid[i++]/(p.Y()[SOLID] + ROOTVSMALL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -211,7 +211,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
|
|||||||
forAllConstIter(typename Cloud<ParcelType>, c, iter)
|
forAllConstIter(typename Cloud<ParcelType>, c, iter)
|
||||||
{
|
{
|
||||||
const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
|
const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
|
||||||
YGas[i++] = p0.YGas()[j]*p0.Y()[0];
|
YGas[i++] = p0.YGas()[j]*p0.Y()[GAS];
|
||||||
}
|
}
|
||||||
|
|
||||||
YGas.write();
|
YGas.write();
|
||||||
@ -235,7 +235,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
|
|||||||
forAllConstIter(typename Cloud<ParcelType>, c, iter)
|
forAllConstIter(typename Cloud<ParcelType>, c, iter)
|
||||||
{
|
{
|
||||||
const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
|
const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
|
||||||
YLiquid[i++] = p0.YLiquid()[j]*p0.Y()[1];
|
YLiquid[i++] = p0.YLiquid()[j]*p0.Y()[LIQUID];
|
||||||
}
|
}
|
||||||
|
|
||||||
YLiquid.write();
|
YLiquid.write();
|
||||||
@ -259,7 +259,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields
|
|||||||
forAllConstIter(typename Cloud<ParcelType>, c, iter)
|
forAllConstIter(typename Cloud<ParcelType>, c, iter)
|
||||||
{
|
{
|
||||||
const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
|
const ReactingMultiphaseParcel<ParcelType>& p0 = iter();
|
||||||
YSolid[i++] = p0.YSolid()[j]*p0.Y()[2];
|
YSolid[i++] = p0.YSolid()[j]*p0.Y()[SOLID];
|
||||||
}
|
}
|
||||||
|
|
||||||
YSolid.write();
|
YSolid.write();
|
||||||
|
|||||||
@ -157,7 +157,8 @@ void Foam::ReactingParcel<ParcelType>::calc
|
|||||||
// Absorb particle(s) into carrier phase
|
// Absorb particle(s) into carrier phase
|
||||||
forAll(Y_, i)
|
forAll(Y_, i)
|
||||||
{
|
{
|
||||||
td.cloud().rhoTrans(i)[cellI] += np0*mass1*Y_[i];
|
label id = td.composition().localToGlobalGasId(0, i);
|
||||||
|
td.cloud().rhoTrans(id)[cellI] += np0*mass1*Y_[i];
|
||||||
}
|
}
|
||||||
td.cloud().UTrans()[cellI] += np0*mass1*U1;
|
td.cloud().UTrans()[cellI] += np0*mass1*U1;
|
||||||
scalar HEff = td.cloud().composition().H(0, Y_, pc_, T1);
|
scalar HEff = td.cloud().composition().H(0, Y_, pc_, T1);
|
||||||
|
|||||||
@ -44,7 +44,7 @@ const Foam::NamedEnum<Foam::phaseProperties::phaseType, 4>
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::phaseProperties::setGlobalGasIds
|
void Foam::phaseProperties::setGlobalIds
|
||||||
(
|
(
|
||||||
const PtrList<volScalarField>& YGas
|
const PtrList<volScalarField>& YGas
|
||||||
)
|
)
|
||||||
@ -111,6 +111,27 @@ void Foam::phaseProperties::setGlobalIds(const wordList& globalNames)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::phaseProperties::setGlobalGasIds
|
||||||
|
(
|
||||||
|
const PtrList<volScalarField>& YGas
|
||||||
|
)
|
||||||
|
{
|
||||||
|
forAll(names_, i)
|
||||||
|
{
|
||||||
|
forAll (YGas, j)
|
||||||
|
{
|
||||||
|
word specieName = YGas[j].name();
|
||||||
|
|
||||||
|
if (specieName == names_[i])
|
||||||
|
{
|
||||||
|
globalGasIds_[i] = j;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::phaseProperties::checkTotalMassFraction() const
|
void Foam::phaseProperties::checkTotalMassFraction() const
|
||||||
{
|
{
|
||||||
scalar total = 0.0;
|
scalar total = 0.0;
|
||||||
@ -209,17 +230,23 @@ void Foam::phaseProperties::initialiseGlobalIds
|
|||||||
{
|
{
|
||||||
case GAS:
|
case GAS:
|
||||||
{
|
{
|
||||||
setGlobalGasIds(YGas);
|
setGlobalIds(YGas);
|
||||||
|
forAll(globalGasIds_, i)
|
||||||
|
{
|
||||||
|
globalGasIds_[i] = globalIds_[i];
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LIQUID:
|
case LIQUID:
|
||||||
{
|
{
|
||||||
setGlobalIds(liquidNames);
|
setGlobalIds(liquidNames);
|
||||||
|
setGlobalGasIds(YGas);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SOLID:
|
case SOLID:
|
||||||
{
|
{
|
||||||
setGlobalIds(solidNames);
|
setGlobalIds(solidNames);
|
||||||
|
setGlobalGasIds(YGas);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@ -330,6 +357,12 @@ const Foam::labelList& Foam::phaseProperties::globalIds() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const Foam::labelList& Foam::phaseProperties::globalGasIds() const
|
||||||
|
{
|
||||||
|
return globalGasIds_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::label Foam::phaseProperties::id(const word& cmptName) const
|
Foam::label Foam::phaseProperties::id(const word& cmptName) const
|
||||||
{
|
{
|
||||||
forAll(names_, cmptI)
|
forAll(names_, cmptI)
|
||||||
|
|||||||
@ -88,15 +88,21 @@ private:
|
|||||||
//- Global ids
|
//- Global ids
|
||||||
labelList globalIds_;
|
labelList globalIds_;
|
||||||
|
|
||||||
|
//- Map to gas global id
|
||||||
|
labelList globalGasIds_;
|
||||||
|
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
|
|
||||||
//- Set global ids - specialisation for carrier gas phases
|
//- Set global ids - specialisation for carrier gas phases
|
||||||
void setGlobalGasIds(const PtrList<volScalarField>& YGas);
|
void setGlobalIds(const PtrList<volScalarField>& YGas);
|
||||||
|
|
||||||
//- Set global ids - liquid and solid phases
|
//- Set global ids - liquid and solid phases
|
||||||
void setGlobalIds(const wordList& globalNames);
|
void setGlobalIds(const wordList& globalNames);
|
||||||
|
|
||||||
|
//- Set global gas ids - attempts to map component names to global gases
|
||||||
|
void setGlobalGasIds(const PtrList<volScalarField>& YGas);
|
||||||
|
|
||||||
//- Check the total mass fraction
|
//- Check the total mass fraction
|
||||||
void checkTotalMassFraction() const;
|
void checkTotalMassFraction() const;
|
||||||
|
|
||||||
@ -159,6 +165,9 @@ public:
|
|||||||
//- Return const acccess to the global ids
|
//- Return const acccess to the global ids
|
||||||
const labelList& globalIds() const;
|
const labelList& globalIds() const;
|
||||||
|
|
||||||
|
//- Return const acccess to the map to the gas global ids
|
||||||
|
const labelList& globalGasIds() const;
|
||||||
|
|
||||||
//- Return the global id of a component in the local list by name
|
//- Return the global id of a component in the local list by name
|
||||||
// Returns -1 if not found
|
// Returns -1 if not found
|
||||||
label globalId(const word& cmptName) const;
|
label globalId(const word& cmptName) const;
|
||||||
|
|||||||
@ -35,7 +35,8 @@ Foam::phaseProperties::phaseProperties(Istream& is)
|
|||||||
stateLabel_("(unknown)"),
|
stateLabel_("(unknown)"),
|
||||||
names_(0),
|
names_(0),
|
||||||
Y_(0),
|
Y_(0),
|
||||||
globalIds_(0)
|
globalIds_(0),
|
||||||
|
globalGasIds_(0)
|
||||||
{
|
{
|
||||||
is.check("Foam::phaseProperties::phaseProperties(Istream& is)");
|
is.check("Foam::phaseProperties::phaseProperties(Istream& is)");
|
||||||
|
|
||||||
@ -66,6 +67,7 @@ Foam::phaseProperties::phaseProperties(Istream& is)
|
|||||||
|
|
||||||
// initialise global ids to -1
|
// initialise global ids to -1
|
||||||
globalIds_.setSize(nComponents, -1);
|
globalIds_.setSize(nComponents, -1);
|
||||||
|
globalGasIds_.setSize(nComponents, -1);
|
||||||
|
|
||||||
checkTotalMassFraction();
|
checkTotalMassFraction();
|
||||||
}
|
}
|
||||||
@ -110,6 +112,7 @@ Foam::Istream& Foam::operator>>(Istream& is, phaseProperties& pp)
|
|||||||
|
|
||||||
// initialise global ids to -1
|
// initialise global ids to -1
|
||||||
pp.globalIds_.setSize(nComponents, -1);
|
pp.globalIds_.setSize(nComponents, -1);
|
||||||
|
pp.globalGasIds_.setSize(nComponents, -1);
|
||||||
|
|
||||||
pp.checkTotalMassFraction();
|
pp.checkTotalMassFraction();
|
||||||
|
|
||||||
|
|||||||
@ -240,6 +240,33 @@ Foam::label Foam::CompositionModel<CloudType>::localId
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class CloudType>
|
||||||
|
Foam::label Foam::CompositionModel<CloudType>::localToGlobalGaslId
|
||||||
|
(
|
||||||
|
const label phaseI,
|
||||||
|
const label id
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
label gid = phaseProps_[phaseI].globalGasIds()[id];
|
||||||
|
|
||||||
|
if (gid < 0)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"Foam::label Foam::CompositionModel<CloudType>::localToGlobalGasId"
|
||||||
|
"("
|
||||||
|
"const label, "
|
||||||
|
"const label"
|
||||||
|
") const"
|
||||||
|
) << "Unable to determine global gas id for phase "
|
||||||
|
<< phaseI << " with local id " << id
|
||||||
|
<< nl << abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class CloudType>
|
template<class CloudType>
|
||||||
const Foam::scalarField& Foam::CompositionModel<CloudType>::Y0
|
const Foam::scalarField& Foam::CompositionModel<CloudType>::Y0
|
||||||
(
|
(
|
||||||
|
|||||||
@ -187,6 +187,13 @@ public:
|
|||||||
//- Return local id of component cmptName in phase phaseI
|
//- Return local id of component cmptName in phase phaseI
|
||||||
label localId(const label phaseI, const word& cmptName) const;
|
label localId(const label phaseI, const word& cmptName) const;
|
||||||
|
|
||||||
|
//- Return global gas id of component given local id
|
||||||
|
label localToGlobalGaslId
|
||||||
|
(
|
||||||
|
const label phaseI,
|
||||||
|
const label id
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Return the list of phase phaseI mass fractions
|
//- Return the list of phase phaseI mass fractions
|
||||||
const scalarField& Y0(const label phaseI) const;
|
const scalarField& Y0(const label phaseI) const;
|
||||||
|
|
||||||
|
|||||||
@ -66,8 +66,11 @@ Foam::scalar Foam::NoSurfaceReaction<CloudType>::calculate
|
|||||||
const scalar,
|
const scalar,
|
||||||
const scalar,
|
const scalar,
|
||||||
const scalar,
|
const scalar,
|
||||||
|
const scalarField&,
|
||||||
|
const scalarField&,
|
||||||
|
const scalarField&,
|
||||||
|
const scalarList&,
|
||||||
const scalarList&,
|
const scalarList&,
|
||||||
scalarField&,
|
|
||||||
scalarField&,
|
scalarField&,
|
||||||
scalarField&,
|
scalarField&,
|
||||||
scalarField&,
|
scalarField&,
|
||||||
|
|||||||
@ -84,11 +84,14 @@ public:
|
|||||||
const scalar pc,
|
const scalar pc,
|
||||||
const scalar rhoc,
|
const scalar rhoc,
|
||||||
const scalar mass,
|
const scalar mass,
|
||||||
const scalarList& dMassMT,
|
const scalarField& YGas,
|
||||||
scalarField& YGas,
|
const scalarField& YLiquid,
|
||||||
scalarField& YLiquid,
|
const scalarField& YSolid,
|
||||||
scalarField& YSolid,
|
const scalarList& YMixture,
|
||||||
scalarField& YMixture,
|
const scalarList& dMassVolatile,
|
||||||
|
scalarField& dMassGas,
|
||||||
|
scalarField& dMassLiquid,
|
||||||
|
scalarField& dMassSolid,
|
||||||
scalarList& dMassSRc
|
scalarList& dMassSRc
|
||||||
) const;
|
) const;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -143,11 +143,14 @@ public:
|
|||||||
const scalar pc,
|
const scalar pc,
|
||||||
const scalar rhoc,
|
const scalar rhoc,
|
||||||
const scalar mass,
|
const scalar mass,
|
||||||
const scalarList& dMassMT,
|
const scalarField& YGas,
|
||||||
scalarField& YGas,
|
const scalarField& YLiquid,
|
||||||
scalarField& YLiquid,
|
const scalarField& YSolid,
|
||||||
scalarField& YSolid,
|
const scalarList& YMixture,
|
||||||
scalarField& YMixture,
|
const scalarList& dMassVolatile,
|
||||||
|
scalarField& dMassGas,
|
||||||
|
scalarField& dMassLiquid,
|
||||||
|
scalarField& dMassSolid,
|
||||||
scalarList& dMassSRc
|
scalarList& dMassSRc
|
||||||
) const = 0;
|
) const = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user