From f613354d3d57363512489738e838d4c50433ecbd Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Fri, 27 Feb 2009 18:59:45 +0000
Subject: [PATCH] phase change update

---
 .../ReactingMultiphaseParcel.C                |  8 +--
 .../Templates/ReactingParcel/ReactingParcel.C | 42 ++++++----------
 .../Templates/ReactingParcel/ReactingParcel.H |  1 +
 .../phaseProperties/phasePropertiesIO.C       |  1 -
 .../CompositionModel/CompositionModel.C       | 50 +++++++++++++++++++
 .../CompositionModel/CompositionModel.H       |  8 +++
 .../NoPhaseChange/NoPhaseChange.C             |  4 +-
 .../NoPhaseChange/NoPhaseChange.H             |  4 +-
 .../PhaseChangeModel/PhaseChangeModel.H       |  4 +-
 .../liquidEvaporation/liquidEvaporation.C     | 12 +++--
 .../liquidEvaporation/liquidEvaporation.H     |  4 +-
 11 files changed, 97 insertions(+), 41 deletions(-)

diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
index 35d969714f8..0ab68ded742 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingMultiphaseParcel/ReactingMultiphaseParcel.C
@@ -100,7 +100,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcCoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T0, dMassMT);
+    scalarField X = td.cloud().composition().X(idLiquid, YLiquid_);
+    calcPhaseChange(td, dt, T0, X, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -271,7 +272,8 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcUncoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T0, dMassMT);
+    scalarField X = td.cloud().composition().X(idLiquid, YLiquid_);
+    calcPhaseChange(td, dt, T0, YLiquid_, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -347,7 +349,7 @@ void Foam::ReactingMultiphaseParcel<ParcelType>::calcDevolatilisation
         (
             "void Foam::ReactingMultiphaseParcel<ParcelType>::"
             "calcDevolatilisation \n"
-            "("
+            "(\n"
             "    TrackData&,\n"
             "    const scalar,\n"
             "    const scalar,\n"
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
index daaa9ac66af..266f6e25301 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C
@@ -97,7 +97,8 @@ void Foam::ReactingParcel<ParcelType>::calcCoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T, dMassMT);
+    scalarField X = td.cliud().composition().X(0, YMixture_);
+    calcPhaseChange(td, dt, T, X, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -229,7 +230,8 @@ void Foam::ReactingParcel<ParcelType>::calcUncoupled
     // ~~~~~~~~~~~~~~~~~~~~~~
     // Calculate phase change
     // ~~~~~~~~~~~~~~~~~~~~~~
-    calcPhaseChange(td, dt, T, dMassMT);
+    scalarField X = td.cloud().composition().X(0, YMixture_);
+    calcPhaseChange(td, dt, T, X, dMassMT);
 
 
     // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -286,6 +288,7 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange
     TrackData& td,
     const scalar dt,
     const scalar T,
+    scalarField& X,
     scalarList& dMassMT
 )
 {
@@ -296,35 +299,22 @@ void Foam::ReactingParcel<ParcelType>::calcPhaseChange
 
     // TODO: separate treatment for boiling
 
-    /*
-    // Determine mass to add to carrier phase
-    const scalar mass = this->mass();
-    const scalar dMassTot = td.cloud().devolatilisation().calculate
+    scalar dMassTot = td.cloud().phaseChange().calculate
     (
-        dt,
-        mass0_,
-        mass,
-        td.cloud().composition().YMixture0(),
-        YMixture_,
-        T0,
-        canCombust_
+        T,
+        this->d_,
+        X,
+        dMassMT,
+        this->U_ - this->Uc_,
+        this->Tc_,
+        pc_,
+        this->muc_/this->rhoc_,
+        dt
     );
 
-    // 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];
+    // TODO: Re-calculate mass fractions
 
-    // Add to cummulative mass transfer
-    forAll (YGas_, i)
-    {
-        label id = td.cloud().composition().gasGlobalIds()[i];
 
-        // Volatiles mass transfer
-        scalar volatileMass = YGas_[i]*dMassTot;
-        dMassMT[id] += volatileMass;
-    }
-        */
 }
 
 
diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
index 763f1e2a6c1..194ffc2d386 100644
--- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
+++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.H
@@ -175,6 +175,7 @@ protected:
             TrackData& td,
             const scalar dt,
             const scalar T,
+            scalarField& X,
             scalarList& dMassMT
         );
 
diff --git a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C
index 34641fe4d4b..192136ed8d0 100644
--- a/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C
+++ b/src/lagrangian/intermediate/phaseProperties/phaseProperties/phasePropertiesIO.C
@@ -29,7 +29,6 @@ License
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-
 Foam::phaseProperties::phaseProperties(Istream& is)
 :
     phase_(UNKNOWN),
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
index 5d1de160e8d..df898464fda 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.C
@@ -241,6 +241,56 @@ const Foam::scalarField& Foam::CompositionModel<CloudType>::Y0
 }
 
 
+template<class CloudType>
+Foam::scalarField Foam::CompositionModel<CloudType>::X
+(
+    const label phaseI,
+    const scalarField& Y
+) const
+{
+    const phaseProperties& props = phaseProps_[phaseI];
+    scalarField X(Y.size(), 0.0);
+    scalar WInv = 0.0;
+    switch (props.phase())
+    {
+        case phaseProperties::GAS:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                WInv += Y[i]/this->gases()[gid].W();
+                X[i] = Y[i]/this->gases()[gid].W();
+            }
+            break;
+        }
+        case phaseProperties::LIQUID:
+        {
+            forAll(Y, i)
+            {
+                label gid = props.globalIds()[i];
+                WInv += Y[i]/this->liquids().properties()[gid].W();
+                X[i] += Y[i]/this->liquids().properties()[gid].W();
+            }
+            break;
+        }
+        default:
+        {
+            FatalErrorIn
+            (
+                "Foam::scalarField Foam::CompositionModel<CloudType>::X\n"
+                "(\n"
+                "    const label phaseI,\n"
+                "    const scalarField Y\n"
+                ") const"
+            )   << "Only possible to convert gas and liquid mass fractions"
+                << nl << abort(FatalError);
+        }
+    }
+
+    return X/WInv;
+}
+
+
 template<class CloudType>
 Foam::scalar Foam::CompositionModel<CloudType>::H
 (
diff --git a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
index 9dd21529c89..5be0e2c1b92 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/CompositionModel/CompositionModel/CompositionModel.H
@@ -187,6 +187,14 @@ public:
                 //- Return the list of phase phaseI mass fractions
                 const scalarField& Y0(const label phaseI) const;
 
+                //- Return the list of phase phaseI volume fractions fractions
+                //  based on supplied mass fractions Y
+                scalarField X
+                (
+                    const label phaseI,
+                    const scalarField& Y
+                ) const;
+
 
             // Mixture properties
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
index 791512789c4..4029aa05708 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.C
@@ -61,8 +61,8 @@ Foam::scalar Foam::NoPhaseChange<CloudType>::calculate
     const scalar,
     const scalar,
     const scalarField&,
-    const scalarField&,
-    const vector,
+    const scalarList&,
+    const vector&,
     const scalar,
     const scalar,
     const scalar,
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
index 07341719db5..74b065b75a8 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/NoPhaseChange/NoPhaseChange.H
@@ -79,8 +79,8 @@ public:
             const scalar T,
             const scalar d,
             const scalarField& Xc,
-            const scalarField& dMassMT,
-            const vector Ur,
+            const scalarList& dMassMT,
+            const vector& Ur,
             const scalar Tc,
             const scalar pc,
             const scalar nuc,
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
index b06506d8281..1a97370529e 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/PhaseChangeModel/PhaseChangeModel.H
@@ -138,8 +138,8 @@ public:
             const scalar T,
             const scalar d,
             const scalarField& Xc,
-            const scalarField& dMassMT,
-            const vector Ur,
+            const scalarList& dMassMT,
+            const vector& Ur,
             const scalar Tc,
             const scalar pc,
             const scalar nuc,
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C
index 792ae89c640..8bba9d784d1 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.C
@@ -146,14 +146,16 @@ Foam::scalar Foam::liquidEvaporation<CloudType>::calculate
     const scalar T,
     const scalar d,
     const scalarField& Xc,
-    const scalarField& dMassMT,
-    const vector Ur
+    const scalarList& dMassMT,
+    const vector& Ur
     const scalar Tc,
     const scalar pc,
     const scalar nuc
     const scalar dt,
 ) const
 {
+    scalar dMassTot = 0.0;
+
     if (T < Tvap_)
     {
         // not reached temperature threshold
@@ -192,9 +194,13 @@ Foam::scalar Foam::liquidEvaporation<CloudType>::calculate
             scalar Ni = max(kc*(Cs - Cinf), 0.0);
 
             // mass transfer
-            dMassMT[i] -= Ni*A*liquids_.properies()[i].W()*dt;
+            scalar dm = Ni*A*liquids_.properies()[i].W()*dt;
+            dMassMT[i] -= dm;
+            dMassTot += dm;
         }
     }
+
+    return dMassTot;
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H
index efc97fecabf..a7e2325f17b 100644
--- a/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H
+++ b/src/lagrangian/intermediate/submodels/Reacting/PhaseChangeModel/liquidEvaporation/liquidEvaporation.H
@@ -111,8 +111,8 @@ public:
             const scalar T,
             const scalar d,
             const scalarField& Xc,
-            const scalarField& dMassMT,
-            const vector Ur,
+            const scalarList& dMassMT,
+            const vector& Ur,
             const scalar Tc,
             const scalar pc,
             const scalar nuc,
-- 
GitLab