From 0e9a699c1fedc234d0dc45a5dc83565a747fdd06 Mon Sep 17 00:00:00 2001
From: sergio <s.ferraris@opencfd.co.uk>
Date: Mon, 1 Jun 2020 12:53:30 -0700
Subject: [PATCH] COM: Speratation of htc FO from general FO and reactingEuler
 solvers.

The phase systems tables for multiphase solver create conflict
between each other as they are defined in the same namespace and using
similar class names. Thereforer a special htc FO for reactingEulerSolver
was added named 'reactingEulerHtcModel' to the FO located in
phaseSystemModels/reactingEulerFoam/functionObjects/

This commit does the following:
1) Change functionObjects for solvers/reactingEulerFoam to src/phaseSystemModels
2) Delete links for fieldFunctionObect to multiphase libs to avoid
conflicts
3) Create a new FO for htc for reactingEulerFoam called reactingEulerHtcMode
---
 .../multiphase/reactingEulerFoam/Allwclean    |   1 -
 .../multiphase/reactingEulerFoam/Allwmake     |   1 -
 src/Allwmake                                  |   3 +-
 src/functionObjects/field/Make/options        |   4 +-
 .../heatTransferCoeff/heatTransferCoeff.C     |   2 +-
 .../ReynoldsAnalogy/ReynoldsAnalogy.C         |   6 +-
 .../ReynoldsAnalogy/ReynoldsAnalogy.H         |   6 +-
 .../fixedReferenceTemperature.C               |   7 +-
 .../fixedReferenceTemperature.H               |   6 +-
 .../heatTransferCoeffModel.C                  |  31 +--
 .../heatTransferCoeffModel.H                  |  24 ++-
 .../localReferenceTemperature.C               |   7 +-
 .../localReferenceTemperature.H               |   6 +-
 src/phaseSystemModels/Allwclean               |   1 +
 src/phaseSystemModels/Allwmake                |   2 +
 .../functionObjects/Make/files                |   1 +
 .../functionObjects/Make/options              |   0
 .../functionObjects/phaseForces/phaseForces.C |   0
 .../functionObjects/phaseForces/phaseForces.H |   0
 .../reactingEulerHtcModel.C                   | 182 ++++++++++++++++++
 .../reactingEulerHtcModel.H                   | 128 ++++++++++++
 .../sizeDistribution/sizeDistribution.C       |   0
 .../sizeDistribution/sizeDistribution.H       |   0
 .../hotRoom/system/controlDict                |  15 ++
 .../solidQuenching2D/system/controlDict       |  10 +-
 25 files changed, 392 insertions(+), 51 deletions(-)
 rename {applications/solvers/multiphase => src/phaseSystemModels}/reactingEulerFoam/functionObjects/Make/files (72%)
 rename {applications/solvers/multiphase => src/phaseSystemModels}/reactingEulerFoam/functionObjects/Make/options (100%)
 rename {applications/solvers/multiphase => src/phaseSystemModels}/reactingEulerFoam/functionObjects/phaseForces/phaseForces.C (100%)
 rename {applications/solvers/multiphase => src/phaseSystemModels}/reactingEulerFoam/functionObjects/phaseForces/phaseForces.H (100%)
 create mode 100644 src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.C
 create mode 100644 src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.H
 rename {applications/solvers/multiphase => src/phaseSystemModels}/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.C (100%)
 rename {applications/solvers/multiphase => src/phaseSystemModels}/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.H (100%)

diff --git a/applications/solvers/multiphase/reactingEulerFoam/Allwclean b/applications/solvers/multiphase/reactingEulerFoam/Allwclean
index 2fe4eb69c0e..4ac3e56e70a 100755
--- a/applications/solvers/multiphase/reactingEulerFoam/Allwclean
+++ b/applications/solvers/multiphase/reactingEulerFoam/Allwclean
@@ -3,6 +3,5 @@ cd "${0%/*}" || exit    # Run from this directory
 
 wclean reactingTwoPhaseEulerFoam
 wclean reactingMultiphaseEulerFoam
-wclean libso functionObjects
 
 #------------------------------------------------------------------------------
diff --git a/applications/solvers/multiphase/reactingEulerFoam/Allwmake b/applications/solvers/multiphase/reactingEulerFoam/Allwmake
index 22b8bfef5ce..afb6570f3af 100755
--- a/applications/solvers/multiphase/reactingEulerFoam/Allwmake
+++ b/applications/solvers/multiphase/reactingEulerFoam/Allwmake
@@ -16,6 +16,5 @@ esac
 
 reactingTwoPhaseEulerFoam/Allwmake $targetType $*
 reactingMultiphaseEulerFoam/Allwmake $targetType $*
-wmake $targetType functionObjects
 
 #------------------------------------------------------------------------------
diff --git a/src/Allwmake b/src/Allwmake
index 812b206ecbf..1bcafada44b 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -100,8 +100,9 @@ wmake $targetType engine
 
 conversion/Allwmake $targetType $*
 
-phaseSystemModels/Allwmake $targetType $*
 functionObjects/Allwmake $targetType $*
+phaseSystemModels/Allwmake $targetType $*
+
 
 wmake $targetType lumpedPointMotion
 wmake $targetType sixDoFRigidBodyMotion
diff --git a/src/functionObjects/field/Make/options b/src/functionObjects/field/Make/options
index 03f219f2604..c24acfb6320 100644
--- a/src/functionObjects/field/Make/options
+++ b/src/functionObjects/field/Make/options
@@ -38,6 +38,4 @@ LIB_LIBS = \
     -lcompressibleTurbulenceModels \
     -lchemistryModel \
     -lreactionThermophysicalModels \
-    -lpairPatchAgglomeration \
-    -ltwoPhaseReactingTurbulenceModels \
-    -lreactingPhaseSystem
+    -lpairPatchAgglomeration
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
index 9f66f0a86c6..6a37e30b5a9 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
@@ -47,7 +47,7 @@ bool Foam::functionObjects::heatTransferCoeff::calc()
 {
     volScalarField& htc = mesh_.lookupObjectRef<volScalarField>(resultName_);
 
-    htcModelPtr_->calc(htc);
+    htcModelPtr_->calc(htc, htcModelPtr_->q());
 
     return true;
 }
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C
index 3cd1f326428..a32e632c384 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C
@@ -243,7 +243,11 @@ bool Foam::heatTransferCoeffModels::ReynoldsAnalogy::read
 }
 
 
-void Foam::heatTransferCoeffModels::ReynoldsAnalogy::htc(volScalarField& htc)
+void Foam::heatTransferCoeffModels::ReynoldsAnalogy::htc
+(
+    volScalarField& htc,
+    const FieldField<Field, scalar>& q
+)
 {
     const FieldField<Field, scalar> CfBf(Cf());
     const scalar magU = mag(URef_);
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H
index 3e9b463622d..1f227dd7769 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H
@@ -131,7 +131,11 @@ protected:
         tmp<FieldField<Field, scalar>> Cf() const;
 
         //- Set the heat transfer coefficient
-        virtual void htc(volScalarField& htc);
+        virtual void htc
+        (
+            volScalarField& htc,
+            const FieldField<Field, scalar>& q
+        );
 
 
         //- No copy construct
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C
index d2bd89459aa..e7f8b7a72ea 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C
@@ -81,10 +81,11 @@ bool Foam::heatTransferCoeffModels::fixedReferenceTemperature::read
 
 void Foam::heatTransferCoeffModels::fixedReferenceTemperature::htc
 (
-    volScalarField& htc
+    volScalarField& htc,
+    const FieldField<Field, scalar>& q
 )
 {
-    const FieldField<Field, scalar> qBf(q());
+    //const FieldField<Field, scalar> qBf(q());
     const volScalarField& T = mesh_.lookupObject<volScalarField>(TName_);
     const volScalarField::Boundary& Tbf = T.boundaryField();
     const scalar eps = ROOTVSMALL;
@@ -92,7 +93,7 @@ void Foam::heatTransferCoeffModels::fixedReferenceTemperature::htc
     volScalarField::Boundary& htcBf = htc.boundaryFieldRef();
     for (const label patchi : patchSet_)
     {
-        htcBf[patchi] = qBf[patchi]/(TRef_ - Tbf[patchi] + eps);
+        htcBf[patchi] = q[patchi]/(TRef_ - Tbf[patchi] + eps);
     }
 }
 
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.H
index e5f17ea8da0..589c48b7a3f 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.H
@@ -94,7 +94,11 @@ protected:
     // Protected Member Functions
 
         //- Set the heat transfer coefficient
-        virtual void htc(volScalarField& htc);
+        virtual void htc
+        (
+            volScalarField& htc,
+            const FieldField<Field, scalar>& q
+        );
 
         //- No copy construct
         fixedReferenceTemperature(const fixedReferenceTemperature&) = delete;
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C
index 0e078a8d784..8f1d013e65a 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C
@@ -30,7 +30,6 @@ License
 #include "fluidThermo.H"
 #include "turbulentTransportModel.H"
 #include "turbulentFluidThermoModel.H"
-#include "phaseSystem.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -91,28 +90,6 @@ Foam::heatTransferCoeffModel::q() const
             q[patchi] = alphabf[patchi]*hebf[patchi].snGrad();
         }
     }
-    else if (mesh_.foundObject<phaseSystem>("phaseProperties"))
-    {
-        const phaseSystem& fluid =
-        (
-            mesh_.lookupObject<phaseSystem>("phaseProperties")
-        );
-
-        for (label patchi : patchSet_)
-        {
-            forAll(fluid.phases(), phasei)
-            {
-                const phaseModel& phase = fluid.phases()[phasei];
-                const fvPatchScalarField& alpha =
-                    phase.boundaryField()[patchi];
-                const volScalarField& he = phase.thermo().he();
-                const volScalarField::Boundary& hebf = he.boundaryField();
-
-                q[patchi] +=
-                    alpha*phase.alphaEff(patchi)()*hebf[patchi].snGrad();
-            }
-        }
-    }
     else
     {
         FatalErrorInFunction
@@ -170,9 +147,13 @@ bool Foam::heatTransferCoeffModel::read(const dictionary& dict)
 }
 
 
-bool Foam::heatTransferCoeffModel::calc(volScalarField& result)
+bool Foam::heatTransferCoeffModel::calc
+(
+    volScalarField& result,
+    const FieldField<Field, scalar>& q
+)
 {
-    htc(result);
+    htc(result, q);
 
     return true;
 }
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
index d9e9ec13b6f..35ca55a042d 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
@@ -64,9 +64,10 @@ class fvMesh;
 
 class heatTransferCoeffModel
 {
-protected:
 
-    // Protected Data
+public:
+
+    // Public Data
 
         //- Mesh reference
         const fvMesh& mesh_;
@@ -81,12 +82,17 @@ protected:
         word qrName_;
 
 
+protected:
+
     // Protected Member Functions
 
-        tmp<FieldField<Field, scalar>> q() const;
 
         //- Set the heat transfer coefficient
-        virtual void htc(volScalarField& htc) = 0;
+        virtual void htc
+        (
+            volScalarField& htc,
+            const FieldField<Field, scalar>& q
+        ) = 0;
 
         //- No copy construct
         heatTransferCoeffModel(const heatTransferCoeffModel&) = delete;
@@ -148,7 +154,15 @@ public:
         //- Read from dictionary
         virtual bool read(const dictionary& dict);
 
-        virtual bool calc(volScalarField& result);
+        virtual bool calc
+        (
+            volScalarField& result,
+            const FieldField<Field, scalar>& q
+        );
+
+        //- Return q
+        tmp<FieldField<Field, scalar>> q() const;
+
 };
 
 
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C
index b26f01502eb..841d011d497 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C
@@ -74,10 +74,11 @@ bool Foam::heatTransferCoeffModels::localReferenceTemperature::read
 
 void Foam::heatTransferCoeffModels::localReferenceTemperature::htc
 (
-    volScalarField& htc
+    volScalarField& htc,
+    const FieldField<Field, scalar>& q
 )
 {
-    const FieldField<Field, scalar> qBf(q());
+    //const FieldField<Field, scalar> qBf(q());
     const volScalarField& T = mesh_.lookupObject<volScalarField>(TName_);
     const volScalarField::Boundary& Tbf = T.boundaryField();
     const scalar eps = ROOTVSMALL;
@@ -87,7 +88,7 @@ void Foam::heatTransferCoeffModels::localReferenceTemperature::htc
     for (const label patchi : patchSet_)
     {
         const scalarField Tc(Tbf[patchi].patchInternalField());
-        htcBf[patchi] = qBf[patchi]/(Tc - Tbf[patchi] + eps);
+        htcBf[patchi] = q[patchi]/(Tc - Tbf[patchi] + eps);
     }
 }
 
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H
index f7578eec4d9..77f2f7b980e 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H
@@ -95,7 +95,11 @@ protected:
     // Protected Member Functions
 
         //- Set the heat transfer coefficient
-        virtual void htc(volScalarField& htc);
+        virtual void htc
+        (
+            volScalarField& htc,
+            const FieldField<Field, scalar>& q
+        );
 
 
 public:
diff --git a/src/phaseSystemModels/Allwclean b/src/phaseSystemModels/Allwclean
index ab4d65ca035..cc8f941470c 100755
--- a/src/phaseSystemModels/Allwclean
+++ b/src/phaseSystemModels/Allwclean
@@ -11,5 +11,6 @@ wclean libso reactingEulerFoam/reactingMultiphaseEulerFoam/multiphaseCompressibl
 
 wclean libso reactingEulerFoam/reactingTwoPhaseEulerFoam/twoPhaseSystem
 wclean libso reactingEulerFoam/reactingTwoPhaseEulerFoam/twoPhaseCompressibleTurbulenceModels
+wclean libso  reactingEulerFoam/functionObjects
 
 #------------------------------------------------------------------------------
diff --git a/src/phaseSystemModels/Allwmake b/src/phaseSystemModels/Allwmake
index 686604a701f..c4a18999fbf 100755
--- a/src/phaseSystemModels/Allwmake
+++ b/src/phaseSystemModels/Allwmake
@@ -28,4 +28,6 @@ wmake $targetType  reactingEulerFoam/reactingTwoPhaseEulerFoam/twoPhaseCompressi
 
 wmake $targetType  reactingEulerFoam/phaseSystems
 
+wmake $targetType  reactingEulerFoam/functionObjects
+
 #------------------------------------------------------------------------------
diff --git a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/Make/files b/src/phaseSystemModels/reactingEulerFoam/functionObjects/Make/files
similarity index 72%
rename from applications/solvers/multiphase/reactingEulerFoam/functionObjects/Make/files
rename to src/phaseSystemModels/reactingEulerFoam/functionObjects/Make/files
index ca7d02162db..567c9619ea0 100644
--- a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/Make/files
+++ b/src/phaseSystemModels/reactingEulerFoam/functionObjects/Make/files
@@ -1,4 +1,5 @@
 sizeDistribution/sizeDistribution.C
 phaseForces/phaseForces.C
+reactingEulerHtcModel/reactingEulerHtcModel.C
 
 LIB = $(FOAM_LIBBIN)/libreactingEulerFoamFunctionObjects
diff --git a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/Make/options b/src/phaseSystemModels/reactingEulerFoam/functionObjects/Make/options
similarity index 100%
rename from applications/solvers/multiphase/reactingEulerFoam/functionObjects/Make/options
rename to src/phaseSystemModels/reactingEulerFoam/functionObjects/Make/options
diff --git a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/phaseForces/phaseForces.C b/src/phaseSystemModels/reactingEulerFoam/functionObjects/phaseForces/phaseForces.C
similarity index 100%
rename from applications/solvers/multiphase/reactingEulerFoam/functionObjects/phaseForces/phaseForces.C
rename to src/phaseSystemModels/reactingEulerFoam/functionObjects/phaseForces/phaseForces.C
diff --git a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/phaseForces/phaseForces.H b/src/phaseSystemModels/reactingEulerFoam/functionObjects/phaseForces/phaseForces.H
similarity index 100%
rename from applications/solvers/multiphase/reactingEulerFoam/functionObjects/phaseForces/phaseForces.H
rename to src/phaseSystemModels/reactingEulerFoam/functionObjects/phaseForces/phaseForces.H
diff --git a/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.C b/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.C
new file mode 100644
index 00000000000..c6012464ad8
--- /dev/null
+++ b/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.C
@@ -0,0 +1,182 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "reactingEulerHtcModel.H"
+#include "phaseSystem.H"
+#include "addToRunTimeSelectionTable.H"
+#include "dictionary.H"
+
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+    defineTypeNameAndDebug(reactingEulerHtcModel, 0);
+    addToRunTimeSelectionTable
+        (functionObject, reactingEulerHtcModel, dictionary);
+}
+}
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+
+Foam::tmp<Foam::FieldField<Foam::Field, Foam::scalar>>
+Foam::functionObjects::reactingEulerHtcModel::q() const
+{
+
+    const fvMesh& mesh = htcModelPtr_->mesh_;
+
+    const volScalarField& T =
+        mesh.lookupObject<volScalarField>(htcModelPtr_->TName_);
+
+    const volScalarField::Boundary& Tbf = T.boundaryField();
+
+    auto tq = tmp<FieldField<Field, scalar>>::New(Tbf.size());
+    auto& q = tq.ref();
+
+    forAll(q, patchi)
+    {
+        q.set(patchi, new Field<scalar>(Tbf[patchi].size(), Zero));
+    }
+
+    if (mesh.foundObject<phaseSystem>("phaseProperties"))
+    {
+        const phaseSystem& fluid =
+        (
+            mesh.lookupObject<phaseSystem>("phaseProperties")
+        );
+
+        for (label patchi : htcModelPtr_->patchSet_)
+        {
+            forAll(fluid.phases(), phasei)
+            {
+                const phaseModel& phase = fluid.phases()[phasei];
+                const fvPatchScalarField& alpha =
+                    phase.boundaryField()[patchi];
+                const volScalarField& he = phase.thermo().he();
+                const volScalarField::Boundary& hebf = he.boundaryField();
+
+                q[patchi] +=
+                    alpha*phase.alphaEff(patchi)()*hebf[patchi].snGrad();
+            }
+        }
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Unable to find a valid phaseSystem to evaluate q"
+            << exit(FatalError);
+    }
+
+    // Add radiative heat flux contribution if present
+
+    const volScalarField* qrPtr =
+        mesh.cfindObject<volScalarField>(htcModelPtr_->qrName_);
+
+    if (qrPtr)
+    {
+        const volScalarField::Boundary& qrbf = qrPtr->boundaryField();
+
+        for (const label patchi : htcModelPtr_->patchSet_)
+        {
+            q[patchi] += qrbf[patchi];
+        }
+    }
+
+    return tq;
+}
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+bool Foam::functionObjects::reactingEulerHtcModel::calc()
+{
+    volScalarField& htc =
+        htcModelPtr_->mesh_.lookupObjectRef<volScalarField>(resultName_);
+
+    htcModelPtr_->calc(htc, q());
+
+    return true;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::functionObjects::reactingEulerHtcModel::reactingEulerHtcModel
+(
+    const word& name,
+    const Time& runTime,
+    const dictionary& dict
+)
+:
+    fieldExpression(name, runTime, dict),
+    htcModelPtr_()
+{
+    read(dict);
+
+    setResultName(typeName, name + ":htc:" + htcModelPtr_->type());
+
+    volScalarField* heatTransferCoeffPtr
+    (
+        new volScalarField
+        (
+            IOobject
+            (
+                resultName_,
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedScalar(dimPower/dimArea/dimTemperature, Zero)
+        )
+    );
+
+    mesh_.objectRegistry::store(heatTransferCoeffPtr);
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::reactingEulerHtcModel::read(const dictionary& dict)
+{
+    if (fieldExpression::read(dict))
+    {
+        htcModelPtr_ =
+            heatTransferCoeffModel::New(dict, mesh_, fieldName_);
+
+        htcModelPtr_->read(dict);
+
+        return true;
+    }
+
+    return false;
+}
+
+// ************************************************************************* //
diff --git a/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.H b/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.H
new file mode 100644
index 00000000000..e989b2ef909
--- /dev/null
+++ b/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.H
@@ -0,0 +1,128 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Namespace
+    Foam::reactingEulerHtcModel
+
+Description
+    A heat transfer coefficient for reactingEuler solvers
+
+Class
+    Foam::reactingEulerHtcModel
+
+SourceFiles
+    reactingEulerHtcModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef reactingEulerHtcModel_H
+#define reactingEulerHtcModel_H
+
+#include "HashSet.H"
+#include "volFields.H"
+#include "fieldExpression.H"
+#include "runTimeSelectionTables.H"
+#include "heatTransferCoeffModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+                   Class reactingEulerHtcModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class reactingEulerHtcModel
+:
+    public fieldExpression
+{
+private:
+
+    //- Heat transfer coefficient model
+    autoPtr<heatTransferCoeffModel> htcModelPtr_;
+
+
+    // Private Member Functions
+
+        //- No copy construct
+        reactingEulerHtcModel(const reactingEulerHtcModel&) = delete;
+
+        //- No copy assignment
+        void operator=(const reactingEulerHtcModel&) = delete;
+
+
+protected:
+
+        //- Calculate the heat transfer coefficient field and return true
+        // if successful
+        virtual bool calc();
+
+        //- Calculate heat flux
+        tmp<FieldField<Field, scalar>> q() const;
+
+
+
+public:
+
+    //- Runtime type information
+    TypeName("reactingEulerHtcModel");
+
+
+    // Constructors
+
+        //- Construct from components
+        reactingEulerHtcModel
+        (
+            const word& name,
+            const Time& runTime,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~reactingEulerHtcModel() = default;
+
+    // Member Functions
+
+        //- Read the heatTransferCoeff data
+        virtual bool read(const dictionary&);
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.C b/src/phaseSystemModels/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.C
similarity index 100%
rename from applications/solvers/multiphase/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.C
rename to src/phaseSystemModels/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.C
diff --git a/applications/solvers/multiphase/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.H b/src/phaseSystemModels/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.H
similarity index 100%
rename from applications/solvers/multiphase/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.H
rename to src/phaseSystemModels/reactingEulerFoam/functionObjects/sizeDistribution/sizeDistribution.H
diff --git a/tutorials/heatTransfer/buoyantPimpleFoam/hotRoom/system/controlDict b/tutorials/heatTransfer/buoyantPimpleFoam/hotRoom/system/controlDict
index eb8dd8a8e64..13683da17de 100644
--- a/tutorials/heatTransfer/buoyantPimpleFoam/hotRoom/system/controlDict
+++ b/tutorials/heatTransfer/buoyantPimpleFoam/hotRoom/system/controlDict
@@ -49,4 +49,19 @@ adjustTimeStep  no;
 
 maxCo           0.5;
 
+functions
+{
+    htc
+    {
+        type            heatTransferCoeff;
+        libs            (fieldFunctionObjects);
+        field           T;
+        writeControl    outputTime;
+        writeInterval   1;
+        htcModel        fixedReferenceTemperature;
+        patches         (ceiling);
+        TRef            373;
+    }
+}
+
 // ************************************************************************* //
diff --git a/tutorials/heatTransfer/chtMultiRegionTwoPhaseEulerFoam/solidQuenching2D/system/controlDict b/tutorials/heatTransfer/chtMultiRegionTwoPhaseEulerFoam/solidQuenching2D/system/controlDict
index 9434d196ca6..bf2aa073505 100644
--- a/tutorials/heatTransfer/chtMultiRegionTwoPhaseEulerFoam/solidQuenching2D/system/controlDict
+++ b/tutorials/heatTransfer/chtMultiRegionTwoPhaseEulerFoam/solidQuenching2D/system/controlDict
@@ -34,7 +34,7 @@ deltaT          1e-6;
 
 writeControl    adjustable;
 
-writeInterval   0.1;
+writeInterval   0.01;
 
 purgeWrite      0;
 
@@ -63,8 +63,8 @@ functions
 {
     htc
     {
-        type            heatTransferCoeff;
-        libs            (fieldFunctionObjects);
+        type            reactingEulerHtcModel;
+        libs            (reactingEulerFoamFunctionObjects);
         region          water;
         field           T.liquid;
         writeControl    outputTime;
@@ -74,6 +74,7 @@ functions
         TRef            373;
     }
 
+    
     htcSurfaceFieldValue
     {
         type            surfaceFieldValue;
@@ -94,8 +95,9 @@ functions
 
         operation       areaAverage;
 
-        fields          ( heatTransferCoeff(T.liquid) );
+        fields          ( reactingEulerHtcModel(T.liquid) );
     }
+    
 }
 
 // ************************************************************************* //
-- 
GitLab