diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C new file mode 100644 index 0000000000000000000000000000000000000000..e36fd1cbfdc86aa2b0b10e20f895f015aefcf6dc --- /dev/null +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.C @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2007 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 "COxidationDiffusionLimitedRate.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::COxidationDiffusionLimitedRate::COxidationDiffusionLimitedRate +( + const dictionary& dict, + ReactingMultiphaseCloud<coalParcel>& owner +) +: + SurfaceReactionModel<ReactingMultiphaseCloud<coalParcel> > + ( + dict, + owner, + typeName + ), + Sb_(dimensionedScalar(this->coeffDict().lookup("Sb")).value()), + D_(dimensionedScalar(this->coeffDict().lookup("D")).value()), + CsLocalId_(-1), + O2GlobalId_(-1), + CO2GlobalId_(-1), + WC_(0.0), + WO2_(0.0), + HcCO2_(0.0) +{ + // Determine carrier phase Ids of reactants/products + label idGas = owner.composition().idGas(); + O2GlobalId_ = owner.composition().globalId(idGas, "O2"); + CO2GlobalId_ = owner.composition().globalId(idGas, "CO2"); + + // Determine Cs ids + label idSolid = owner.composition().idSolid(); + CsLocalId_ = owner.composition().localId(idSolid, "C"); + + // Set local copies of thermo properties + WO2_ = owner().composition().gases()[O2GlobalId_].W(); + scalar WCO2 = owner().composition().gases()[CO2GlobalId_].W(); + WC_ = WCO2 - WO2_; + HcCO2_ = owner().composition().gases()[CO2GlobalId_].Hc(); + + if (Sb_ < 0) + { + FatalErrorIn + ( + "COxidationDiffusionLimitedRate" + "(" + "const dictionary&, " + "ReactingMultiphaseCloud<coalParcel>&" + ")" + ) << "Stoichiometry, Sb, must be greater than zero" << nl + << exit(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::COxidationDiffusionLimitedRate::~COxidationDiffusionLimitedRate() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::COxidationDiffusionLimitedRate::active() const +{ + return true; +} + + +Foam::scalar Foam::COxidationDiffusionLimitedRate::calculate +( + const scalar dt, + const label cellI, + const scalar d, + const scalar T, + const scalar Tc, + const scalar pc, + const scalar rhoc, + const scalar mass, + const scalarField& YGas, + const scalarField& YLiquid, + const scalarField& YSolid, + const scalarField& YMixture, + const scalarField& dMassVolatile, + scalarField& dMassGas, + scalarField& dMassLiquid, + scalarField& dMassSolid, + scalarField& dMassSRCarrier +) const +{ + // Fraction of remaining combustible material + const scalar fComb = YMixture[coalParcel::SLD]*YSolid[CsLocalId_]; + + // Surface combustion active combustible fraction is consumed + if (fComb < SMALL) + { + return 0.0; + } + + // Local mass fraction of O2 in the carrier phase + const scalar YO2 = + owner().carrierThermo().composition().Y(O2GlobalId_)[cellI]; + + // Change in C mass [kg] + scalar dmC = + 4.0*mathematicalConstant::pi*d*D_*YO2*Tc*rhoc/(Sb_*(T + Tc))*dt; + + // Limit mass transfer by availability of C + dmC = min(mass*fComb, dmC); + + // Change in O2 mass [kg] + const scalar dmO2 = dmC/WC_*Sb_*WO2_; + + // Mass of newly created CO2 [kg] + const scalar dmCO2 = dmC + dmO2; + + // Update local particle C mass + dMassSolid[CsLocalId_] += dmC; + + // Update carrier O2 and CO2 mass + dMassSRCarrier[O2GlobalId_] -= dmO2; + dMassSRCarrier[CO2GlobalId_] += dmCO2; + + // Heat of reaction [J] + return HcCO2_*dmCO2; +} + + +// ************************************************************************* // diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H new file mode 100644 index 0000000000000000000000000000000000000000..3ce6b7cbaddc90a19ff57868fca7b429edae5599 --- /dev/null +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationDiffusionLimitedRate/COxidationDiffusionLimitedRate.H @@ -0,0 +1,147 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2007 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 + COxidationDiffusionLimitedRate + +Description + Diffusion limited rate surface reaction model for coal parcels. Limited to: + + C(s) + Sb*O2 -> CO2 + + where Sb is the stoichiometry of the reaction + +\*---------------------------------------------------------------------------*/ + +#ifndef COxidationDiffusionLimitedRate_H +#define COxidationDiffusionLimitedRate_H + +#include "SurfaceReactionModel.H" +#include "coalParcel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +/*---------------------------------------------------------------------------*\ + Class COxidationDiffusionLimitedRate Declaration +\*---------------------------------------------------------------------------*/ + +class COxidationDiffusionLimitedRate +: + public SurfaceReactionModel<ReactingMultiphaseCloud<coalParcel> > +{ + // Private data + + // Model constants + + //- Stoichiometry of reaction + const scalar Sb_; + + //- Diffusion coefficient of oxidants [m2/s] + const scalar D_; + + + // Local copies of thermo properties + + //- Molecular weight of C [kg/kmol] + scalar WC_; + + //- Molecular weight of O2 [kg/kmol] + scalar WO2_; + + //- Chemical enthalpy of CO2 [J/kg] + scalar HcCO2_; + + + // Addressing + + //- Cs positions in global/local lists + label CsLocalId_; + + //- O2 position in global list + label O2GlobalId_; + + //- CO2 positions in global list + label CO2GlobalId_; + + +public: + + //- Runtime type information + TypeName("COxidationDiffusionLimitedRate"); + + + // Constructors + + //- Construct from dictionary + COxidationDiffusionLimitedRate + ( + const dictionary& dict, + ReactingMultiphaseCloud<coalParcel>& owner + ); + + + //- Destructor + virtual ~COxidationDiffusionLimitedRate(); + + + // Member Functions + + //- Flag to indicate whether model activates surface reaction model + virtual bool active() const; + + //- Update surface reactions + virtual scalar calculate + ( + const scalar dt, + const label cellI, + const scalar d, + const scalar T, + const scalar Tc, + const scalar pc, + const scalar rhoc, + const scalar mass, + const scalarField& YGas, + const scalarField& YLiquid, + const scalarField& YSolid, + const scalarField& YMixture, + const scalarField& dMassVolatile, + scalarField& dMassGas, + scalarField& dMassLiquid, + scalarField& dMassSolid, + scalarField& dMassSRCarrier + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C new file mode 100644 index 0000000000000000000000000000000000000000..a58094f29e3824116f92c24f6a104c9492d39aba --- /dev/null +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C @@ -0,0 +1,167 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2007 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 "COxidationKineticDiffusionLimitedRate.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::COxidationKineticDiffusionLimitedRate:: +COxidationKineticDiffusionLimitedRate +( + const dictionary& dict, + ReactingMultiphaseCloud<coalParcel>& owner +) +: + SurfaceReactionModel<ReactingMultiphaseCloud<coalParcel> > + ( + dict, + owner, + typeName + ), + Sb_(dimensionedScalar(this->coeffDict().lookup("Sb")).value()), + C1_(dimensionedScalar(this->coeffDict().lookup("C1")).value()), + C2_(dimensionedScalar(this->coeffDict().lookup("C2")).value()), + E_(dimensionedScalar(this->coeffDict().lookup("E")).value()), + CsLocalId_(-1), + O2GlobalId_(-1), + CO2GlobalId_(-1), + WC_(0.0), + WO2_(0.0), + HcCO2_(0.0) +{ + // Determine carrier phase Ids of reactants/products + label idGas = owner.composition().idGas(); + O2GlobalId_ = owner.composition().globalId(idGas, "O2"); + CO2GlobalId_ = owner.composition().globalId(idGas, "CO2"); + + // Determine Cs ids + label idSolid = owner.composition().idSolid(); + CsLocalId_ = owner.composition().localId(idSolid, "C"); + + // Set local copies of thermo properties + WO2_ = owner().composition().gases()[O2GlobalId_].W(); + scalar WCO2 = owner().composition().gases()[CO2GlobalId_].W(); + WC_ = WCO2 - WO2_; + HcCO2_ = owner().composition().gases()[CO2GlobalId_].Hc(); + + if (Sb_ < 0) + { + FatalErrorIn + ( + "COxidationKineticDiffusionLimitedRate" + "(" + "const dictionary&, " + "ReactingMultiphaseCloud<coalParcel>&" + ")" + ) << "Stoichiometry, Sb, must be greater than zero" << nl + << exit(FatalError); + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::COxidationKineticDiffusionLimitedRate:: +~COxidationKineticDiffusionLimitedRate() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +bool Foam::COxidationKineticDiffusionLimitedRate::active() const +{ + return true; +} + + +Foam::scalar Foam::COxidationKineticDiffusionLimitedRate::calculate +( + const scalar dt, + const label cellI, + const scalar d, + const scalar T, + const scalar Tc, + const scalar pc, + const scalar rhoc, + const scalar mass, + const scalarField& YGas, + const scalarField& YLiquid, + const scalarField& YSolid, + const scalarField& YMixture, + const scalarField& dMassVolatile, + scalarField& dMassGas, + scalarField& dMassLiquid, + scalarField& dMassSolid, + scalarField& dMassSRCarrier +) const +{ + // Fraction of remaining combustible material + const scalar fComb = YMixture[coalParcel::SLD]*YSolid[CsLocalId_]; + + // Surface combustion active combustible fraction is consumed + if (fComb < SMALL) + { + return 0.0; + } + + // Local mass fraction of O2 in the carrier phase + const scalar YO2 = + owner().carrierThermo().composition().Y(O2GlobalId_)[cellI]; + + // Diffusion rate coefficient + const scalar D0 = C1_/d*pow(0.5*(T + Tc), 0.75); + + // Kinetic rate + const scalar Rk = C2_*exp(-E_/(specie::RR*Tc)); + + // Particle surface area + const scalar Ap = mathematicalConstant::pi*sqr(d); + + // Change in C mass [kg] + scalar dmC = Ap*rhoc*specie::RR*Tc*YO2/WO2_*D0*Rk/(D0 + Rk); + + // Limit mass transfer by availability of C + dmC = min(mass*fComb, dmC); + + // Change in O2 mass [kg] + const scalar dmO2 = dmC/WC_*Sb_*WO2_; + + // Mass of newly created CO2 [kg] + const scalar dmCO2 = dmC + dmO2; + + // Update local particle C mass + dMassSolid[CsLocalId_] += dmC; + + // Update carrier O2 and CO2 mass + dMassSRCarrier[O2GlobalId_] -= dmO2; + dMassSRCarrier[CO2GlobalId_] += dmCO2; + + // Heat of reaction [J] + return HcCO2_*dmCO2; +} + + +// ************************************************************************* // diff --git a/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H new file mode 100644 index 0000000000000000000000000000000000000000..9bbed296f105c12fcb194013986dc3ebd955a1a8 --- /dev/null +++ b/src/lagrangian/coalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.H @@ -0,0 +1,154 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2007 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 + COxidationKineticDiffusionLimitedRate + +Description + Kinetic/diffusion limited rate surface reaction model for coal parcels. + Limited to: + + C(s) + Sb*O2 -> CO2 + + where Sb is the stoichiometry of the reaction + +\*---------------------------------------------------------------------------*/ + +#ifndef COxidationKineticDiffusionLimitedRate_H +#define COxidationKineticDiffusionLimitedRate_H + +#include "SurfaceReactionModel.H" +#include "coalParcel.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +/*---------------------------------------------------------------------------*\ + Class COxidationKineticDiffusionLimitedRate Declaration +\*---------------------------------------------------------------------------*/ + +class COxidationKineticDiffusionLimitedRate +: + public SurfaceReactionModel<ReactingMultiphaseCloud<coalParcel> > +{ + // Private data + + // Model constants + + //- Stoichiometry of reaction + const scalar Sb_; + + //- Mass diffusion limited rate constant, C1 + const scalar C1_; + + //- Kinetics limited rate pre-exponential constant, C2 + const scalar C2_; + + //- Kinetics limited rate activation energy + const scalar E_; + + + // Local copies of thermo properties + + //- Molecular weight of C [kg/kmol] + scalar WC_; + + //- Molecular weight of O2 [kg/kmol] + scalar WO2_; + + //- Chemical enthalpy of CO2 [J/kg] + scalar HcCO2_; + + + // Addressing + + //- Cs positions in global/local lists + label CsLocalId_; + + //- O2 position in global list + label O2GlobalId_; + + //- CO2 positions in global list + label CO2GlobalId_; + + +public: + + //- Runtime type information + TypeName("COxidationKineticDiffusionLimitedRate"); + + + // Constructors + + //- Construct from dictionary + COxidationKineticDiffusionLimitedRate + ( + const dictionary& dict, + ReactingMultiphaseCloud<coalParcel>& owner + ); + + + //- Destructor + virtual ~COxidationKineticDiffusionLimitedRate(); + + + // Member Functions + + //- Flag to indicate whether model activates surface reaction model + virtual bool active() const; + + //- Update surface reactions + virtual scalar calculate + ( + const scalar dt, + const label cellI, + const scalar d, + const scalar T, + const scalar Tc, + const scalar pc, + const scalar rhoc, + const scalar mass, + const scalarField& YGas, + const scalarField& YLiquid, + const scalarField& YSolid, + const scalarField& YMixture, + const scalarField& dMassVolatile, + scalarField& dMassGas, + scalarField& dMassLiquid, + scalarField& dMassSolid, + scalarField& dMassSRCarrier + ) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //