From 95f7ed0342ae9ce1bb1b92b71ef8e824a288fab9 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: Separate htc FO from general FO and reactingEuler
 solvers (#1714)

The phase systems tables for multiphase solvers create conflict
between each other as they are defined in the same namespace and using
similar class names.

Therefore a special htc function object for reactingEulerSolver was
added (reactingEulerHtcModel), located under
src/phaseSystemModels/reactingEulerFoam/functionObjects/

This commit includes the following:

- Relocate solvers/reactingEulerFoam functionObjects to
  src/phaseSystemModels
- Remove links for fieldFunctionObject to multiphase libs to avoid
  conflicts
- New FO for htc for reactingEulerFoam called reactingEulerHtcModel
---
 .../multiphase/reactingEulerFoam/Allwclean    |   1 -
 .../multiphase/reactingEulerFoam/Allwmake     |   1 -
 src/Allwmake                                  |   2 +-
 src/functionObjects/field/Make/options        |   4 +-
 .../heatTransferCoeff/heatTransferCoeff.C     |  12 +-
 .../heatTransferCoeff/heatTransferCoeff.H     |  23 +--
 .../ReynoldsAnalogy/ReynoldsAnalogy.C         |   6 +-
 .../ReynoldsAnalogy/ReynoldsAnalogy.H         |   6 +-
 .../fixedReferenceTemperature.C               |   7 +-
 .../fixedReferenceTemperature.H               |   6 +-
 .../heatTransferCoeffModel.C                  |  39 +---
 .../heatTransferCoeffModel.H                  |  49 ++++-
 .../localReferenceTemperature.C               |   7 +-
 .../localReferenceTemperature.H               |  19 +-
 src/phaseSystemModels/Allwclean               |   1 +
 src/phaseSystemModels/Allwmake                |   1 +
 .../functionObjects/Make/files                |   1 +
 .../functionObjects/Make/options              |   0
 .../functionObjects/phaseForces/phaseForces.C |   0
 .../functionObjects/phaseForces/phaseForces.H |   0
 .../reactingEulerHtcModel.C                   | 178 ++++++++++++++++++
 .../reactingEulerHtcModel.H                   | 122 ++++++++++++
 .../sizeDistribution/sizeDistribution.C       |   0
 .../sizeDistribution/sizeDistribution.H       |   0
 .../hotRoom/system/controlDict                |  15 ++
 .../solidQuenching2D/system/controlDict       |   6 +-
 26 files changed, 421 insertions(+), 85 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..c2baebc1cae 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -100,8 +100,8 @@ 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..d9b48b62d17 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2017 OpenCFD Ltd.
+    Copyright (C) 2017-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -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;
 }
@@ -63,14 +63,13 @@ Foam::functionObjects::heatTransferCoeff::heatTransferCoeff
 )
 :
     fieldExpression(name, runTime, dict),
-    htcModelPtr_()
+    htcModelPtr_(nullptr)
 {
     read(dict);
 
     setResultName(typeName, name + ":htc:" + htcModelPtr_->type());
 
-    volScalarField* heatTransferCoeffPtr
-    (
+    volScalarField* heatTransferCoeffPtr =
         new volScalarField
         (
             IOobject
@@ -83,8 +82,7 @@ Foam::functionObjects::heatTransferCoeff::heatTransferCoeff
             ),
             mesh_,
             dimensionedScalar(dimPower/dimArea/dimTemperature, Zero)
-        )
-    );
+        );
 
     mesh_.objectRegistry::store(heatTransferCoeffPtr);
 }
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H
index 01c42773305..08cf4258fa7 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H
@@ -122,6 +122,7 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class heatTransferCoeffModel;
 
 namespace functionObjects
@@ -135,16 +136,19 @@ class heatTransferCoeff
 :
     public fieldExpression
 {
-
-private:
-
-    // Private data
+    // Private Data
 
         //- Heat transfer coefficient model
         autoPtr<heatTransferCoeffModel> htcModelPtr_;
 
 
-    // Private Member Functions
+protected:
+
+    // Protected Member Functions
+
+        //- Calculate the heat transfer coefficient field
+        //  \return true on success
+        virtual bool calc();
 
         //- No copy construct
         heatTransferCoeff(const heatTransferCoeff&) = delete;
@@ -153,13 +157,6 @@ private:
         void operator=(const heatTransferCoeff&) = delete;
 
 
-protected:
-
-        //- Calculate the heat transfer coefficient field and return true
-        // if successful
-        virtual bool calc();
-
-
 public:
 
     //- Runtime type information
@@ -185,7 +182,7 @@ public:
     // Member Functions
 
         //- Read the heatTransferCoeff data
-        virtual bool read(const dictionary&);
+        virtual bool read(const dictionary& dict);
 };
 
 
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..4fefa38596b 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,32 +90,10 @@ 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
-            << "Unable to find a valid thermo model to evaluate q"
+            << "Unable to find a valid thermo model to evaluate q" << nl
             << exit(FatalError);
     }
 
@@ -158,11 +135,7 @@ Foam::heatTransferCoeffModel::heatTransferCoeffModel
 
 bool Foam::heatTransferCoeffModel::read(const dictionary& dict)
 {
-    patchSet_ =
-        mesh_.boundaryMesh().patchSet
-        (
-            dict.get<wordRes>("patches")
-        );
+    patchSet_ = mesh_.boundaryMesh().patchSet(dict.get<wordRes>("patches"));
 
     dict.readIfPresent("qr", qrName_);
 
@@ -170,9 +143,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..ebeaf24da60 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
@@ -47,7 +47,6 @@ SourceFiles
 #include "dictionary.H"
 #include "HashSet.H"
 #include "volFields.H"
-
 #include "runTimeSelectionTables.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@@ -66,7 +65,7 @@ class heatTransferCoeffModel
 {
 protected:
 
-    // Protected Data
+    // Public Data
 
         //- Mesh reference
         const fvMesh& mesh_;
@@ -77,16 +76,20 @@ protected:
         //- Temperature name
         const word TName_;
 
-        //- Name of radiative heat flux name, default = qr
+        //- Name of radiative heat flux (default = qr)
         word qrName_;
 
 
-    // Protected Member Functions
+protected:
 
-        tmp<FieldField<Field, scalar>> q() const;
+    // Protected Member Functions
 
         //- 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;
@@ -145,10 +148,42 @@ public:
 
     // Member Functions
 
+        //- The mesh reference
+        const fvMesh& mesh() const
+        {
+            return mesh_;
+        }
+
+        //- Wall patches to process
+        const labelHashSet& patchSet() const
+        {
+            return patchSet_;
+        }
+
+        //- Temperature name
+        const word& TName() const
+        {
+            return TName_;
+        }
+
+        //- Name of radiative heat flux
+        const word& qrName() const
+        {
+            return qrName_;
+        }
+
+
         //- 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 boundary fields
+        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..1492d33c4a6 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..7175b209166 100644
--- a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H
@@ -81,7 +81,16 @@ class localReferenceTemperature
 :
     public heatTransferCoeffModel
 {
-    // Private Member Functions
+protected:
+
+    // Protected Member Functions
+
+        //- Set the heat transfer coefficient
+        virtual void htc
+        (
+            volScalarField& htc,
+            const FieldField<Field, scalar>& q
+        );
 
         //- No copy construct
         localReferenceTemperature(const localReferenceTemperature&) = delete;
@@ -90,14 +99,6 @@ class localReferenceTemperature
         void operator=(const localReferenceTemperature&) = delete;
 
 
-protected:
-
-    // Protected Member Functions
-
-        //- Set the heat transfer coefficient
-        virtual void htc(volScalarField& htc);
-
-
 public:
 
     //- Runtime type information
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..65eb00e8ee7 100755
--- a/src/phaseSystemModels/Allwmake
+++ b/src/phaseSystemModels/Allwmake
@@ -27,5 +27,6 @@ wmake $targetType  reactingEulerFoam/reactingTwoPhaseEulerFoam/twoPhaseSystem
 wmake $targetType  reactingEulerFoam/reactingTwoPhaseEulerFoam/twoPhaseCompressibleTurbulenceModels
 
 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..85eb2500ba5
--- /dev/null
+++ b/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.C
@@ -0,0 +1,178 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  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));
+    }
+
+    const auto* fluidPtr =
+        mesh.cfindObject<phaseSystem>("phaseProperties");
+
+    if (!fluidPtr)
+    {
+        FatalErrorInFunction
+            << "Unable to find a valid phaseSystem to evaluate q" << nl
+            << exit(FatalError);
+    }
+
+    const phaseSystem& fluid = *fluidPtr;
+
+    for (const label patchi : htcModelPtr_->patchSet())
+    {
+        for (const phaseModel& phase : fluid.phases())
+        {
+            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();
+        }
+    }
+
+    // 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()
+{
+    auto& 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_(nullptr)
+{
+    read(dict);
+
+    setResultName(typeName, name + ":htc:" + htcModelPtr_->type());
+
+    volScalarField* htcPtr =
+        new volScalarField
+        (
+            IOobject
+            (
+                resultName_,
+                mesh_.time().timeName(),
+                mesh_,
+                IOobject::NO_READ,
+                IOobject::NO_WRITE
+            ),
+            mesh_,
+            dimensionedScalar(dimPower/dimArea/dimTemperature, Zero)
+        );
+
+    mesh_.objectRegistry::store(htcPtr);
+}
+
+
+// * * * * * * * * * * * * * * * 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..7c1536bf7d8
--- /dev/null
+++ b/src/phaseSystemModels/reactingEulerFoam/functionObjects/reactingEulerHtcModel/reactingEulerHtcModel.H
@@ -0,0 +1,122 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  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/>.
+
+Class
+    Foam::reactingEulerHtcModel
+
+Description
+    A heat transfer coefficient for reactingEuler solvers
+
+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 Data
+
+        //- Heat transfer coefficient model
+        autoPtr<heatTransferCoeffModel> htcModelPtr_;
+
+
+protected:
+
+    // Protected Member Functions
+
+        //- Calculate the heat transfer coefficient field
+        //  \return true on success
+        virtual bool calc();
+
+        //- Calculate heat flux
+        tmp<FieldField<Field, scalar>> q() const;
+
+        //- No copy construct
+        reactingEulerHtcModel(const reactingEulerHtcModel&) = delete;
+
+        //- No copy assignment
+        void operator=(const reactingEulerHtcModel&) = delete;
+
+
+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& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // 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..62866a741d6 100644
--- a/tutorials/heatTransfer/chtMultiRegionTwoPhaseEulerFoam/solidQuenching2D/system/controlDict
+++ b/tutorials/heatTransfer/chtMultiRegionTwoPhaseEulerFoam/solidQuenching2D/system/controlDict
@@ -63,8 +63,8 @@ functions
 {
     htc
     {
-        type            heatTransferCoeff;
-        libs            (fieldFunctionObjects);
+        type            reactingEulerHtcModel;
+        libs            (reactingEulerFoamFunctionObjects);
         region          water;
         field           T.liquid;
         writeControl    outputTime;
@@ -94,7 +94,7 @@ functions
 
         operation       areaAverage;
 
-        fields          ( heatTransferCoeff(T.liquid) );
+        fields          ( reactingEulerHtcModel(T.liquid) );
     }
 }
 
-- 
GitLab