diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index ecbb9266511717bc7c8bcad067324b16b11c8319..efbdea63898eae4773007327e2a2f1267e424666 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -155,21 +155,7 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud false ), mesh_, - dimensionedVector("zero", dimensionSet(1, 1, -1, 0, 0), vector::zero) - ), - UCoeff_ - ( - IOobject - ( - this->name() + "UCoeff", - this->db().time().timeName(), - this->db(), - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ), - mesh_, - dimensionedScalar("zero", dimensionSet(1, 0, -1, 0, 0), 0.0) + dimensionedVector("zero", dimMass*dimVelocity, vector::zero) ) {} @@ -187,7 +173,6 @@ template<class ParcelType> void Foam::KinematicCloud<ParcelType>::resetSourceTerms() { UTrans_.field() = vector::zero; - UCoeff_.field() = 0.0; } diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 785b9819199ca23a269206ce4f8ba90756551161..50280469e2f9f024789eff4e996784c039d42c3a 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -165,9 +165,6 @@ class KinematicCloud //- Momentum DimensionedField<vector, volMesh> UTrans_; - //- Coefficient for carrier phase U equation - DimensionedField<scalar, volMesh> UCoeff_; - // Private Member Functions @@ -309,14 +306,8 @@ public: //- Return reference to momentum source inline DimensionedField<vector, volMesh>& UTrans(); - //- Coefficient for carrier phase U equation - inline DimensionedField<scalar, volMesh>& UCoeff(); - //- Return tmp momentum source term - fully explicit - inline tmp<DimensionedField<vector, volMesh> > SU1() const; - - //- Return tmp momentum source term - semi-implicit - inline tmp<fvVectorMatrix> SU2(volVectorField& U) const; + inline tmp<DimensionedField<vector, volMesh> > SU() const; // Check diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index dde35a4298fc380ddaaea4fc5abfe4c2063ecb1f..8c44470c44bb867583212eaadfea65aa51666e6b 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -203,25 +203,17 @@ Foam::KinematicCloud<ParcelType>::UTrans() } -template<class ParcelType> -inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>& -Foam::KinematicCloud<ParcelType>::UCoeff() -{ - return UCoeff_; -} - - template<class ParcelType> inline Foam::tmp<Foam::DimensionedField<Foam::vector, Foam::volMesh> > -Foam::KinematicCloud<ParcelType>::SU1() const +Foam::KinematicCloud<ParcelType>::SU() const { - tmp<DimensionedField<vector, volMesh> > tSU1 + tmp<DimensionedField<vector, volMesh> > tSU ( new DimensionedField<vector, volMesh> ( IOobject ( - this->name() + "SU1", + this->name() + "SU", this->db().time().timeName(), this->mesh(), IOobject::NO_READ, @@ -237,29 +229,10 @@ Foam::KinematicCloud<ParcelType>::SU1() const ) ); - vectorField& SU1 = tSU1().field(); - SU1 = UTrans_/(mesh_.V()*this->db().time().deltaT()); - - return tSU1; -} - - -template<class ParcelType> -inline Foam::tmp<Foam::fvVectorMatrix> -Foam::KinematicCloud<ParcelType>::SU2(volVectorField& U) const -{ - if (debug) - { - Info<< "UTrans min/max = " - << min(UTrans_) << ", " << max(UTrans_) << endl; - Info<< "UCoeff min/max = " - << min(UCoeff_) << ", " << max(UCoeff_) << endl; - } + vectorField& SU = tSU().field(); + SU = UTrans_/(mesh_.V()*this->db().time().deltaT()); - return - UTrans_/(mesh_.V()*this->db().time().deltaT()) - - fvm::Sp(UCoeff_/mesh_.V(), U) - + UCoeff_/mesh_.V()*U; + return tSU; } diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H index 6fe5bf68a65a9a7db9959fb02cc18f5fff2adb7a..0cc8bfc96b9812fe45c400c98e968e3272316a32 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H @@ -180,15 +180,13 @@ public: inline PtrList<DimensionedField<scalar, volMesh> >& rhoTrans(); - //- Return tmp mass source for field i - // Fully explicit + //- Return tmp mass source for field i - fully explicit inline tmp<DimensionedField<scalar, volMesh> > - Srho1(const label i) const; + Srho(const label i) const; //- Return tmp total mass source for carrier phase - // Fully explicit - inline tmp<DimensionedField<scalar, volMesh> > - Srho1() const; + // - fully explicit + inline tmp<DimensionedField<scalar, volMesh> > Srho() const; // Check diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H index 1414b6b16d78e2c2fe141c5144f8836a9456acee..98d9eee8feff5ea659c9b51d58318a3cf950494b 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H @@ -92,7 +92,7 @@ Foam::ReactingCloud<ParcelType>::rhoTrans() template<class ParcelType> inline Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh> > -Foam::ReactingCloud<ParcelType>::Srho1(const label i) const +Foam::ReactingCloud<ParcelType>::Srho(const label i) const { return rhoTrans_[i]/(this->db().time().deltaT()*this->mesh().V()); } @@ -100,7 +100,7 @@ Foam::ReactingCloud<ParcelType>::Srho1(const label i) const template<class ParcelType> inline Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh> > -Foam::ReactingCloud<ParcelType>::Srho1() const +Foam::ReactingCloud<ParcelType>::Srho() const { tmp<DimensionedField<scalar, volMesh> > trhoTrans ( diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C index 6872f2428eadeb99b6bbcbaa135624c1460312fc..62c926f1eaca456af40190185489245a4df6f4a7 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C @@ -115,20 +115,6 @@ Foam::ThermoCloud<ParcelType>::ThermoCloud ), this->mesh(), dimensionedScalar("zero", dimensionSet(1, 2, -2, 0, 0), 0.0) - ), - hCoeff_ - ( - IOobject - ( - this->name() + "hCoeff", - this->db().time().timeName(), - this->db(), - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ), - this->mesh(), - dimensionedScalar("zero", dimensionSet(1, 2, -3, -1, 0), 0.0) ) {} @@ -147,7 +133,6 @@ void Foam::ThermoCloud<ParcelType>::resetSourceTerms() { KinematicCloud<ParcelType>::resetSourceTerms(); hTrans_.field() = 0.0; - hCoeff_.field() = 0.0; } diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H index 9789bd0f5f08258613879bd186423def7c15ae20..7cdc7b12636a3c0bc54aa030878b3eb4e691a913 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H @@ -102,9 +102,6 @@ class ThermoCloud //- Enthalpy transfer DimensionedField<scalar, volMesh> hTrans_; - //- Coefficient for carrier phase h equation - DimensionedField<scalar, volMesh> hCoeff_; - // Private Member Functions @@ -179,14 +176,8 @@ public: //- Return reference to enthalpy source inline DimensionedField<scalar, volMesh>& hTrans(); - //- Coefficient for carrier phase h equation - inline DimensionedField<scalar, volMesh>& hCoeff(); - //- return tmp enthalpy source term - fully explicit - inline tmp<DimensionedField<scalar, volMesh> > Sh1() const; - - //- Return tmp enthalpy source term - semi-implicit - inline tmp<fvScalarMatrix> Sh2(volScalarField& h) const; + inline tmp<DimensionedField<scalar, volMesh> > Sh() const; // Radiation - overrides thermoCloud virtual abstract members diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H index 2f3df96f41b9db4483a9a8fa3b241df58e49f159..d85d043ec55216d5c024af352acddea9cc61d9ff 100644 --- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H @@ -83,25 +83,17 @@ Foam::ThermoCloud<ParcelType>::hTrans() } -template<class ParcelType> -inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>& -Foam::ThermoCloud<ParcelType>::hCoeff() -{ - return hCoeff_; -} - - template<class ParcelType> inline Foam::tmp<Foam::DimensionedField<Foam::scalar, Foam::volMesh> > -Foam::ThermoCloud<ParcelType>::Sh1() const +Foam::ThermoCloud<ParcelType>::Sh() const { - tmp<DimensionedField<scalar, volMesh> > tSh1 + tmp<DimensionedField<scalar, volMesh> > tSh ( new DimensionedField<scalar, volMesh> ( IOobject ( - this->name() + "Sh1", + this->name() + "Sh", this->db().time().timeName(), this->mesh(), IOobject::NO_READ, @@ -118,30 +110,10 @@ Foam::ThermoCloud<ParcelType>::Sh1() const ) ); - scalarField& Sh1 = tSh1().field(); - Sh1 = hTrans_/(this->mesh().V()*this->db().time().deltaT()); - - return tSh1; -} - - -template<class ParcelType> -inline Foam::tmp<Foam::fvScalarMatrix> -Foam::ThermoCloud<ParcelType>::Sh2(volScalarField& h) const -{ - const volScalarField cp = carrierThermo_.Cp(); - - if (debug) - { - Info<< "hTrans min/max = " - << min(hTrans_) << ", " << max(hTrans_) << endl; - Info<< "hCoeff min/max = " - << min(hCoeff_) << ", " << max(hCoeff_) << endl; - } + scalarField& Sh = tSh().field(); + Sh = hTrans_/(this->mesh().V()*this->db().time().deltaT()); - return hTrans_/(this->mesh().V()*this->db().time().deltaT()) - - fvm::Sp(hCoeff_/(cp*this->mesh().V()), h) - + hCoeff_/(cp*this->mesh().V())*h; + return tSh; } diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index ad564e6d89232c59e7b449e41d8533ebcc1f4d5f..69cc25869e5a29075863f01a5c37fe6f6544ad56 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -92,15 +92,6 @@ void Foam::KinematicParcel<ParcelType>::calc const scalar rho0 = rho_; const scalar mass0 = mass(); - const polyMesh& mesh = this->cloud().pMesh(); - - - // Initialise transfer terms - // ~~~~~~~~~~~~~~~~~~~~~~~~~ - - // Momentum - vector dUTrans = vector::zero; - // Motion // ~~~~~~ @@ -109,9 +100,7 @@ void Foam::KinematicParcel<ParcelType>::calc vector Fx = vector::zero; // Calculate new particle velocity - scalar Cud = 0.0; - vector U1 = - calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Fx, Cud, dUTrans); + vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Fx); // Accumulate carrier phase source terms @@ -119,10 +108,7 @@ void Foam::KinematicParcel<ParcelType>::calc if (td.cloud().coupled()) { // Update momentum transfer - td.cloud().UTrans()[cellI] += np0*dUTrans; - - // Coefficient to be applied in carrier phase momentum coupling - td.cloud().UCoeff()[cellI] += np0*mass0*Cud; + td.cloud().UTrans()[cellI] += np0*mass0*(U0 - U1); } @@ -143,15 +129,13 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity const vector& U, const scalar rho, const scalar mass, - const vector& Fx, - scalar& Cud, - vector& dUTrans + const vector& Fx ) const { const polyMesh& mesh = this->cloud().pMesh(); // Return linearised term from drag model - Cud = td.cloud().drag().Cu(U - Uc_, d, rhoc_, rho, muc_); + scalar Cud = td.cloud().drag().Cu(U - Uc_, d, rhoc_, rho, muc_); // Calculate particle forces vector Ftot = td.cloud().forces().calc(cellI, dt, rhoc_, rho, Uc_, U); @@ -169,10 +153,6 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity // Apply correction to velocity for reduced-D cases meshTools::constrainDirection(mesh, mesh.solutionD(), Unew); - // Calculate the momentum transfer to the continuous phase - // - do not include gravity impulse - dUTrans = -mass*(Unew - U - dt*td.g()); - return Unew; } diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H index d5ccfd84b2f662c0c4534437070c1cbff2342742..7a57dd5fb017b90c0f63dcb943fa202d65b26c29 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -243,9 +243,7 @@ protected: const vector& U, // velocity const scalar rho, // density const scalar mass, // mass - const vector& Fx, // additional forces - scalar& Cud, // linearised drag term coeff - vector& dUTrans // momentum transfer to carrier phase + const vector& Fx // additional forces ) const; diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C index 7692c2011f3abc07f0b377f55f24041ce5683916..3d67afa89b7ca401d9c5b3aaf9740ca1cfd1643e 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C @@ -32,10 +32,10 @@ template<class ParcelType> const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::GAS(0); template<class ParcelType> -const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::LIQUID(1); +const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::LIQ(1); template<class ParcelType> -const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::SOLID(2); +const Foam::label Foam::ReactingMultiphaseParcel<ParcelType>::SLD(2); // * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // @@ -54,8 +54,8 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::cpEff { return this->Y_[GAS]*td.cloud().composition().cp(idG, YGas_, p, T) - + this->Y_[LIQUID]*td.cloud().composition().cp(idL, YLiquid_, p, T) - + this->Y_[SOLID]*td.cloud().composition().cp(idS, YSolid_, p, T); + + this->Y_[LIQ]*td.cloud().composition().cp(idL, YLiquid_, p, T) + + this->Y_[SLD]*td.cloud().composition().cp(idS, YSolid_, p, T); } @@ -73,8 +73,27 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::HEff { return this->Y_[GAS]*td.cloud().composition().H(idG, YGas_, p, T) - + this->Y_[LIQUID]*td.cloud().composition().H(idL, YLiquid_, p, T) - + this->Y_[SOLID]*td.cloud().composition().H(idS, YSolid_, p, T); + + this->Y_[LIQ]*td.cloud().composition().H(idL, YLiquid_, p, T) + + this->Y_[SLD]*td.cloud().composition().H(idS, YSolid_, p, T); +} + + +template<class ParcelType> +template<class TrackData> +Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::LEff +( + TrackData& td, + const scalar p, + const scalar T, + const label idG, + const label idL, + const label idS +) const +{ + return + this->Y_[GAS]*td.cloud().composition().L(idG, YGas_, p, T) + + this->Y_[LIQ]*td.cloud().composition().L(idL, YLiquid_, p, T) + + this->Y_[SLD]*td.cloud().composition().L(idS, YSolid_, p, T); } @@ -94,14 +113,14 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::updateMassFractions 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_); + this->updateMassFraction(mass0*YMix[LIQ], dMassLiquid, YLiquid_); + this->updateMassFraction(mass0*YMix[SLD], dMassSolid, YSolid_); scalar massNew = mass0 - (dMassGasTot + dMassLiquidTot + dMassSolidTot); YMix[GAS] = (mass0*YMix[GAS] - dMassGasTot)/massNew; - YMix[LIQUID] = (mass0*YMix[LIQUID] - dMassLiquidTot)/massNew; - YMix[SOLID] = 1.0 - YMix[GAS] - YMix[LIQUID]; + YMix[LIQ] = (mass0*YMix[LIQ] - dMassLiquidTot)/massNew; + YMix[SLD] = 1.0 - YMix[GAS] - YMix[LIQ]; return massNew; } @@ -148,32 +167,18 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc const label idL = td.cloud().composition().idLiquid(); const label idS = td.cloud().composition().idSolid(); + // Intial ethalpy state + scalar H0H = HEff(td, pc, T0, idG, idL, idS); + scalar H0L = LEff(td, pc, T0, idG, idL, idS); + scalar H0 = H0H - H0L; - // Initialise transfer terms - // ~~~~~~~~~~~~~~~~~~~~~~~~~ - // Momentum - vector dUTrans = vector::zero; - - // Enthalpy - scalar dhTrans = 0.0; + // Phase change in liquid phase + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Mass transfer due to phase change scalarField dMassPC(YLiquid_.size(), 0.0); - // Mass transfer due to devolatilisation - scalarField dMassDV(YGas_.size(), 0.0); - - // Change in carrier phase composition due to surface reactions - scalarField dMassSRGas(YGas_.size(), 0.0); - scalarField dMassSRLiquid(YLiquid_.size(), 0.0); - scalarField dMassSRSolid(YSolid_.size(), 0.0); - scalarField dMassSRCarrier(td.cloud().gases().size(), 0.0); - - - // Phase change in liquid phase - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Return enthalpy source and calc mass transfer due to phase change scalar ShPC = calcPhaseChange @@ -185,7 +190,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc T0, U0, idL, - YMix[LIQUID], + YMix[LIQ], YLiquid_, dMassPC ); @@ -194,6 +199,9 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc // Devolatilisation // ~~~~~~~~~~~~~~~~ + // Mass transfer due to devolatilisation + scalarField dMassDV(YGas_.size(), 0.0); + // Return enthalpy source and calc mass transfer due to devolatilisation scalar ShDV = calcDevolatilisation @@ -214,8 +222,14 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc // Surface reactions // ~~~~~~~~~~~~~~~~~ + // Change in carrier phase composition due to surface reactions + scalarField dMassSRGas(YGas_.size(), 0.0); + scalarField dMassSRLiquid(YLiquid_.size(), 0.0); + scalarField dMassSRSolid(YSolid_.size(), 0.0); + scalarField dMassSRCarrier(td.cloud().gases().size(), 0.0); + // Return enthalpy source and calc mass transfer(s) due to surface reaction - scalar ShSR = + scalar HReaction = calcSurfaceReactions ( td, @@ -233,34 +247,14 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc dMassSRGas, dMassSRLiquid, dMassSRSolid, - dMassSRCarrier, - dhTrans + dMassSRCarrier ); + // Heat of reaction split between component retained by particle + const scalar ShSR = td.constProps().hRetentionCoeff()*HReaction; - // Heat transfer - // ~~~~~~~~~~~~~ - - // Total enthalpy source - scalar Sh = ShPC + ShDV + ShSR; - - // Calculate new particle temperature - scalar htc = 0.0; - scalar T1 = - calcHeatTransfer - ( - td, - dt, - cellI, - d0, - U0, - rho0, - T0, - cp0, - Sh, - htc, - dhTrans - ); + // ...and component added to the carrier phase + const scalar ShSRc = (1.0 - td.constProps().hRetentionCoeff())*HReaction; // Update component mass fractions @@ -274,6 +268,22 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc updateMassFractions(mass0, dMassGas, dMassLiquid, dMassSolid); + // Heat transfer + // ~~~~~~~~~~~~~ + + // Total enthalpy source + scalar Sh = ShPC + ShDV + ShSR; + + // Calculate new particle temperature + scalar T1 = calcHeatTransfer(td, dt, cellI, d0, U0, rho0, T0, cp0, Sh); + + // Calculate new enthalpy state based on updated composition at new + // temperature + scalar H1H = HEff(td, pc, T1, idG, idL, idS); + scalar H1L = LEff(td, pc, T1, idG, idL, idS); + scalar H1 = H1H - H1L; + + // Motion // ~~~~~~ @@ -281,21 +291,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc vector Fx = vector::zero; // Calculate new particle velocity - scalar Cud = 0.0; - vector U1 = - calcVelocity - ( - td, - dt, - cellI, - d0, - U0, - rho0, - 0.5*(mass0 + mass1), - Fx, - Cud, - dUTrans - ); + vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Fx); // Accumulate carrier phase source terms @@ -311,13 +307,13 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc } forAll(YLiquid_, i) { - label id = td.cloud().composition().localToGlobalGasId(LIQUID, i); + label id = td.cloud().composition().localToGlobalGasId(LIQ, i); td.cloud().rhoTrans(id)[cellI] += np0*dMassLiquid[i]; } // // No mapping between solid components and carrier phase // forAll(YSolid_, i) // { -// label id = td.cloud().composition().localToGlobalGasId(SOLID, i); +// label id = td.cloud().composition().localToGlobalGasId(SLD, i); // td.cloud().rhoTrans(id)[cellI] += np0*dMassSolid[i]; // } forAll(dMassSRCarrier, i) @@ -326,16 +322,10 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc } // Update momentum transfer - td.cloud().UTrans()[cellI] += np0*dUTrans; - - // Coefficient to be applied in carrier phase momentum coupling - td.cloud().UCoeff()[cellI] += np0*mass0*Cud; + td.cloud().UTrans()[cellI] += np0*(mass0*U0 - mass1*U1); // Update enthalpy transfer - td.cloud().hTrans()[cellI] += np0*dhTrans; - - // Coefficient to be applied in carrier phase enthalpy coupling - td.cloud().hCoeff()[cellI] += np0*htc*this->areaS(); + td.cloud().hTrans()[cellI] += np0*(mass0*H0 - (mass1*H1 + ShSRc)); } @@ -357,29 +347,20 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calc forAll(YLiquid_, i) { label id = - td.cloud().composition().localToGlobalGasId(LIQUID, i); + td.cloud().composition().localToGlobalGasId(LIQ, i); td.cloud().rhoTrans(id)[cellI] += - np0 - *mass1 - *YMix[LIQUID] - *YLiquid_[i]; + np0*mass1*YMix[LIQ]*YLiquid_[i]; } // // No mapping between solid components and carrier phase // forAll(YSolid_, i) // { // label id = -// td.cloud().composition().localToGlobalGasId(SOLID, i); +// td.cloud().composition().localToGlobalGasId(SLD, i); // td.cloud().rhoTrans(id)[cellI] += -// np0 -// *mass1 -// *YMix[SOLID] -// *YSolid_[i]; +// np0*mass1*YMix[SLD]*YSolid_[i]; // } - td.cloud().hTrans()[cellI] += - np0 - *mass1 - *HEff(td, pc, T1, idG, idL, idS); + td.cloud().hTrans()[cellI] += np0*mass1*H1; td.cloud().UTrans()[cellI] += np0*mass1*U1; } } @@ -421,7 +402,7 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation const scalarField& YVolatile, bool& canCombust, scalarField& dMassDV -) +) const { // Check that model is active, and that the parcel temperature is // within necessary limits for devolatilisation to occur @@ -448,10 +429,7 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation ); // Volatile mass transfer - equal components of each volatile specie - forAll(YVolatile, i) - { - dMassDV[i] = YVolatile[i]*dMassTot; - } + dMassDV = YVolatile*dMassTot; td.cloud().addToMassDevolatilisation(this->nParticle_*dMassTot); @@ -478,9 +456,8 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions scalarField& dMassSRGas, scalarField& dMassSRLiquid, scalarField& dMassSRSolid, - scalarField& dMassSRCarrier, - scalar& dhTrans -) + scalarField& dMassSRCarrier +) const { // Check that model is active if (!td.cloud().surfaceReaction().active() || !canCombust) @@ -489,18 +466,15 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions } // Update surface reactions - const scalar pc = this->pc_; - const scalar Tc = this->Tc_; - const scalar rhoc = this->rhoc_; const scalar HReaction = td.cloud().surfaceReaction().calculate ( dt, cellI, d, T, - Tc, - pc, - rhoc, + this->Tc_, + this->pc_, + this->rhoc_, mass, YGas, YLiquid, @@ -519,27 +493,7 @@ Foam::scalar Foam::ReactingMultiphaseParcel<ParcelType>::calcSurfaceReactions *(sum(dMassSRGas) + sum(dMassSRLiquid) + sum(dMassSRSolid)) ); - // Add enthalpy of consumed components to the carrier phase enthalpy - // transfer - const label idG = td.cloud().composition().idGas(); - const label idL = td.cloud().composition().idLiquid(); - const label idS = td.cloud().composition().idSolid(); - scalar dhGas = - sum(dMassSRGas)*td.cloud().composition().H(idG, YGas, pc, T); - - scalar dhLiquid = - sum(dMassSRLiquid)*td.cloud().composition().H(idL, YLiquid, pc, T); - - scalar dhSolid = - sum(dMassSRSolid)*td.cloud().composition().H(idS, YSolid, pc, T); - - dhTrans += dhGas + dhLiquid + dhSolid; - - // Heat of reaction divided between particle and carrier phase by the - // fraction fh and (1 - fh) - dhTrans += (1.0 - td.constProps().hRetentionCoeff())*HReaction; - - return td.constProps().hRetentionCoeff()*HReaction; + return HReaction; } diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H index f1bace3a8b973956d55a5b30d0b3173661e0415d..b5f45310cd4feb610d5ec9da1c4bc23649157484 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.H @@ -71,11 +71,11 @@ public: // IDs of phases in ReacingParcel phase list (Y) static const label GAS; - static const label LIQUID; - static const label SOLID; + static const label LIQ; + static const label SLD; - //- Class to hold reacting particle constant properties + //- Class to hold reacting multiphase particle constant properties class constantProperties : public ReactingParcel<ParcelType>::constantProperties @@ -177,6 +177,18 @@ private: const label idS ) const; + //- Return the mixture effective latent heat + template<class TrackData> + scalar LEff + ( + 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 ( @@ -223,7 +235,7 @@ protected: const scalarField& YVolatile, // volatile component mass fractions bool& canCombust, // 'can combust' flag scalarField& dMassDV // mass transfer - local to particle - ); + ) const; //- Calculate surface reactions template<class TrackData> @@ -237,16 +249,15 @@ protected: const scalar mass, // mass const bool canCombust, // 'can combust' flag const scalarField& dMassVolatile, // mass transfer of volatiles - const scalarField& YMix, // mixture mass fractions + const scalarField& YMix, // mixture mass fractions const scalarField& YGas, // gas-phase mass fractions const scalarField& YLiquid,// liquid-phase mass fractions const scalarField& YSolid, // solid-phase mass fractions scalarField& dMassSRGas, // gas-phase mass transfer - local scalarField& dMassSRLiquid,// liquid-phase mass transfer - local scalarField& dMassSRSolid, // solid-phase mass transfer - local - scalarField& dMassSRCarrier,// carrier phase mass transfer - scalar& dhTrans // enthalpy transfer to carrier phase - ); + scalarField& dMassSRCarrier// carrier phase mass transfer + ) const; public: diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C index 64829732e8fee556a0c7b9ca0c5e260e83f08ab8..b37f7c715e27ea0272a038bef14676f10384e9cd 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcelIO.C @@ -70,8 +70,8 @@ Foam::ReactingMultiphaseParcel<ParcelType>::ReactingMultiphaseParcel // scale the mass fractions const scalarField& YMix = this->Y_; YGas_ /= YMix[GAS] + ROOTVSMALL; - YLiquid_ /= YMix[LIQUID] + ROOTVSMALL; - YSolid_ /= YMix[SOLID] + ROOTVSMALL; + YLiquid_ /= YMix[LIQ] + ROOTVSMALL; + YSolid_ /= YMix[SLD] + ROOTVSMALL; } // Check state of Istream @@ -153,7 +153,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields forAllIter(typename Cloud<ParcelType>, c, iter) { ReactingMultiphaseParcel<ParcelType>& p = iter(); - p.YLiquid_[j] = YLiquid[i++]/(p.Y()[LIQUID] + ROOTVSMALL); + p.YLiquid_[j] = YLiquid[i++]/(p.Y()[LIQ] + ROOTVSMALL); } } // Populate YSolid for each parcel @@ -172,7 +172,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::readFields forAllIter(typename Cloud<ParcelType>, c, iter) { ReactingMultiphaseParcel<ParcelType>& p = iter(); - p.YSolid_[j] = YSolid[i++]/(p.Y()[SOLID] + ROOTVSMALL); + p.YSolid_[j] = YSolid[i++]/(p.Y()[SLD] + ROOTVSMALL); } } } @@ -235,7 +235,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields forAllConstIter(typename Cloud<ParcelType>, c, iter) { const ReactingMultiphaseParcel<ParcelType>& p0 = iter(); - YLiquid[i++] = p0.YLiquid()[j]*p0.Y()[LIQUID]; + YLiquid[i++] = p0.YLiquid()[j]*p0.Y()[LIQ]; } YLiquid.write(); @@ -259,7 +259,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::writeFields forAllConstIter(typename Cloud<ParcelType>, c, iter) { const ReactingMultiphaseParcel<ParcelType>& p0 = iter(); - YSolid[i++] = p0.YSolid()[j]*p0.Y()[SOLID]; + YSolid[i++] = p0.YSolid()[j]*p0.Y()[SLD]; } YSolid.write(); diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index 4529d4e07798d4c55a886a9628be55e10541cd3e..1db979c6da654a75e2722d8a271a7abea384a2ca 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -102,23 +102,18 @@ void Foam::ReactingParcel<ParcelType>::calc const scalar cp0 = this->cp_; const scalar mass0 = this->mass(); + // Intial ethalpy state + scalar H0H = td.cloud().composition().H(0, Y_, pc_, T0); + scalar H0L = td.cloud().composition().L(0, Y_, pc_, T0); + scalar H0 = H0H - H0L; - // Intialise transfer terms - // ~~~~~~~~~~~~~~~~~~~~~~~~ - // Momentum - vector dUTrans = vector::zero; - - // Enthalpy - scalar dhTrans = 0.0; + // Phase change + // ~~~~~~~~~~~~ // Mass transfer due to phase change scalarField dMassPC(Y_.size(), 0.0); - - // Phase change - // ~~~~~~~~~~~~ - // Return enthalpy source and calc mass transfer due to phase change scalar ShPC = calcPhaseChange(td, dt, cellI, d0, T0, U0, 0, 1.0, Y_, dMassPC); @@ -126,54 +121,30 @@ void Foam::ReactingParcel<ParcelType>::calc // Update particle component mass fractions updateMassFraction(mass0, dMassPC, Y_); + // Update mass + scalar mass1 = mass0 - sum(dMassPC); + // Heat transfer // ~~~~~~~~~~~~~ // Calculate new particle temperature - scalar htc = 0.0; - scalar T1 = - calcHeatTransfer - ( - td, - dt, - cellI, - d0, - U0, - rho0, - T0, - cp0, - ShPC, - htc, - dhTrans - ); + scalar T1 = calcHeatTransfer(td, dt, cellI, d0, U0, rho0, T0, cp0, ShPC); + + // Calculate new enthalpy state + scalar H1H = td.cloud().composition().H(0, Y_, pc_, T1); + scalar H1L = td.cloud().composition().L(0, Y_, pc_, T1); + scalar H1 = H1H - H1L; // Motion // ~~~~~~ - // Update mass - scalar mass1 = mass0 - sum(dMassPC); - // No additional forces vector Fx = vector::zero; // Calculate new particle velocity - scalar Cud = 0.0; - vector U1 = - calcVelocity - ( - td, - dt, - cellI, - d0, - U0, - rho0, - 0.5*(mass0 + mass1), - Fx, - Cud, - dUTrans - ); + vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Fx); // Accumulate carrier phase source terms @@ -188,16 +159,10 @@ void Foam::ReactingParcel<ParcelType>::calc } // Update momentum transfer - td.cloud().UTrans()[cellI] += np0*dUTrans; - - // Coefficient to be applied in carrier phase momentum coupling - td.cloud().UCoeff()[cellI] += np0*mass0*Cud; + td.cloud().UTrans()[cellI] += np0*(mass0*U0 - mass1*U1); // Update enthalpy transfer - td.cloud().hTrans()[cellI] += np0*dhTrans; - - // Coefficient to be applied in carrier phase enthalpy coupling - td.cloud().hCoeff()[cellI] += np0*htc*this->areaS(); + td.cloud().hTrans()[cellI] += np0*(mass0*H0 - mass1*H1); } @@ -216,8 +181,7 @@ void Foam::ReactingParcel<ParcelType>::calc td.cloud().rhoTrans(id)[cellI] += np0*mass1*Y_[i]; } td.cloud().UTrans()[cellI] += np0*mass1*U1; - scalar HEff = td.cloud().composition().H(0, Y_, pc_, T1); - td.cloud().hTrans()[cellI] += np0*mass1*HEff; + td.cloud().hTrans()[cellI] += np0*mass1*H1; } } diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C index 8b5a722d30ab7e6eef16e77357baee370aa79ecb..4d4d469d124b1ab7112185683e7b4d5e07c8cb4b 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C @@ -84,12 +84,8 @@ void Foam::ThermoParcel<ParcelType>::calc const scalar cp0 = this->cp_; const scalar mass0 = this->mass(); - - // Initialise transfer terms - // ~~~~~~~~~~~~~~~~~~~~~~~~~ - - vector dUTrans = vector::zero; - scalar dhTrans = 0.0; + // Initial enthalpy state + scalar H0 = cp0*T0; // Heat transfer @@ -99,22 +95,10 @@ void Foam::ThermoParcel<ParcelType>::calc scalar Sh = 0.0; // Calculate new particle velocity - scalar htc = 0.0; - scalar T1 = - calcHeatTransfer - ( - td, - dt, - cellI, - d0, - U0, - rho0, - T0, - cp0, - Sh, - htc, - dhTrans - ); + scalar T1 = calcHeatTransfer(td, dt, cellI, d0, U0, rho0, T0, cp0, Sh); + + // Calculate new enthalpy state + scalar H1 = cp0 - T1; // Motion @@ -124,9 +108,7 @@ void Foam::ThermoParcel<ParcelType>::calc vector Fx = vector::zero; // Calculate new particle velocity - scalar Cud = 0.0; - vector U1 = - calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Fx, Cud, dUTrans); + vector U1 = calcVelocity(td, dt, cellI, d0, U0, rho0, mass0, Fx); // Accumulate carrier phase source terms @@ -134,16 +116,10 @@ void Foam::ThermoParcel<ParcelType>::calc if (td.cloud().coupled()) { // Update momentum transfer - td.cloud().UTrans()[cellI] += np0*dUTrans; - - // Coefficient to be applied in carrier phase momentum coupling - td.cloud().UCoeff()[cellI] += np0*mass0*Cud; + td.cloud().UTrans()[cellI] += np0*mass0*(U0 - U1); // Update enthalpy transfer - td.cloud().hTrans()[cellI] += np0*dhTrans; - - // Coefficient to be applied in carrier phase enthalpy coupling - td.cloud().hCoeff()[cellI] += np0*htc*this->areaS(); + td.cloud().hTrans()[cellI] += np0*mass0*(H0 - H1); } // Set new particle properties @@ -165,19 +141,16 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer const scalar rho, const scalar T, const scalar cp, - const scalar Sh, - scalar& htc, - scalar& dhTrans + const scalar Sh ) { if (!td.cloud().heatTransfer().active()) { - htc = 0.0; return T; } // Calc heat transfer coefficient - htc = td.cloud().heatTransfer().h + scalar htc = td.cloud().heatTransfer().h ( d, U - this->Uc_, @@ -192,11 +165,8 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer // Determine new particle temperature // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // Particle area - scalar Ap = this->areaS(d); - // Determine ap and bp coefficients - scalar ap = Tc_ + Sh/(htc*Ap + ROOTVSMALL); + scalar ap = Tc_ + Sh/(htc*this->areaS(d) + ROOTVSMALL); scalar bp = 6.0*htc/(rho*d*cp); if (td.cloud().radiation()) { @@ -219,10 +189,6 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer IntegrationScheme<scalar>::integrationResult Tres = td.cloud().TIntegrator().integrate(T, dt, ap, bp); - // Enthalpy transfer - // - Using average particle temperature - dhTrans = dt*Ap*htc*(Tres.average() - Tc_); - return Tres.value(); } diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H index 18a36dc024fbfbc38437d581856f804b528f5469..aa2020aa10b94990ab4b4a555f2c1b86317a2a42 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H @@ -222,9 +222,7 @@ protected: const scalar rho, // density const scalar T, // temperature const scalar cp, // specific heat capacity - const scalar Sh, // additional enthalpy sources - scalar& htc, // heat transfer coeff - scalar& dhTrans // enthalpy transfer to carrier phase + const scalar Sh // additional enthalpy sources );