From 9b482442e546a5f76cc49f0a03cb7edaf91fb9c3 Mon Sep 17 00:00:00 2001
From: Sergio Ferraris <sergio@alex.opencfd.co.uk>
Date: Fri, 29 Nov 2013 16:53:17 +0000
Subject: [PATCH] ENH: Adding soot model and updating tutorial for fireFoam

---
 .../radiationModels/Make/files                |   5 +
 .../greyMeanAbsorptionEmission.C              |  11 ++
 .../wideBandAbsorptionEmission.C              |  44 ++++-
 .../mixtureFractionSoot/mixtureFractionSoot.C | 166 ++++++++++++++++
 .../mixtureFractionSoot/mixtureFractionSoot.H | 179 ++++++++++++++++++
 .../mixtureFractionSoots.C                    |  47 +++++
 .../submodels/sootModel/noSoot/noSoot.C       |  77 ++++++++
 .../submodels/sootModel/noSoot/noSoot.H       |  98 ++++++++++
 .../sootModel/sootModel/makeSootTypes.H       |  57 ++++++
 .../submodels/sootModel/sootModel/sootModel.C |  62 ++++++
 .../submodels/sootModel/sootModel/sootModel.H | 153 +++++++++++++++
 .../sootModel/sootModel/sootModelNew.C        |  69 +++++++
 .../constant/radiationProperties              |   9 +-
 .../constant/radiationProperties              |   1 +
 .../constant/radiationProperties              |   9 +
 .../constant/radiationProperties              |   3 +
 16 files changed, 974 insertions(+), 16 deletions(-)
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.C
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.H
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoots.C
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.C
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.H
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/makeSootTypes.H
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.C
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.H
 create mode 100644 src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModelNew.C

diff --git a/src/thermophysicalModels/radiationModels/Make/files b/src/thermophysicalModels/radiationModels/Make/files
index 27d90bdd5e5..7b17f4ad51c 100644
--- a/src/thermophysicalModels/radiationModels/Make/files
+++ b/src/thermophysicalModels/radiationModels/Make/files
@@ -27,6 +27,11 @@ submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionE
 submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C
 submodels/absorptionEmissionModel/greyMeanSolidAbsorptionEmission/greyMeanSolidAbsorptionEmission.C
 
+/* Soot model */
+submodels/sootModel/sootModel/sootModel.C
+submodels/sootModel/sootModel/sootModelNew.C
+submodels/sootModel/mixtureFractionSoot/mixtureFractionSoots.C
+submodels/sootModel/noSoot/noSoot.C
 
 /* Boundary conditions */
 derivedFvPatchFields/MarshakRadiation/MarshakRadiationFvPatchScalarField.C
diff --git a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C
index 08dd1e3764e..bf33d8af880 100644
--- a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C
+++ b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C
@@ -337,6 +337,17 @@ Foam::radiation::greyMeanAbsorptionEmission::ECont(const label bandI) const
             }
         }
     }
+    else
+    {
+        WarningIn
+        (
+            "tmp<volScalarField>"
+            "radiation::greyMeanAbsorptionEmission::ECont"
+            "("
+                "const label"
+            ") const"
+        ) << "dQ field not found in mesh" << endl;
+    }
 
     return E;
 }
diff --git a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C
index a3a37549090..230fb033070 100644
--- a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C
+++ b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/wideBandAbsorptionEmission/wideBandAbsorptionEmission.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -255,14 +255,39 @@ Foam::radiation::wideBandAbsorptionEmission::ECont(const label bandI) const
         )
     );
 
-    if (mesh().foundObject<volScalarField>("hrr"))
+    if (mesh().foundObject<volScalarField>("dQ"))
     {
-        const volScalarField& hrr = mesh().lookupObject<volScalarField>("hrr");
-        E().internalField() =
-            iEhrrCoeffs_[bandI]
-           *hrr.internalField()
-           *(iBands_[bandI][1] - iBands_[bandI][0])
-           /totalWaveLength_;
+        const volScalarField& dQ = mesh().lookupObject<volScalarField>("dQ");
+
+        if (dQ.dimensions() == dimEnergy/dimTime)
+        {
+            E().internalField() =
+                iEhrrCoeffs_[bandI]
+               *dQ.internalField()
+               *(iBands_[bandI][1] - iBands_[bandI][0])
+               /totalWaveLength_
+               /mesh_.V();
+        }
+        else if (dQ.dimensions() == dimEnergy/dimTime/dimVolume)
+        {
+            E().internalField() =
+                iEhrrCoeffs_[bandI]
+               *dQ.internalField()
+               *(iBands_[bandI][1] - iBands_[bandI][0])
+               /totalWaveLength_;
+        }
+        else
+        {
+            WarningIn
+            (
+                "tmp<volScalarField>"
+                "radiation::wideBandAbsorptionEmission::ECont"
+                "("
+                    "const label"
+                ") const"
+            )
+                << "Incompatible dimensions for dQ field" << endl;
+        }
     }
 
     return E;
@@ -289,9 +314,8 @@ void Foam::radiation::wideBandAbsorptionEmission::correct
 
     for (label j=0; j<nBands_; j++)
     {
-        Info<< "Calculating absorption in band: " << j << endl;
         aLambda[j].internalField() = this->a(j);
-        Info<< "Calculated absorption in band: " << j << endl;
+
         a.internalField() +=
             aLambda[j].internalField()
            *(iBands_[j][1] - iBands_[j][0])
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.C b/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.C
new file mode 100644
index 00000000000..f891f9ad212
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.C
@@ -0,0 +1,166 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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 "mixtureFractionSoot.H"
+#include "singleStepReactingMixture.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+
+template<class ThermoType>
+const Foam::singleStepReactingMixture<ThermoType>&
+Foam::radiation::mixtureFractionSoot<ThermoType>::checkThermo
+(
+    const fluidThermo& thermo
+)
+{
+    if (isA<singleStepReactingMixture<ThermoType> >(thermo))
+    {
+        return dynamic_cast<const singleStepReactingMixture<ThermoType>& >
+        (
+            thermo
+        );
+    }
+    else
+    {
+        FatalErrorIn
+        (
+            "template<class ThermoType> "
+            "Foam::radiation::mixtureFractionSoot "
+            "("
+                "const dictionary&, "
+                "const fvMesh&"
+            ")"
+        )
+            << "Inconsistent thermo package for " << thermo.type()
+            << "Please select a thermo package based on "
+            << "singleStepReactingMixture" << exit(FatalError);
+
+        return dynamic_cast<const singleStepReactingMixture<ThermoType>& >
+        (
+            thermo
+        );
+    }
+
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class ThermoType>
+Foam::radiation::mixtureFractionSoot<ThermoType>::mixtureFractionSoot
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& modelType
+)
+:
+    sootModel(dict, mesh, modelType),
+    soot_
+    (
+        IOobject
+        (
+            "soot",
+            mesh_.time().timeName(),
+            mesh_,
+            IOobject::MUST_READ,
+            IOobject::AUTO_WRITE
+        ),
+        mesh_
+    ),
+    coeffsDict_(dict.subOrEmptyDict(modelType + "Coeffs")),
+    nuSoot_(readScalar(coeffsDict_.lookup("nuSoot"))),
+    Wsoot_(readScalar(coeffsDict_.lookup("Wsoot"))),
+    sootMax_(-1),
+    mappingFieldName_
+    (
+        coeffsDict_.lookupOrDefault<word>("mappingFieldName", "none")
+    ),
+    mapFieldMax_(1),
+    thermo_(mesh.lookupObject<fluidThermo>("thermophysicalProperties")),
+    mixture_(checkThermo(thermo_))
+{
+    const Reaction<ThermoType>& reaction = mixture_.operator[](0);
+
+    const scalarList& specieStoichCoeffs(mixture_.specieStoichCoeffs());
+
+    scalar totalMol = 0.0;
+    forAll(reaction.rhs(), i)
+    {
+        label specieI = reaction.rhs()[i].index;
+        totalMol += mag(specieStoichCoeffs[specieI]);
+    }
+
+    totalMol += nuSoot_;
+
+    scalarList Xi(reaction.rhs().size());
+
+    scalar Wm = 0.0;
+    forAll(reaction.rhs(), i)
+    {
+        const label specieI = reaction.rhs()[i].index;
+        Xi[i] = mag(specieStoichCoeffs[specieI])/totalMol;
+        Wm += Xi[i]*mixture_.speciesData()[specieI].W();
+    }
+
+    const scalar XSoot = nuSoot_/totalMol;
+    Wm += XSoot*Wsoot_;
+
+    sootMax_ = XSoot*Wsoot_/Wm;
+
+    Info << "Maximum soot mass concentrations: " << sootMax_ << nl;
+
+    if (mappingFieldName_ == "none")
+    {
+        const label index = reaction.rhs()[0].index;
+        mappingFieldName_ = mixture_.Y(index).name();
+    }
+
+    const label mapFieldIndex = mixture_.species()[mappingFieldName_];
+
+    mapFieldMax_ = mixture_.Yprod0()[mapFieldIndex];
+
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class ThermoType>
+Foam::radiation::mixtureFractionSoot<ThermoType>::~mixtureFractionSoot()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class ThermoType>
+void Foam::radiation::mixtureFractionSoot<ThermoType>::correct()
+{
+    const volScalarField& mapField =
+        mesh_.lookupObject<volScalarField>(mappingFieldName_);
+
+    soot_ = sootMax_*(mapField/mapFieldMax_);
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.H b/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.H
new file mode 100644
index 00000000000..1b1eed82d25
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoot.H
@@ -0,0 +1,179 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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::radiation::mixtureFractionSoot
+
+Description
+    This soot model is purely an state model. The ammount of soot produced is
+    determined by a single step chemistry as :
+
+        nuf Fuel + nuOx Ox = nuP P + nuSoot soot
+
+    nuSoot is prescribed by the user.
+
+    The single step chemistry used is read from the combustion.
+    The soot is not considered into the thermodynamics of the system and it
+    is not considered as an extra specie in the solver.
+
+    The spacial distribution is given by the normalization of the first product
+    on the rhs of the reaction by default or it can be added as input.
+
+    The input dictionary reads like in the radiationProperties dictionary:
+
+    sootModel mixtureFractionSoot<gasHThermoPhysics>;
+
+    mixtureFractionSootCoeffs
+    {
+        nuSoot              0.015;
+        Wsoot               12;
+        mappingFieldName    P;
+    }
+
+SourceFiles
+    mixtureFractionSoot.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef mixtureFractionSoot_H
+#define mixtureFractionSoot_H
+
+#include "interpolationLookUpTable.H"
+#include "sootModel.H"
+#include "HashTable.H"
+
+#include "fluidThermo.H"
+#include "singleStepReactingMixture.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace radiation
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class mixtureFractionSoot Declaration
+\*---------------------------------------------------------------------------*/
+template<class ThermoType>
+class mixtureFractionSoot
+:
+    public sootModel
+{
+
+    // Static functions
+
+        //- Check mixture in thermo
+        static const singleStepReactingMixture<ThermoType>& checkThermo
+        (
+            const fluidThermo&
+        );
+
+
+    // Private data
+
+         //- Soot mass fraction
+        volScalarField soot_;
+
+        //- Soot model dictionary
+        dictionary coeffsDict_;
+
+        //- Soot yield
+        scalar nuSoot_;
+
+        //- Soot molecular weight
+        scalar Wsoot_;
+
+        //- Maximum soot mass concentration at stoichiometric
+        scalar sootMax_;
+
+        //- Name of the field mapping the soot
+        word mappingFieldName_;
+
+        //- Maximum value of the map field
+        scalar mapFieldMax_;
+
+        //- Thermo package
+        const fluidThermo& thermo_;
+
+        //- Auto Ptr to singleStepReactingMixture
+        const singleStepReactingMixture<ThermoType>& mixture_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("mixtureFractionSoot");
+
+
+    // Constructors
+
+        //- Construct from components
+        mixtureFractionSoot
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& modelType
+        );
+
+
+    //- Destructor
+    virtual ~mixtureFractionSoot();
+
+
+    // Member Functions
+
+        // Edit
+
+            //- Main update/correction routine
+            virtual void correct();
+
+
+        // Access
+
+            //- Return Ysoot
+            const volScalarField& soot() const
+            {
+                return soot_;
+            }
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace radiation
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "mixtureFractionSoot.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoots.C b/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoots.C
new file mode 100644
index 00000000000..9c4131b6798
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/mixtureFractionSoot/mixtureFractionSoots.C
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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 "mixtureFractionSoot.H"
+#include "makeSootTypes.H"
+#include "thermoPhysicsTypes.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace radiation
+{
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+makeSootTypesThermo(mixtureFractionSoot, gasHThermoPhysics);
+makeSootTypesThermo(mixtureFractionSoot, gasEThermoPhysics);
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace radiation
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.C b/src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.C
new file mode 100644
index 00000000000..73b057c8102
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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 "noSoot.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    namespace radiation
+    {
+        defineTypeNameAndDebug(noSoot, 0);
+
+        addToRunTimeSelectionTable
+        (
+            sootModel,
+            noSoot,
+            dictionary
+        );
+    }
+}
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::radiation::noSoot::noSoot
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& modelType
+)
+:
+    sootModel(dict, mesh, modelType)
+{}
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+Foam::radiation::noSoot::~noSoot()
+{}
+
+
+void Foam::radiation::noSoot::correct()
+{
+    //Do nothing
+}
+
+const Foam::volScalarField& Foam::radiation::noSoot::soot() const
+{
+    notImplemented
+    (
+        "Foam::volScalarField& Foam::radiation::noSoot::soot() const"
+    );
+    return tmp<volScalarField>(NULL);
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.H b/src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.H
new file mode 100644
index 00000000000..cec60541055
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/noSoot/noSoot.H
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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::radiation::noSoot
+
+Description
+    noSoot
+
+
+SourceFiles
+    noSoot.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef noSoot_H
+#define noSoot_H
+
+
+#include "sootModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace radiation
+{
+
+/*---------------------------------------------------------------------------*\
+                    Class noSoot Declaration
+\*---------------------------------------------------------------------------*/
+class noSoot
+:
+    public sootModel
+{
+
+public:
+
+    //- Runtime type information
+    TypeName("none");
+
+
+    // Constructors
+
+        //- Construct from components
+        noSoot(const dictionary& dict, const fvMesh& mesh, const word&);
+
+
+    //- Destructor
+    virtual ~noSoot();
+
+
+    // Member Functions
+
+        // Edit
+
+            //- Main update/correction routine
+            void correct();
+
+        // Access
+
+            //- Return Ysoot
+            const volScalarField& soot() const;
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace radiation
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/makeSootTypes.H b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/makeSootTypes.H
new file mode 100644
index 00000000000..f8799926f41
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/makeSootTypes.H
@@ -0,0 +1,57 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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/>.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef makeSootTypes_H
+#define makeSootTypes_H
+
+#include "addToRunTimeSelectionTable.H"
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#define makeSootTypesThermo(sootModelType, Thermo)                            \
+                                                                              \
+    typedef sootModelType<Thermo> sootModelType##Thermo;                      \
+                                                                              \
+    defineTemplateTypeNameAndDebugWithName                                    \
+    (                                                                         \
+        sootModelType##Thermo,                                                \
+        #sootModelType"<"#Thermo">",                                          \
+        0                                                                     \
+    );                                                                        \
+                                                                              \
+    addToRunTimeSelectionTable                                                \
+    (                                                                         \
+        sootModel,                                                            \
+        sootModelType##Thermo,                                                \
+        dictionary                                                            \
+    );
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.C b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.C
new file mode 100644
index 00000000000..b0432e1d33d
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.C
@@ -0,0 +1,62 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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 "sootModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace radiation
+{
+    defineTypeNameAndDebug(sootModel, 0);
+    defineRunTimeSelectionTable(sootModel, dictionary);
+}
+}
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::radiation::sootModel::sootModel
+(
+    const dictionary& dict,
+    const fvMesh& mesh,
+    const word& modelType
+)
+:
+    dict_(dict),
+    mesh_(mesh)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor    * * * * * * * * * * * * * * //
+
+Foam::radiation::sootModel::~sootModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.H b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.H
new file mode 100644
index 00000000000..5562d630fa6
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModel.H
@@ -0,0 +1,153 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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::radiation::sootModel
+
+Description
+    Base class for soor models
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef radiationsootModel_H
+#define radiationsootModel_H
+
+#include "IOdictionary.H"
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+#include "volFields.H"
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace radiation
+{
+
+
+/*---------------------------------------------------------------------------*\
+                            Class sootModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class sootModel
+{
+
+protected:
+
+    // Protected data
+
+        //- Radiation model dictionary
+        const dictionary dict_;
+
+        //- Reference to the fvMesh
+        const fvMesh& mesh_;
+
+
+public:
+
+    //- Runtime type information
+    TypeName("sootModel");
+
+    //- Declare runtime constructor selection table
+
+        declareRunTimeSelectionTable
+        (
+            autoPtr,
+            sootModel,
+            dictionary,
+            (
+                const dictionary& dict,
+                const fvMesh& mesh,
+                const word& modelType
+            ),
+            (dict, mesh, modelType)
+        );
+
+
+    // Constructors
+
+        //- Construct from components
+        sootModel
+        (
+            const dictionary& dict,
+            const fvMesh& mesh,
+            const word& modelType
+        );
+
+
+    //- Selector
+    static autoPtr<sootModel> New
+    (
+        const dictionary& dict,
+        const fvMesh& mesh
+    );
+
+
+    //- Destructor
+    virtual ~sootModel();
+
+
+    // Member Functions
+
+        // Access
+
+            //- Reference to the mesh
+            inline const fvMesh& mesh() const
+            {
+                return mesh_;
+            }
+
+            //- Reference to the dictionary
+            inline const dictionary& dict() const
+            {
+                return dict_;
+            }
+
+
+            // Member Functions
+
+                // Edit
+
+                    //- Main update/correction routine
+                    virtual void correct() = 0;
+
+
+                // Access
+
+                    //- Return const reference to soot
+                    virtual const volScalarField& soot() const = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+} // End namespace radiation
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModelNew.C b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModelNew.C
new file mode 100644
index 00000000000..bdb8181d41d
--- /dev/null
+++ b/src/thermophysicalModels/radiationModels/submodels/sootModel/sootModel/sootModelNew.C
@@ -0,0 +1,69 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2013 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 "error.H"
+#include "sootModel.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::autoPtr<Foam::radiation::sootModel>
+Foam::radiation::sootModel::New
+(
+    const dictionary& dict,
+    const fvMesh& mesh
+)
+{
+    word modelType("none");
+
+    if (dict.found("sootModel"))
+    {
+        dict.lookup("sootModel") >> modelType;
+
+        Info<< "Selecting sootModel " << modelType << endl;
+    }
+
+    dictionaryConstructorTable::iterator cstrIter =
+            dictionaryConstructorTablePtr_->find(modelType);
+
+    if (cstrIter == dictionaryConstructorTablePtr_->end())
+    {
+        FatalErrorIn
+        (
+            "sootModel::New(const dictionary&, const fvMesh&)"
+        )   << "Unknown sootModel type "
+            << modelType << nl << nl
+            << "Valid sootModel types are :" << nl
+            << dictionaryConstructorTablePtr_->sortedToc() << exit(FatalError);
+    }
+
+    const label tempOpen = modelType.find('<');
+
+    const word className = modelType(0, tempOpen);
+
+    return autoPtr<sootModel>(cstrIter()(dict, mesh, className));
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/flameSpreadWaterSuppressionPanel/constant/radiationProperties b/tutorials/combustion/fireFoam/les/flameSpreadWaterSuppressionPanel/constant/radiationProperties
index 392c1acad2c..6ce48dc3fe1 100755
--- a/tutorials/combustion/fireFoam/les/flameSpreadWaterSuppressionPanel/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/flameSpreadWaterSuppressionPanel/constant/radiationProperties
@@ -48,13 +48,10 @@ greyMeanAbsorptionEmissionSootCoeffs
     EhrrCoeff                0.4;
 }
 
-scatterModel    constantScatter;
+scatterModel    none;
 
-constantScatterCoeffs
-{
-    sigma           sigma [ 0 -1 0 0 0 0 0 ] 0;
-    C               C [ 0 0 0 0 0 0 0 ] 0;
-}
+
+sootModel       none;
 
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties
index ae6091de4dc..b779d05d382 100644
--- a/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/oppositeBurningPanels/constant/radiationProperties
@@ -191,5 +191,6 @@ greyMeanAbsorptionEmissionCoeffs
 
 scatterModel    none;
 
+sootModel       none;
 
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties
index 62b677bd775..a25c81382a4 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties
@@ -15,6 +15,8 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+radiation on;
+
 radiationModel  fvDOM;
 
 fvDOMCoeffs
@@ -187,5 +189,12 @@ greyMeanAbsorptionEmissionCoeffs
 
 scatterModel    none;
 
+sootModel mixtureFractionSoot<gasHThermoPhysics>;
 
+mixtureFractionSootCoeffs
+{
+    //CH4 + 2O2 + 7.5N2 = CO2 + 2H2O + 7.5N2 + nuSoot soot
+    nuSoot              0.055;
+    Wsoot               12;
+}
 // ************************************************************************* //
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties
index 63e3de884c0..621656b060f 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties
@@ -16,6 +16,8 @@ FoamFile
 }
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
+radiation on;
+
 radiationModel  fvDOM;
 
 fvDOMCoeffs
@@ -188,5 +190,6 @@ greyMeanAbsorptionEmissionCoeffs
 
 scatterModel    none;
 
+sootModel       none;
 
 // ************************************************************************* //
-- 
GitLab