adding new coal-based surface reaction moodels

This commit is contained in:
andy
2009-05-18 09:38:31 +01:00
parent 51e8809560
commit c2d39f1435
4 changed files with 623 additions and 0 deletions

View File

@ -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;
}
// ************************************************************************* //

View File

@ -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
// ************************************************************************* //

View File

@ -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;
}
// ************************************************************************* //

View File

@ -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
// ************************************************************************* //