diff --git a/src/thermophysicalModels/laminarFlameSpeed/Make/files b/src/thermophysicalModels/laminarFlameSpeed/Make/files index 468c086eea..63e0f3c1ca 100644 --- a/src/thermophysicalModels/laminarFlameSpeed/Make/files +++ b/src/thermophysicalModels/laminarFlameSpeed/Make/files @@ -3,5 +3,6 @@ laminarFlameSpeed/laminarFlameSpeedNew.C constant/constant.C Gulders/Gulders.C GuldersEGR/GuldersEGR.C +RaviPetersen/RaviPetersen.C LIB = $(FOAM_LIBBIN)/liblaminarFlameSpeedModels diff --git a/src/thermophysicalModels/laminarFlameSpeed/RaviPetersen/RaviPetersen.C b/src/thermophysicalModels/laminarFlameSpeed/RaviPetersen/RaviPetersen.C new file mode 100644 index 0000000000..320b779539 --- /dev/null +++ b/src/thermophysicalModels/laminarFlameSpeed/RaviPetersen/RaviPetersen.C @@ -0,0 +1,365 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 . + +\*---------------------------------------------------------------------------*/ + +#include "RaviPetersen.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ +namespace laminarFlameSpeedModels +{ + defineTypeNameAndDebug(RaviPetersen, 0); + + addToRunTimeSelectionTable + ( + laminarFlameSpeed, + RaviPetersen, + dictionary + ); +} +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::laminarFlameSpeedModels::RaviPetersen::RaviPetersen +( + const dictionary& dict, + const psiuReactionThermo& ct +) +: + laminarFlameSpeed(dict, ct), + coeffsDict_(dict.subDict(typeName + "Coeffs").subDict(fuel_)), + pPoints_(coeffsDict_.lookup("pPoints")), + EqRPoints_(coeffsDict_.lookup("EqRPoints")), + alpha_(coeffsDict_.lookup("alpha")), + beta_(coeffsDict_.lookup("beta")), + TRef_(readScalar(coeffsDict_.lookup("TRef"))) +{ + checkPointsMonotonicity("equivalenceRatio", EqRPoints_); + checkPointsMonotonicity("pressure", pPoints_); + checkCoefficientArrayShape("alpha", alpha_); + checkCoefficientArrayShape("beta", beta_); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::laminarFlameSpeedModels::RaviPetersen::~RaviPetersen() +{} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::laminarFlameSpeedModels::RaviPetersen::checkPointsMonotonicity +( + const word& name, + const List& x +) const +{ + for (label i = 1; i < x.size(); i ++) + { + if (x[i] <= x[i-1]) + { + FatalIOErrorIn + ( + "laminarFlameSpeedModels::RaviPetersen::checkPointsMonotonicity" + "(" + "const word&, " + "const List&" + ") const", + coeffsDict_ + ) << "Data points for the " << name + << " do not increase monotonically" << endl + << exit(FatalIOError); + } + } +} + + +void Foam::laminarFlameSpeedModels::RaviPetersen::checkCoefficientArrayShape +( + const word& name, + const List > >& x +) const +{ + bool ok = true; + + ok &= x.size() == EqRPoints_.size() - 1; + + forAll(x, i) + { + ok &= x[i].size() == pPoints_.size(); + + forAll(x[i], j) + { + ok &= x[i][j].size() == x[i][0].size(); + } + } + + if (!ok) + { + FatalIOErrorIn + ( + "laminarFlameSpeedModels::RaviPetersen::checkCoefficientArrayShape" + "(" + "const word&, " + "const List > >&" + ") const", + coeffsDict_ + ) << "Inconsistent size of " << name << " coefficients array" << endl + << exit(FatalIOError); + } +} + + +inline bool Foam::laminarFlameSpeedModels::RaviPetersen::interval +( + const List& xPoints, + const scalar x, + label& xIndex, + scalar& xXi, + scalar& xLim +) const +{ + if (x < xPoints.first()) + { + xIndex = 0; + xXi = 0.0; + xLim = xPoints.first(); + return false; + } + + else if (x > xPoints.last()) + { + xIndex = xPoints.size() - 2; + xXi = 1.0; + xLim = xPoints.last(); + return false; + } + + for (xIndex = 0; x > xPoints[xIndex+1]; xIndex ++) + { + // increment xIndex until xPoints[xIndex] < x < xPoints[xIndex+1] + } + + xXi = (x - xPoints[xIndex])/(xPoints[xIndex+1] - xPoints[xIndex]); + xLim = x; + + return true; +} + + +inline Foam::scalar Foam::laminarFlameSpeedModels::RaviPetersen::polynomial +( + const List& coeffs, + const scalar x +) const +{ + scalar xPow = 1.0; + scalar y = 0.0; + forAll(coeffs, i) + { + y += coeffs[i]*xPow; + xPow *= x; + } + return y; +} + + +inline Foam::scalar Foam::laminarFlameSpeedModels::RaviPetersen::dPolynomial +( + const List& coeffs, + const scalar x +) const +{ + scalar xPow = 1.0; + scalar y = 0.0; + for (label i = 1; i < coeffs.size(); i++) + { + y += i*coeffs[i]*xPow; + xPow *= x; + } + return y; +} + + +inline Foam::scalar Foam::laminarFlameSpeedModels::RaviPetersen::THatPowB +( + const label EqRIndex, + const label pIndex, + const scalar EqR, + const scalar Tu +) const +{ + return pow + ( + Tu/TRef_, + polynomial(beta_[EqRIndex][pIndex],EqR) + ); +} + + +inline Foam::scalar +Foam::laminarFlameSpeedModels::RaviPetersen::correlationInRange +( + const label EqRIndex, + const label pIndex, + const scalar EqR, + const scalar Tu +) const +{ + // standard correlation + return + polynomial(alpha_[EqRIndex][pIndex],EqR) + *THatPowB(EqRIndex, pIndex, EqR, Tu); +} + + +inline Foam::scalar +Foam::laminarFlameSpeedModels::RaviPetersen::correlationOutOfRange +( + const label EqRIndex, + const label pIndex, + const scalar EqR, + const scalar EqRLim, + const scalar Tu +) const +{ + scalar A = polynomial(alpha_[EqRIndex][pIndex], EqRLim); + scalar dA = dPolynomial(alpha_[EqRIndex][pIndex], EqRLim); + scalar dB = dPolynomial(beta_[EqRIndex][pIndex], EqRLim); + scalar TB = THatPowB(EqRIndex, pIndex, EqRLim, Tu); + + // linear extrapolation from the bounds of the correlation + return max(TB*(A + (dA + A*log(Tu/TRef_)*dB)*(EqR - EqRLim)), 0.0); +} + + +inline Foam::scalar Foam::laminarFlameSpeedModels::RaviPetersen::speed +( + const scalar EqR, + const scalar p, + const scalar Tu +) const +{ + scalar Su = 0, s; + + label EqRIndex, pIndex; + scalar EqRXi, pXi; + scalar EqRLim, pLim; + bool EqRInRange; + + EqRInRange = interval(EqRPoints_, EqR, EqRIndex, EqRXi, EqRLim); + + interval(pPoints_, p, pIndex, pXi, pLim); + + for (label pI = 0; pI < 2; pI ++) + { + if (EqRInRange) + { + s = correlationInRange(EqRIndex, pIndex + pI, EqR, Tu); + } + else + { + s = correlationOutOfRange(EqRIndex, pIndex + pI, EqR, EqRLim, Tu); + } + + Su += (1 - pXi)*s; + pXi = 1 - pXi; + } + + return Su; +} + + +// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * // + +Foam::tmp +Foam::laminarFlameSpeedModels::RaviPetersen::operator()() const +{ + const volScalarField& p = psiuReactionThermo_.p(); + const volScalarField& Tu = psiuReactionThermo_.Tu(); + + volScalarField EqR + ( + IOobject + ( + "EqR", + p.time().timeName(), + p.db(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + p.mesh(), + dimensionedScalar("EqR", dimless, 0.0) + ); + + if (psiuReactionThermo_.composition().contains("ft")) + { + const volScalarField& ft = psiuReactionThermo_.composition().Y("ft"); + + EqR = + dimensionedScalar + ( + psiuReactionThermo_.lookup("stoichiometricAirFuelMassRatio") + )*ft/max(1 - ft, SMALL); + } + else + { + EqR = equivalenceRatio_; + } + + tmp tSu0 + ( + new volScalarField + ( + IOobject + ( + "Su0", + p.time().timeName(), + p.db(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + p.mesh(), + dimensionedScalar("Su0", dimVelocity, 0.0) + ) + ); + + volScalarField& Su0 = tSu0(); + + forAll(Su0, cellI) + { + Su0[cellI] = speed(EqR[cellI], p[cellI], Tu[cellI]); + } + + return tSu0; +} + + +// ************************************************************************* // diff --git a/src/thermophysicalModels/laminarFlameSpeed/RaviPetersen/RaviPetersen.H b/src/thermophysicalModels/laminarFlameSpeed/RaviPetersen/RaviPetersen.H new file mode 100644 index 0000000000..964fee4032 --- /dev/null +++ b/src/thermophysicalModels/laminarFlameSpeed/RaviPetersen/RaviPetersen.H @@ -0,0 +1,203 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / 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 . + +Class + Foam::laminarFlameSpeedModels::RaviPetersen + +Description + Laminar flame speed obtained from Ravi and Petersen's correlation. + + The correlation for the laminar flame speed \f$Su\f$ is of the following + form: + \f[ + Su = \left( \sum \alpha_i \phi^i \right) + \left( \frac{T}{T_{ref}} \right)^{\left( \sum \beta_j \phi^j \right)} + \f] + + Where \f$\phi\f$ is the equivalence ratio, and \f$\alpha\f$ and \f$\beta\f$ + are polynomial coefficients given for a number of pressure and equivalence + ratio points. + +SourceFiles + RaviPetersen.C + +\*---------------------------------------------------------------------------*/ + +#ifndef RaviPetersen_H +#define RaviPetersen_H + +#include "laminarFlameSpeed.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace laminarFlameSpeedModels +{ + +/*---------------------------------------------------------------------------*\ + Class RaviPetersen Declaration +\*---------------------------------------------------------------------------*/ + +class RaviPetersen +: + public laminarFlameSpeed +{ + // Private Data + + dictionary coeffsDict_; + + //- Correlation pressure values + List pPoints_; + + //- Correlation equivalence ratios + List EqRPoints_; + + //- Correlation alpha coefficients + List > > alpha_; + + //- Correlation beta coefficients + List > > beta_; + + //- Reference temperature + scalar TRef_; + + + // Private Member Functions + + //- Check that input points are ordered + void checkPointsMonotonicity + ( + const word& name, + const List& x + ) const; + + //- Check that the coefficient arrays are of the correct shape + void checkCoefficientArrayShape + ( + const word& name, + const List > >& x + ) const; + + //- Find and interpolate a value in the data point arrays + inline bool interval + ( + const List& xPoints, + const scalar x, + label& xIndex, + scalar& xXi, + scalar& xLim + ) const; + + //- Evaluate a polynomial + inline scalar polynomial + ( + const List& coeffs, + const scalar x + ) const; + + //- Evaluate a polynomial differential + inline scalar dPolynomial + ( + const List& coeffs, + const scalar x + ) const; + + //- Calculate normalised temperature to the power of the B polynomial + inline scalar THatPowB + ( + const label EqRIndex, + const label pIndex, + const scalar EqR, + const scalar Tu + ) const; + + //- Return the flame speed within the correlation range + inline scalar correlationInRange + ( + const label EqRIndex, + const label pIndex, + const scalar EqR, + const scalar Tu + ) const; + + //- Extrapolate the flame speed correlation outside its range + inline scalar correlationOutOfRange + ( + const label EqRIndex, + const label pIndex, + const scalar EqR, + const scalar EqRLim, + const scalar Tu + ) const; + + //- Return the laminar flame speed [m/s] + inline scalar speed + ( + const scalar EqR, + const scalar p, + const scalar Tu + ) const; + + + //- Construct as copy (not implemented) + RaviPetersen(const RaviPetersen&); + void operator=(const RaviPetersen&); + + +public: + + //- Runtime type information + TypeName("RaviPetersen"); + + // Constructors + + //- Construct from dictionary and psiuReactionThermo + RaviPetersen + ( + const dictionary&, + const psiuReactionThermo& + ); + + + //- Destructor + virtual ~RaviPetersen(); + + + // Member functions + + //- Return the laminar flame speed [m/s] + tmp operator()() const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End laminarFlameSpeedModels +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/tutorials/combustion/XiFoam/ras/Allclean b/tutorials/combustion/XiFoam/ras/Allclean index 9768a9af46..b35a5b7730 100755 --- a/tutorials/combustion/XiFoam/ras/Allclean +++ b/tutorials/combustion/XiFoam/ras/Allclean @@ -5,7 +5,7 @@ cd ${0%/*} || exit 1 # run from this directory . $WM_PROJECT_DIR/bin/tools/CleanFunctions keepCases="moriyoshiHomogeneous" -loseCases="moriyoshiHomogeneousPart2" +loseCases="moriyoshiHomogeneousPart2 moriyoshiHomogeneousHydrogen" for caseName in $keepCases do diff --git a/tutorials/combustion/XiFoam/ras/Allrun b/tutorials/combustion/XiFoam/ras/Allrun index 352a424e97..e533fb24c1 100755 --- a/tutorials/combustion/XiFoam/ras/Allrun +++ b/tutorials/combustion/XiFoam/ras/Allrun @@ -6,21 +6,25 @@ cd ${0%/*} || exit 1 # run from this directory setControlDict() { - controlDict="system/controlDict" - sed \ - -e s/"\(deltaT[ \t]*\) 5e-06;"/"\1 1e-05;"/g \ - -e s/"\(endTime[ \t]*\) 0.005;"/"\1 0.015;"/g \ - -e s/"\(writeInterval[ \t]*\) 10;"/"\1 50;"/g \ - $controlDict > temp.$$ - mv temp.$$ $controlDict + -e "s/\(deltaT[ \t]*\) 5e-06;/\1 1e-05;/g" \ + -e "s/\(endTime[ \t]*\) 0.005;/\1 0.015;/g" \ + -e "s/\(writeInterval[ \t]*\) 10;/\1 50;/g" \ + -i system/controlDict } +setCombustionProperties() +{ + sed \ + -e "s/\(laminarFlameSpeedCorrelation[ \t]*\) Gulders;/\1 RaviPetersen;/g" \ + -e "s/\(fuel[ \t]*\) Propane;/\1 HydrogenInAir;/g" \ + -i constant/combustionProperties +} # Do moriyoshiHomogeneous ( cd moriyoshiHomogeneous && foamRunTutorials ) -# Clone case +# Clone case for second phase cloneCase moriyoshiHomogeneous moriyoshiHomogeneousPart2 # Modify and execute @@ -32,4 +36,19 @@ cloneCase moriyoshiHomogeneous moriyoshiHomogeneousPart2 runApplication `getApplication` ) +# Clone case for hydrogen +cloneCase moriyoshiHomogeneous moriyoshiHomogeneousHydrogen + +# Modify and execute +( + cd moriyoshiHomogeneousHydrogen || exit + + setCombustionProperties + mv constant/thermophysicalProperties \ + constant/thermophysicalProperties.propane + mv constant/thermophysicalProperties.hydrogen \ + constant/thermophysicalProperties + runApplication `getApplication` +) + # ----------------------------------------------------------------- end-of-file diff --git a/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/combustionProperties b/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/combustionProperties index e716f817c1..ca17b8af4e 100644 --- a/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/combustionProperties +++ b/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/combustionProperties @@ -68,6 +68,36 @@ GuldersCoeffs } } +RaviPetersenCoeffs +{ + HydrogenInAir + { + TRef 320; + pPoints ( 1.0e05 5.0e05 1.0e06 2.0e06 3.0e06 ); + EqRPoints ( 0.5 2.0 5.0 ); + alpha ( ( (-0.03 -2.347 9.984 -6.734 1.361) + ( 1.61 -9.708 19.026 -11.117 2.098) + ( 2.329 -12.287 21.317 -11.973 2.207) + ( 2.593 -12.813 20.815 -11.471 2.095) + ( 2.728 -13.164 20.794 -11.418 2.086) ) + ( ( 3.558 0.162 -0.247 0.0253 0 ) + ( 4.818 -0.872 -0.053 0.0138 0 ) + ( 3.789 -0.312 -0.208 0.028 0 ) + ( 4.925 -1.841 0.211 -0.0059 0 ) + ( 4.505 -1.906 0.259 -0.0105 0 ) ) ); + beta ( ( ( 5.07 -6.42 3.87 -0.767) + ( 5.52 -6.73 3.88 -0.728) + ( 5.76 -6.92 3.92 -0.715) + ( 6.02 -7.44 4.37 -0.825) + ( 7.84 -11.55 7.14 -1.399) ) + ( ( 1.405 0.053 0.022 0 ) + ( 1.091 0.317 0 0 ) + ( 1.64 -0.03 0.07 0 ) + ( 0.84 0.56 0 0 ) + ( 0.81 0.64 0 0 ) ) ); + } +} + ignite yes; ignitionSites diff --git a/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/thermophysicalProperties.hydrogen b/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/thermophysicalProperties.hydrogen new file mode 100644 index 0000000000..8d4aff1e16 --- /dev/null +++ b/tutorials/combustion/XiFoam/ras/moriyoshiHomogeneous/constant/thermophysicalProperties.hydrogen @@ -0,0 +1,76 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object thermophysicalProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +thermoType +{ + type heheuPsiThermo; + mixture homogeneousMixture; + transport sutherland; + thermo janaf; + equationOfState perfectGas; + specie specie; + energy absoluteEnthalpy; +} + +stoichiometricAirFuelMassRatio stoichiometricAirFuelMassRatio [ 0 0 0 0 0 0 0 ] 34.074; + +reactants +{ + specie + { + nMoles 24.8095; + molWeight 16.0243; + } + thermodynamics + { + Tlow 200; + Thigh 5000; + Tcommon 1000; + highCpCoeffs ( 3.02082 0.00104314 -2.88613e-07 4.20369e-11 -2.37182e-15 -902.964 2.3064 ); + lowCpCoeffs ( 2.99138 0.00343493 -8.43792e-06 9.57755e-09 -3.75097e-12 -987.16 1.95123 ); + } + transport + { + As 1.67212e-06; + Ts 170.672; + } +} + +products +{ + specie + { + nMoles 1; + molWeight 17.9973; + } + thermodynamics + { + Tlow 200; + Thigh 5000; + Tcommon 1000; + highCpCoeffs ( 2.879 0.00161934 -4.61257e-07 6.41382e-11 -3.3855e-15 -8023.54 4.11691 ); + lowCpCoeffs ( 3.3506 0.00176018 -4.28718e-06 5.63372e-09 -2.35948e-12 -8211.42 1.36387 ); + } + transport + { + As 1.67212e-06; + Ts 170.672; + } +} + + +// ************************************************************************* //