data(thermo)
## regress calculated heat capacities and volumes of CH4(aq)
## to test that regressions return known HKF parameters
# calculate the properties of CH4 on a T-P grid
T <- convert(seq(0, 350, 25), "K")
P <- seq(200, 1000, 100)
# convert=FALSE means that temperature has units of K
CH4.prop <- subcrt("CH4", T=T, P=P, grid="T", convert=FALSE)$out[[1]]
# terms in the HKF equations for Cp
Cp.var <- c("invTTheta2", "TX")
# get coefficients in Cp regression
Cp.lm <- EOSregress(CH4.prop[, c("T", "P", "Cp")], Cp.var)
Cp.coeff <- Cp.lm$coefficients
# terms in the HKF equations for V
V.var <- c("invPPsi", "invTTheta", "invPPsiTTheta", "Q")
# get coefficients in V regression
V.lm <- EOSregress(CH4.prop[, c("T", "P", "V")], V.var)
# use same units as HKF: convert from cm3.bar to calories (divide by 41.84)
V.coeff <- convert(V.lm$coefficients, "calories")
## the tests: did we get the HKF parameters that are in the database?
CH4.par <- info(info("CH4"))
# c1 and c2
stopifnot(all.equal(Cp.coeff[1], CH4.par$c1, check.attr=FALSE))
stopifnot(all.equal(Cp.coeff[2], CH4.par$c2, check.attr=FALSE))
# omega (from Cp)
stopifnot(all.equal(Cp.coeff[3], CH4.par$omega, check.attr=FALSE))
# a1, a2, a3 and a4
stopifnot(all.equal(V.coeff[1], CH4.par$a1, check.attr=FALSE))
stopifnot(all.equal(V.coeff[2], CH4.par$a2, check.attr=FALSE))
stopifnot(all.equal(V.coeff[3], CH4.par$a3, check.attr=FALSE))
stopifnot(all.equal(V.coeff[4], CH4.par$a4, check.attr=FALSE))
# omega (from V) - note negative sign
stopifnot(all.equal(-V.coeff[5], CH4.par$omega, check.attr=FALSE))
## regress experimental heat capacities of CH4
## using revised Helgeson-Kirkham-Flowers equations
# read the data from Hnedkovsky and Wood, 1997
f <- system.file("extdata/cpetc/Cp.CH4.HW97.csv", package="CHNOSZ")
d <- read.csv(f)
# have to convert J to cal and MPa to bar
d$Cp <- convert(d$Cp, "cal")
d$P <- convert(d$P, "bar")
# specify the terms in the HKF equations
var <- c("invTTheta2", "TX")
# perform regression, with a temperature limit
EOSlm <- EOSregress(d, var, T.max=600)
# the result is within 10% of the accepted
# values of c1, c2 and omega for CH4(aq)
CH4coeffs <- EOScoeffs("CH4", "Cp")
dcoeffs <- EOSlm$coefficients - CH4coeffs
stopifnot(all(abs(dcoeffs/CH4coeffs) < 0.1))
## make plots comparing the regressions
## here with the accepted EOS parameters of CH4
par(mfrow=c(2,2))
EOSplot(d, T.max=600)
title("Cp of CH4(aq), fit to 600 K")
legend("bottomleft", pch=1, legend="Hnedkovsky and Wood, 1997")
EOSplot(d, coefficients=CH4coeffs)
title("Cp from EOS parameters in database")
EOSplot(d, T.max=600, T.plot=600)
title("Cp fit to 600 K, plot to 600 K")
EOSplot(d, coefficients=CH4coeffs, T.plot=600)
title("Cp from EOS parameters in database")
## model experimental volumes of CH4
## using HKF equation and an exploratory one
f <- system.file("extdata/cpetc/V.CH4.HWM96.csv", package="CHNOSZ")
d <- read.csv(f)
d$P <- convert(d$P, "bar")
# the HKF equation
varHKF <- c("invTTheta", "Q")
# alpha is the expansivity coefficient of water
varal <- c("invTTheta", "alpha")
par(mfrow=c(2,2))
# for both HKF and the expansivity equation
# we'll fit up to a temperature limit
EOSplot(d, varHKF, T.max=663, T.plot=625)
legend("bottomright", pch=1, legend="Hnedkovsky et al., 1996")
title("V of CH4(aq), HKF equation")
EOSplot(d, varal, T.max=663, T.plot=625)
title("V of CH4(aq), expansivity equation")
EOSplot(d, varHKF, T.max=663)
title("V of CH4(aq), HKF equation")
EOSplot(d, varal, T.max=663)
title("V of CH4(aq), expansivity equation")
# note that the volume regression using the HKF gives
# a result for omega (coefficient on Q) that is
# not consistent with the high-T heat capacities
Run the code above in your browser using DataLab