You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
2.0 KiB
R
48 lines
2.0 KiB
R
14 years ago
|
##################################################
|
||
|
############### ConvertRefPotEC ##################
|
||
|
##################################################
|
||
|
ConvertRefPotEC <- function(argpotential, argrefscale, valuerefscale) {
|
||
|
# Converts from an electrochemical reference potential scale into another
|
||
|
# SHE: standard hydrogen electrode scale
|
||
|
# Ag/AgCl: silver silver-chloride electrode scale
|
||
|
# SCE: standard calomel scale
|
||
|
#
|
||
|
|
||
|
##### Add more reference electrodes here >>
|
||
|
refpotatSHEzero <- c( 0, -0.21, -0.24, 3)
|
||
|
refrownames <- c( "SHE", "Ag/AgCl", "SCE", "Li/Li+")
|
||
|
refcolnames <- c("SHE0", "AgCl0", "SCE0", "Li0")
|
||
|
##### Add more reference electrodes here <<
|
||
|
#
|
||
|
SHE0 <- data.frame(matrix(refpotatSHEzero, ncol=length(refpotatSHEzero), byrow=T))
|
||
|
refpotmtx <- matrix(NA, length(SHE0), length(SHE0))
|
||
|
refpotmtx[,1] <- matrix(as.matrix(SHE0), ncol=1, byrow=T)
|
||
|
for (c in 2:length(SHE0)) {
|
||
|
# loop over columns (except the first)
|
||
|
for (r in 1:length(SHE0)) {
|
||
|
# loop over rows
|
||
|
refpotmtx[r, c] <- refpotmtx[r, 1] - refpotmtx[c, 1]
|
||
|
}
|
||
|
}
|
||
|
refpotdf <- as.data.frame(refpotmtx)
|
||
|
names(refpotdf) <- refcolnames
|
||
|
row.names(refpotdf) <- refrownames
|
||
|
## So far we have made a matrix of all the possible combinations,
|
||
|
## given the vector refpotatSHEzero. The matrix is not strictly necessary,
|
||
|
## but it may prove useful later. It does.
|
||
|
#
|
||
|
# Match argrefscale to the refrownames
|
||
|
argmatch <- match(argrefscale, refrownames, nomatch = 0)
|
||
|
# Match valuerefscale to the refrownames
|
||
|
valuematch <- match(valuerefscale, refrownames, nomatch = 0)
|
||
|
# We simply assume that the match was well-behaved
|
||
|
valuepotential <- argpotential + refpotdf[valuematch, argmatch]
|
||
|
# Check that arg and value electrodes are within bounds for a match
|
||
|
if (argmatch == 0 || valuematch == 0) {
|
||
|
# No match
|
||
|
# Perform suitable action
|
||
|
message("Arg out of bounds in call to ConvertRefPot")
|
||
|
valuepotential <- NA
|
||
|
}
|
||
|
return(valuepotential)
|
||
|
}
|