CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > OpenFOAM > OpenFOAM Programming & Development

Solving for an additional species CO in coalChemistryFoam

Register Blogs Community New Posts Updated Threads Search

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   August 11, 2010, 12:25
Default Solving for an additional species CO in coalChemistryFoam
  #1
Member
 
N. A.
Join Date: May 2010
Posts: 64
Rep Power: 16
N. A. is on a distinguished road
Hi,

Let me frist give you a brief background:

I have added multiple reactions for char combustion chemistry and modeified coalChemistryFoam. It was simple as I added following reactions in chemkin folder in chem.inp file:
ELEMENTS
O H C N
END
SPECIES
N2 O2 CH4 H2 CO2 H2O CO
END
REACTIONS
CH4 + 2 O2 => CO2 + 2 H2O 7.000E+12 0.00 20000
H2 + 0.5 O2 => H2O 1.500E+11 0.00 20000
CO + H2O => CO2 + H2 5.000E+12 0.00 20000
END

The fvSolution file already has details for CO. The amount of CO comes from Char combustion model and I have modified following file:

~/src/lagrangian/mycoalCombustion/submodels/surfaceReactionModel/COxidationKineticDiffusionLimitedRate/COxidationKineticDiffusionLimitedRate.C

Instead of CO2, CO is formed due to reaction of C with O2, H2O and CO2.


Questions:

1. I dont see that there is CO in the gas phase. Is there an issue in coupling for the two phases or there is an issue in the set-up of the case?

2. If anyone has implemented multiple-step char combustion chemistry in openfoam, can you please check the following file and let me know if you find anything.

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2008-2009 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 "COxidationMultiStepChemistry.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class CloudType>
Foam::COxidationMultiStepChemistry<CloudType>::
COxidationMultiStepChemistry
(
const dictionary& dict,
CloudType& owner
)
:
SurfaceReactionModel<CloudType>
(
dict,
owner,
typeName
),
Sb_(dimensionedScalar(this->coeffDict().lookup("Sb")).value()),
C1_(dimensionedScalar(this->coeffDict().lookup("C1")).value()),
Ka_(dimensionedScalar(this->coeffDict().lookup("Ka")).value()),
Ea_(dimensionedScalar(this->coeffDict().lookup("Ea")).value()),
Kb_(dimensionedScalar(this->coeffDict().lookup("Kb")).value()),
Eb_(dimensionedScalar(this->coeffDict().lookup("Eb")).value()),
Kc_(dimensionedScalar(this->coeffDict().lookup("Kc")).value()),
Ec_(dimensionedScalar(this->coeffDict().lookup("Ec")).value()),
CsLocalId_(-1),
O2GlobalId_(owner.composition().globalCarrierId("O 2")),
CO2GlobalId_(owner.composition().globalCarrierId(" CO2")),
COGlobalId_(owner.composition().globalCarrierId("C O")),
H2OGlobalId_(owner.composition().globalCarrierId(" H2O")),
H2GlobalId_(owner.composition().globalCarrierId("H 2")),
WC_(0.0),
WO2_(0.0),
WH2_(0.0),
WCO2_(0.0),
WCO_(0.0),
WH2O_(0.0)
{
// Determine Cs ids
label idSolid = owner.composition().idSolid();
CsLocalId_ = owner.composition().localId(idSolid, "C");
// Set local copies of thermo properties
WO2_ = owner.mcCarrierThermo().speciesData()[O2GlobalId_].W();
WH2_ = owner.mcCarrierThermo().speciesData()[H2GlobalId_].W();
WCO2_ = owner.mcCarrierThermo().speciesData()[CO2GlobalId_].W();
WH2O_ = owner.mcCarrierThermo().speciesData()[H2OGlobalId_].W();
WC_ = WCO2_ - WO2_;
WCO_ = owner.mcCarrierThermo().speciesData()[COGlobalId_].W();
if (Sb_ < 0)
{
FatalErrorIn
(
"COxidationMultiStepChemistry"
"("
"const dictionary&, "
"CloudType&"
")"
) << "Stoichiometry of reaction, Sb, must be greater than zero" << nl
<< exit(FatalError);
}
}

// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
template<class CloudType>
Foam::COxidationMultiStepChemistry<CloudType>::
~COxidationMultiStepChemistry()
{}

// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class CloudType>
bool Foam::COxidationMultiStepChemistry<CloudType>::act ive() const
{
return true;
}

template<class CloudType>
Foam::scalar Foam::COxidationMultiStepChemistry<CloudType>::cal culate
(
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 label idSolid = CloudTypearcelType::SLD;
const scalar fComb = YMixture[idSolid]*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 = this->owner().mcCarrierThermo().Y(O2GlobalId_)[cellI];
const scalar YCO2 = this->owner().mcCarrierThermo().Y(CO2GlobalId_)[cellI];
const scalar YH2O = this->owner().mcCarrierThermo().Y(H2OGlobalId_)[cellI];
// Diffusion rate coefficient
const scalar D0 = C1_/d*pow(0.5*(T + Tc), 0.75);
// Kinetic rate
const scalar Rka = max(Tc*(-0.0168+0.0000132*Tc) , 0) ;
const scalar Rkb = Kb_*exp(-Eb_/(specie::RR*Tc));
const scalar Rkc = Kc_*exp(-Ec_/(specie::RR*Tc));
// Particle surface area
const scalar Ap = mathematicalConstanti*sqr(d);
// Change in C mass [kg]
scalar dmCa = Ap*rhoc*specie::RR*Tc*YO2/WO2_*D0*Rka/(D0 + Rka);
scalar dmCb = Ap*rhoc*specie::RR*Tc*YCO2/WCO2_*D0*Rkb/(D0 + Rkb);
scalar dmCc = Ap*rhoc*specie::RR*Tc*YH2O/WH2O_*D0*Rkc/(D0 + Rkc);
scalar dmC = dmCa + dmCb +dmCc;
// Limit mass transfer by availability of C
dmC = min(mass*fComb, dmC);
// Change in O2 mass [kg]
const scalar dmO2 = dmCa/WC_*Sb_*WO2_;
// Change in CO2 mass [kg]
const scalar dmCOa = dmC+dmO2;
const scalar dmCO2 = dmCb/WC_*WCO2_;
const scalar dmCOb = dmCb + dmCO2;
const scalar dmH2O = dmCc/WC_*WH2O_;
const scalar dmCOc = dmCc/WC_*WCO_;
const scalar dmH2 = dmCc + dmH2O - dmCOc;
const scalar dmCO = dmCOa + dmCOb + dmCOc;
// Update local particle C mass
dMassSolid[CsLocalId_] += dmC;
// Update carrier O2 and CO2 mass
dMassSRCarrier[O2GlobalId_] -= dmO2;
dMassSRCarrier[CO2GlobalId_] -= dmCO2;
dMassSRCarrier[COGlobalId_] += dmCO;
dMassSRCarrier[H2GlobalId_] += dmH2;
dMassSRCarrier[H2OGlobalId_] -= dmH2O;
const scalar HC =
this->owner().composition().solids().properties()[CsLocalId_].Hf()
+ this->owner().composition().solids().properties()[CsLocalId_].cp()*T;
const scalar HcCO2 =
this->owner().mcCarrierThermo().speciesData()[CO2GlobalId_].H(T);
const scalar HcCO =
this->owner().mcCarrierThermo().speciesData()[COGlobalId_].H(T);
const scalar HcH2 =
this->owner().mcCarrierThermo().speciesData()[H2GlobalId_].H(T);
const scalar HcH2O =
this->owner().mcCarrierThermo().speciesData()[H2OGlobalId_].H(T);
const scalar HcO2 =
this->owner().mcCarrierThermo().speciesData()[O2GlobalId_].H(T);
// Heat of reaction [J]
return (dmC*HC + dmO2*HcO2 + HcCO2*dmCO2 + HcH2O*dmH2O - dmCO*HcCO - dmH2*HcH2);
}

Many Thanks.
NiA

Last edited by N. A.; August 11, 2010 at 12:52. Reason: smiley's
N. A. is offline   Reply With Quote

Old   August 11, 2010, 12:52
Default
  #2
Member
 
N. A.
Join Date: May 2010
Posts: 64
Rep Power: 16
N. A. is on a distinguished road
Folks,

the smiley's are letter 'p' in the above thread.

Let me know your take on it.

best,
NiA
N. A. is offline   Reply With Quote

Old   November 13, 2014, 09:43
Default
  #3
Senior Member
 
Freedom
Join Date: May 2014
Posts: 209
Rep Power: 13
wenxu is on a distinguished road
Quote:
Originally Posted by N. A. View Post
Folks,

the smiley's are letter 'p' in the above thread.

Let me know your take on it.

best,
NiA

I think we should also change the chem.inp or thermo.inp accordingly.

Best
wen
wenxu is offline   Reply With Quote

Old   February 18, 2019, 06:58
Default
  #4
New Member
 
Xiang Zhao
Join Date: Nov 2018
Posts: 6
Rep Power: 8
Sean Zhao is on a distinguished road
Hi, have you solved it? I encounter the same problem
Sean Zhao is offline   Reply With Quote

Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Moving mesh Niklas Wikstrom (Wikstrom) OpenFOAM Running, Solving & CFD 122 June 15, 2014 07:20
Differences between serial and parallel runs carsten OpenFOAM Bugs 11 September 12, 2008 12:16
Unknown error sivakumar OpenFOAM Pre-Processing 9 September 9, 2008 13:53
IcoFoam parallel woes msrinath80 OpenFOAM Running, Solving & CFD 9 July 22, 2007 03:58
Could anybody help me see this error and give help liugx212 OpenFOAM Running, Solving & CFD 3 January 4, 2006 19:07


All times are GMT -4. The time now is 04:22.