From 1d8010fc8cf581e2bef00d65ff5d19e03da2d206 Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Wed, 27 May 2009 14:49:18 +0100
Subject: [PATCH] added new family of injection models

---
 .../makeBasicKinematicParcelInjectionModels.C |   7 +
 .../makeBasicReactingParcelInjectionModels.C  |   7 +
 .../makeBasicThermoParcelInjectionModels.C    |   7 +
 .../KinematicLookupTableInjection.C           | 231 +++++++++++++++
 .../KinematicLookupTableInjection.H           | 194 +++++++++++++
 .../ReactingLookupTableInjection.C            | 263 ++++++++++++++++++
 .../ReactingLookupTableInjection.H            | 205 ++++++++++++++
 .../ThermoLookupTableInjection.C              | 243 ++++++++++++++++
 .../ThermoLookupTableInjection.H              | 202 ++++++++++++++
 9 files changed, 1359 insertions(+)
 create mode 100644 src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C
 create mode 100644 src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H
 create mode 100644 src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C
 create mode 100644 src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H
 create mode 100644 src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C
 create mode 100644 src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H

diff --git a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/submodels/makeBasicKinematicParcelInjectionModels.C b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/submodels/makeBasicKinematicParcelInjectionModels.C
index 272ea3e06d2..9c406339f51 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/submodels/makeBasicKinematicParcelInjectionModels.C
+++ b/src/lagrangian/intermediate/parcels/derived/basicKinematicParcel/submodels/makeBasicKinematicParcelInjectionModels.C
@@ -29,6 +29,7 @@ License
 
 #include "ConeInjection.H"
 #include "FieldActivatedInjection.H"
+#include "KinematicLookupTableInjection.H"
 #include "ManualInjection.H"
 #include "NoInjection.H"
 
@@ -52,6 +53,12 @@ namespace Foam
         basicKinematicParcel
     );
     makeInjectionModelType
+    (
+        KinematicLookupTableInjection,
+        KinematicCloud,
+        basicKinematicParcel
+    );
+    makeInjectionModelType
     (
         ManualInjection,
         KinematicCloud,
diff --git a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/submodels/makeBasicReactingParcelInjectionModels.C b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/submodels/makeBasicReactingParcelInjectionModels.C
index 4ed4e7894ae..28355e9f675 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/submodels/makeBasicReactingParcelInjectionModels.C
+++ b/src/lagrangian/intermediate/parcels/derived/basicReactingParcel/submodels/makeBasicReactingParcelInjectionModels.C
@@ -31,6 +31,7 @@ License
 #include "FieldActivatedInjection.H"
 #include "ManualInjection.H"
 #include "NoInjection.H"
+#include "ReactingLookupTableInjection.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -63,6 +64,12 @@ namespace Foam
         KinematicCloud,
         basicReactingParcel
     );
+    makeInjectionModelType
+    (
+        ReactingLookupTableInjection,
+        KinematicCloud,
+        basicReactingParcel
+    );
 };
 
 
diff --git a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/submodels/makeBasicThermoParcelInjectionModels.C b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/submodels/makeBasicThermoParcelInjectionModels.C
index 2bf6f2e1b3d..2635b239377 100644
--- a/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/submodels/makeBasicThermoParcelInjectionModels.C
+++ b/src/lagrangian/intermediate/parcels/derived/basicThermoParcel/submodels/makeBasicThermoParcelInjectionModels.C
@@ -31,6 +31,7 @@ License
 #include "FieldActivatedInjection.H"
 #include "ManualInjection.H"
 #include "NoInjection.H"
+#include "ThermoLookupTableInjection.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -64,6 +65,12 @@ namespace Foam
         KinematicCloud,
         basicThermoParcel
     );
+    makeInjectionModelType
+    (
+        ThermoLookupTableInjection,
+        KinematicCloud,
+        basicThermoParcel
+    );
 
 };
 
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C
new file mode 100644
index 00000000000..7461225b51d
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.C
@@ -0,0 +1,231 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "KinematicLookupTableInjection.H"
+#include "scalarIOList.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::KinematicLookupTableInjection<CloudType>::INPUT_FILE_COLS = 9;
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::KinematicLookupTableInjection<CloudType>::parcelsToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    if ((time0 >= 0.0) && (time0 < duration_))
+    {
+        return round(injectorCells_.size()*(time1 - time0)*nParcelsPerSecond_);
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::volumeToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    scalar volume = 0.0;
+    if ((time0 >= 0.0) && (time0 < duration_))
+    {
+        forAll(mDot_, injectorI)
+        {
+            volume += mDot_[injectorI]/rho_[injectorI]*(time1 - time0);
+        }
+    }
+
+    return volume;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::KinematicLookupTableInjection<CloudType>::KinematicLookupTableInjection
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    InjectionModel<CloudType>(dict, owner, typeName),
+    inputFileName_(this->coeffDict().lookup("inputFile")),
+    duration_(readScalar(this->coeffDict().lookup("duration"))),
+    nParcelsPerSecond_
+    (
+        readScalar(this->coeffDict().lookup("parcelsPerSecond"))
+    ),
+    x_(0),
+    U_(0),
+    d_(0),
+    rho_(0),
+    mDot_(0),
+    injectorCells_(0)
+{
+    scalarListIOList injectorData
+    (
+        IOobject
+        (
+            inputFileName_,
+            owner.db().time().constant(),
+            owner.db(),
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE
+        )
+    );
+
+    x_.setSize(injectorData.size());
+    U_.setSize(injectorData.size());
+    d_.setSize(injectorData.size());
+    rho_.setSize(injectorData.size());
+    mDot_.setSize(injectorData.size());
+
+    // Populate lists
+    forAll(injectorData, injectorI)
+    {
+        if (injectorData[injectorI].size() != INPUT_FILE_COLS)
+        {
+            FatalErrorIn
+            (
+                "KinematicLookupTableInjection"
+                "("
+                    "const dictionary&,"
+                    "CloudType& owner"
+                ")"
+            )   << "Incorrect number of entries in injector specification "
+                << "- found " << injectorData[injectorI].size()
+                << ", expected " << INPUT_FILE_COLS << ":" << nl
+                << "    x0 x1 x2 u0 u1 u2 d rho mDot " << nl
+                << exit(FatalError);
+        }
+        x_[injectorI].component(0) = injectorData[injectorI][0];
+        x_[injectorI].component(1) = injectorData[injectorI][1];
+        x_[injectorI].component(2) = injectorData[injectorI][2];
+        U_[injectorI].component(0) = injectorData[injectorI][3];
+        U_[injectorI].component(1) = injectorData[injectorI][4];
+        U_[injectorI].component(2) = injectorData[injectorI][5];
+        d_[injectorI] = injectorData[injectorI][6];
+        rho_[injectorI] = injectorData[injectorI][7];
+        mDot_[injectorI] = injectorData[injectorI][8];
+    }
+
+    // Set/cache the injector cells
+    injectorCells_.setSize(injectorData.size());
+    forAll(x_, injectorI)
+    {
+        this->findCellAtPosition(injectorCells_[injectorI], x_[injectorI]);
+    }
+
+    // Determine volume of particles to inject
+    this->volumeTotal_ = 0.0;
+    forAll(mDot_, injectorI)
+    {
+        this->volumeTotal_ += mDot_[injectorI]/rho_[injectorI];
+    }
+    this->volumeTotal_ *= duration_;
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::KinematicLookupTableInjection<CloudType>::~KinematicLookupTableInjection()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+bool Foam::KinematicLookupTableInjection<CloudType>::active() const
+{
+    return true;
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::KinematicLookupTableInjection<CloudType>::timeEnd() const
+{
+    return this->SOI_ + duration_;
+}
+
+
+template<class CloudType>
+void Foam::KinematicLookupTableInjection<CloudType>::setPositionAndCell
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar time,
+    vector& position,
+    label& cellOwner
+)
+{
+    label injectorI = parcelI*injectorCells_.size()/nParcels;
+
+    position = x_[injectorI];
+    cellOwner = injectorCells_[injectorI];
+}
+
+
+template<class CloudType>
+void Foam::KinematicLookupTableInjection<CloudType>::setProperties
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar,
+    typename CloudType::parcelType* pPtr
+)
+{
+    label injectorI = parcelI*injectorCells_.size()/nParcels;
+
+    // set particle velocity
+    pPtr->U() = U_[injectorI];
+
+    // set particle diameter
+    pPtr->d() = d_[injectorI];
+
+    // set particle density
+    pPtr->rho() = rho_[injectorI];
+}
+
+
+template<class CloudType>
+bool Foam::KinematicLookupTableInjection<CloudType>::validInjection(const label)
+{
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H
new file mode 100644
index 00000000000..77aad11bc4c
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/KinematicLookupTableInjection/KinematicLookupTableInjection.H
@@ -0,0 +1,194 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::KinematicLookupTableInjection
+
+Description
+    Particle injection sources read from look-up table. Each row corresponds to
+    an injection site.
+
+    (
+        (x y z u v w d rho mDot)
+    );
+
+    where:
+        x, y, z = global cartesian co-ordinates [m]
+        u, v, w = global cartesian velocity components [m/s]
+        d       = diameter [m]
+        rho     = density [kg/m3]
+        mDot    = mass flow rate [kg/m3]
+
+SourceFiles
+    KinematicLookupTableInjection.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef KinematicLookupTableInjection_H
+#define KinematicLookupTableInjection_H
+
+#include "InjectionModel.H"
+#include "pdf.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+               Class KinematicLookupTableInjection Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class KinematicLookupTableInjection
+:
+    public InjectionModel<CloudType>
+{
+    // Private data
+
+        //- Name of file containing injector/parcel data
+        const word inputFileName_;
+
+        //- Injection duration - common to all injection sources
+        const scalar duration_;
+
+        //- Number of parcels per injector - common to all injection sources
+        const label nParcelsPerSecond_;
+
+        //- List of parcel position per injector / [m]
+        List<point> x_;
+
+        //- List of parcel velocity per injector / [m]
+        List<vector> U_;
+
+        //- List of parcel diameter per injector / [m]
+        List<scalar> d_;
+
+        //- List of parcel fluid density pre injector / [kg/m3]
+        List<scalar> rho_;
+
+        //- List of parcel injection mass flow per injector / [kg/s]
+        List<scalar> mDot_;
+
+        //- List of injector cells per injector
+        List<label> injectorCells_;
+
+        //- Number of columns expected in input file
+        static label INPUT_FILE_COLS;
+
+
+protected:
+
+    // Protected member functions
+
+        //- Number of parcels to introduce over the time step relative to SOI
+        label parcelsToInject
+        (
+            const scalar time0,
+            const scalar time1
+        ) const;
+
+        //- Volume of parcels to introduce over the time step relative to SOI
+        scalar volumeToInject
+        (
+            const scalar time0,
+            const scalar time1
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("KinematicLookupTableInjection");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        KinematicLookupTableInjection
+        (
+            const dictionary& dict,
+            CloudType& owner
+        );
+
+
+    //- Destructor
+    virtual ~KinematicLookupTableInjection();
+
+
+    // Member Functions
+
+        //- Flag to indicate whether model activates injection model
+        bool active() const;
+
+        //- Return the end-of-injection time
+        scalar timeEnd() const;
+
+
+        // Injection geometry
+
+            //- Set the injection position and owner cell
+            virtual void setPositionAndCell
+            (
+                const label parcelI,
+                const label nParcels,
+                const scalar time,
+                vector& position,
+                label& cellOwner
+            );
+
+            virtual void setProperties
+            (
+                const label parcelI,
+                const label nParcels,
+                const scalar time,
+                typename CloudType::parcelType* pPtr
+            );
+
+            virtual bool fullyDescribed() const
+            {
+                return true;
+            }
+
+            //- Return flag to identify whether or not injection in cellI is
+            //  permitted
+            virtual bool validInjection(const label parcelI);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "KinematicLookupTableInjection.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C
new file mode 100644
index 00000000000..c00262a4241
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.C
@@ -0,0 +1,263 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "ReactingLookupTableInjection.H"
+#include "scalarIOList.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::ReactingLookupTableInjection<CloudType>::INPUT_FILE_COLS = 12;
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::ReactingLookupTableInjection<CloudType>::parcelsToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    if ((time0 >= 0.0) && (time0 < duration_))
+    {
+        return round(injectorCells_.size()*(time1 - time0)*nParcelsPerSecond_);
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::ReactingLookupTableInjection<CloudType>::volumeToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    scalar volume = 0.0;
+    if ((time0 >= 0.0) && (time0 < duration_))
+    {
+        forAll(mDot_, injectorI)
+        {
+            volume += mDot_[injectorI]/rho_[injectorI]*(time1 - time0);
+        }
+    }
+
+    return volume;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::ReactingLookupTableInjection<CloudType>::ReactingLookupTableInjection
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    InjectionModel<CloudType>(dict, owner, typeName),
+    inputFileName_(this->coeffDict().lookup("inputFile")),
+    duration_(readScalar(this->coeffDict().lookup("duration"))),
+    nParcelsPerSecond_
+    (
+        readScalar(this->coeffDict().lookup("parcelsPerSecond"))
+    ),
+    x_(0),
+    U_(0),
+    d_(0),
+    rho_(0),
+    mDot_(0),
+    T_(0),
+    cp_(0),
+    Y_(0),
+    injectorCells_(0)
+{
+    scalarListIOList injectorData
+    (
+        IOobject
+        (
+            inputFileName_,
+            owner.db().time().constant(),
+            owner.db(),
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE
+        )
+    );
+
+    x_.setSize(injectorData.size());
+    U_.setSize(injectorData.size());
+    d_.setSize(injectorData.size());
+    rho_.setSize(injectorData.size());
+    mDot_.setSize(injectorData.size());
+    T_.setSize(injectorData.size());
+    cp_.setSize(injectorData.size());
+    Y_.setSize(injectorData.size());
+
+    // Populate lists
+    forAll(injectorData, injectorI)
+    {
+        if (injectorData[injectorI].size() != INPUT_FILE_COLS)
+        {
+            FatalErrorIn
+            (
+                "ReactingLookupTableInjection"
+                "("
+                    "const dictionary&,"
+                    "CloudType& owner"
+                ")"
+            )   << "Incorrect number of entries in injector specification "
+                << "- found " << injectorData[injectorI].size()
+                << ", expected a minimum of " << INPUT_FILE_COLS << ":" << nl
+                << "    x0 x1 x2 u0 u1 u2 d rho mDot T cp Y0..YN"
+                << nl << exit(FatalError);
+        }
+        x_[injectorI].component(0) = injectorData[injectorI][0];
+        x_[injectorI].component(1) = injectorData[injectorI][1];
+        x_[injectorI].component(2) = injectorData[injectorI][2];
+        U_[injectorI].component(0) = injectorData[injectorI][3];
+        U_[injectorI].component(1) = injectorData[injectorI][4];
+        U_[injectorI].component(2) = injectorData[injectorI][5];
+        d_[injectorI] = injectorData[injectorI][6];
+        rho_[injectorI] = injectorData[injectorI][7];
+        mDot_[injectorI] = injectorData[injectorI][8];
+        T_[injectorI] = injectorData[injectorI][9];
+        cp_[injectorI] = injectorData[injectorI][10];
+
+        Y_[injectorI].setSize
+        (
+            injectorData[injectorI].size() - INPUT_FILE_COLS + 1
+        );
+        label Yi = 0;
+        for
+        (
+            label i = INPUT_FILE_COLS-1;
+            i < injectorData[injectorI].size();
+            i++
+        )
+        {
+            Y_[injectorI][Yi++] = injectorData[injectorI][i];
+        }
+   }
+
+    // Set/cache the injector cells
+    injectorCells_.setSize(injectorData.size());
+    forAll(x_, injectorI)
+    {
+        this->findCellAtPosition(injectorCells_[injectorI], x_[injectorI]);
+    }
+
+    // Determine volume of particles to inject
+    this->volumeTotal_ = 0.0;
+    forAll(mDot_, injectorI)
+    {
+        this->volumeTotal_ += mDot_[injectorI]/rho_[injectorI];
+    }
+    this->volumeTotal_ *= duration_;
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::ReactingLookupTableInjection<CloudType>::~ReactingLookupTableInjection()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+bool Foam::ReactingLookupTableInjection<CloudType>::active() const
+{
+    return true;
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::ReactingLookupTableInjection<CloudType>::timeEnd() const
+{
+    return this->SOI_ + duration_;
+}
+
+
+template<class CloudType>
+void Foam::ReactingLookupTableInjection<CloudType>::setPositionAndCell
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar time,
+    vector& position,
+    label& cellOwner
+)
+{
+    label injectorI = parcelI*injectorCells_.size()/nParcels;
+
+    position = x_[injectorI];
+    cellOwner = injectorCells_[injectorI];
+}
+
+
+template<class CloudType>
+void Foam::ReactingLookupTableInjection<CloudType>::setProperties
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar,
+    typename CloudType::parcelType* pPtr
+)
+{
+    label injectorI = parcelI*injectorCells_.size()/nParcels;
+
+    // set particle velocity
+    pPtr->U() = U_[injectorI];
+
+    // set particle diameter
+    pPtr->d() = d_[injectorI];
+
+    // set particle density
+    pPtr->rho() = rho_[injectorI];
+
+    // set particle temperature
+    pPtr->T() = T_[injectorI];
+
+    // set particle specific heat capacity
+    pPtr->cp() = cp_[injectorI];
+
+    // set particle component mass fractions
+    pPtr->Y() = Y_[injectorI];
+}
+
+
+template<class CloudType>
+bool Foam::ReactingLookupTableInjection<CloudType>::validInjection(const label)
+{
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H
new file mode 100644
index 00000000000..3d361e249bc
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Reacting/InjectionModel/ReactingLookupTableInjection/ReactingLookupTableInjection.H
@@ -0,0 +1,205 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::ReactingLookupTableInjection
+
+Description
+    Particle injection sources read from look-up table. Each row corresponds to
+    an injection site.
+
+    (
+        (x y z u v w d rho mDot T cp Y0..YN)
+    );
+
+    where:
+        x, y, z = global cartesian co-ordinates [m]
+        u, v, w = global cartesian velocity components [m/s]
+        d       = diameter [m]
+        rho     = density [kg/m3]
+        mDot    = mass flow rate [kg/m3]
+        T       = temperature [K]
+        cp      = specific heat capacity [J/kg/K]
+
+SourceFiles
+    ReactingLookupTableInjection.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef ReactingLookupTableInjection_H
+#define ReactingLookupTableInjection_H
+
+#include "InjectionModel.H"
+#include "pdf.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                Class ReactingLookupTableInjection Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class ReactingLookupTableInjection
+:
+    public InjectionModel<CloudType>
+{
+    // Private data
+
+        //- Name of file containing injector/parcel data
+        const word inputFileName_;
+
+        //- Injection duration - common to all injection sources
+        const scalar duration_;
+
+        //- Number of parcels per injector - common to all injection sources
+        const label nParcelsPerSecond_;
+
+        //- List of parcel position per injector / [m]
+        List<point> x_;
+
+        //- List of parcel velocity per injector / [m]
+        List<vector> U_;
+
+        //- List of parcel diameter per injector / [m]
+        List<scalar> d_;
+
+        //- List of parcel fluid density pre injector / [kg/m3]
+        List<scalar> rho_;
+
+        //- List of parcel injection mass flow per injector / [kg/s]
+        List<scalar> mDot_;
+
+        //- List of parcel temperature flow per injector / [K]
+        List<scalar> T_;
+
+        //- List of parcel specific heat capacity per injector / [J/kg/K]
+        List<scalar> cp_;
+
+        //- List of parcel specie mass fractions per injector / []
+        List<scalarList> Y_;
+
+        //- List of injector cells per injector
+        List<label> injectorCells_;
+
+        //- Number of columns expected in input file
+        static label INPUT_FILE_COLS;
+
+
+protected:
+
+    // Protected member functions
+
+        //- Number of parcels to introduce over the time step relative to SOI
+        label parcelsToInject
+        (
+            const scalar time0,
+            const scalar time1
+        ) const;
+
+        //- Volume of parcels to introduce over the time step relative to SOI
+        scalar volumeToInject
+        (
+            const scalar time0,
+            const scalar time1
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("ReactingLookupTableInjection");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        ReactingLookupTableInjection
+        (
+            const dictionary& dict,
+            CloudType& owner
+        );
+
+
+    //- Destructor
+    virtual ~ReactingLookupTableInjection();
+
+
+    // Member Functions
+
+        //- Flag to indicate whether model activates injection model
+        bool active() const;
+
+        //- Return the end-of-injection time
+        scalar timeEnd() const;
+
+
+        // Injection geometry
+
+            //- Set the injection position and owner cell
+            virtual void setPositionAndCell
+            (
+                const label parcelI,
+                const label nParcels,
+                const scalar time,
+                vector& position,
+                label& cellOwner
+            );
+
+            virtual void setProperties
+            (
+                const label parcelI,
+                const label nParcels,
+                const scalar time,
+                typename CloudType::parcelType* pPtr
+            );
+
+            virtual bool fullyDescribed() const
+            {
+                return true;
+            }
+
+            //- Return flag to identify whether or not injection in cellI is
+            //  permitted
+            virtual bool validInjection(const label parcelI);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "ReactingLookupTableInjection.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C
new file mode 100644
index 00000000000..c736757fc26
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.C
@@ -0,0 +1,243 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+\*---------------------------------------------------------------------------*/
+
+#include "ThermoLookupTableInjection.H"
+#include "scalarIOList.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::ThermoLookupTableInjection<CloudType>::INPUT_FILE_COLS = 11;
+
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::label Foam::ThermoLookupTableInjection<CloudType>::parcelsToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    if ((time0 >= 0.0) && (time0 < duration_))
+    {
+        return round(injectorCells_.size()*(time1 - time0)*nParcelsPerSecond_);
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::ThermoLookupTableInjection<CloudType>::volumeToInject
+(
+    const scalar time0,
+    const scalar time1
+) const
+{
+    scalar volume = 0.0;
+    if ((time0 >= 0.0) && (time0 < duration_))
+    {
+        forAll(mDot_, injectorI)
+        {
+            volume += mDot_[injectorI]/rho_[injectorI]*(time1 - time0);
+        }
+    }
+
+    return volume;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::ThermoLookupTableInjection<CloudType>::ThermoLookupTableInjection
+(
+    const dictionary& dict,
+    CloudType& owner
+)
+:
+    InjectionModel<CloudType>(dict, owner, typeName),
+    inputFileName_(this->coeffDict().lookup("inputFile")),
+    duration_(readScalar(this->coeffDict().lookup("duration"))),
+    nParcelsPerSecond_
+    (
+        readScalar(this->coeffDict().lookup("parcelsPerSecond"))
+    ),
+    x_(0),
+    U_(0),
+    d_(0),
+    rho_(0),
+    mDot_(0),
+    T_(0),
+    cp_(0),
+    injectorCells_(0)
+{
+    scalarListIOList injectorData
+    (
+        IOobject
+        (
+            inputFileName_,
+            owner.db().time().constant(),
+            owner.db(),
+            IOobject::MUST_READ,
+            IOobject::NO_WRITE
+        )
+    );
+
+    x_.setSize(injectorData.size());
+    U_.setSize(injectorData.size());
+    d_.setSize(injectorData.size());
+    rho_.setSize(injectorData.size());
+    mDot_.setSize(injectorData.size());
+    T_.setSize(injectorData.size());
+    cp_.setSize(injectorData.size());
+
+    // Populate lists
+    forAll(injectorData, injectorI)
+    {
+        if (injectorData[injectorI].size() != INPUT_FILE_COLS)
+        {
+            FatalErrorIn
+            (
+                "ThermoLookupTableInjection"
+                "("
+                    "const dictionary&,"
+                    "CloudType& owner"
+                ")"
+            )   << "Incorrect number of entries in injector specification "
+                << "- found " << injectorData[injectorI].size()
+                << ", expected " << INPUT_FILE_COLS << ":" << nl
+                << "    x0 x1 x2 u0 u1 u2 d rho mDot T cp"
+                << nl << exit(FatalError);
+        }
+        x_[injectorI].component(0) = injectorData[injectorI][0];
+        x_[injectorI].component(1) = injectorData[injectorI][1];
+        x_[injectorI].component(2) = injectorData[injectorI][2];
+        U_[injectorI].component(0) = injectorData[injectorI][3];
+        U_[injectorI].component(1) = injectorData[injectorI][4];
+        U_[injectorI].component(2) = injectorData[injectorI][5];
+        d_[injectorI] = injectorData[injectorI][6];
+        rho_[injectorI] = injectorData[injectorI][7];
+        mDot_[injectorI] = injectorData[injectorI][8];
+        T_[injectorI] = injectorData[injectorI][9];
+        cp_[injectorI] = injectorData[injectorI][10];
+   }
+
+    // Set/cache the injector cells
+    injectorCells_.setSize(injectorData.size());
+    forAll(x_, injectorI)
+    {
+        this->findCellAtPosition(injectorCells_[injectorI], x_[injectorI]);
+    }
+
+    // Determine volume of particles to inject
+    this->volumeTotal_ = 0.0;
+    forAll(mDot_, injectorI)
+    {
+        this->volumeTotal_ += mDot_[injectorI]/rho_[injectorI];
+    }
+    this->volumeTotal_ *= duration_;
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class CloudType>
+Foam::ThermoLookupTableInjection<CloudType>::~ThermoLookupTableInjection()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class CloudType>
+bool Foam::ThermoLookupTableInjection<CloudType>::active() const
+{
+    return true;
+}
+
+
+template<class CloudType>
+Foam::scalar Foam::ThermoLookupTableInjection<CloudType>::timeEnd() const
+{
+    return this->SOI_ + duration_;
+}
+
+
+template<class CloudType>
+void Foam::ThermoLookupTableInjection<CloudType>::setPositionAndCell
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar time,
+    vector& position,
+    label& cellOwner
+)
+{
+    label injectorI = parcelI*injectorCells_.size()/nParcels;
+
+    position = x_[injectorI];
+    cellOwner = injectorCells_[injectorI];
+}
+
+
+template<class CloudType>
+void Foam::ThermoLookupTableInjection<CloudType>::setProperties
+(
+    const label parcelI,
+    const label nParcels,
+    const scalar,
+    typename CloudType::parcelType* pPtr
+)
+{
+    label injectorI = parcelI*injectorCells_.size()/nParcels;
+
+    // set particle velocity
+    pPtr->U() = U_[injectorI];
+
+    // set particle diameter
+    pPtr->d() = d_[injectorI];
+
+    // set particle density
+    pPtr->rho() = rho_[injectorI];
+
+    // set particle temperature
+    pPtr->T() = T_[injectorI];
+
+    // set particle specific heat capacity
+    pPtr->cp() = cp_[injectorI];
+}
+
+
+template<class CloudType>
+bool Foam::ThermoLookupTableInjection<CloudType>::validInjection(const label)
+{
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H
new file mode 100644
index 00000000000..22d3daa96cd
--- /dev/null
+++ b/src/lagrangian/intermediate/submodels/Thermodynamic/InjectionModel/ThermoLookupTableInjection/ThermoLookupTableInjection.H
@@ -0,0 +1,202 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 1991-2009 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 2 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, write to the Free Software Foundation,
+    Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Class
+    Foam::ThermoLookupTableInjection
+
+Description
+    Particle injection sources read from look-up table. Each row corresponds to
+    an injection site.
+
+    (
+        (x y z u v w d rho mDot T cp)
+    );
+
+    where:
+        x, y, z = global cartesian co-ordinates [m]
+        u, v, w = global cartesian velocity components [m/s]
+        d       = diameter [m]
+        rho     = density [kg/m3]
+        mDot    = mass flow rate [kg/m3]
+        T       = temperature [K]
+        cp      = specific heat capacity [J/kg/K]
+
+SourceFiles
+    ThermoLookupTableInjection.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef ThermoLookupTableInjection_H
+#define ThermoLookupTableInjection_H
+
+#include "InjectionModel.H"
+#include "pdf.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                Class ThermoLookupTableInjection Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class CloudType>
+class ThermoLookupTableInjection
+:
+    public InjectionModel<CloudType>
+{
+    // Private data
+
+        //- Name of file containing injector/parcel data
+        const word inputFileName_;
+
+        //- Injection duration - common to all injection sources
+        const scalar duration_;
+
+        //- Number of parcels per injector - common to all injection sources
+        const label nParcelsPerSecond_;
+
+        //- List of parcel position per injector / [m]
+        List<point> x_;
+
+        //- List of parcel velocity per injector / [m]
+        List<vector> U_;
+
+        //- List of parcel diameter per injector / [m]
+        List<scalar> d_;
+
+        //- List of parcel fluid density pre injector / [kg/m3]
+        List<scalar> rho_;
+
+        //- List of parcel injection mass flow per injector / [kg/s]
+        List<scalar> mDot_;
+
+        //- List of parcel temperature flow per injector / [K]
+        List<scalar> T_;
+
+        //- List of parcel specific heat capacity per injector / [J/kg/K]
+        List<scalar> cp_;
+
+        //- List of injector cells per injector
+        List<label> injectorCells_;
+
+        //- Number of columns expected in input file
+        static label INPUT_FILE_COLS;
+
+
+protected:
+
+    // Protected member functions
+
+        //- Number of parcels to introduce over the time step relative to SOI
+        label parcelsToInject
+        (
+            const scalar time0,
+            const scalar time1
+        ) const;
+
+        //- Volume of parcels to introduce over the time step relative to SOI
+        scalar volumeToInject
+        (
+            const scalar time0,
+            const scalar time1
+        ) const;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("ThermoLookupTableInjection");
+
+
+    // Constructors
+
+        //- Construct from dictionary
+        ThermoLookupTableInjection
+        (
+            const dictionary& dict,
+            CloudType& owner
+        );
+
+
+    //- Destructor
+    virtual ~ThermoLookupTableInjection();
+
+
+    // Member Functions
+
+        //- Flag to indicate whether model activates injection model
+        bool active() const;
+
+        //- Return the end-of-injection time
+        scalar timeEnd() const;
+
+
+        // Injection geometry
+
+            //- Set the injection position and owner cell
+            virtual void setPositionAndCell
+            (
+                const label parcelI,
+                const label nParcels,
+                const scalar time,
+                vector& position,
+                label& cellOwner
+            );
+
+            virtual void setProperties
+            (
+                const label parcelI,
+                const label nParcels,
+                const scalar time,
+                typename CloudType::parcelType* pPtr
+            );
+
+            virtual bool fullyDescribed() const
+            {
+                return true;
+            }
+
+            //- Return flag to identify whether or not injection in cellI is
+            //  permitted
+            virtual bool validInjection(const label parcelI);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "ThermoLookupTableInjection.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
-- 
GitLab