Equilibrium constant varies with pressure

79 views
Skip to first unread message

Mikael Larsen

unread,
May 24, 2024, 9:27:04 AMMay 24
to Cantera Users' Group
Hi Cantera folks

I am studying calcination of lime in a hydrogen atmosphere
CaCO3 → CaO + CO2

I have produced my own data (attached)
I have defined the interphase of CaO(S) with CaCO3_s and CaO_s plus a gas phase as adjacent phases.
CaCO3_s and CaO_s are bulk phases with fixed stoichiometry.

Generally, the modellings make sense and comply with other more simple modellings.

However, at high pressures the modeling seems odd. I have calculated the equilibrium constant for this reaction: CaCO3(S) <=> CO2(S) + CaO    and it depends on the pressure.

Normally the equilibrium constants are dimensionless, but the equilibrium constant from Cantera are not dimensionless as far as I understand as they also need to be equal to the ratio between the forward rate constant and the reverse rate constant.

Below is shown the equilibrium constant based on by dataEq-constant-CaCO3_s.png
Here is the equilibrium constant based on data from ptcombust.yaml for another and here the equilibrium constant does not depend on the pressure.
Eq-constant-CO_s-O_s.png
In my case the surface reactions involve two additional bulk phases: CaCO3_s and CaO_s. 
Can this cause problems? Any ideas what is going wrong.

Here is the source code
import cantera as ct

p = ct.one_atm # pressure
T = 673.0 # surface temperature

gas = ct.Solution("CaCO3-calcination-surface.yaml", "gas")
CaCO3_phase = ct.Solution("CaCO3-calcination-surface.yaml","CaCO3_s")
CaO_phase = ct.Solution("CaCO3-calcination-surface.yaml", "CaO_s")
surf_phase = ct.Interface("CaCO3-calcination-surface.yaml", "CaO_surf", adjacent=[gas, CaCO3_phase, CaO_phase])

surf_phase.TPX = T, p, 'CaO(S): 1, CaCO3(S):1e8, CO2(S):1 '
gas.TPX = T, p, 'H2:0, CO2:1'
CaCO3_phase.TP = T, p
CaO_phase.TP = T, p

CO2_prod = []

print('{:10s} {:10s} {:10s} {:10s} {:10s} {:10s} {:10s} {:10s}'.format('p[Pa]', '673', '773', '873', '973', '1073', '1173', '1273'))

p_end = 1e5*101325
p = 10e-7*101325
while p < p_end:
for T in range(673, 1274, 100):
surf_phase.TPX = T, p, 'CaO(S): 1, CaCO3(S):1e8, CO2(S):1 '
gas.TPX = T, p, 'H2:0, CO2:1'
CaCO3_phase.TP = T, p
CaO_phase.TP = T, p
surf_prod = surf_phase.equilibrium_constants
CO2 = surf_prod[1]
CO2_prod.append(CO2)

print(f' {p:10.3e} {CO2_prod[0]:10.3e} {CO2_prod[1]:10.3e} {CO2_prod[2]:10.3e} {CO2_prod[3]:10.3e} {CO2_prod[4]:10.3e} {CO2_prod[5]:10.3e} {CO2_prod[6]:10.3e} ')
CO2_prod.clear()
p = p * 1.1

Chris N

unread,
May 24, 2024, 4:38:35 PMMay 24
to Cantera Users' Group
It might be totally unrelated, but if you look in the BulkKinetics.cpp file, at the updateROP() method, when it updates the Kc quantity, it's only calling the getStandardChemPotentials() method, which if only used, will have an incorrect pressure dependence it seems for the computed value of Kc.  I'm not sure if is in any way related to your issue, but it was something that I noticed recently when looking through the BulkKinetics.cpp file.

You might be able to check the thermo phase implementations for your specific phases, for the methods called by the getEquilibriumConstants() method to see if anything looks wrong.

Ray Speth

unread,
May 27, 2024, 1:33:57 PMMay 27
to Cantera Users' Group

Hi,

Could you please attach the input data file, CaCO3-calcination-surface.yaml?

Thanks,
Ray

On Friday, May 24, 2024 at 9:27:04 AM UTC-4 mikael.l...@gmail.com wrote:

Mikael Larsen

unread,
May 28, 2024, 2:12:38 AMMay 28
to Cantera Users' Group
Here is the input file
CaCO3-calcination-surface.yaml
Message has been deleted

Mikael Larsen

unread,
May 28, 2024, 5:46:34 AMMay 28
to Cantera Users' Group
Now, I calculated the standard_gibbs_RT for the species and they are independent of the pressure. Below I have then calculated the equilibrium constant based on these values and the equilibrium constants are in close agreement with the equilibrium constants calculated by Cantera at low pressures. Is it a bug or is Cantera using another definition of the equilibrium constant.

Skærmbillede 2024-05-28 113525.png

Tom Condra

unread,
May 30, 2024, 12:18:41 PMMay 30
to Cantera Users' Group
Hej Mikael
...Fools rush in where angels.... . I have been following the dialogue so far - I have not checked your calculations but at the risk of making a fool of myself ... are you confusing the difference between Kp and Kc?
Regards
Tom Condra

Ray Speth

unread,
May 30, 2024, 6:46:59 PMMay 30
to Cantera Users' Group
Hi Mikael,

I think this comes down to Cantera's somewhat unconventional definition for "standard state", where the standard state properties are calculated at the current temperature and pressure of the mixture, but using a reference state for the compositional dependence (for example, pure species for gas phase species). For equilibrium constants involving only gas phase and surface phase species, this ends up having no effect, due to the choice of the standard concentration for the gas phase species and due to the conservation of surface sites for the surface species. However, for the reaction CaCO3(S) <=> CO2(S) + CaO, the presence of a bulk phase species in an incompressible phase makes things a little more interesting.

For an incompressible phase, the internal energy is independent of pressure. However, since dH = dU + V dP, the enthalpy and therefore Gibbs free energy are functions of pressure. This pressure dependence then affects ΔG for the reaction. Without invoking any definition of the standard state, exp(-ΔG/RT) = Rf / Rr, where Rf and Rr are the forward and reverse rates of progress, respectively. Based on this, there should be some dependence of the reverse reaction rate on the pressure. Using Cantera's definitions of the standard state and activity for these phases, the activity for the surface species is the concentration and the activity of the bulk is unity (because g = g° for a pure species when g° contains the pressure dependence). This means that the pressure dependence must be embedded in the reverse rate constant and therefore also affect the equilibrium constant: Rf / Rr = (kf * [CaCO3(s)]) / (kr * [CO2(s)]) = Kc * [CaCO3(s)]/[CO2(s)].

If you took the alternative approach where the standard state is defined as being at a reference pressure of 1 bar, then the activity of the bulk phase would be a function of pressure (since activity = exp((g - g°)/RT)) and you'd end up with an equilibrium constant and reverse rate constant that were pressure-independent. However, the reverse rate of progress would end up being the same.

I hope this explanation helps. It took me a while to convince myself that everything actually works out, but this turns out to be a case where I can see an advantage to Cantera's standard state convention.

Regards,
Ray

Mikael Larsen

unread,
Jun 1, 2024, 3:48:59 AMJun 1
to Cantera Users' Group

Thanks Ray, it makes sense.

The pressure dependence of the pressure on Gibbs energy can be seen from the fundamental equation.

dG = Vmdp - SdT

for an ideal gas Vm = RT/p giving a pressure dependence of ΔG = RT·ln(p/po)

for an incompressible solid ΔG = Vm(p - po)

Below is shown the standard_gibbs_RT from Cantera as function of pressure showing these relationships.

 st_G_RT.png

The reason for the question was that the overall reaction CaCO3 <=> CO2 + CaO, shifted to the right ( or at least I got a net_production of CO2) at very high pressures contrary to common knowledge. I think the reason for Cantera getting this wrong result is the lack of pressure dependence on the surface species. The surface species have no molar volume associated with them and therefore a simple model will leave the Gibbs energy independent of the pressure as is also noted on the graph. But that fine and I can live with it. Now I understand how Cantera works and know that you should be cautious at high pressures.

 Tom, yes, you should be cautious calculating K from exp(-ΔG/RT), but in this case it is ok because the activity of CaO is fixed and there is one surface specie on both side of the reaction.

Best regards
Mikael

Reply all
Reply to author
Forward
0 new messages