diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
new file mode 100644
index 0000000000000000000000000000000000000000..aff33118b4df0b727d9854c6abd483da406914b9
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.C
@@ -0,0 +1,114 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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 "heatTransferCoeff.H"
+#include "dictionary.H"
+#include "heatTransferCoeffModel.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+    defineTypeNameAndDebug(heatTransferCoeff, 0);
+    addToRunTimeSelectionTable(functionObject, heatTransferCoeff, dictionary);
+}
+}
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+bool Foam::functionObjects::heatTransferCoeff::calc()
+{
+    volScalarField& htc = mesh_.lookupObjectRef<volScalarField>(resultName_);
+
+    htcModelPtr_->calc(htc);
+
+    return true;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::functionObjects::heatTransferCoeff::heatTransferCoeff
+(
+    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("0", dimPower/dimArea/dimTemperature, 0.0)
+        )
+    );
+
+    mesh_.objectRegistry::store(heatTransferCoeffPtr);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::heatTransferCoeff::~heatTransferCoeff()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::heatTransferCoeff::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/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H
new file mode 100644
index 0000000000000000000000000000000000000000..7496854c8fd300c6b39b5104a3ef2dde111a43ed
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeff.H
@@ -0,0 +1,199 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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::functionObjects::heatTransferCoeff
+
+Group
+    grpFieldFunctionObjects
+
+Description
+    This function object calculates and writes the heat transfer coefficient
+    as a volScalarField for a set of patches.
+
+    The field is stored on the mesh database so that it can be retrieved and
+    used for other applications.  Heat transfer coefficient, htc [W/m2/K]
+    can be evaluated using one of the following modes:
+    - ReynoldsAnalogy: Reynold's analogy
+    - localReferenceTemperature: local reference temperature
+    - fixedReferenceTemperature: specified reference temperature
+
+Usage
+    Example usage for mode 'ReynoldsAnalogy' for incompressible case
+    \verbatim
+    htc
+    {
+        type        heatTransferCoeff;
+        libs        ("libfieldFunctionObjects.so");
+
+        field       T;
+        patches     ("walls.*");
+
+        htcModel    ReynoldsAnalogy;
+        UInf        (20 0 0);
+        Cp          CpInf;
+        CpInf       1000;
+        rho         rhoInf;
+        rhoInf      1.2;
+    }
+    \endverbatim
+
+    Example usage for mode 'ReynoldsAnalogy' for compressible case
+    \verbatim
+    htc
+    {
+        type        heatTransferCoeff;
+        libs        ("libfieldFunctionObjects.so");
+
+        field       T;
+        patches     ("walls.*");
+
+        htcModel    ReynoldsAnalogy;
+        UInf        (20 0 0);
+    }
+    \endverbatim
+
+    Example usage for mode 'localReferenceTemperature' for compressible case
+    \verbatim
+    htc
+    {
+        type        heatTransferCoeff;
+        libs        ("libfieldFunctionObjects.so");
+
+        field       T;
+        patches     ("walls.*");
+        htcModel    local;
+    }
+    \endverbatim
+
+    Example usage for mode 'fixedReferenceTemperature' for compressible case
+    \verbatim
+    htc
+    {
+        type        heatTransferCoeff;
+        libs        ("libfieldFunctionObjects.so");
+
+        field       T;
+        patches     ("walls.*");
+        htcModel    local;
+        TRef        300;
+    }
+    \endverbatim
+
+See also
+    Foam::functionObjects::fieldExpression
+    Foam::heatTransferCoeffModels::fixedReferenceTemperature
+    Foam::heatTransferCoeffModels::localReferenceTemperature
+
+SourceFiles
+    heatTransferCoeff.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_heatTransferCoeff_H
+#define functionObjects_heatTransferCoeff_H
+
+#include "fieldExpression.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class heatTransferCoeffModel;
+
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+                      Class heatTransferCoeff Declaration
+\*---------------------------------------------------------------------------*/
+
+class heatTransferCoeff
+:
+    public fieldExpression
+{
+
+private:
+
+    // Private data
+
+        //- Heat transfer coefficient model
+        autoPtr<heatTransferCoeffModel> htcModelPtr_;
+
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        heatTransferCoeff(const heatTransferCoeff&) = delete;
+
+        //- Disallow default bitwise assignment
+        void operator=(const heatTransferCoeff&) = delete;
+
+
+protected:
+
+        //- Calculate the heat transfer coefficient field and return true
+        // if successful
+        virtual bool calc();
+
+
+public:
+
+    //- Runtime type information
+    TypeName("heatTransferCoeff");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        heatTransferCoeff
+        (
+            const word& name,
+            const Time& runTime,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~heatTransferCoeff();
+
+
+    // Member Functions
+
+        //- Read the heatTransferCoeff data
+        virtual bool read(const dictionary&);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C
new file mode 100644
index 0000000000000000000000000000000000000000..8a374669556e2497b29a9e5ddc25d43d70a0a639
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.C
@@ -0,0 +1,271 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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 "ReynoldsAnalogy.H"
+#include "fluidThermo.H"
+#include "turbulentTransportModel.H"
+#include "turbulentFluidThermoModel.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace heatTransferCoeffModels
+{
+    defineTypeNameAndDebug(ReynoldsAnalogy, 0);
+    addToRunTimeSelectionTable
+    (
+        heatTransferCoeffModel,
+        ReynoldsAnalogy,
+        dictionary
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+Foam::tmp<Foam::Field<Foam::scalar>>
+Foam::heatTransferCoeffModels::ReynoldsAnalogy::rho(const label patchi) const
+{
+    if (rhoName_ == "rhoInf")
+    {
+        const label n = mesh_.boundary()[patchi].size();
+        return tmp<Field<scalar>>(new Field<scalar>(n, rhoRef_));
+    }
+    else if (mesh_.foundObject<volScalarField>(rhoName_, false))
+    {
+        const volScalarField& rho =
+            mesh_.lookupObject<volScalarField>(rhoName_);
+        return rho.boundaryField()[patchi];
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Unable to set rho for patch " << patchi
+            << exit(FatalError);
+    }
+
+    return tmp<Field<scalar>>(nullptr);
+}
+
+
+Foam::tmp<Foam::Field<Foam::scalar>>
+Foam::heatTransferCoeffModels::ReynoldsAnalogy::Cp(const label patchi) const
+{
+    if (CpName_ == "CpInf")
+    {
+        const label n = mesh_.boundary()[patchi].size();
+        return tmp<Field<scalar>>(new Field<scalar>(n, CpRef_));
+    }
+    else if (mesh_.foundObject<fluidThermo>(fluidThermo::typeName))
+    {
+        const fluidThermo& thermo =
+            mesh_.lookupObject<fluidThermo>(fluidThermo::typeName);
+
+        const scalarField& pp = thermo.p().boundaryField()[patchi];
+        const scalarField& Tp = thermo.T().boundaryField()[patchi];
+
+        return thermo.Cp(pp, Tp, patchi);
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Unable to set Cp for patch " << patchi
+            << exit(FatalError);
+    }
+
+    return tmp<Field<scalar>>(nullptr);
+}
+
+
+Foam::tmp<Foam::volSymmTensorField>
+Foam::heatTransferCoeffModels::ReynoldsAnalogy::devReff() const
+{
+    typedef compressible::turbulenceModel cmpTurbModel;
+    typedef incompressible::turbulenceModel icoTurbModel;
+
+    if (mesh_.foundObject<cmpTurbModel>(cmpTurbModel::propertiesName))
+    {
+        const cmpTurbModel& turb =
+            mesh_.lookupObject<cmpTurbModel>(cmpTurbModel::propertiesName);
+
+        return turb.devRhoReff()/turb.rho();
+    }
+    else if (mesh_.foundObject<icoTurbModel>(icoTurbModel::propertiesName))
+    {
+        const incompressible::turbulenceModel& turb =
+            mesh_.lookupObject<icoTurbModel>(icoTurbModel::propertiesName);
+
+        return turb.devReff();
+    }
+    else if (mesh_.foundObject<fluidThermo>(fluidThermo::dictName))
+    {
+        const fluidThermo& thermo =
+            mesh_.lookupObject<fluidThermo>(fluidThermo::dictName);
+
+        const volVectorField& U = mesh_.lookupObject<volVectorField>(UName_);
+
+        return -thermo.nu()*dev(twoSymm(fvc::grad(U)));
+    }
+    else if (mesh_.foundObject<transportModel>("transportProperties"))
+    {
+        const transportModel& laminarT =
+            mesh_.lookupObject<transportModel>("transportProperties");
+
+        const volVectorField& U = mesh_.lookupObject<volVectorField>(UName_);
+
+        return -laminarT.nu()*dev(twoSymm(fvc::grad(U)));
+    }
+    else if (mesh_.foundObject<dictionary>("transportProperties"))
+    {
+        const dictionary& transportProperties =
+            mesh_.lookupObject<dictionary>("transportProperties");
+
+        dimensionedScalar nu(transportProperties.lookup("nu"));
+
+        const volVectorField& U = mesh_.lookupObject<volVectorField>(UName_);
+
+        return -nu*dev(twoSymm(fvc::grad(U)));
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "No valid model for viscous stress calculation"
+            << exit(FatalError);
+
+        return volSymmTensorField::null();
+    }
+}
+
+
+Foam::tmp<Foam::FieldField<Foam::Field, Foam::scalar>>
+Foam::heatTransferCoeffModels::ReynoldsAnalogy::Cf() const
+{
+    const volVectorField& U = mesh_.lookupObject<volVectorField>(UName_);
+    const volVectorField::Boundary& Ubf = U.boundaryField();
+
+    tmp<FieldField<Field, scalar>> tCf
+    (
+        new FieldField<Field, scalar>(Ubf.size())
+    );
+
+    FieldField<Field, scalar>& Cf = tCf.ref();
+
+    forAll(Cf, patchi)
+    {
+        Cf.set(patchi, new Field<scalar>(Ubf[patchi].size(), 0));
+    }
+
+    const volSymmTensorField R(devReff());
+    const volSymmTensorField::Boundary& Rbf = R.boundaryField();
+
+    for (label patchi : patchSet_)
+    {
+        const fvPatchVectorField& Up = Ubf[patchi];
+
+        const symmTensorField& Rp = Rbf[patchi];
+
+        const vectorField nHat(Up.patch().nf());
+
+        const scalarField tauByRhop(mag(nHat & Rp));
+
+        Cf[patchi] = 2*tauByRhop/magSqr(URef_);
+    }
+
+    return tCf;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::heatTransferCoeffModels::ReynoldsAnalogy::ReynoldsAnalogy
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& TName
+)
+:
+    heatTransferCoeffModel(dict, mesh, TName),
+    UName_("U"),
+    URef_(vector::zero),
+    rhoName_("rho"),
+    rhoRef_(0.0),
+    CpName_("Cp"),
+    CpRef_(0.0)
+{
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+bool Foam::heatTransferCoeffModels::ReynoldsAnalogy::read
+(
+    const dictionary& dict
+)
+{
+    if (heatTransferCoeffModel::read(dict))
+    {
+        dict.lookup("UInf") >> URef_;
+
+        dict.readIfPresent("Cp", CpName_);
+        if (CpName_ == "CpInf")
+        {
+            dict.lookup("CpInf") >> CpRef_;
+        }
+
+        dict.readIfPresent("rho", rhoName_);
+        if (rhoName_ == "rhoInf")
+        {
+            dict.lookup("rhoInf") >> rhoRef_;
+        }
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::heatTransferCoeffModels::ReynoldsAnalogy::htc(volScalarField& htc)
+{
+    const FieldField<Field, scalar> CfBf(Cf());
+    const scalar magU = mag(URef_);
+
+    volScalarField::Boundary& htcBf = htc.boundaryFieldRef();
+    forAllConstIters(patchSet_, iter)
+    {
+        label patchi = iter.key();
+        const scalarField rhop(rho(patchi));
+        const scalarField Cpp(Cp(patchi));
+
+        htcBf[patchi] = 0.5*rhop*Cpp*magU*CfBf[patchi];
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H
new file mode 100644
index 0000000000000000000000000000000000000000..3265fb8be5bba56fa112bb4c9d92af8e37a877c4
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/ReynoldsAnalogy/ReynoldsAnalogy.H
@@ -0,0 +1,182 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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::heatTransferCoeffModels::ReynoldsAnalogy
+
+Description
+    Heat transfer coefficient calculation based on Reynolds Analogy
+
+    The heat transfer coefficient is derived from the skin friction
+    coefficient:
+
+    \f[
+        C_f = \frac{\tau_w}{0.5 \rho_\infty |U|^2}
+    \f]
+
+    as:
+
+    \f[
+        h = 0.5 \rho_\infty \C_{p,\infty} |U_{\infty}| C_f
+    \f]
+
+Usage
+    Example of function object specification:
+    \verbatim
+        type            heatTransferCoeff;
+        libs            ("libfieldFunctionObjects.so");
+        ...
+    	htcModel	    ReynoldsAnalogy;
+        UInf            (20 0 0);
+        Cp              CpInf;
+        CpInf           1005;
+        ...
+    \endverbatim
+
+    Where the entries comprise:
+    \table
+        Property     | Description             | Required    | Default value
+        type         | type name: heatTransferCoeff | yes    |
+        htcModel     | selected htc model      | yes         |
+        UInf         | reference velocity      | yes |
+        Cp           | specific heat capacity field name | no |
+        rho          | density field name      | no |
+    \endtable
+
+    Note:
+    - to use a reference \c Cp, set \c Cp to \c CpInf
+    - to use a reference \c rho, set \c rho to \c rhoInf
+
+SourceFiles
+    ReynoldsAnalogy.C
+
+SeeAlso
+    Foam::heatTransferCoeffModel
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef heatTransferCoeffModels_ReynoldsAnalogy_H
+#define heatTransferCoeffModels_ReynoldsAnalogy_H
+
+#include "heatTransferCoeffModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace heatTransferCoeffModels
+{
+
+/*---------------------------------------------------------------------------*\
+                   Class ReynoldsAnalogy Declaration
+\*---------------------------------------------------------------------------*/
+
+class ReynoldsAnalogy
+:
+    public heatTransferCoeffModel
+{
+    // Private Member Functions
+
+        //- Disallow copy construct
+        ReynoldsAnalogy(const ReynoldsAnalogy&) = delete;
+
+        //- Disallow default bitwise assignment
+        void operator=(const ReynoldsAnalogy&) = delete;
+
+
+protected:
+
+    // Protected data
+
+        //- Name of velocity field
+        word UName_;
+
+        //- Reference velocity
+        vector URef_;
+
+        //- Name of density field
+        word rhoName_;
+
+        //- Reference density
+        scalar rhoRef_;
+
+        //- Name of specific heat capacity field
+        word CpName_;
+
+        //- Reference specific heat capacity
+        scalar CpRef_;
+
+
+    // Protected Member Functions
+
+        virtual tmp<Field<scalar>> rho(const label patchi) const;
+
+        virtual tmp<Field<scalar>> Cp(const label patchi) const;
+
+        virtual tmp<volSymmTensorField> devReff() const;
+
+        tmp<FieldField<Field, scalar>> Cf() const;
+
+        //- Set the heat transfer coefficient
+        virtual void htc(volScalarField& htc);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("ReynoldsAnalogy");
+
+
+    // Constructors
+
+        //- Construct from components
+        ReynoldsAnalogy
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& TName
+        );
+
+
+    //- Destructor
+    virtual ~ReynoldsAnalogy()
+    {}
+
+
+    // Member Functions
+
+        //- Read from dictionary
+        virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace heatTransferCoeffModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C
new file mode 100644
index 0000000000000000000000000000000000000000..5a37291e2d05525e6347f69955b6fe29917dfaee
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.C
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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 "fixedReferenceTemperature.H"
+
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace heatTransferCoeffModels
+{
+    defineTypeNameAndDebug(fixedReferenceTemperature, 0);
+    addToRunTimeSelectionTable
+    (
+        heatTransferCoeffModel,
+        fixedReferenceTemperature,
+        dictionary
+    );
+}
+}
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::heatTransferCoeffModels::fixedReferenceTemperature::fixedReferenceTemperature
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& TName
+)
+:
+    heatTransferCoeffModel(dict, mesh, TName),
+    TRef_(0)
+{
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+bool Foam::heatTransferCoeffModels::fixedReferenceTemperature::read
+(
+    const dictionary& dict
+)
+{
+    if (heatTransferCoeffModel::read(dict))
+    {
+        dict.lookup("TRef") >> TRef_;
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::heatTransferCoeffModels::fixedReferenceTemperature::htc
+(
+    volScalarField& htc
+)
+{
+    const FieldField<Field, scalar> qBf(q());
+    const volScalarField& T = mesh_.lookupObject<volScalarField>(TName_);
+    const volScalarField::Boundary& Tbf = T.boundaryField();
+    const scalar eps = ROOTVSMALL;
+
+    volScalarField::Boundary& htcBf = htc.boundaryFieldRef();
+    forAllConstIters(patchSet_, iter)
+    {
+        label patchi = iter.key();
+        htcBf[patchi] = qBf[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
new file mode 100644
index 0000000000000000000000000000000000000000..6e5c72903a8025988c0ece87688c5cf200239ae6
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/fixedReferenceTemperature/fixedReferenceTemperature.H
@@ -0,0 +1,145 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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::heatTransferCoeffModels::fixedReferenceTemperature
+
+Description
+    Heat transfer coefficient calculation that employs a fixed reference
+    temperature
+
+    The heat transfer coefficient is specified by:
+    
+    \f[
+        h = \frac{q}{T_{ref} - T_w}
+    \f]
+
+Usage
+    Example of function object specification:
+    \verbatim
+        type            heatTransferCoeff;
+        libs            ("libfieldFunctionObjects.so");
+        ...
+    	htcModel	    fixedReferenceTemperature;
+	    TRef		    300;
+        ...
+    \endverbatim
+
+    Where the entries comprise:
+    \table
+        Property     | Description             | Required    | Default value
+        type         | type name: heatTransferCoeff | yes    |
+        htcModel     | selected htc model      | yes         |
+        TRef         | reference temperature   | yes |
+    \endtable
+
+SourceFiles
+    fixedReferenceTemperature.C
+
+SeeAlso
+    Foam::heatTransferCoeffModel
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef heatTransferCoeffModels_fixedReferenceTemperature_H
+#define heatTransferCoeffModels_fixedReferenceTemperature_H
+
+#include "heatTransferCoeffModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace heatTransferCoeffModels
+{
+
+/*---------------------------------------------------------------------------*\
+                   Class fixedReferenceTemperature Declaration
+\*---------------------------------------------------------------------------*/
+
+class fixedReferenceTemperature
+:
+    public heatTransferCoeffModel
+{
+    // Private Member Functions
+
+        //- Disallow copy construct
+        fixedReferenceTemperature(const fixedReferenceTemperature&) = delete;
+
+        //- Disallow default bitwise assignment
+        void operator=(const fixedReferenceTemperature&) = delete;
+
+
+protected:
+
+    // Protected data
+
+        //- Reference tempetaure
+        scalar TRef_;
+
+
+    // Protected Member Functions
+
+        //- Set the heat transfer coefficient
+        virtual void htc(volScalarField& htc);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("fixedReferenceTemperature");
+
+
+    // Constructors
+
+        //- Construct from components
+        fixedReferenceTemperature
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& TName
+        );
+
+
+    //- Destructor
+    virtual ~fixedReferenceTemperature()
+    {}
+
+
+    // Member Functions
+
+        //- Read from dictionary
+        virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace heatTransferCoeffModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..4c8f5928ca20a07c884577bd430fa569a327c1d8
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.C
@@ -0,0 +1,154 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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 "heatTransferCoeffModel.H"
+#include "fvMesh.H"
+#include "fluidThermo.H"
+#include "turbulentTransportModel.H"
+#include "turbulentFluidThermoModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(heatTransferCoeffModel, 0);
+    defineRunTimeSelectionTable(heatTransferCoeffModel, dictionary);
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+Foam::tmp<Foam::FieldField<Foam::Field, Foam::scalar>>
+Foam::heatTransferCoeffModel::q() const
+{
+    const volScalarField& T = mesh_.lookupObject<volScalarField>(TName_);
+    const volScalarField::Boundary& Tbf = T.boundaryField();
+
+    tmp<FieldField<Field, scalar>> tq
+    (
+        new FieldField<Field, scalar>(Tbf.size())
+    );
+
+    FieldField<Field, scalar>& q = tq.ref();
+
+    forAll(q, patchi)
+    {
+        q.set(patchi, new Field<scalar>(Tbf[patchi].size(), 0));
+    }
+
+    typedef compressible::turbulenceModel cmpTurbModel;
+
+    if (mesh_.foundObject<cmpTurbModel>(cmpTurbModel::propertiesName))
+    {
+        const cmpTurbModel& turb =
+            mesh_.lookupObject<cmpTurbModel>(cmpTurbModel::propertiesName);
+
+        const volScalarField& he = turb.transport().he();
+        const volScalarField::Boundary& hebf = he.boundaryField();
+
+        const volScalarField alphaEff(turb.alphaEff());
+        const volScalarField::Boundary& alphaEffbf = alphaEff.boundaryField();
+
+        for (label patchi : patchSet_)
+        {
+            q[patchi] = alphaEffbf[patchi]*hebf[patchi].snGrad();
+        }
+    }
+    else if (mesh_.foundObject<fluidThermo>(fluidThermo::dictName))
+    {
+        const fluidThermo& thermo =
+            mesh_.lookupObject<fluidThermo>(fluidThermo::dictName);
+
+        const volScalarField& he = thermo.he();
+        const volScalarField::Boundary& hebf = he.boundaryField();
+
+        const volScalarField& alpha(thermo.alpha());
+        const volScalarField::Boundary& alphabf = alpha.boundaryField();
+
+        for (label patchi : patchSet_)
+        {
+            q[patchi] = alphabf[patchi]*hebf[patchi].snGrad();
+        }
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Unable to find a valid thermo model to evaluate q"
+            << exit(FatalError);
+    }
+
+    // Add radiative heat flux contribution if present
+    if (mesh_.foundObject<volScalarField>(qrName_))
+    {
+        const volScalarField& qr = mesh_.lookupObject<volScalarField>(qrName_);
+        const volScalarField::Boundary& qrbf = qr.boundaryField();
+
+        for (label patchi : patchSet_)
+        {
+            q[patchi] += qrbf[patchi];
+        }
+    }
+
+    return tq;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::heatTransferCoeffModel::heatTransferCoeffModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& TName
+)
+:
+    mesh_(mesh),
+    TName_(TName),
+    patchSet_(),
+    qrName_("qr")
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+bool Foam::heatTransferCoeffModel::read(const dictionary& dict)
+{
+    const wordReList patchNames(dict.lookup("patches"));
+    patchSet_ = mesh_.boundaryMesh().patchSet(patchNames);
+    dict.readIfPresent("qr", qrName_);
+
+    return true;
+}
+
+
+bool Foam::heatTransferCoeffModel::calc(volScalarField& result)
+{
+    htc(result);
+
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..3bdbe16f7f7e7fe1bf649a631996a4a71aaad5d6
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModel.H
@@ -0,0 +1,158 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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::heatTransferCoeffModels
+
+Description
+    A namespace for various heat transfer coefficient model implementations.
+
+Class
+    Foam::heatTransferCoeffModel
+
+Description
+    An abstract base class for heat transfer coeffcient models.
+
+SourceFiles
+    heatTransferCoeffModel.C
+    heatTransferCoeffModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef heatTransferCoeffModel_H
+#define heatTransferCoeffModel_H
+
+#include "dictionary.H"
+#include "HashSet.H"
+#include "volFields.H"
+
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class fvMesh;
+
+/*---------------------------------------------------------------------------*\
+                   Class heatTransferCoeffModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class heatTransferCoeffModel
+{
+
+    // Private Member Functions
+
+        //- Disallow copy construct
+        heatTransferCoeffModel(const heatTransferCoeffModel&) = delete;
+
+        //- Disallow default bitwise assignment
+        void operator=(const heatTransferCoeffModel&) = delete;
+
+
+protected:
+
+    // Protected data
+
+        const fvMesh& mesh_;
+
+        const word TName_;
+
+        labelHashSet patchSet_;
+
+        word qrName_;
+
+        tmp<FieldField<Field, scalar>> q() const;
+
+        //- Set the heat transfer coefficient
+        virtual void htc(volScalarField& htc) = 0;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("heatTransferCoeffModel");
+
+
+    // Declare run-time constructor selection table
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            heatTransferCoeffModel,
+            dictionary,
+            (
+                const dictionary& dict,
+                const fvMesh& mesh,
+                const word& TName
+            ),
+            (dict, mesh, TName)
+        );
+
+
+    // Selectors
+
+        //- Return a reference to the selected heat transfer coefficicent model
+        static autoPtr<heatTransferCoeffModel> New
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& TName
+        );
+
+
+    // Constructors
+
+        //- Construct from components
+        heatTransferCoeffModel
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& TName
+        );
+
+
+    //- Destructor
+    virtual ~heatTransferCoeffModel()
+    {}
+
+
+    // Member Functions
+
+        //- Read from dictionary
+        virtual bool read(const dictionary& dict);
+
+        virtual bool calc(volScalarField& result);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModelNew.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModelNew.C
new file mode 100644
index 0000000000000000000000000000000000000000..aef48b1f9db4e77b06bb6dbe3b0cec8e4b995c4c
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/heatTransferCoeffModel/heatTransferCoeffModelNew.C
@@ -0,0 +1,59 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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 "heatTransferCoeffModel.H"
+#include "fvMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::heatTransferCoeffModel> Foam::heatTransferCoeffModel::New
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& TName
+)
+{
+    const word modelType(dict.lookup("htcModel"));
+
+    Info<< "Selecting heat transfer coefficient model " << modelType << endl;
+
+    auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
+
+    if (!cstrIter.found())
+    {
+        FatalErrorInFunction
+            << "Unknown heatTransferCoeffModel type "
+            << modelType << nl << nl
+            << "Valid heatTransferCoeffModels :" << endl
+            << dictionaryConstructorTablePtr_->sortedToc()
+            << exit(FatalError);
+    }
+
+    return autoPtr<heatTransferCoeffModel>(cstrIter()(dict, mesh, TName));
+}
+
+
+// ************************************************************************* //
diff --git a/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C
new file mode 100644
index 0000000000000000000000000000000000000000..cd53e144ff12e28e1f42242c0759580514d3676b
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.C
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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 "localReferenceTemperature.H"
+
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace heatTransferCoeffModels
+{
+    defineTypeNameAndDebug(localReferenceTemperature, 0);
+    addToRunTimeSelectionTable
+    (
+        heatTransferCoeffModel,
+        localReferenceTemperature,
+        dictionary
+    );
+}
+}
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::heatTransferCoeffModels::localReferenceTemperature::
+localReferenceTemperature
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& TName
+)
+:
+    heatTransferCoeffModel(dict, mesh, TName)
+{
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+bool Foam::heatTransferCoeffModels::localReferenceTemperature::read
+(
+    const dictionary& dict
+)
+{
+    return heatTransferCoeffModel::read(dict);
+}
+
+
+void Foam::heatTransferCoeffModels::localReferenceTemperature::htc
+(
+    volScalarField& htc
+)
+{
+    const FieldField<Field, scalar> qBf(q());
+    const volScalarField& T = mesh_.lookupObject<volScalarField>(TName_);
+    const volScalarField::Boundary& Tbf = T.boundaryField();
+    const scalar eps = ROOTVSMALL;
+
+    volScalarField::Boundary& htcBf = htc.boundaryFieldRef();
+    forAllConstIters(patchSet_, iter)
+    {
+        label patchi = iter.key();
+        const scalarField Tc(Tbf[patchi].patchInternalField());
+        htcBf[patchi] = qBf[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
new file mode 100644
index 0000000000000000000000000000000000000000..2b1431d3405047999698f8a6e9d9e330c5fd1471
--- /dev/null
+++ b/src/functionObjects/field/heatTransferCoeff/heatTransferCoeffModels/localReferenceTemperature/localReferenceTemperature.H
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+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::heatTransferCoeffModels::localReferenceTemperature
+
+Description
+    Heat transfer coefficient calculation that employs the patch internal
+    field as the reference temperature
+
+    The heat transfer coefficient is specified by:
+    
+    \f[
+        h = \frac{q}{T_c - T_w}
+    \f]
+
+Usage
+    Example of function object specification:
+    \verbatim
+        type            heatTransferCoeff;
+        libs            ("libfieldFunctionObjects.so");
+        ...
+    	htcModel	    localReferenceTemperature;
+        ...
+    \endverbatim
+
+    Where the entries comprise:
+    \table
+        Property     | Description             | Required    | Default value
+        type         | type name: heatTransferCoeff | yes    |
+        htcModel     | selected htc model      | yes         |
+    \endtable
+
+SourceFiles
+    localReferenceTemperature.C
+
+SeeAlso
+    Foam::heatTransferCoeffModel
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef heatTransferCoeffModels_localReferenceTemperature_H
+#define heatTransferCoeffModels_localReferenceTemperature_H
+
+#include "heatTransferCoeffModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace heatTransferCoeffModels
+{
+
+/*---------------------------------------------------------------------------*\
+                   Class localReferenceTemperature Declaration
+\*---------------------------------------------------------------------------*/
+
+class localReferenceTemperature
+:
+    public heatTransferCoeffModel
+{
+    // Private Member Functions
+
+        //- Disallow copy construct
+        localReferenceTemperature(const localReferenceTemperature&) = delete;
+
+        //- Disallow default bitwise assignment
+        void operator=(const localReferenceTemperature&) = delete;
+
+
+protected:
+
+    // Protected Member Functions
+
+        //- Set the heat transfer coefficient
+        virtual void htc(volScalarField& htc);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("localReferenceTemperature");
+
+
+    // Constructors
+
+        //- Construct from components
+        localReferenceTemperature
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& TName
+        );
+
+
+    //- Destructor
+    virtual ~localReferenceTemperature()
+    {}
+
+
+    // Member Functions
+
+        //- Read from dictionary
+        virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace heatTransferCoeffModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/Make/files b/src/waveModels/Make/files
index 44b6ad45c1ad9178126cf37df0957f1a63849e4c..d50a062cf39b92f075d68b1f6d685d376dd868cc 100644
--- a/src/waveModels/Make/files
+++ b/src/waveModels/Make/files
@@ -8,6 +8,7 @@ waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
 waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
 waveGenerationModels/derived/Grimshaw/GrimshawWaveModel.C
 waveGenerationModels/derived/McCowan/McCowanWaveModel.C
+waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.C
 waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
 waveGenerationModels/derived/StokesI/StokesIWaveModel.C
 waveGenerationModels/derived/StokesV/StokesVWaveModel.C
diff --git a/src/waveModels/waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.C b/src/waveModels/waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.C
new file mode 100644
index 0000000000000000000000000000000000000000..181e9a4d44e7cf1f705ca8347675e0893ea90ef3
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.C
@@ -0,0 +1,256 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 "streamFunctionWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+    defineTypeNameAndDebug(streamFunction, 0);
+    addToRunTimeSelectionTable
+    (
+        waveModel,
+        streamFunction,
+        patch
+    );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::streamFunction::eta
+(
+    const scalar h,
+    const scalar kx,
+    const scalar ky,
+    const scalar T,
+    const scalar x,
+    const scalar y,
+    const scalar omega,
+    const scalar t,
+    const scalar phase
+) const
+{
+
+   const scalar k = sqrt(kx*kx + ky*ky);
+   scalar strfnAux = 0.0;
+   forAll(Ejs_, iterSF)
+   {
+        strfnAux +=
+            Ejs_[iterSF]*cos((iterSF + 1)
+		   *(kx*x + ky*y - omega*t + phase));
+   }
+
+   return (1/k)*strfnAux;
+}
+
+Foam::vector Foam::waveModels::streamFunction::Uf
+(
+    const scalar h,
+    const scalar kx,
+    const scalar ky,
+    const scalar T,
+    const scalar x,
+    const scalar y,
+    const scalar omega,
+    const scalar t,
+    const scalar phase,
+    const scalar z
+) const
+{
+    const scalar k = sqrt(kx*kx + ky*ky);
+    const scalar phaseTot = kx*x + ky*y - omega*t + phase;
+
+    scalar u = 0.0;
+    scalar w = 0.0;
+
+    forAll(Bjs_, iterSF2)
+    {
+        u +=
+            (iterSF2 + 1)*Bjs_[iterSF2]*cosh((iterSF2 + 1)*k*z)
+           /cosh((iterSF2 + 1)*k*h)*cos((iterSF2 + 1)*phaseTot);
+
+        w +=
+            (iterSF2 + 1)*Bjs_[iterSF2]*sinh((iterSF2 + 1)*k*z)
+           /cosh((iterSF2 + 1)*k*h)*sin((iterSF2 + 1)*phaseTot);
+    }
+
+    u = waveLength_/T - uMean_ + sqrt(mag(g_)/k)*u;
+    w = sqrt(mag(g_)/k)*w;
+
+    scalar v = u*sin(waveAngle_);
+    u *= cos(waveAngle_);
+
+    return vector(u, v, w);
+}
+
+
+// * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * * //
+
+void Foam::waveModels::streamFunction::setLevel
+(
+    const scalar t,
+    const scalar tCoeff,
+    scalarField& level
+) const
+{
+    const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(level, paddlei)
+    {
+        const scalar eta =
+            this->eta
+            (
+                waterDepthRef_,
+        		waveKx,
+                waveKy,
+                wavePeriod_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+		        waveOmega,
+                t,
+                wavePhase_
+            );
+
+        level[paddlei] = waterDepthRef_ + tCoeff*eta;
+    }
+}
+
+
+void Foam::waveModels::streamFunction::setVelocity
+(
+    const scalar t,
+    const scalar tCoeff,
+    const scalarField& level
+)
+{
+    const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+    const scalar waveK = mathematical::twoPi/waveLength_;
+    const scalar waveKx = waveK*cos(waveAngle_);
+    const scalar waveKy = waveK*sin(waveAngle_);
+
+    forAll(U_, facei)
+    {
+        // Fraction of geometry represented by paddle - to be set
+        scalar fraction = 1;
+
+        // Height - to be set
+        scalar z = 0;
+
+        setPaddlePropeties(level, facei, fraction, z);
+
+        if (fraction > 0)
+        {
+            const label paddlei = faceToPaddle_[facei];
+
+            const vector Uf = this->Uf
+            (
+                waterDepthRef_,
+                waveKx,
+                waveKy,
+                wavePeriod_,
+                xPaddle_[paddlei],
+                yPaddle_[paddlei],
+		        waveOmega,
+                t,
+                wavePhase_,
+                z
+            );
+
+            U_[facei] = fraction*Uf*tCoeff;
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::waveModels::streamFunction::streamFunction
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const polyPatch& patch,
+    const bool readFields
+)
+:
+    regularWaveModel(dict, mesh, patch, false),
+    uMean_(0),
+    Bjs_(),
+    Ejs_()
+{
+    if (readFields)
+    {
+        readDict(dict);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::waveModels::streamFunction::~streamFunction()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::waveModels::streamFunction::readDict(const dictionary& overrideDict)
+{
+    if (regularWaveModel::readDict(overrideDict))
+    {
+	    overrideDict.lookup("uMean") >> uMean_;
+	    overrideDict.lookup("waveLength") >> waveLength_;
+	    overrideDict.lookup("Bjs") >> Bjs_;
+	    overrideDict.lookup("Ejs") >> Ejs_;
+
+        return true;
+    }
+
+    return false;
+}
+
+
+void Foam::waveModels::streamFunction::info(Ostream& os) const
+{
+    regularWaveModel::info(os);
+
+    os  << "    uMean : " << uMean_ << nl
+        << "    Stream function wavelength : " << waveLength_ << nl
+        << "    Bj coefficients : " << Bjs_ << nl
+        << "    Ej coefficients : " << Ejs_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.H b/src/waveModels/waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.H
new file mode 100644
index 0000000000000000000000000000000000000000..28804d3ee587a4eef1b62d5abf165290d76d48a0
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/streamFunction/streamFunctionWaveModel.H
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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::waveModels::streamFunction
+
+Description
+    streamFunction wave model
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_streamFunction_H
+#define waveModels_streamFunction_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class streamFunction Declaration
+\*---------------------------------------------------------------------------*/
+
+class streamFunction
+:
+    public regularWaveModel
+{
+private:
+
+    // Private Member Functions
+
+        //- Wave height
+        virtual scalar eta
+        (
+            const scalar h,
+            const scalar kx,
+            const scalar ky,
+            const scalar T,
+            const scalar x,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase
+        ) const;
+
+        //- Wave velocity
+        virtual vector Uf
+        (
+            const scalar d,
+            const scalar kx,
+            const scalar ky,
+            const scalar T,
+            const scalar x,
+            const scalar y,
+            const scalar omega,
+            const scalar t,
+            const scalar phase,
+            const scalar z
+        ) const;
+
+
+protected:
+
+    // Protected data
+
+        //- Mean fluid speed in frame of reference (stream function)
+        scalar uMean_;
+
+        //- Stream Function Bj coefficients
+        scalarList Bjs_;
+
+        //- Stream Function Ej coefficients
+        scalarList Ejs_;
+
+
+    // Protected Member Functions
+
+
+        //- Set the water level
+        virtual void setLevel
+        (
+            const scalar t,
+            const scalar tCoeff,
+            scalarField& level
+        ) const;
+
+        //- Calculate the wave model velocity
+        virtual void setVelocity
+        (
+            const scalar t,
+            const scalar tCoeff,
+            const scalarField& level
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("streamFunction");
+
+    //- Constructor
+    streamFunction
+    (
+        const dictionary& dict,
+        const fvMesh& mesh,
+        const polyPatch& patch,
+        const bool readFields = true
+    );
+
+    //- Destructor
+    virtual ~streamFunction();
+
+
+    // Public Member Functions
+
+        //- Read from dictionary
+        virtual bool readDict(const dictionary& overrideDict);
+
+        //- Info
+        virtual void info(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/U b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/U
new file mode 100644
index 0000000000000000000000000000000000000000..95453554e5529d177dda4c13adb6acf9108a6c76
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/U
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volVectorField;
+    location    "0";
+    object      U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -1 0 0 0 0];
+
+internalField   uniform (0 0 0);
+
+boundaryField
+{
+    inlet
+    {
+        type            waveVelocity;
+        value           uniform (0 0 0);
+    }
+
+    outlet
+    {
+        type            waveVelocity;
+        value           uniform (0 0 0);
+    }
+
+    sides
+    {
+	type            empty;
+    }
+
+    ground
+    {
+        type            fixedValue;
+        value           uniform (0 0 0);
+    }
+
+    top
+    {
+        type            pressureInletOutletVelocity;
+        value           uniform (0 0 0);
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/alpha.water b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/alpha.water
new file mode 100644
index 0000000000000000000000000000000000000000..aca611d91547deed9b0951fb041d8369f1ef80e5
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/alpha.water
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 0 0 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    inlet
+    {
+        type            waveAlpha;
+        value           uniform 0;
+    }
+
+    outlet
+    {
+        type            zeroGradient;
+    }
+
+    ground
+    {
+        type            zeroGradient;
+    }
+
+    sides
+    {
+	type            empty;
+    }
+
+    top
+    {
+        type            inletOutlet;
+        inletValue      uniform 0;
+        value           uniform 0;
+    }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/p_rgh b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/p_rgh
new file mode 100644
index 0000000000000000000000000000000000000000..f43a02558ad327182dcc2f80277b809499671245
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/0.orig/p_rgh
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       volScalarField;
+    object      p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [1 -1 -2 0 0 0 0];
+
+internalField   uniform 0;
+
+boundaryField
+{
+    inlet
+    {
+        type            fixedFluxPressure;
+        value           uniform 0;
+    }
+
+    outlet
+    {
+        type            fixedFluxPressure;
+        value           uniform 0;
+    }
+
+    ground
+    {
+        type            fixedFluxPressure;
+        value           uniform 0;
+    }
+
+    sides
+    {
+        type            empty;
+    }
+
+    top
+    {
+        type            totalPressure;
+        p0              uniform 0;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/Allclean b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/Allclean
new file mode 100755
index 0000000000000000000000000000000000000000..705f91474c4a86592eb4f9f16b842144f410492f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0
+
+cleanCase
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/Allrun b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/Allrun
new file mode 100755
index 0000000000000000000000000000000000000000..9f0c668029a93fea007d22217c227f723d480abe
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/Allrun
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1    # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+runParallel setFields
+
+runParallel $(getApplication)
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/g b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/g
new file mode 100644
index 0000000000000000000000000000000000000000..3ec2141e5c9b5a8a78035c1d7906278b36600862
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                     |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       uniformDimensionedVectorField;
+    location    "constant";
+    object      g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions      [0 1 -2 0 0 0 0];
+value           ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/transportProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/transportProperties
new file mode 100644
index 0000000000000000000000000000000000000000..43a98e9c59e2bd89ed7261daa5bc888e41b96155
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/transportProperties
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+    transportModel  Newtonian;
+    nu              1e-06;
+    rho             1000;
+}
+
+air
+{
+    transportModel  Newtonian;
+    nu              1.48e-05;
+    rho             1;
+}
+
+sigma           0.07;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/turbulenceProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/turbulenceProperties
new file mode 100644
index 0000000000000000000000000000000000000000..115a9830c11098c87040784f3183691b1877caea
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                     |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType  laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/waveProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/waveProperties
new file mode 100644
index 0000000000000000000000000000000000000000..f24465e67047956fab1b8dbcad2b40144a5e45c7
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/constant/waveProperties
@@ -0,0 +1,80 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "constant";
+    object      wavesProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inlet
+{
+    alpha           alpha.water;
+
+    waveModel       streamFunction;
+
+    nPaddle         1;
+
+    waveHeight      0.1517;
+
+    waveAngle       0.0;
+
+    rampTime        6.034;
+
+    activeAbsorption yes;
+
+    wavePeriod      3.017;
+
+    uMean      	    2.0825;
+
+    waveLength      6.2832;
+
+    Bjs
+    (
+        8.6669014e-002
+        2.4849799e-002
+        7.7446850e-003
+        2.3355420e-003
+        6.4497731e-004
+        1.5205114e-004
+        2.5433769e-005
+       -2.2045436e-007
+       -2.8711504e-006
+       -1.2287334e-006
+    );
+
+    Ejs
+    (
+	    5.6009609e-002
+	    3.1638171e-002
+	    1.5375952e-002
+	    7.1743178e-003
+	    3.3737077e-003
+	    1.6324880e-003
+	    8.2331980e-004
+	    4.4403497e-004
+	    2.7580059e-004
+	    2.2810557e-004
+    );
+
+}
+
+outlet
+{
+    alpha           alpha.water;
+
+    waveModel       shallowWaterAbsorption;
+
+    nPaddle         1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/blockMeshDict b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/blockMeshDict
new file mode 100644
index 0000000000000000000000000000000000000000..cf37101f40eb3335eab15124dcdf1d23a75ac7b0
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/blockMeshDict
@@ -0,0 +1,91 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version         2.0;
+    format          ascii;
+    class           dictionary;
+    object          blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+    ( 0.0 0.0 0.0)
+    ( 40.0 0.0 0.0)
+    ( 40.0 0.01 0.0)
+    ( 0.0 0.01 0.0)
+    ( 0.0 0.0 0.8)
+    ( 40.0 0.0 0.8)
+    ( 40.0 0.01 0.8)
+    ( 0.0 0.01 0.8)
+);
+
+blocks
+(
+    hex (0 1 2 3 4 5 6 7) (2000 1 80) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+    inlet
+    {
+        type patch;
+        faces
+        (
+            (0 4 7 3)
+        );
+    }
+    outlet
+    {
+        type patch;
+        faces
+        (
+            (1 5 6 2)
+        );
+    }
+    ground
+    {
+        type wall;
+        faces
+        (
+            (0 1 2 3)
+        );
+    }
+    top
+    {
+        type patch;
+        faces
+        (
+            (4 5 6 7)
+        );
+    }
+    sides
+    {
+        type empty;
+        faces
+        (
+            (0 1 5 4)
+            (3 2 6 7)
+        );
+    }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
+
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/controlDict b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/controlDict
new file mode 100644
index 0000000000000000000000000000000000000000..136f44877803ecdeffebaa1d6f69ce1325cf2ea0
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/controlDict
@@ -0,0 +1,162 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application     interFoam;
+
+startFrom       latestTime;
+
+startTime       0;
+
+stopAt          endTime;
+
+endTime         30.0;
+
+deltaT          0.01;
+
+writeControl    adjustableRunTime;
+
+writeInterval   0.033;
+
+purgeWrite      0;
+
+writeFormat     ascii;
+
+writePrecision  6;
+
+writeCompression off;
+
+timeFormat      general;
+
+timePrecision   6;
+
+runTimeModifiable yes;
+
+adjustTimeStep  yes;
+
+maxCo           0.65;
+maxAlphaCo      0.65;
+
+maxDeltaT       0.05;
+
+
+functions
+{
+    line
+    {
+        type            sets;
+        libs            ("libsampling.so");
+        enabled         true;
+        writeControl    writeTime;
+        writeInterval   1;
+
+        interpolationScheme cellPoint;
+        setFormat       raw;
+        sets
+        (
+            line1
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 1.0 0.005 0.0 );
+                end     ( 1.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line2
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 2.0 0.005 0.0 );
+                end     ( 2.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line3
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 3.0 0.005 0.0 );
+                end     ( 3.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line4
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 5.0 0.005 0.0 );
+                end     ( 5.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line5
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 7.5 0.005 0.0 );
+                end     ( 7.5 0.005 1.0 );
+                nPoints 1001;
+            }
+
+            line6
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 10.0 0.005 0.0 );
+                end     ( 10.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line7
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 12.0 0.005 0.0 );
+                end     ( 12.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line8
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 15.0 0.005 0.0 );
+                end     ( 15.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line9
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 20.0 0.005 0.0 );
+                end     ( 20.0 0.005 1.0 );
+                nPoints 1001;
+            }
+            line10
+            {
+                type    uniform;
+                axis    distance;
+                start   ( 28.0 0.005 0.0 );
+                end     ( 28.0 0.005 1.0 );
+                nPoints 1001;
+            }
+        );
+
+        fixedLocations  false;
+        fields
+        (
+            U alpha.water
+        );
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/decomposeParDict
new file mode 100644
index 0000000000000000000000000000000000000000..301d97027b8aa1815be46c6525b8a54c5f6b6de1
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      decomposeParDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method          hierarchical;
+
+hierarchicalCoeffs
+{
+    n           (2 1 1);
+    delta       0.001;
+    order       xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/fvSchemes b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/fvSchemes
new file mode 100644
index 0000000000000000000000000000000000000000..eeff89271fbc31a2b0adeb80ad6afdef35eba94e
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/fvSchemes
@@ -0,0 +1,54 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+    default         Euler;
+}
+
+gradSchemes
+{
+    default         Gauss linear;
+}
+
+divSchemes
+{
+    div(rhoPhi,U)   Gauss linearUpwind grad(U);
+    div(phi,alpha)  Gauss vanLeer;
+    div(phirb,alpha) Gauss linear;
+    div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+    default         Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+    default         linear;
+}
+
+snGradSchemes
+{
+    default         orthogonal;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/fvSolution b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/fvSolution
new file mode 100644
index 0000000000000000000000000000000000000000..dee334f852def87e5a1e475dff7ae74349491321
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/fvSolution
@@ -0,0 +1,78 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+    "alpha.water.*"
+    {
+        nAlphaCorr      1;
+        nAlphaSubCycles 3;
+        cAlpha          1;
+    }
+
+    "pcorr.*"
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-6;
+        relTol          0;
+    }
+
+    p_rgh
+    {
+        solver          PCG;
+        preconditioner  DIC;
+        tolerance       1e-6;
+        relTol          0.1;
+    }
+
+    p_rghFinal
+    {
+        solver          GAMG;
+        smoother        DIC;
+        tolerance       1e-7;
+        relTol          0;
+    }
+
+    U
+    {
+        solver          PBiCG;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0.1;
+    }
+
+    UFinal
+    {
+        solver          PBiCG;
+        preconditioner  DILU;
+        tolerance       1e-6;
+        relTol          0;
+    }
+}
+
+PIMPLE
+{
+    momentumPredictor no;
+    nCorrectors     2;
+    nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/setFieldsDict b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/setFieldsDict
new file mode 100644
index 0000000000000000000000000000000000000000..b51d428a4d4652bab554ac775950263ea2ef44fd
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStreamFunction/system/setFieldsDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  plus                                  |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    location    "system";
+    object      setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+    volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+    boxToCell
+    {
+        box (0 0 0) (40.0 1.0 0.4046);
+        fieldValues
+        (
+            volScalarFieldValue alpha.water 1
+        );
+    }
+);
+
+
+// ************************************************************************* //