From 939c335504c0f463b150de744c9c28c9b51a8885 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Jasi=C5=84ski?= <daniel.jasinski@gmail.com>
Date: Wed, 23 Jun 2021 14:39:22 +0200
Subject: [PATCH] INT: liquidProperties: support for user defined liquid
 properties (#2141)

- Generic thermophysical properties class for a liquid in which the
  functions and coefficients for each property are run-time selected.

  Code adapted from openfoam.org
---
 .../thermophysicalProperties/Make/files       |   1 +
 .../liquidProperties/liquid/liquid.C          | 135 ++++++++++++++
 .../liquidProperties/liquid/liquid.H          | 164 ++++++++++++++++++
 .../liquidProperties/liquid/liquidI.H         | 113 ++++++++++++
 .../liquidProperties/liquidProperties.C       |   9 +-
 5 files changed, 420 insertions(+), 2 deletions(-)
 create mode 100644 src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.C
 create mode 100644 src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.H
 create mode 100644 src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquidI.H

diff --git a/src/thermophysicalModels/thermophysicalProperties/Make/files b/src/thermophysicalModels/thermophysicalProperties/Make/files
index d428e419d25..269ad20b921 100644
--- a/src/thermophysicalModels/thermophysicalProperties/Make/files
+++ b/src/thermophysicalModels/thermophysicalProperties/Make/files
@@ -23,6 +23,7 @@ thermophysicalProperties/thermophysicalProperties.C
 liquidProperties/liquidProperties/liquidProperties.C
 liquidProperties/liquidMixtureProperties/liquidMixtureProperties.C
 
+liquidProperties/liquid/liquid.C
 liquidProperties/H2O/H2O.C
 liquidProperties/C7H16/C7H16.C
 liquidProperties/C12H26/C12H26.C
diff --git a/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.C b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.C
new file mode 100644
index 00000000000..f9f2525edb5
--- /dev/null
+++ b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.C
@@ -0,0 +1,135 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenFOAM Foundation
+    Copyright (C) 2021 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 "liquid.H"
+#include "NoneFunction1.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(liquid, 0);
+    addToRunTimeSelectionTable(liquidProperties, liquid, dictionary);
+}
+
+
+// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+template<class Type>
+static autoPtr<Function1<Type>> NewOrNone
+(
+    const word& entryName,
+    const dictionary& dict
+)
+{
+    autoPtr<Function1<Type>> ptr
+    (
+        Function1<Type>::NewIfPresent(entryName, dict)
+    );
+
+    if (!ptr)
+    {
+        ptr.reset
+        (
+            new Function1Types::None<Type>(entryName, dict)
+        );
+    }
+
+    return ptr;
+}
+
+} // End namespace Foam
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::liquid::liquid(const dictionary& dict)
+:
+    liquidProperties(dict),
+    rho_(NewOrNone<scalar>("rho", dict)),
+    pv_(NewOrNone<scalar>("pv", dict)),
+    hl_(NewOrNone<scalar>("hl", dict)),
+    Cp_(NewOrNone<scalar>("Cp", dict)),
+    h_(NewOrNone<scalar>("h", dict)),
+    Cpg_(NewOrNone<scalar>("Cpg", dict)),
+    B_(NewOrNone<scalar>("B", dict)),
+    mu_(NewOrNone<scalar>("mu", dict)),
+    mug_(NewOrNone<scalar>("mug", dict)),
+    kappa_(NewOrNone<scalar>("kappa", dict)),
+    kappag_(NewOrNone<scalar>("kappag", dict)),
+    sigma_(NewOrNone<scalar>("sigma", dict)),
+    D_(NewOrNone<scalar>("D", dict))
+{}
+
+
+
+Foam::liquid::liquid(const liquid& rhs)
+:
+    liquidProperties(rhs),
+    rho_(rhs.rho_.clone()),
+    pv_(rhs.pv_.clone()),
+    hl_(rhs.hl_.clone()),
+    Cp_(rhs.Cp_.clone()),
+    h_(rhs.h_.clone()),
+    Cpg_(rhs.Cpg_.clone()),
+    B_(rhs.B_.clone()),
+    mu_(rhs.mu_.clone()),
+    mug_(rhs.mug_.clone()),
+    kappa_(rhs.kappa_.clone()),
+    kappag_(rhs.kappag_.clone()),
+    sigma_(rhs.sigma_.clone()),
+    D_(rhs.D_.clone())
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::liquid::writeData(Ostream& os) const
+{
+    liquidProperties::writeData(os); os << nl;
+    rho_->writeData(os); os << nl;
+    pv_->writeData(os); os << nl;
+    hl_->writeData(os); os << nl;
+    Cp_->writeData(os); os << nl;
+    h_->writeData(os); os << nl;
+    Cpg_->writeData(os); os << nl;
+    B_->writeData(os); os << nl;
+    mu_->writeData(os); os << nl;
+    mug_->writeData(os); os << nl;
+    kappa_->writeData(os); os << nl;
+    kappag_->writeData(os); os << nl;
+    sigma_->writeData(os); os << nl;
+    D_->writeData(os); os << endl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.H b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.H
new file mode 100644
index 00000000000..21b152c36aa
--- /dev/null
+++ b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquid.H
@@ -0,0 +1,164 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenFOAM Foundation
+    Copyright (C) 2021 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::liquid
+
+Description
+    Generic thermophysical properties class for a liquid in which the
+    functions and coefficients for each property are run-time selected.
+
+SourceFiles
+    liquid.C
+    liquidI.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef liquid_H
+#define liquid_H
+
+#include "liquidProperties.H"
+#include "Function1.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class liquid Declaration
+\*---------------------------------------------------------------------------*/
+
+class liquid
+:
+    public liquidProperties
+{
+    // Private Data
+
+        autoPtr<Function1<scalar>> rho_;
+        autoPtr<Function1<scalar>> pv_;
+        autoPtr<Function1<scalar>> hl_;
+        autoPtr<Function1<scalar>> Cp_;
+        autoPtr<Function1<scalar>> h_;
+        autoPtr<Function1<scalar>> Cpg_;
+        autoPtr<Function1<scalar>> B_;
+        autoPtr<Function1<scalar>> mu_;
+        autoPtr<Function1<scalar>> mug_;
+        autoPtr<Function1<scalar>> kappa_;
+        autoPtr<Function1<scalar>> kappag_;
+        autoPtr<Function1<scalar>> sigma_;
+        autoPtr<Function1<scalar>> D_;
+
+
+public:
+
+    friend class liquidProperties;
+
+    //- Runtime type information
+    TypeName("liquid");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        explicit liquid(const dictionary& dict);
+
+        //- Copy construct
+        liquid(const liquid& rhs);
+
+
+        //- Construct and return clone
+        virtual autoPtr<liquidProperties> clone() const
+        {
+            return autoPtr<liquidProperties>(new liquid(*this));
+        }
+
+
+    // Member Functions
+
+        //- Liquid density [kg/m^3]
+        inline scalar rho(scalar p, scalar T) const;
+
+        //- Vapour pressure [Pa]
+        inline scalar pv(scalar p, scalar T) const;
+
+        //- Heat of vapourisation [J/kg]
+        inline scalar hl(scalar p, scalar T) const;
+
+        //- Liquid heat capacity [J/(kg K)]
+        inline scalar Cp(scalar p, scalar T) const;
+
+        //- Liquid Enthalpy [J/(kg)]
+        inline scalar h(scalar p, scalar T) const;
+
+        //- Ideal gas heat capacity [J/(kg K)]
+        inline scalar Cpg(scalar p, scalar T) const;
+
+        //- Second Virial Coefficient [m^3/kg]
+        inline scalar B(scalar p, scalar T) const;
+
+        //- Liquid viscosity [Pa s]
+        inline scalar mu(scalar p, scalar T) const;
+
+        //- Vapour viscosity [Pa s]
+        inline scalar mug(scalar p, scalar T) const;
+
+        //- Liquid thermal conductivity  [W/(m K)]
+        inline scalar kappa(scalar p, scalar T) const;
+
+        //- Vapour thermal conductivity  [W/(m K)]
+        inline scalar kappag(scalar p, scalar T) const;
+
+        //- Surface tension [N/m]
+        inline scalar sigma(scalar p, scalar T) const;
+
+        //- Vapour diffusivity [m2/s]
+        inline scalar D(scalar p, scalar T) const;
+
+        //- Vapour diffusivity [m2/s] with specified binary pair
+        inline scalar D(scalar p, scalar T, scalar Wb) const;
+
+
+    // I-O
+
+        //- Write the function coefficients
+        void writeData(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "liquidI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquidI.H b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquidI.H
new file mode 100644
index 00000000000..b362f20cf34
--- /dev/null
+++ b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquid/liquidI.H
@@ -0,0 +1,113 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2020 OpenFOAM Foundation
+-------------------------------------------------------------------------------
+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/>.
+
+\*---------------------------------------------------------------------------*/
+
+inline Foam::scalar Foam::liquid::rho(scalar p, scalar T) const
+{
+    return rho_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::pv(scalar p, scalar T) const
+{
+    return pv_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::hl(scalar p, scalar T) const
+{
+    return hl_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::Cp(scalar p, scalar T) const
+{
+    return Cp_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::h(scalar p, scalar T) const
+{
+    return h_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::Cpg(scalar p, scalar T) const
+{
+    return Cpg_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::B(scalar p, scalar T) const
+{
+    return B_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::mu(scalar p, scalar T) const
+{
+    return mu_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::mug(scalar p, scalar T) const
+{
+    return mug_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::kappa(scalar p, scalar T) const
+{
+    return kappa_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::kappag(scalar p, scalar T) const
+{
+    return kappag_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::sigma(scalar p, scalar T) const
+{
+    return sigma_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::D(scalar p, scalar T) const
+{
+    return D_->value(T);
+}
+
+
+inline Foam::scalar Foam::liquid::D(scalar p, scalar T, scalar Wb) const
+{
+    // Currently ignoring the Wb argument
+    return D_->value(T);
+}
+
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquidProperties/liquidProperties.C b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquidProperties/liquidProperties.C
index 3df7af91b84..c8855ee9007 100644
--- a/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquidProperties/liquidProperties.C
+++ b/src/thermophysicalModels/thermophysicalProperties/liquidProperties/liquidProperties/liquidProperties.C
@@ -117,9 +117,14 @@ Foam::autoPtr<Foam::liquidProperties> Foam::liquidProperties::New
 {
     DebugInFunction << "Constructing liquidProperties" << nl;
 
-    const word liquidType(dict.dictName());
+    // Can either specify "type", or simply use the dictionary name
+    // as being the liquid type name
 
-    if (dict.found("defaultCoeffs"))
+    word liquidType(dict.dictName());
+
+    const bool hadExplicitType = dict.readIfPresent("type", liquidType);
+
+    if (dict.found("defaultCoeffs") && !hadExplicitType)
     {
         // Backward-compatibility
 
-- 
GitLab