From 55da1f976a3ec5168081de206a01353163fdfb5f Mon Sep 17 00:00:00 2001 From: andy <a.heather@opencfd.co.uk> Date: Fri, 13 Mar 2009 19:17:25 +0000 Subject: [PATCH] updates for parcel calc routined --- .../Templates/KinematicCloud/KinematicCloud.C | 4 ++ .../Templates/KinematicCloud/KinematicCloud.H | 27 ++++++++++++ .../KinematicCloud/KinematicCloudI.H | 22 ++++++++++ .../KinematicParcel/KinematicParcel.C | 36 +++++++++++++--- .../KinematicParcel/KinematicParcel.H | 8 ++++ .../KinematicParcel/KinematicParcelI.H | 11 ++++- .../Templates/ReactingParcel/ReactingParcel.C | 43 ++++++++----------- .../Templates/ThermoParcel/ThermoParcel.C | 39 +++++++++-------- .../Templates/ThermoParcel/ThermoParcel.H | 1 + .../Kinematic/DragModel/DragModel/DragModel.C | 2 +- 10 files changed, 144 insertions(+), 49 deletions(-) diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C index 6584495b637..6df424c523a 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C @@ -102,6 +102,10 @@ Foam::KinematicCloud<ParcelType>::KinematicCloud mu_(mu), g_(g), interpolationSchemes_(particleProperties_.subDict("interpolationSchemes")), + forcesDict_(particleProperties_.subDict("forces")), + forceGravity_(forcesDict_.lookup("gravity")), + forceVirtualMass_(forcesDict_.lookup("virtualMass")), + forcePressureGradient_(forcesDict_.lookup("pressureGradient")), dispersionModel_ ( DispersionModel<KinematicCloud<ParcelType> >::New diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H index 8a03a73cd7e..77a61b02d29 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H @@ -133,6 +133,21 @@ class KinematicCloud dictionary interpolationSchemes_; + // Forces to include in particle motion evaluation + + //- Dictionary of forces + dictionary forcesDict_; + + //- Gravity + Switch forceGravity_; + + //- Virtual mass + Switch forceVirtualMass_; + + //- Pressure gradient + Switch forcePressureGradient_; + + // References to the cloud sub-models //- Dispersion model @@ -252,6 +267,18 @@ public: inline const dictionary& interpolationSchemes() const; + // Forces to include in particle motion evaluation + + //- Return reference to the gravity force flag + inline Switch forceGravity() const; + + //- Return reference to the virtual mass force flag + inline Switch forceVirtualMass() const; + + //- Return reference to the pressure gradient force flag + inline Switch forcePressureGradient() const; + + // Sub-models //- Return reference to dispersion model diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H index f129df9bdb0..adae027b878 100644 --- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H +++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H @@ -108,6 +108,28 @@ Foam::KinematicCloud<ParcelType>::interpolationSchemes() const } +template<class ParcelType> +inline Foam::Switch Foam::KinematicCloud<ParcelType>::forceGravity() const +{ + return forceGravity_; +} + + +template<class ParcelType> +inline Foam::Switch Foam::KinematicCloud<ParcelType>::forceVirtualMass() const +{ + return forceVirtualMass_; +} + + +template<class ParcelType> +inline Foam::Switch Foam::KinematicCloud<ParcelType>:: +forcePressureGradient() const +{ + return forcePressureGradient_; +} + + template<class ParcelType> inline const Foam::DispersionModel<Foam::KinematicCloud<ParcelType> >& Foam::KinematicCloud<ParcelType>::dispersion() const diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index 7fc3a62b792..c9df5a57768 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -27,6 +27,8 @@ License #include "KinematicParcel.H" #include "dimensionedConstants.H" +#include "fvcGrad.H" + // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // template<class ParcelType> @@ -69,7 +71,7 @@ void Foam::KinematicParcel<ParcelType>::calc // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ scalar Cud = 0.0; vector dUTrans = vector::zero; - const vector U1 = calcVelocity(td, dt, Cud, dUTrans); + const vector U1 = calcVelocity(td, dt, vector::zero, mass(), Cud, dUTrans); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -88,7 +90,7 @@ void Foam::KinematicParcel<ParcelType>::calc // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // 3. Set new particle properties // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - this->U() = U1; + U_ = U1; } @@ -98,27 +100,51 @@ const Foam::vector Foam::KinematicParcel<ParcelType>::calcVelocity ( TrackData& td, const scalar dt, + const vector& Fx, + const scalar mass, scalar& Cud, - vector& dUTrans + vector& dUTrans, ) const { // Return linearised term from drag model Cud = td.cloud().drag().Cu(U_ - Uc_, d_, rhoc_, rho_, muc_); + // Initialise total force (per unit mass) + vector Ftot = vector::zero; + + // Gravity force + if (td.cloud().forceGravity()) + { + Ftot += td.g()*(1 - rhoc_/rho_); + } + + // Virtual mass force + if (td.cloud().forceVirtualMass()) + { +// Ftot += td.constProps().Cvm()*rhoc_/rho_*d(Uc - U_)/dt; + } + + // Pressure gradient force + if (td.cloud().forcePressureGradient()) + { + Ftot += rhoc_/rho_*(U_ & fvc::grad(Uc_)) + } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Set new particle velocity //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Update velocity - treat as 3-D - const vector ap = Uc_ + (1 - rhoc_/rho_)/(Cud + VSMALL)*td.g(); + const vector ap = Uc_ + (Ftot + Fx)/(Cud + VSMALL); const scalar bp = Cud; vector Unew = td.cloud().UIntegrator().integrate(U_, dt, ap, bp).value(); // Calculate the momentum transfer to the continuous phase // - do not include gravity impulse - dUTrans = -mass()*(Unew - U_ - dt*td.g()); + + // TODO: USE AVERAGE PARTICLE MASS + 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 c60a2164984..b6df66d414c 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -93,6 +93,9 @@ public: //- Minimum particle mass [kg] const scalar minParticleMass_; + //- Virtual mass coefficient [] + const scalar Cvm_; + public: @@ -106,6 +109,9 @@ public: //- Return const access to the minimum particle mass inline scalar minParticleMass() const; + + //- Return const access to the virtual mass coefficient + inline scalar Cvm() const; }; @@ -228,6 +234,8 @@ protected: ( TrackData& td, const scalar dt, + const vector& Fx, + const scalar mass, scalar& Cud, vector& dUTrans ) const; diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H index 3e8d49b7ad4..4a6be04a971 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H @@ -33,7 +33,8 @@ inline Foam::KinematicParcel<ParcelType>::constantProperties::constantProperties ) : rho0_(dimensionedScalar(dict.lookup("rho0")).value()), - minParticleMass_(dimensionedScalar(dict.lookup("minParticleMass")).value()) + minParticleMass_(dimensionedScalar(dict.lookup("minParticleMass")).value()), + Cvm_(dimensionedScalar(dict.lookup("Cvm")).value()) {} @@ -103,6 +104,14 @@ Foam::KinematicParcel<ParcelType>::constantProperties::minParticleMass() const } +template <class ParcelType> +inline Foam::scalar +Foam::KinematicParcel<ParcelType>::constantProperties::Cvm() const +{ + return Cvm_; +} + + // * * * * * * * * * * * trackData Member Functions * * * * * * * * * * * * // template <class ParcelType> diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index 8e8b9f9d68a..65d8bc1d8fd 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -82,35 +82,33 @@ void Foam::ReactingParcel<ParcelType>::calc scalar Cud = 0.0; vector dUTrans = vector::zero; - const vector U1 = calcVelocity(td, dt, Cud, dUTrans); - - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~ - // 2. Calculate heat transfer - // ~~~~~~~~~~~~~~~~~~~~~~~~~~ - scalar htc = 0.0; - scalar dhHT = 0.0; -// TODO: T1 no longer used - return dhHT instead?????????????????????????????? -// scalar T1 = calcHeatTransfer(td, dt, cellI, htc, dhHT); - calcHeatTransfer(td, dt, cellI, htc, dhHT); + const vector U1 = calcVelocity(td, dt, vector::zero, mass0, Cud, dUTrans); // ~~~~~~~~~~~~~~~~~~~~~~~~~ - // 3. Calculate phase change + // 2. Calculate phase change // ~~~~~~~~~~~~~~~~~~~~~~~~~ // Mass transfer from particle to carrier phase scalarList dMassPC(td.cloud().gases().size(), 0.0); const scalar dMassPCTot = calcPhaseChange(td, dt, cellI, T0, 1.0, dMassPC); - // Update particle component mass fractions - updateMassFraction(mass0, dMassPC, Y_); - // Enthalpy change due to change in particle composition (sink) - scalar dhPC = -dMassPCTot*td.cloud().composition().L(0, Y_, pc, T0); + scalar ShPC = -dMassPCTot*td.cloud().composition().L(0, Y_, pc, T0); // Enthalpy change due to species released into the carrier (source) scalar HEff = td.cloud().composition().H(0, Y_, pc, T0); - dhPC += dMassPCTot*HEff; + ShPC += dMassPCTot*HEff; + + // Update particle component mass fractions + updateMassFraction(mass0, dMassPC, Y_); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 3. Calculate heat transfer + // ~~~~~~~~~~~~~~~~~~~~~~~~~~ + scalar htc = 0.0; + scalar ShHT = 0.0; + scalar T1 = calcHeatTransfer(td, dt, cellI, ShPC, htc, ShHT); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -121,13 +119,10 @@ void Foam::ReactingParcel<ParcelType>::calc scalar mass1 = mass0 - dMassPCTot; // Total enthalpy transfer from the particle to the carrier phase - scalar dhTrans = dhHT + dhPC; - - // New specific heat capacity of mixture - using old temperature - scalar cp1 = td.cloud().composition().cp(0, Y_, pc_, T0); + scalar dhTrans = ShHT + ShPC; - // New particle temperature - using average mass over the time interval - scalar T1 = T0 + dhTrans/(0.5*(mass0 + mass1)*cp1); + // New specific heat capacity of mixture - using new temperature + scalar cp1 = td.cloud().composition().cp(0, Y_, pc_, T1); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -203,7 +198,7 @@ Foam::scalar Foam::ReactingParcel<ParcelType>::calcPhaseChange const scalar dt, const label cellI, const scalar T, - const scalar YPhase, + const scalar YPhase, // TODO: NEEDED????????????????????????????????????????? scalarList& dMassMT ) { diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C index 61cbdf9535d..da7a31200ee 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C @@ -72,18 +72,18 @@ void Foam::ThermoParcel<ParcelType>::calc scalar dhTrans = 0.0; - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // 2. Calculate velocity - update U - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - scalar Cud = 0.0; - const vector U1 = calcVelocity(td, dt, Cud, dUTrans); - - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // 3. Calculate heat transfer - update T + // 2. Calculate heat transfer - update T // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ scalar htc = 0.0; - const scalar T1 = calcHeatTransfer(td, dt, cellI, htc, dhTrans); + const scalar T1 = calcHeatTransfer(td, dt, cellI, 0.0, htc, dhTrans); + + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // 3. Calculate velocity - update U + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + scalar Cud = 0.0; + const vector U1 = calcVelocity(td, dt, vector::zero, Cud, mass0, dUTrans); // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -108,7 +108,7 @@ void Foam::ThermoParcel<ParcelType>::calc // 5. Set new particle properties // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ this->U() = U1; - this->T() = T1; + T_ = T1; } @@ -119,6 +119,7 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer TrackData& td, const scalar dt, const label cellI, + const scalar Sh, scalar& htc, scalar& dhTrans ) @@ -142,9 +143,12 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer this->muc_ ); + //- Assuming diameter = diameter at start of time step + scalar Ap = this->areasS(); + // Determine ap and bp coefficients - scalar ap = Tc_; - scalar bp = htc; + scalar ap = Tc_ + Sh/(htc*Ap + ROOTVSMALL); + scalar bp = 6.0*htc/(this->rho_*this->d_*cp_); if (td.cloud().radiation()) { // Carrier phase incident radiation field @@ -156,19 +160,18 @@ Foam::scalar Foam::ThermoParcel<ParcelType>::calcHeatTransfer // Helper variables const scalar sigma = radiation::sigmaSB.value(); const scalar epsilon = td.constProps().epsilon0(); - const scalar epsilonSigmaT3 = epsilon*sigma*pow3(T_); - ap = (htc*Tc_ + 0.25*epsilon*G[cellI])/(htc + epsilonSigmaT3); - bp += epsilonSigmaT3; + const scalar D = epsilon*sigma*pow3(T_)/(htc + ROOTVSMALL) + 1.0; + ap += 0.25*epsilon*G[cellI]/(htc + ROOTVSMALL); + ap /= D; + bp *= D; } - bp *= 6.0/(this->rho_*this->d_*cp_); - // Integrate to find the new parcel temperature IntegrationScheme<scalar>::integrationResult Tres = td.cloud().TIntegrator().integrate(T_, dt, ap, bp); // Using average parcel temperature for enthalpy transfer calculation - dhTrans = dt*this->areaS()*htc*(Tres.average() - Tc_); + 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 bc66a2a7d2c..8506bb7c0ad 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H @@ -210,6 +210,7 @@ protected: TrackData& td, const scalar dt, const label cellI, + const scalar Sh, scalar& htc, scalar& dhTrans ); diff --git a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C index 273e93b0e17..f1b98e609c2 100644 --- a/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C +++ b/src/lagrangian/intermediate/submodels/Kinematic/DragModel/DragModel/DragModel.C @@ -75,7 +75,7 @@ Foam::scalar Foam::DragModel<CloudType>::Cu { const scalar magUr = mag(Ur); - const scalar Re = rhoc*magUr*d/(mu + SMALL); + const scalar Re = rhoc*magUr*d/(mu + ROOTVSMALL); const scalar Cd = this->Cd(Re); -- GitLab