From 5bd56ebdaf8271c92d442bfc79b4bbd94fe130e4 Mon Sep 17 00:00:00 2001
From: sergio <s.ferraris@opencfd.co.uk>
Date: Tue, 22 Feb 2011 11:55:00 +0000
Subject: [PATCH] ENH: grey absorption with multispecies solvers

---
 .../global/unitConversion/unitConversion.H    |  12 ++
 .../radiationModels/Make/options              |  17 ++-
 .../radiationModels/radiationModel/P1/P1.C    |   2 +-
 .../greyMeanAbsorptionEmission.C              | 117 +++++++++++++-----
 .../greyMeanAbsorptionEmission.H              |  17 +--
 .../constant/radiationProperties              |  56 +++++++++
 .../constant/radiationProperties              |  56 +++++++++
 7 files changed, 236 insertions(+), 41 deletions(-)

diff --git a/src/OpenFOAM/global/unitConversion/unitConversion.H b/src/OpenFOAM/global/unitConversion/unitConversion.H
index 3255a4d805d..9913ed36478 100644
--- a/src/OpenFOAM/global/unitConversion/unitConversion.H
+++ b/src/OpenFOAM/global/unitConversion/unitConversion.H
@@ -53,6 +53,18 @@ inline scalar radToDeg(const scalar rad)
     return (rad * 180.0/constant::mathematical::pi);
 }
 
+//- Conversion from atm to Pa
+inline scalar atmToPa(const scalar atm)
+{
+    return (atm * 101035.0);
+}
+
+//- Conversion from atm to Pa
+inline scalar paToAtm(const scalar pa)
+{
+    return (pa / 101035.0);
+}
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace Foam
diff --git a/src/thermophysicalModels/radiationModels/Make/options b/src/thermophysicalModels/radiationModels/Make/options
index 91f332c71f8..f9a6356a6d4 100644
--- a/src/thermophysicalModels/radiationModels/Make/options
+++ b/src/thermophysicalModels/radiationModels/Make/options
@@ -3,12 +3,25 @@ EXE_INC = \
     -I$(LIB_SRC)/meshTools/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
     -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
-    -I$(LIB_SRC)/thermophysicalModels/basicSolidThermo/lnInclude
+    -I$(LIB_SRC)/thermophysicalModels/basicSolidThermo/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/SLGThermo/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/properties/liquidProperties/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/properties/liquidMixtureProperties/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/properties/solidProperties/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/properties/solidMixtureProperties/lnInclude \
+    -I$(LIB_SRC)/thermophysicalModels/reactionThermo/lnInclude
+
 
 LIB_LIBS = \
     -lfiniteVolume \
     -lbasicThermophysicalModels \
     -lspecie \
     -lbasicSolidThermo \
-    -lmeshTools
+    -lmeshTools \
+    -lSLGThermo \
+    -lsolidMixtureProperties \
+    -lliquidMixtureProperties \
+    -lsolidProperties \
+    -lliquidProperties
+
 
diff --git a/src/thermophysicalModels/radiationModels/radiationModel/P1/P1.C b/src/thermophysicalModels/radiationModels/radiationModel/P1/P1.C
index f59b5632f44..907ffc45663 100644
--- a/src/thermophysicalModels/radiationModels/radiationModel/P1/P1.C
+++ b/src/thermophysicalModels/radiationModels/radiationModel/P1/P1.C
@@ -89,7 +89,7 @@ Foam::radiation::P1::P1(const volScalarField& T)
             mesh_.time().timeName(),
             mesh_,
             IOobject::NO_READ,
-            IOobject::NO_WRITE
+            IOobject::AUTO_WRITE
         ),
         mesh_,
         dimensionedScalar("a", dimless/dimLength, 0.0)
diff --git a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C
index 62c491b1040..21dfa9786da 100644
--- a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C
+++ b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.C
@@ -25,6 +25,8 @@ License
 
 #include "greyMeanAbsorptionEmission.H"
 #include "addToRunTimeSelectionTable.H"
+#include "unitConversion.H"
+#include "zeroGradientFvPatchFields.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -56,13 +58,15 @@ Foam::radiation::greyMeanAbsorptionEmission::greyMeanAbsorptionEmission
     coeffsDict_((dict.subDict(typeName + "Coeffs"))),
     speciesNames_(0),
     specieIndex_(0),
-    lookUpTable_
+    lookUpTablePtr_(),
+    thermo_
     (
-        fileName(coeffsDict_.lookup("lookUpTableFileName")),
-        mesh.time().constant(),
-        mesh
+        mesh,
+        const_cast<basicThermo&>
+        (
+            mesh.lookupObject<basicThermo>("thermophysicalProperties")
+        )
     ),
-    thermo_(mesh.lookupObject<basicThermo>("thermophysicalProperties")),
     EhrrCoeff_(readScalar(coeffsDict_.lookup("EhrrCoeff"))),
     Yj_(nSpecies_)
 {
@@ -83,17 +87,45 @@ Foam::radiation::greyMeanAbsorptionEmission::greyMeanAbsorptionEmission
         nFunc++;
     }
 
+    if (coeffsDict_.found("lookUpTableFileName"))
+    {
+        const word name = coeffsDict_.lookup("lookUpTableFileName");
+        if (name != "none")
+        {
+            lookUpTablePtr_.set
+            (
+                new interpolationLookUpTable<scalar>
+                (
+                    fileName(coeffsDict_.lookup("lookUpTableFileName")),
+                    mesh.time().constant(),
+                    mesh
+                )
+            );
+
+            if (!mesh.foundObject<volScalarField>("ft"))
+            {
+                FatalErrorIn
+                (
+                    "Foam::radiation::greyMeanAbsorptionEmission(const"
+                    "dictionary& dict, const fvMesh& mesh)"
+                )   << "specie ft is not present to use with "
+                    << "lookUpTableFileName " << nl
+                    << exit(FatalError);
+            }
+        }
+    }
+
     // Check that all the species on the dictionary are present in the
     // look-up table and save the corresponding indices of the look-up table
 
     label j = 0;
     forAllConstIter(HashTable<label>, speciesNames_, iter)
     {
-        if (mesh.foundObject<volScalarField>("ft"))
+        if (!lookUpTablePtr_.empty())
         {
-            if (lookUpTable_.found(iter.key()))
+            if (lookUpTablePtr_().found(iter.key()))
             {
-                label index = lookUpTable_.findFieldIndex(iter.key());
+                label index = lookUpTablePtr_().findFieldIndex(iter.key());
 
                 Info<< "specie: " << iter.key() << " found on look-up table "
                     << " with index: " << index << endl;
@@ -120,18 +152,32 @@ Foam::radiation::greyMeanAbsorptionEmission::greyMeanAbsorptionEmission
                     "dictionary& dict, const fvMesh& mesh)"
                 )   << "specie: " << iter.key()
                     << " is neither in look-up table: "
-                    << lookUpTable_.tableName()
+                    << lookUpTablePtr_().tableName()
                     << " nor is being solved" << nl
                     << exit(FatalError);
             }
         }
+        else if (mesh.foundObject<volScalarField>(iter.key()))
+        {
+            volScalarField& Y =
+                const_cast<volScalarField&>
+                (
+                    mesh.lookupObject<volScalarField>(iter.key())
+                );
+
+            Yj_.set(j, &Y);
+            specieIndex_[iter()] = 0;
+            j++;
+        }
         else
         {
             FatalErrorIn
             (
                 "Foam::radiation::greyMeanAbsorptionEmission(const"
                 "dictionary& dict, const fvMesh& mesh)"
-            )   << "specie ft is not present " << nl
+            )   << " there is not lookup table and the specie" << nl
+                << iter.key() << nl
+                << " is not found " << nl
                 << exit(FatalError);
 
         }
@@ -149,11 +195,10 @@ Foam::radiation::greyMeanAbsorptionEmission::~greyMeanAbsorptionEmission()
 Foam::tmp<Foam::volScalarField>
 Foam::radiation::greyMeanAbsorptionEmission::aCont(const label bandI) const
 {
-    const volScalarField& T = thermo_.T();
-    const volScalarField& p = thermo_.p();
-    const volScalarField& ft = mesh_.lookupObject<volScalarField>("ft");
+    const volScalarField& T = thermo_.thermo().T();
+    const volScalarField& p = thermo_.thermo().p();
 
-    label nSpecies = speciesNames_.size();
+    const basicMultiComponentMixture& mixture = thermo_.carrier();
 
     tmp<volScalarField> ta
     (
@@ -168,48 +213,60 @@ Foam::radiation::greyMeanAbsorptionEmission::aCont(const label bandI) const
                 IOobject::NO_WRITE
             ),
             mesh(),
-            dimensionedScalar("a", dimless/dimLength, 0.0)
+            dimensionedScalar("a", dimless/dimLength, 0.0),
+            zeroGradientFvPatchVectorField::typeName
         )
     );
 
     scalarField& a = ta().internalField();
 
-    forAll(a, i)
+    forAll(a, cellI)
     {
-        const List<scalar>& species = lookUpTable_.lookUp(ft[i]);
-
-        for (label n=0; n<nSpecies; n++)
+        forAllConstIter(HashTable<label>, speciesNames_, iter)
         {
-            label l = 0;
-            scalar Yipi = 0;
+            label n = iter();
+            scalar Xipi = 0.0;
             if (specieIndex_[n] != 0)
             {
+                //Specie found in the lookUpTable.
+                const volScalarField& ft =
+                    mesh_.lookupObject<volScalarField>("ft");
+
+                const List<scalar>& Ynft = lookUpTablePtr_().lookUp(ft[cellI]);
                 //moles x pressure [atm]
-                Yipi = species[specieIndex_[n]]*p[i]*9.869231e-6;
+                Xipi = Ynft[specieIndex_[n]]*paToAtm(p[cellI]);
             }
             else
             {
-                // mass fraction
-                Yipi = Yj_[l][i];
-                l++;
+                scalar invWt = 0.0;
+                forAll (mixture.Y(), s)
+                {
+                    invWt += mixture.Y(s)[cellI]/mixture.W(s);
+                }
+
+                label index = mixture.species()[iter.key()];
+                scalar Xk = mixture.Y(index)[cellI]/(mixture.W(index)*invWt);
+
+                Xipi = Xk*paToAtm(p[cellI]);
             }
 
-            const absorptionCoeffs::coeffArray& b = coeffs_[n].coeffs(T[i]);
+            const absorptionCoeffs::coeffArray& b = coeffs_[n].coeffs(T[cellI]);
 
-            scalar Ti = T[i];
+            scalar Ti = T[cellI];
             // negative temperature exponents
             if (coeffs_[n].invTemp())
             {
-                Ti = 1./T[i];
+                Ti = 1.0/T[cellI];
             }
-            a[i] +=
-                Yipi
+            a[cellI] +=
+                Xipi
                *(
                     ((((b[5]*Ti + b[4])*Ti + b[3])*Ti + b[2])*Ti + b[1])*Ti
                   + b[0]
                 );
         }
     }
+    ta().correctBoundaryConditions();
     return ta;
 }
 
diff --git a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H
index 6e8fbe8c456..a41d2adf097 100644
--- a/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H
+++ b/src/thermophysicalModels/radiationModels/submodels/absorptionEmissionModel/greyMeanAbsorptionEmission/greyMeanAbsorptionEmission.H
@@ -89,7 +89,8 @@ SourceFiles
 #include "absorptionEmissionModel.H"
 #include "HashTable.H"
 #include "absorptionCoeffs.H"
-#include "basicThermo.H"
+#include "SLGThermo.H"
+//#include "basicThermo.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -110,10 +111,10 @@ public:
 
     // Public data
 
-        // - Maximum number of species considered for absorptivity
+        // Maximum number of species considered for absorptivity
         static const int nSpecies_ = 5;
 
-        //  Absorption Coefficients
+        // Absorption Coefficients
         absorptionCoeffs coeffs_[nSpecies_];
 
 
@@ -127,14 +128,14 @@ private:
         //- Hash table of species names
         HashTable<label> speciesNames_;
 
-        // Indices of species in the look-up table
+        //- Indices of species in the look-up table
         FixedList<label, nSpecies_> specieIndex_;
 
-        // Look-up table of species related to ft
-        mutable interpolationLookUpTable<scalar> lookUpTable_;
+        //- Look-up table of species related to ft
+        mutable autoPtr<interpolationLookUpTable<scalar> > lookUpTablePtr_;
 
-        // Thermo package
-        const basicThermo& thermo_;
+        //- SLG thermo package
+        SLGThermo thermo_;
 
         //- Emission constant coefficient
         const scalar EhrrCoeff_;
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties
index 37b3eefe66e..c030050fc4d 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire2D/constant/radiationProperties
@@ -135,6 +135,62 @@ greyMeanAbsorptionEmissionCoeffs
         );
     }
 
+    N2
+    {
+        Tcommon         300;
+        invTemp         false;
+        Tlow            200; 
+        Thigh           2500;
+
+        loTcoeffs
+        (
+            0.01
+            0   
+            0   
+            0   
+            0   
+            0   
+        );
+        hiTcoeffs
+        (
+            0.01
+            0
+            0
+            0
+            0
+            0
+        );
+
+    }
+
+    O2
+    {
+        Tcommon         300;
+        invTemp         false;
+        Tlow            200;
+        Thigh           2500;
+
+        loTcoeffs
+        (
+            0.01 
+            0       
+            0         
+            0         
+            0         
+            0         
+        );
+        hiTcoeffs     
+        (
+            0.01
+            0
+            0
+            0
+            0
+            0
+        );
+
+    }
+
 }
 
 scatterModel    constantScatter;
diff --git a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties
index 500834ae4af..aaee75d4a1b 100644
--- a/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties
+++ b/tutorials/combustion/fireFoam/les/smallPoolFire3D/constant/radiationProperties
@@ -135,6 +135,62 @@ greyMeanAbsorptionEmissionCoeffs
             0
         );
     }
+    
+    N2
+    {
+        Tcommon         300;
+        invTemp         false;
+        Tlow            200; 
+        Thigh           2500;
+
+        loTcoeffs
+        (
+            0.01
+            0   
+            0   
+            0   
+            0   
+            0   
+        );
+        hiTcoeffs
+        (
+            0.01
+            0
+            0
+            0
+            0
+            0
+        );
+
+    }
+
+    O2
+    {
+        Tcommon         300;
+        invTemp         false;
+        Tlow            200;
+        Thigh           2500;
+
+        loTcoeffs
+        (
+            0.01 
+            0       
+            0         
+            0         
+            0         
+            0         
+        );
+        hiTcoeffs     
+        (
+            0.01
+            0
+            0
+            0
+            0
+            0
+        );
+
+    }
 
 }
 
-- 
GitLab