From b634f5af0818a49b0e7283f9b8035be9891a408d Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Mon, 23 May 2016 21:45:41 +0100
Subject: [PATCH] functionObjects::MachNo: New functionObject to calculate the
 Mach number volScalarField of a compressible single-phase flow

See tutorials/compressible/sonicFoam/laminar/forwardStep/system/controlDict
---
 .../functionObjects/field/MachNo/MachNo.C     |  95 ++++++++++++++++
 .../functionObjects/field/MachNo/MachNo.H     | 102 ++++++++++++++++++
 .../functionObjects/field/Make/files          |   1 +
 .../functionObjects/field/Make/options        |   5 +
 .../laminar/forwardStep/system/controlDict    |  12 +++
 5 files changed, 215 insertions(+)
 create mode 100644 src/postProcessing/functionObjects/field/MachNo/MachNo.C
 create mode 100644 src/postProcessing/functionObjects/field/MachNo/MachNo.H

diff --git a/src/postProcessing/functionObjects/field/MachNo/MachNo.C b/src/postProcessing/functionObjects/field/MachNo/MachNo.C
new file mode 100644
index 00000000000..d252a45b307
--- /dev/null
+++ b/src/postProcessing/functionObjects/field/MachNo/MachNo.C
@@ -0,0 +1,95 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
+     \\/     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 "MachNo.H"
+#include "fluidThermo.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+    defineTypeNameAndDebug(MachNo, 0);
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        MachNo,
+        dictionary
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::functionObjects::MachNo::MachNo
+(
+    const word& name,
+    const Time& runTime,
+    const dictionary& dict
+)
+:
+    fieldExpression(name, runTime, dict, "U", "Ma")
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::MachNo::~MachNo()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::MachNo::execute(const bool postProcess)
+{
+    if
+    (
+        foundField<volVectorField>(fieldName_)
+     && mesh_.foundObject<fluidThermo>(fluidThermo::dictName)
+    )
+    {
+        const fluidThermo& thermo =
+            mesh_.lookupObject<fluidThermo>(fluidThermo::dictName);
+
+        const volVectorField& U = lookupField<volVectorField>(fieldName_);
+
+        return store
+        (
+            resultName_,
+            mag(U)/sqrt(thermo.gamma()*thermo.p()/thermo.rho())
+        );
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/field/MachNo/MachNo.H b/src/postProcessing/functionObjects/field/MachNo/MachNo.H
new file mode 100644
index 00000000000..4d744f62194
--- /dev/null
+++ b/src/postProcessing/functionObjects/field/MachNo/MachNo.H
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 OpenFOAM Foundation
+     \\/     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::MachNo
+
+Group
+    grpFieldFunctionObjects
+
+Description
+    This function object calculates and writes the Mach number as a
+    volScalarField.
+
+SeeAlso
+    Foam::functionObjects::fieldExpression
+    Foam::functionObjects::fvMeshFunctionObject
+
+SourceFiles
+    MachNo.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_MachNo_H
+#define functionObjects_MachNo_H
+
+#include "fieldExpression.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class MachNo Declaration
+\*---------------------------------------------------------------------------*/
+
+class MachNo
+:
+    public fieldExpression
+{
+
+public:
+
+    //- Runtime type information
+    TypeName("MachNo");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        MachNo
+        (
+            const word& name,
+            const Time& runTime,
+            const dictionary& dict
+        );
+
+
+    //- Destructor
+    virtual ~MachNo();
+
+
+    // Member Functions
+
+        //- Calculate the Mach number field
+        virtual bool execute(const bool postProcess = false);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/field/Make/files b/src/postProcessing/functionObjects/field/Make/files
index ee11ceecfbe..934c931ac8e 100644
--- a/src/postProcessing/functionObjects/field/Make/files
+++ b/src/postProcessing/functionObjects/field/Make/files
@@ -45,5 +45,6 @@ CourantNo/CourantNo.C
 PecletNo/PecletNo.C
 blendingFactor/blendingFactor.C
 pressure/pressure.C
+MachNo/MachNo.C
 
 LIB = $(FOAM_LIBBIN)/libfieldFunctionObjects
diff --git a/src/postProcessing/functionObjects/field/Make/options b/src/postProcessing/functionObjects/field/Make/options
index 8f45abcac0e..5e97121147d 100644
--- a/src/postProcessing/functionObjects/field/Make/options
+++ b/src/postProcessing/functionObjects/field/Make/options
@@ -5,10 +5,15 @@ EXE_INC = \
     -I$(LIB_SRC)/fileFormats/lnInclude \
     -I$(LIB_SRC)/sampling/lnInclude \
     -I$(LIB_SRC)/surfMesh/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+    -I$(LIB_SRC)/transportModels \
+    -I$(LIB_SRC)/transportModels/compressible/lnInclude \
     -I$(LIB_SRC)/TurbulenceModels/turbulenceModels/lnInclude
 
 LIB_LIBS = \
     -lfiniteVolume \
+    -lfluidThermophysicalModels \
+    -lcompressibleTransportModels \
     -lturbulenceModels \
     -lmeshTools \
     -lsurfMesh \
diff --git a/tutorials/compressible/sonicFoam/laminar/forwardStep/system/controlDict b/tutorials/compressible/sonicFoam/laminar/forwardStep/system/controlDict
index 3fc5df7bb98..caa6bae1aed 100644
--- a/tutorials/compressible/sonicFoam/laminar/forwardStep/system/controlDict
+++ b/tutorials/compressible/sonicFoam/laminar/forwardStep/system/controlDict
@@ -45,5 +45,17 @@ timePrecision   6;
 
 runTimeModifiable true;
 
+functions
+{
+    libs ("libfieldFunctionObjects.so");
+
+    Ma
+    {
+        type            MachNo;
+        executeControl  writeTime;
+        writeControl    writeTime;
+    }
+}
+
 
 // ************************************************************************* //
-- 
GitLab