data(thermo)
## list the buffers
thermo$buffer
# another way to do it, for a specific buffer
print(mod.buffer('PPM'))
## buffer of one species ##
# calculate the activity of CO2 in equilibrium with
# (a buffer made of) acetic acid at a given activity
basis('CHNOS')
basis('CO2','AC')
# what activity of acetic acid are we using?
print(mod.buffer('AC'))
# return the activity of CO2
affinity(return.buffer=TRUE)
# as a function of oxygen fugacity
affinity(O2=c(-85,-70,4),return.buffer=TRUE)
# as a function of logfO2 and temperature
affinity(O2=c(-85,-70,4),T=c(25,100,4),return.buffer=TRUE)
# change the activity of species in the buffer
mod.buffer('AC',logact=-10)
affinity(O2=c(-85,-70,4),T=c(25,100,4),return.buffer=TRUE)
## show values of logfO2 on an Eh-pH diagram
## After Garrels, 1960, Figure 6.
basis('CHNOSe')
# here we will buffer the activity of the electron by O2
mod.buffer('O2','O2','gas',999)
basis('e-','O2')
# start our plot, then loop over values of logfO2
thermo.plot.new(xlim=c(0,14),ylim=c(-0.8,1.2),
xlab='pH',ylab=axis.label('Eh'))
# the upper and lower lines correspond to the upper
# and lower stability limits of water
logfO2 <- c(0,-20,-40,-60,-83.1)
for(i in 1:5) {
# update the logarithm of fugacity (logact) of O2 in the buffer
mod.buffer('O2','O2','gas',logfO2[i])
# get the values of the logarithm of activity of the electron
t <- affinity(pH=c(0,14,15),return.buffer=TRUE)
# convert values of pe (-logact of the electron) to Eh
Eh <- convert(-as.numeric(t[[1]]),'Eh')
lines(seq(0,14,length.out=15),Eh)
# add some labels
text(seq(0,14,length.out=15)[i*2+2],Eh[i*2+2],
paste('logfO2=',logfO2[i],sep=''))
}
title(main=paste('Relation between logfO2(g), Eh and pH at<n>',
'25 degC and 1 bar. After Garrels, 1960'))
## buffer of two species ##
# conditions for metastable equilibrium among
# CO2 and acetic acid. note their starting activities:
print(mod.buffer('CO2-AC'))
basis('CHNOS')
basis('O2','CO2-AC')
affinity(return.buffer=TRUE) # logfO2 = -75.94248
basis('CO2',123) # what the buffer reactions are balanced on
affinity(return.buffer=TRUE) # unchanged
# consider more oxidizing conditions
mod.buffer('CO2-AC',logact=c(0,-10))
affinity(return.buffer=TRUE)
### Pyrite-Pyrrhotite-Magnetite (PPM)
# specify basis species and initial activities
basis(c('FeS2','H2S','O2','H2O'),c(0,-10,-50,0))
# note that the affinity of formation of pyrite,
# which corresponds to FeS2 in the basis, is zero
species(c('pyrite','pyrrhotite','magnetite'))
affinity(T=c(200,400,11),P=2000)$values
# attach basis species H2S and O2 to the PPM buffer
basis(c('FeS2','H2S','O2','H2O'),c(0,'PPM','PPM',0))
# inspect values of H2S activity and O2 fugacity
affinity(T=c(200,400,11),P=2000,return.buffer=TRUE)
# now, the affinities of formation reactions of
# species in the buffer are all equal to zero
affinity(T=c(200,400,11),P=2000)$values
## log fH2 - temperature diagram for mineral buffers
## and for given activities of aqueous CH2O and HCN
## After Schulte and Shock, 1995, Fig. 6:
## 300 bars, log fCO2=1, log fN2=0, log aH2O=0
# the mineral buffers FeFeO, QFM, PPM and HM are already
# included in the thermo$buffer table so let's plot them.
# the states here can be omitted -- by using the names of
# some of the basis species they will be gases
basis.logacts <- c(999,1,0,0,999,999,999)
basis(c('Fe','CO2','H2O','nitrogen','H2',
'H2S','SiO2'),basis.logacts)
basis(c('CO2','N2'),'gas')
# initialize the plot
xlim <- c(0,350)
thermo.plot.new(xlim=xlim,ylim=c(-4,4),
xlab=axis.label('T'),ylab=axis.label('H2',opt='g'))
res <- 50
Tseq <- seq(xlim[1],xlim[2],length.out=res)
# a function to plot the log fH2 of buffers and label the lines
logfH2plot <- function(buffer,lty,where) {
basis('H2',buffer)
t <- as.numeric(affinity(T=c(xlim,res),P=300,return.buffer=TRUE)$H2)
lines(Tseq,t,lty=lty)
# 'where' is the percent distance along the x-axis to plot the label
wherethis <- seq(xlim[1],xlim[2],length.out=100)[where]
if(length(grep('_',buffer)) > 0) tt <-
thermo$buffer$logact[thermo$buffer$name==buffer] else tt <- buffer
text(wherethis,splinefun(Tseq,t)(wherethis),tt)
}
# plot log fH2 of each mineral buffer
logfH2plot('FeFeO',1,16)
logfH2plot('QFM',1,30)
logfH2plot('PPM',1,80)
logfH2plot('HM',1,40)
anotherplotfunction <- function(mybuff,lty,logact,where) {
for(i in 1:length(logact)) {
# update the species activity
mod.buffer(mybuff,logact=logact[i])
logfH2plot(mybuff,lty,where[i])
}
}
# add and plot new buffers (formaldehyde and HCN)
mod.buffer('mybuffer_1','formaldehyde','aq')
logact <- c(-6,-10,-15); where <- c(10,10,25)
anotherplotfunction('mybuffer_1',3,logact,where)
mod.buffer('mybuffer_2','HCN','aq')
where <- c(20,73,50)
anotherplotfunction('mybuffer_2',2,logact,where)
# title
title(main=paste('Mineral buffers (solid), HCN (dashed), formaldehyde',
'(dotted)<n>',describe(thermo$basis[c(2,4),],T=NULL,P=300),
'After Schulte and Shock, 1995'),cex.main=0.9)</n>
<references>Garrels, R. M., 1960. <em>Mineral Equilibria</em>. Harper & Brothers, New York, 254 p.
Schulte, M. D. and Shock, E. L., 1995. Thermodynamics of Strecker synthesis in hydrothermal systems. <em>Orig. Life Evol. Biosph.</em>, 25, 161-173.</references>
<keyword>misc</keyword></n>
Run the code above in your browser using DataLab