From 88a2b204aa86ba225304960a006f53983fe779c6 Mon Sep 17 00:00:00 2001
From: Andrew Heather <>
Date: Wed, 17 May 2023 17:55:37 +0100
Subject: [PATCH] ENH: lagrangian - added transfer of parcel to carrier source
 terms

---
 .../Templates/KinematicCloud/KinematicCloud.H |  8 ++++
 .../KinematicCloud/KinematicCloudI.H          | 15 ++++++
 .../Templates/ReactingCloud/ReactingCloud.H   | 10 +++-
 .../Templates/ReactingCloud/ReactingCloudI.H  | 33 +++++++++++++
 .../ReactingMultiphaseCloud.H                 | 10 ++++
 .../ReactingMultiphaseCloudI.H                | 47 +++++++++++++++++++
 .../Templates/ThermoCloud/ThermoCloud.H       |  8 ++++
 .../Templates/ThermoCloud/ThermoCloudI.H      | 13 +++++
 8 files changed, 143 insertions(+), 1 deletion(-)

diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index 702f3592415..7b8b401c6ec 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -527,6 +527,14 @@ public:
 
             // Sources
 
+                //- Transfer the effect of parcel to the carrier phase
+                inline void transferToCarrier
+                (
+                    const parcelType& p,
+                    const typename parcelType::trackingData& td
+                );
+
+
                 // Momentum
 
                     //- Return reference to mass for kinematic source
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
index d4643044317..b8f54f964b8 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
@@ -434,6 +434,21 @@ Foam::KinematicCloud<CloudType>::cellLengthScale() const
 }
 
 
+template<class CloudType>
+inline void Foam::KinematicCloud<CloudType>::transferToCarrier
+(
+    const parcelType& p,
+    const typename parcelType::trackingData& td
+)
+{
+    const scalar m = p.nParticle()*p.mass();
+
+    rhokTrans()[p.cell()] += m;
+
+    UTrans()[p.cell()] += m*p.U();
+}
+
+
 template<class CloudType>
 inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
 Foam::KinematicCloud<CloudType>::rhokTrans()
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
index 4cf53147eb1..33afd881e51 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloud.H
@@ -233,7 +233,15 @@ public:
 
             // Sources
 
-                //- Mass
+                //- Transfer the effect of parcel to the carrier phase
+                inline void transferToCarrier
+                (
+                    const parcelType& p,
+                    const typename parcelType::trackingData& td
+                );
+
+
+                // Mass
 
                     //- Return reference to mass source for field i
                     inline volScalarField::Internal&
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H
index ef82d05462e..8f357987e53 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingCloud/ReactingCloudI.H
@@ -75,6 +75,39 @@ Foam::ReactingCloud<CloudType>::phaseChange()
 }
 
 
+template<class CloudType>
+inline void Foam::ReactingCloud<CloudType>::transferToCarrier
+(
+    const parcelType& p,
+    const typename parcelType::trackingData& td
+)
+{
+    const auto& comp = this->composition();
+
+    const label celli = p.cell();
+
+    const scalar m = p.nParticle()*p.mass();
+
+    this->rhokTrans()[celli] += m;
+
+    this->UTrans()[celli] += m*p.U();
+
+    const scalar pc = td.pc();
+    const scalar T = p.T();
+    const auto& Y = p.Y();
+
+    forAll(Y, i)
+    {
+        const scalar dm = m*p.Y[i];
+        const label gid = comp.localToCarrierId(0, i);
+        const scalar hs = comp.carrier().Hs(gid, pc, T);
+
+        this->rhoTrans(gid)[celli] += dm;
+        this->hsTrans()[celli] += dm*hs;
+    }
+}
+
+
 template<class CloudType>
 inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
 Foam::ReactingCloud<CloudType>::rhoTrans(const label i)
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
index f8ba3ae2342..2c26b4f545f 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloud.H
@@ -251,6 +251,16 @@ public:
                 surfaceReaction();
 
 
+            // Sources
+
+                //- Transfer the effect of parcel to the carrier phase
+                inline void transferToCarrier
+                (
+                    const parcelType& p,
+                    const typename parcelType::trackingData& td
+                );
+
+
         // Cloud evolution functions
 
             //- Set parcel thermo properties
diff --git a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudI.H
index d06d65ea8e1..d3ff72b3cd2 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ReactingMultiphaseCloud/ReactingMultiphaseCloudI.H
@@ -95,4 +95,51 @@ Foam::ReactingMultiphaseCloud<CloudType>::surfaceReaction()
 }
 
 
+template<class CloudType>
+inline void Foam::ReactingMultiphaseCloud<CloudType>::transferToCarrier
+(
+    const parcelType& p,
+    const typename parcelType::trackingData& td
+)
+{
+    const label celli = p.cell();
+
+    const scalar m = p.nParticle()*p.mass();
+    const scalar pc = td.pc();
+    const scalar T = p.T();
+
+    this->rhokTrans()[celli] += m;
+
+    this->UTrans()[celli] += m*p.U();
+
+    const auto& comp = this->composition();
+    const label idG = comp.idGas();
+    const label idL = comp.idLiquid();
+    // const label idS = composition.idSolid();
+
+    // Absorb parcel into carrier phase
+    auto transfer = [&]
+    (
+        const label phaseType,
+        const label phasei,
+        const scalarField& Y
+    )
+    {
+        const scalar YMix = p.Y()[phaseType];
+
+        forAll(Y, i)
+        {
+            const label gid = comp.localToCarrierId(phaseType, i);
+            this->rhoTrans(gid)[celli] += m*YMix*Y[i];
+            this->hsTrans()[celli] += m*YMix*comp.Hs(phasei, Y, pc, T);
+        }
+    };
+
+    transfer(parcelType::GAS, idG, p.YGas());
+    transfer(parcelType::LIQ, idL, p.YLiquid());
+    // No mapping between solid components and carrier phase
+    //transfer(parcelType::SLD, idS, p.YSolid());
+}
+
+
 // ************************************************************************* //
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
index 47dfcb3949a..7a9a8d47416 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
@@ -285,6 +285,14 @@ public:
 
             // Sources
 
+                //- Transfer the effect of parcel to the carrier phase
+                inline void transferToCarrier
+                (
+                    const parcelType& p,
+                    const typename parcelType::trackingData& td
+                );
+
+
                 // Enthalpy
 
                     //- Sensible enthalpy transfer [J/kg]
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
index e0dbbb8b589..9899a5f0c51 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloudI.H
@@ -190,6 +190,19 @@ Foam::ThermoCloud<CloudType>::radAreaPT4() const
 }
 
 
+template<class CloudType>
+inline void Foam::ThermoCloud<CloudType>::transferToCarrier
+(
+    const parcelType& p,
+    const typename parcelType::trackingData& td
+)
+{
+    CloudType::transferToCarrier(p, td);
+
+    hsTrans()[p.cell()] += p.nParticle()*p.mass()*p.hs();
+}
+
+
 template<class CloudType>
 inline Foam::DimensionedField<Foam::scalar, Foam::volMesh>&
 Foam::ThermoCloud<CloudType>::hsTrans()
-- 
GitLab