From b9eafd250ad967fc9fcdf55e25da9d357217edfa Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Wed, 13 May 2009 12:24:32 +0100
Subject: [PATCH] - min rho, T and p now required in constantProperties

- added (cumulative) contributions due to transfer of mass, mom and energy when
  evaluating cell properties
---
 .../KinematicParcel/KinematicParcel.C         | 11 ++++++++--
 .../KinematicParcel/KinematicParcel.H         |  6 ++++++
 .../KinematicParcel/KinematicParcelI.H        |  9 +++++++++
 .../Templates/ReactingParcel/ReactingParcel.C | 20 +++++++++++++++----
 .../Templates/ReactingParcel/ReactingParcel.H |  6 ++++++
 .../ReactingParcel/ReactingParcelI.H          |  9 +++++++++
 .../Templates/ThermoParcel/ThermoParcel.C     | 16 +++++++++++----
 .../Templates/ThermoParcel/ThermoParcel.H     | 17 +++++++++++-----
 .../Templates/ThermoParcel/ThermoParcelI.H    |  9 +++++++++
 9 files changed, 88 insertions(+), 15 deletions(-)

diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
index 5dd28f50cc4..ad564e6d892 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
@@ -39,7 +39,7 @@ void Foam::KinematicParcel<ParcelType>::updateCellQuantities
 )
 {
     rhoc_ = td.rhoInterp().interpolate(this->position(), cellI);
-    if (rhoc_ < SMALL)
+    if (rhoc_ < td.constProps().rhoMin())
     {
         WarningIn
         (
@@ -49,10 +49,17 @@ void Foam::KinematicParcel<ParcelType>::updateCellQuantities
                 "const scalar, "
                 "const label"
             ")"
-        )   << "Density < " << SMALL << " in cell " << cellI << nl << endl;
+        )   << "Limiting density in cell " << cellI << " to "
+            << td.constProps().rhoMin() <<  nl << endl;
+
+        rhoc_ = td.constProps().rhoMin();
     }
 
     Uc_ = td.UInterp().interpolate(this->position(), cellI);
+
+    // Apply correction to cell velocity to account for momentum transfer
+    Uc_ += td.cloud().UTrans()[cellI]/(massCell(cellI));
+
     muc_ = td.muInterp().interpolate(this->position(), cellI);
 
     // Apply dispersion components to carrier phase velocity
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
index f90c86b9181..d5ccfd84b2f 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H
@@ -89,6 +89,9 @@ public:
             //- Constant properties dictionary
             const dictionary dict_;
 
+            //- Minimum density [kg/m3]
+            const scalar rhoMin_;
+
             //- Particle density [kg/m3] (constant)
             const scalar rho0_;
 
@@ -106,6 +109,9 @@ public:
             //- Return const access to the constant properties dictionary
             inline const dictionary& dict() const;
 
+            //- Return const access to the minimum density
+            inline scalar rhoMin() const;
+
             //- Return const access to the particle density
             inline scalar rho0() const;
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H
index bf4545032af..2adc0e944d0 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H
@@ -33,6 +33,7 @@ inline Foam::KinematicParcel<ParcelType>::constantProperties::constantProperties
 )
 :
     dict_(parentDict.subDict("constantProperties")),
+    rhoMin_(dimensionedScalar(dict_.lookup("rhoMin")).value()),
     rho0_(dimensionedScalar(dict_.lookup("rho0")).value()),
     minParticleMass_
     (
@@ -99,6 +100,14 @@ Foam::KinematicParcel<ParcelType>::constantProperties::dict() const
 }
 
 
+template <class ParcelType>
+inline Foam::scalar
+Foam::KinematicParcel<ParcelType>::constantProperties::rhoMin() const
+{
+    return rhoMin_;
+}
+
+
 template <class ParcelType>
 inline Foam::scalar
 Foam::KinematicParcel<ParcelType>::constantProperties::rho0() const
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
index 75276900875..4529d4e0779 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
@@ -40,7 +40,7 @@ void Foam::ReactingParcel<ParcelType>::updateCellQuantities
     ThermoParcel<ParcelType>::updateCellQuantities(td, dt, cellI);
 
     pc_ = td.pInterp().interpolate(this->position(), cellI);
-    if (pc_ < SMALL)
+    if (pc_ < td.constProps().pMin())
     {
         WarningIn
         (
@@ -50,8 +50,19 @@ void Foam::ReactingParcel<ParcelType>::updateCellQuantities
                 "const scalar, "
                 "const label"
             ")"
-        )   << "Pressure < " << SMALL << " in cell " << cellI << nl << endl;
+        )   << "Limiting pressure in cell " << cellI << " to "
+            << td.constProps().pMin() <<  nl << endl;
+
+        pc_ = td.constProps().pMin();
+    }
+
+    // Apply correction to cell density to account for mass transfer
+    scalar addedMass = 0.0;
+    forAll(td.cloud().rhoTrans(), i)
+    {
+        addedMass += td.cloud().rhoTrans(i)[cellI];
     }
+    this->rhoc_ += addedMass/td.cloud().pMesh().cellVolumes()[cellI];
 }
 
 
@@ -259,15 +270,16 @@ Foam::scalar Foam::ReactingParcel<ParcelType>::calcPhaseChange
         return 0.0;
     }
 
+    // Calculate mass transfer due to phase change
     td.cloud().phaseChange().calculate
     (
         dt,
         cellI,
         d,
-        min(T, td.constProps().Tbp()), // Limiting to boiling temperature
+        min(T, td.constProps().Tbp()), // Limit to boiling temperature
         pc_,
         this->Tc_,
-        this->muc_/this->rhoc_,
+        this->muc_/(this->rhoc_ + ROOTVSMALL),
         U - this->Uc_,
         dMassPC
     );
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
index f876fa6401c..429ceffea33 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
@@ -80,6 +80,9 @@ public:
     {
         // Private data
 
+            //- Minimum pressure [Pa]
+            const scalar pMin_;
+
             //- Constant volume flag - e.g. during mass transfer
             Switch constantVolume_;
 
@@ -97,6 +100,9 @@ public:
 
         // Access
 
+            //- Return const access to the minimum pressure
+            inline scalar pMin() const;
+
             //- Return const access to the constant volume flag
             inline Switch constantVolume() const;
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H
index 0cc40887d4a..344eb09398a 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcelI.H
@@ -33,6 +33,7 @@ inline Foam::ReactingParcel<ParcelType>::constantProperties::constantProperties
 )
 :
     ThermoParcel<ParcelType>::constantProperties(parentDict),
+    pMin_(dimensionedScalar(this->dict().lookup("pMin")).value()),
     constantVolume_(this->dict().lookup("constantVolume")),
     Tbp_(dimensionedScalar(this->dict().lookup("Tbp")).value()),
     Tvap_(dimensionedScalar(this->dict().lookup("Tvap")).value())
@@ -106,6 +107,14 @@ inline Foam::ReactingParcel<ParcelType>::ReactingParcel
 
 // * * * * * * * * * constantProperties Member Functions * * * * * * * * * * //
 
+template<class ParcelType>
+inline Foam::scalar
+Foam::ReactingParcel<ParcelType>::constantProperties::pMin() const
+{
+    return pMin_;
+}
+
+
 template<class ParcelType>
 inline Foam::Switch
 Foam::ReactingParcel<ParcelType>::constantProperties::constantVolume() const
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C
index e13420e56db..8b5a722d30a 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.C
@@ -39,8 +39,15 @@ void Foam::ThermoParcel<ParcelType>::updateCellQuantities
 {
     KinematicParcel<ParcelType>::updateCellQuantities(td, dt, cellI);
 
+    cpc_ = td.cpInterp().interpolate(this->position(), cellI);
+
     Tc_ = td.TInterp().interpolate(this->position(), cellI);
-    if (Tc_ < SMALL)
+
+    // Apply correction to cell temperature to account for enthalpy transfer
+    scalar cpMean = td.cpInterp().psi()[cellI];
+    Tc_ += td.cloud().hTrans()[cellI]/(cpMean*this->massCell(cellI));
+
+    if (Tc_ < td.constProps().TMin())
     {
         WarningIn
         (
@@ -50,10 +57,11 @@ void Foam::ThermoParcel<ParcelType>::updateCellQuantities
                 "const scalar, "
                 "const label"
             ")"
-        )   << "Temperature < " << SMALL << " in cell " << cellI << nl << endl;
-    }
+        )   << "Limiting temperature in cell " << cellI << " to "
+            << td.constProps().TMin() <<  nl << endl;
 
-    cpc_ = td.cpInterp().interpolate(this->position(), cellI);
+        Tc_ = td.constProps().TMin();
+    }
 }
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
index c7ba92ab840..18a36dc024f 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcel.H
@@ -85,6 +85,9 @@ public:
             //- Particle initial temperature [K]
             const scalar T0_;
 
+            //- Minimum temperature [K]
+            const scalar TMin_;
+
             //- Particle specific heat capacity [J/(kg.K)]
             const scalar cp0_;
 
@@ -104,18 +107,22 @@ public:
 
             // Access
 
-                //- Return const access to particle initial temperature [K]
+                //- Return const access to the particle initial temperature [K]
                 inline scalar T0() const;
 
-                //- Return const access to particle specific heat capacity
+                //- Return const access to minimum temperature [K]
+                inline scalar TMin() const;
+
+                //- Return const access to the particle specific heat capacity
                 //  [J/(kg.K)]
                 inline scalar cp0() const;
 
-                //- Return const access to Particle emissivity [] (radiation)
+                //- Return const access to the particle emissivity []
+                //  Active for radiation only
                 inline scalar epsilon0() const;
 
-                //- Return const access to Particle scattering factor []
-                //  (radiation)
+                //- Return const access to the particle scattering factor []
+                //  Active for radiation only
                 inline scalar f0() const;
     };
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H
index 1a2c0326d39..6e929b6e691 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ThermoParcel/ThermoParcelI.H
@@ -34,6 +34,7 @@ inline Foam::ThermoParcel<ParcelType>::constantProperties::constantProperties
 :
     KinematicParcel<ParcelType>::constantProperties(parentDict),
     T0_(dimensionedScalar(this->dict().lookup("T0")).value()),
+    TMin_(dimensionedScalar(this->dict().lookup("TMin")).value()),
     cp0_(dimensionedScalar(this->dict().lookup("cp0")).value()),
     epsilon0_(dimensionedScalar(this->dict().lookup("epsilon0")).value()),
     f0_(dimensionedScalar(this->dict().lookup("f0")).value())
@@ -110,6 +111,14 @@ Foam::ThermoParcel<ParcelType>::constantProperties::T0() const
 }
 
 
+template <class ParcelType>
+inline Foam::scalar
+Foam::ThermoParcel<ParcelType>::constantProperties::TMin() const
+{
+    return TMin_;
+}
+
+
 template <class ParcelType>
 inline Foam::scalar
 Foam::ThermoParcel<ParcelType>::constantProperties::cp0() const
-- 
GitLab