calcCH4 <- function(df, pool, labTemp = 'default', labPa = 'default', ...) {
labParams <- list(
labTemp = labTemp,
labPa = labPa
)
allColumns <- sum(
grepl(
paste(
c('WTW_Temp_degC_1',
'Field_BP$',
'Field_BP_altitude$',
'lab_co2_lab_temp',
'lab_co2_lab_press',
'lab_co2_ch4_dry'),
collapse = '|'
),
colnames(df)
)
) == 6
if (nrow(df) == 1 & allColumns) {
cst_to_get <- c('lab_press_avg_atm', 'lab_temp_avg_degC', 'ch4_in_sa', 'gas_const_r_mol', 'h_ch4_29815k')
constants <- getRows(pool, 'constants', name %in% cst_to_get, columns = c('name', 'value'))
for (param in names(labParams)) {
if (param == 'labTemp') {
cstName <- 'lab_temp_avg_degC'
dbName <- 'lab_co2_lab_temp'
} else {
cstName <- 'lab_press_avg_atm'
dbName <- 'lab_co2_lab_press'
}
if (labParams[[param]] == 'db') {
labParams[[param]] <- df %>% pull(dbName)
} else if (labParams[[param]] == 'cst') {
labParams[[param]] <- constants %>%
filter(name == cstName) %>%
pull('value')
} else if (labParams[[param]] == 'default') {
labParams[[param]] <- df %>% pull(dbName)
if (is.na(labParams[[param]])) labParams[[param]] <- constants %>%
filter(name == cstName) %>%
pull('value')
}
}
labParams$labTemp <- labParams$labTemp + 273.15
ch4_dry <- df %>% select(starts_with('lab_co2_ch4_dry')) %>% pull()
water_temp_k <- 273.15 + df %>% pull('WTW_Temp_degC_1')
fieldPressure <- df %>% pull('Field_BP')
altPressure <- df %>% pull('Field_BP_altitude')
if (!is.na(fieldPressure) & fieldPressure <= 1050 & fieldPressure >= 700) {
bp <- fieldPressure
} else {
bp <- altPressure
}
ch4_in_sa <- constants %>% filter(name == 'ch4_in_sa') %>% pull('value')
gas_const_r_mol <- constants %>% filter(name == 'gas_const_r_mol') %>% pull('value')
h_ch4_29815k <- constants %>% filter(name == 'h_ch4_29815k') %>% pull('value')
if (!any(is.na(c(ch4_dry, water_temp_k, bp, ch4_in_sa, gas_const_r_mol, h_ch4_29815k, labParams$labTemp, labParams$labPa)))) {
h_ch4_t_eq <- h_ch4_29815k * exp(1750 * (1/labParams$labTemp - 1/298.15))
A <- ch4_dry * (0.957237 * 1013.25) * 101.325 * water_temp_k - bp * (ch4_in_sa * labParams$labTemp * 10^3)
B <- h_ch4_t_eq * gas_const_r_mol * 10 * water_temp_k + bp
dividend <- A * B
divisor <- labParams$labTemp * bp * gas_const_r_mol * water_temp_k
if (divisor != 0) {
return(
dividend / divisor
)
}
}
}
as.numeric(NA)
}