From 36fc8595db40f2ba921440a0754aab225624c8df Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Thu, 14 Jan 2016 16:34:37 +0000
Subject: [PATCH] reactionThermo/functionObjects/moleFractions/moleFractions:
 New functionObject to calculate and write mole-fraction fields

    This function object calculates mole-fraction fields from the mass-fraction
    fields of the psi/rhoReactionThermo and caches them for output and further
    post-processing.

    The names of the mole-fraction fields are obtained from the corresponding
    mass-fraction fields prepended by "X_"

    Example of function object specification:

        moleFractions
        {
            type psiReactionThermoMoleFractions;
        }

     or

        moleFractions
        {
            type rhoReactionThermoMoleFractions;
        }

    depending on the thermodynamics package used in the solver.
---
 .../reactionThermo/Make/files                 |   2 +
 .../moleFractions/moleFractions.C             | 144 +++++++++++++++
 .../moleFractions/moleFractions.H             | 174 ++++++++++++++++++
 .../moleFractionsFunctionObjects.C            |  76 ++++++++
 .../moleFractionsFunctionObjects.H            |  61 ++++++
 5 files changed, 457 insertions(+)
 create mode 100644 src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.C
 create mode 100644 src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.H
 create mode 100644 src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.C
 create mode 100644 src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.H

diff --git a/src/thermophysicalModels/reactionThermo/Make/files b/src/thermophysicalModels/reactionThermo/Make/files
index 57f14fc0d1f..8870103dfe0 100644
--- a/src/thermophysicalModels/reactionThermo/Make/files
+++ b/src/thermophysicalModels/reactionThermo/Make/files
@@ -19,4 +19,6 @@ derivedFvPatchFields/fixedUnburntEnthalpy/fixedUnburntEnthalpyFvPatchScalarField
 derivedFvPatchFields/gradientUnburntEnthalpy/gradientUnburntEnthalpyFvPatchScalarField.C
 derivedFvPatchFields/mixedUnburntEnthalpy/mixedUnburntEnthalpyFvPatchScalarField.C
 
+functionObjects/moleFractions/moleFractionsFunctionObjects.C
+
 LIB = $(FOAM_LIBBIN)/libreactionThermophysicalModels
diff --git a/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.C b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.C
new file mode 100644
index 00000000000..4ae994033c9
--- /dev/null
+++ b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.C
@@ -0,0 +1,144 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  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 "moleFractions.H"
+#include "basicThermo.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class ThermoType>
+void Foam::moleFractions<ThermoType>::calculateMoleFractions()
+{
+    const ThermoType& thermo =
+        mesh_.lookupObject<ThermoType>(basicThermo::dictName);
+
+    const PtrList<volScalarField>& Y = thermo.composition().Y();
+
+    const volScalarField W(thermo.composition().W());
+
+    forAll(Y, i)
+    {
+        X_[i] = W*Y[i]/thermo.composition().W(i);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class ThermoType>
+Foam::moleFractions<ThermoType>::moleFractions
+(
+    const word& name,
+    const objectRegistry& obr,
+    const dictionary& dict,
+    const bool loadFromFiles
+)
+:
+    functionObjectFile(obr, name),
+    name_(name),
+    mesh_(refCast<const fvMesh>(obr))
+{
+    if (mesh_.foundObject<ThermoType>(basicThermo::dictName))
+    {
+        const ThermoType& thermo =
+            mesh_.lookupObject<ThermoType>(basicThermo::dictName);
+
+        const PtrList<volScalarField>& Y = thermo.composition().Y();
+
+        X_.setSize(Y.size());
+
+        forAll(Y, i)
+        {
+            X_.set
+            (
+                i,
+                new volScalarField
+                (
+                    IOobject
+                    (
+                        "X_" + Y[i].name(),
+                        mesh_.time().timeName(),
+                        mesh_,
+                        IOobject::NO_READ,
+                        IOobject::AUTO_WRITE
+                    ),
+                    mesh_,
+                    dimensionedScalar("X", dimless, 0)
+                )
+            );
+        }
+
+        calculateMoleFractions();
+    }
+    else
+    {
+        FatalErrorInFunction
+            << "Cannot find thermodynamics model of type "
+            << ThermoType::typeName
+            << exit(FatalError);
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class ThermoType>
+Foam::moleFractions<ThermoType>::~moleFractions()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class ThermoType>
+void Foam::moleFractions<ThermoType>::read
+(
+    const dictionary& dict
+)
+{}
+
+
+template<class ThermoType>
+void Foam::moleFractions<ThermoType>::execute()
+{
+    calculateMoleFractions();
+}
+
+
+template<class ThermoType>
+void Foam::moleFractions<ThermoType>::end()
+{}
+
+
+template<class ThermoType>
+void Foam::moleFractions<ThermoType>::timeSet()
+{}
+
+
+template<class ThermoType>
+void Foam::moleFractions<ThermoType>::write()
+{}
+
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.H b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.H
new file mode 100644
index 00000000000..b699d16005e
--- /dev/null
+++ b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractions.H
@@ -0,0 +1,174 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  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::moleFractions
+
+Description
+    This function object calculates mole-fraction fields from the mass-fraction
+    fields of the psi/rhoReactionThermo and caches them for output and further
+    post-processing.
+
+    The names of the mole-fraction fields are obtained from the corresponding
+    mass-fraction fields prepended by "X_"
+
+    Example of function object specification:
+    \verbatim
+    moleFractions
+    {
+        type psiReactionThermoMoleFractions;
+    }
+    \endverbatim
+    or
+    \verbatim
+    moleFractions
+    {
+        type rhoReactionThermoMoleFractions;
+    }
+    \endverbatim
+    depending on the thermodynamics package used in the solver.
+
+SeeAlso
+    Foam::functionObject
+    Foam::OutputFilterFunctionObject
+
+SourceFiles
+    moleFractions.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef moleFractions_H
+#define moleFractions_H
+
+#include "functionObjectFile.H"
+#include "volFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class moleFractions Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class ThermoType>
+class moleFractions
+:
+    public functionObjectFile
+{
+    // Private data
+
+        //- Name of moleFractions functionObject
+        word name_;
+
+        //- Reference to the mesh
+        const fvMesh& mesh_;
+
+        //- Species mole fractions
+        PtrList<volScalarField> X_;
+
+
+    // Private Member Functions
+
+        //- Calculate the mole fraction fields
+        virtual void calculateMoleFractions();
+
+        //- Disallow default bitwise copy construct
+        moleFractions(const moleFractions&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const moleFractions&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("moleFractions");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        moleFractions
+        (
+            const word& name,
+            const objectRegistry&,
+            const dictionary&,
+            const bool loadFromFiles = false
+        );
+
+
+    //- Destructor
+    virtual ~moleFractions();
+
+
+    // Member Functions
+
+        //- Return name of the moleFractions functionObject
+        virtual const word& name() const
+        {
+            return name_;
+        }
+
+        //- Read the moleFractions data
+        virtual void read(const dictionary&);
+
+        //- Execute, currently does nothing
+        virtual void execute();
+
+        //- Execute at the final time-loop, currently does nothing
+        virtual void end();
+
+        //- Called when time was set at the end of the Time::operator++
+        virtual void timeSet();
+
+        //- Calculate the moleFractions and write
+        virtual void write();
+
+        //- Update for changes of mesh
+        virtual void updateMesh(const mapPolyMesh&)
+        {}
+
+        //- Update for changes of mesh
+        virtual void movePoints(const polyMesh&)
+        {}
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "moleFractions.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.C b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.C
new file mode 100644
index 00000000000..09c5a1d8cce
--- /dev/null
+++ b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.C
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  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 "moleFractionsFunctionObjects.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTemplateTypeNameAndDebugWithName
+    (
+        moleFractions<psiReactionThermo>,
+        "psiReactionThermoMoleFractions",
+        0
+    );
+
+    defineTemplateTypeNameAndDebugWithName
+    (
+        psiReactionThermoMoleFractionsFunctionObject,
+        "psiReactionThermoMoleFractions",
+        0
+    );
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        psiReactionThermoMoleFractionsFunctionObject,
+        dictionary
+    );
+
+    defineTemplateTypeNameAndDebugWithName
+    (
+        moleFractions<rhoReactionThermo>,
+        "rhoReactionThermoMoleFractions",
+        0
+    );
+
+    defineTemplateTypeNameAndDebugWithName
+    (
+        rhoReactionThermoMoleFractionsFunctionObject,
+        "rhoReactionThermoMoleFractions",
+        0
+    );
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        rhoReactionThermoMoleFractionsFunctionObject,
+        dictionary
+    );
+}
+
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.H b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.H
new file mode 100644
index 00000000000..21092bba3b4
--- /dev/null
+++ b/src/thermophysicalModels/reactionThermo/functionObjects/moleFractions/moleFractionsFunctionObjects.H
@@ -0,0 +1,61 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  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/>.
+
+Typedef
+    Foam::moleFractionsFunctionObject
+
+Description
+    FunctionObject wrapper around moleFractions to allow
+    it to be created via the functions entry within controlDict.
+
+SourceFiles
+    moleFractionsFunctionObjects.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef moleFractionsFunctionObjects_H
+#define moleFractionsFunctionObjects_H
+
+#include "OutputFilterFunctionObject.H"
+#include "moleFractions.H"
+#include "psiReactionThermo.H"
+#include "rhoReactionThermo.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef OutputFilterFunctionObject<moleFractions<psiReactionThermo>>
+        psiReactionThermoMoleFractionsFunctionObject;
+
+
+    typedef OutputFilterFunctionObject<moleFractions<rhoReactionThermo>>
+        rhoReactionThermoMoleFractionsFunctionObject;
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
-- 
GitLab