diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C index a99f5faeaf..f0e175904c 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C @@ -177,6 +177,22 @@ void Foam::ReactingMultiphaseParcel::cellValueSourceCorrection this->Cpc_ = (massCell*Cpc + addedMass*CpEff)/massCellNew; this->Tc_ += td.cloud().hsTrans()[cellI]/(this->Cpc_*massCellNew); + + if (this->Tc_ < td.cloud().constProps().TMin()) + { + WarningIn + ( + "void Foam::ReactingParcel::cellValueSourceCorrection" + "(" + "TrackData&, " + "const scalar, " + "const label" + ")" + ) << "Limiting observed temperature in cell " << cellI << " to " + << td.cloud().constProps().TMin() << nl << endl; + + this->Tc_ = td.cloud().constProps().TMin(); + } } diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index 9fc2f2fb33..60f1019f87 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -101,6 +101,22 @@ void Foam::ReactingParcel::cellValueSourceCorrection this->Cpc_ = (massCell*Cpc + addedMass*CpEff)/massCellNew; this->Tc_ += td.cloud().hsTrans()[cellI]/(this->Cpc_*massCellNew); + + if (this->Tc_ < td.cloud().constProps().TMin()) + { + WarningIn + ( + "void Foam::ReactingParcel::cellValueSourceCorrection" + "(" + "TrackData&, " + "const scalar, " + "const label" + ")" + ) << "Limiting observed temperature in cell " << cellI << " to " + << td.cloud().constProps().TMin() << nl << endl; + + this->Tc_ = td.cloud().constProps().TMin(); + } } @@ -124,14 +140,14 @@ void Foam::ReactingParcel::correctSurfaceValues return; } + const SLGThermo& thermo = td.cloud().thermo(); + // Far field carrier molar fractions scalarField Xinf(td.cloud().thermo().carrier().species().size()); forAll(Xinf, i) { - Xinf[i] = - td.cloud().thermo().carrier().Y(i)[cellI] - /td.cloud().thermo().carrier().W(i); + Xinf[i] = thermo.carrier().Y(i)[cellI]/thermo.carrier().W(i); } Xinf /= sum(Xinf); @@ -153,7 +169,7 @@ void Foam::ReactingParcel::correctSurfaceValues 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().thermo().carrier().W(i); + Ys[i] = Xs[i]*thermo.carrier().W(i); } Xs /= sum(Xs); Ys /= sum(Ys); @@ -168,13 +184,14 @@ void Foam::ReactingParcel::correctSurfaceValues forAll(Ys, i) { - const scalar sqrtW = sqrt(td.cloud().thermo().carrier().W(i)); - const scalar cbrtW = cbrt(td.cloud().thermo().carrier().W(i)); + const scalar W = thermo.carrier().W(i); + const scalar sqrtW = sqrt(W); + const scalar cbrtW = cbrt(W); - rhos += Xs[i]*td.cloud().thermo().carrier().W(i); - mus += Ys[i]*sqrtW*td.cloud().thermo().carrier().mu(i, T); - kappa += Ys[i]*cbrtW*td.cloud().thermo().carrier().kappa(i, T); - Cps += Xs[i]*td.cloud().thermo().carrier().Cp(i, T); + rhos += Xs[i]*W; + mus += Ys[i]*sqrtW*thermo.carrier().mu(i, T); + kappa += Ys[i]*cbrtW*thermo.carrier().kappa(i, T); + Cps += Xs[i]*thermo.carrier().Cp(i, T); sumYiSqrtW += Ys[i]*sqrtW; sumYiCbrtW += Ys[i]*cbrtW; @@ -547,7 +564,7 @@ Foam::ReactingParcel::ReactingParcel const ReactingCloud& c ) : - ThermoParcel(p), + ThermoParcel(p, c), mass0_(p.mass0_), Y_(p.Y_), pc_(p.pc_) diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C index 9c44d1cb7f..6c2dfb1143 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C @@ -78,6 +78,22 @@ void Foam::ThermoParcel::cellValueSourceCorrection const scalar CpMean = td.CpInterp().psi()[cellI]; Tc_ += td.cloud().hsTrans()[cellI]/(CpMean*this->massCell(cellI)); + + if (Tc_ < td.cloud().constProps().TMin()) + { + WarningIn + ( + "void Foam::ThermoParcel::cellValueSourceCorrection" + "(" + "TrackData&, " + "const scalar, " + "const label" + ")" + ) << "Limiting observed temperature in cell " << cellI << " to " + << td.cloud().constProps().TMin() << nl << endl; + + Tc_ = td.cloud().constProps().TMin(); + } } @@ -98,14 +114,34 @@ void Foam::ThermoParcel::calcSurfaceValues // Surface temperature using two thirds rule Ts = (2.0*T + Tc_)/3.0; - tetIndices tetIs = this->currentTetIndices(); + if (Ts < td.cloud().constProps().TMin()) + { + WarningIn + ( + "void Foam::ThermoParcel::calcSurfaceValues" + "(" + "TrackData&, " + "const label, " + "const scalar, " + "scalar&, " + "scalar&, " + "scalar&, " + "scalar&, " + "scalar&" + ") const" + ) << "Limiting parcel surface temperature to " + << td.cloud().constProps().TMin() << nl << endl; + + Ts = td.cloud().constProps().TMin(); + } // Assuming thermo props vary linearly with T for small dT - scalar factor = td.TInterp().interpolate (this->position(), tetIs)/Ts; + const scalar TRatio = Tc_/Ts; - rhos = this->rhoc_*factor; + rhos = this->rhoc_*TRatio; - mus = td.muInterp().interpolate (this->position(), tetIs)/factor; + tetIndices tetIs = this->currentTetIndices(); + mus = td.muInterp().interpolate(this->position(), tetIs)/TRatio; Pr = td.cloud().constProps().Pr(); kappa = Cpc_*mus/Pr; @@ -270,6 +306,7 @@ Foam::scalar Foam::ThermoParcel::calcHeatTransfer ); } + htc = max(htc, ROOTVSMALL); const scalar As = this->areaS(d); scalar ap = Tc_ + Sh/As/htc; scalar bp = 6.0*(Sh/As + htc*(Tc_ - T)); @@ -284,7 +321,7 @@ Foam::scalar Foam::ThermoParcel::calcHeatTransfer 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 /= rho*d*Cp*(ap - T); + bp /= rho*d*Cp*(ap - T) + ROOTVSMALL; // Integrate to find the new parcel temperature IntegrationScheme::integrationResult Tres = diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C index 57b618ee6f..ae93b144ed 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/basicKinematicParcel.C @@ -25,16 +25,6 @@ License #include "basicKinematicParcel.H" -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ - defineTypeNameAndDebug(basicKinematicParcel, 0); - defineParticleTypeNameAndDebug(basicKinematicParcel, 0); - defineParcelTypeNameAndDebug(basicKinematicParcel, 0); -}; - - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::basicKinematicParcel::basicKinematicParcel diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/defineBasicKinematicParcel.C b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/defineBasicKinematicParcel.C index aee5402c34..973a70dbb0 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/defineBasicKinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/defineBasicKinematicParcel.C @@ -24,16 +24,13 @@ License \*---------------------------------------------------------------------------*/ #include "basicKinematicParcel.H" -#include "KinematicCloud.H" -#include "KinematicParcel.H" +#include "createKinematicParcelTypes.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { - defineTemplateTypeNameAndDebug(Cloud, 0); - - defineParcelTypeNameAndDebug(KinematicCloud, 0); + createKinematicParcelTypes(basicKinematicParcel); }; diff --git a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C index 52737115f6..b5a4a76ed1 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/basicThermoParcel.C @@ -25,16 +25,6 @@ License #include "basicThermoParcel.H" -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ - defineTypeNameAndDebug(basicThermoParcel, 0); - defineParticleTypeNameAndDebug(basicThermoParcel, 0); - defineParcelTypeNameAndDebug(basicThermoParcel, 0); -}; - - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::basicThermoParcel::basicThermoParcel diff --git a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/defineBasicThermoParcel.C b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/defineBasicThermoParcel.C index f235de759e..a98be4baad 100644 --- a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/defineBasicThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/defineBasicThermoParcel.C @@ -24,21 +24,13 @@ License \*---------------------------------------------------------------------------*/ #include "basicThermoParcel.H" -#include "ThermoCloud.H" +#include "createThermoParcelTypes.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { - defineTemplateTypeNameAndDebug(Cloud, 0); - - defineParcelTypeNameAndDebug(KinematicParcel, 0); - defineParcelTypeNameAndDebug(ThermoParcel, 0); - defineTemplateTypeNameAndDebug(ThermoParcel, 0); - - defineParcelTypeNameAndDebug(KinematicCloud, 0); - - defineParcelTypeNameAndDebug(ThermoCloud, 0); + createThermoParcelTypes(basicThermoParcel); };