cumBg {biogas}R Documentation

Calculate Cumulative Biogas Production

Description

cumBg (for cumulative biogas) calculates cumulative biogas, methane production and production rates from individual volume (or mass) and composition measurements for any number of reactors.

Usage

cumBg(
  # Main arguments
  dat, dat.type = 'vol', comp = NULL, temp = NULL, 
  pres = NULL, interval = TRUE,
  data.struct = 'long',
  # Column names for volumetric method
  id.name = 'id', time.name = 'time', dat.name = dat.type,
  comp.name = 'xCH4', 
  # Additional arguments for manometric and gravimetric methods
  pres.resid = NULL, temp.init = NULL, pres.init = NULL,
  rh.resid = NULL,
  rh.resid.init = 1, headspace = NULL, 
  vol.hs.name = 'vol.hs', headcomp = 'N2',
  absolute = TRUE, pres.amb = NULL,
  # Additional arguments for GCA method
  mol.f.name = NULL, vol.syr = NULL,
  # Calculation method and other settings
  cmethod = 'removed', imethod = 'linear', extrap = FALSE,
  addt0 = TRUE, showt0 = TRUE, 
  dry = FALSE,
  empty.name = NULL,
  # Warnings and messages
  std.message = !quiet, 
  check = TRUE,
  # Units and standard conditions
  temp.std = getOption('temp.std', as.numeric(NA)), 
  pres.std = getOption('pres.std', as.numeric(NA)),
  unit.temp = getOption('unit.temp', 'C'),
  unit.pres = getOption('unit.pres', 'atm'),
  quiet = FALSE
  ) 

Arguments

dat

a data frame with reactor identification code; time of measurement (as numeric, or POSIX); and measured biogas volume, pressure in pres.unit, or total reactor mass (see dat.type argument). See Details section for details on units. Additional columns can be present–these will be returned in the output data frame. See data.struct argument for details on how data frames are structured.

dat.type

the type of data contained in dat. Use "vol" or "volume" for biogas volume (volumetric method will be used), "mass" for reactor masses (gravimetric method will be used) or "pres" ("pressure") for headspace pressure (pressure of the headspace will be converted to gas volume). Default is "vol".

comp

(optional) a data frame with the columns reactor identification code; time of measurement, (as numeric, or POSIX); and methane concentration within dry biogas as a mole fraction, considering only methane and carbon dioxide (unless cmethod = "total") or a single numeric value. If omitted, cumulative biogas volume will still be calculated and returned (but no methane data will be returned). The names of these columns are specified with id.name, time.name, and comp.name. Default is NULL.

temp

the temperature at which biogas volume was measured (when dat.type = "vol"), or of biogas just prior to exiting the reactor (when dat.type = "mass"). A length-one numeric vector. Degrees Celcius by default (see unit.temp argument). Default is NULL, which suppresses correction for temperature and pressure.

pres

the absolute pressure at which biogas volume was measured (when dat.type = "vol"), or of biogas just prior to exiting the reactor (when dat.type = "mass"). A length-one numeric vector or a character vector giving the name of the column in dat with the pressure measurements. Atmospheres by default (see unit.pres argument). Default is NULL, which suppresses correction for temperature and pressure. Not used for manometric method (when dat.type = "pres").

interval

do biogas measurements (volume or pressure) represent production only from the time interval between observations (default)? interval = FALSE means measured gas volume or pressure is cumulative. Applies to volumetric (dat.type = "vol") and manometric methods (dat.type = "pres"). The gravimetric method (dat.type = "mass") is cumulative by nature and the interval argument is not used. For mixed manometric measurements (some observations vented, some not), use interval = TRUE, include a column for pres.resid, and, if composition was only measured for vented observations, use imethod = "f1". Default is TRUE.

data.struct

the structure of input data. The default of 'long' means separate objects for volume (or pressure or mass for manometric and gravimetric methods) and composition (if available). Each data frame must have reactor identification code and time columns with names specified with id.name and time.name. The dat data frame must have volume (or pressure or mass) data in a single column with the name specified by dat.name. The comp data frame must have biogas composition in a single column with the name specified by comp.name. For the data.struct = 'longcombo' option, the composition column should be in the dat data frame, and the comp argument is not used. For the data.struct = 'wide' option, two separate data frames are needed as in 'long', but there are no reactor identification code columns. Instead, in dat, volume (or pressure or mass) data are in a separate column for each bottle, and column names are reactor identification codes. Here, dat.name should be the name of the first column with volume (or pressure or mass) data. All following columns are assumed to also have volume (or pressure or mass) data. And in comp, biogas composition data are also in a separate column for each bottle, also with reactor identification codes for column names. Here, comp.name should be the name of the first column with biogas composition data, as for dat.

id.name

name of the reactor identification code column in dat. Must be the same in all data frames used in the function. Default is "id".

time.name

name of column containing time data in dat and comp data frames. Default is "time".

dat.name

name of column containing the primary response variable (volume or mass) in dat data frame. Default is dat.type value. See dat.type argument.

comp.name

name of column containing biogas mole fraction of methane in comp data frame. Default is "xCH4". Must be normalised so xCH4 + xCO2 = 1.0 unless cmethod = "total".

pres.resid

headspace pressure after venting. Either a single numeric value, assumed to be the same for all observations, or the name of a column in dat that contains these values for each observation. Used in manometric method only (dat.type = "pres"). Can be absolute (default) or gauge depending on the value of absolute. Length one numeric or character vector.

temp.init

initial headspace temperature in unit.temp units. Used to correct for effect of initial reactor headspace on mass loss for the gravimetric method (dat.type = "mass"), and to determine initial gas volume in the manometric method (dat.type = "pres"). Not used for volumetric method (dat.type = "vol").

pres.init

headspace pressure at the begining of the experiment. Used in manometric method only (dat.type = "pres"). Can be absolute (default) or gauge depending on the value of absolute. Length one numeric vector.

rh.resid

relative humidity of the gas in the headspace after venting. If NULL (default), it is calculated for each interval as the ratio of post- to pre-venting pressure (equivalent to assuming relative water vapor concentration (mixing ratio) is the same before and after venting. If entered, typically should be 1.0. Length one numeric vector. Used in manometric method only (dat.type = "pres").

rh.resid.init

relative humidity of the gas in the headspace at the begining of the experiment. Typically should be 1.0 (the default). Length one numeric vector. Used in manometric method only (dat.type = "pres").

headspace

(optional) a data frame or length-one numeric vector with reactor headspace volume(s). If a data frame is used, it should at least contain a "id" (reactor identification code) column (see "id.name") and headspace volume column (see vol.hs.name argument). Required if method = "total" for the volumetric method, for initial headspace correction for the gravimetric method (see headcomp and temp.init) and for the manometric method using pressure measurements (dat.type = "pres"). Default is NULL.

vol.hs.name

name of column containing headspace volume data in optional headspace data frame. Default is "vol.hs".

headcomp

(optional) Composition of headspace for correction of initial headspace mass for gravimetric method only. If provided, correction will be applied to first mass loss observation for each individual reactor. See argument of the same name in mass2vol. Currently, the only option is "N2" for dinitrogen gas. Use of any other value will be ignored with a warning.

absolute

is the headspace pressure measured in the manometric method (dat.name and pres.resid values/columns) absolute or gauge pressure? Applies to manometric method only (dat.type = "pres"). Default is TRUE.

pres.amb

absolute ambient pressure needed to calculate absolute pressure from gauge pressure measurements. In atmospheres by default (see unit.pres argument). Only a single value is accepted. If ambient pressure differed among measurements, it is necessary to convert pressures to absolute values and use absolute = TRUE instead.

mol.f.name

name of the column in dat that contains the post-venting (f for final) quantity of methane in the syringe. Used for the absolute GC method (dat.type = "gca") only (Hansen et al., 2004). If venting was not done for a particular observation, the value in this column should be NA. The pre-venting column name is given in the dat.name column.

vol.syr

volume of the syringe used in the absolute GC method (Hansen et al., 2004) (dat.type = "gca") in mL. Only a single value is accepted. If other volume units are used (e.g., microL), the units used for the (headspace) argument must match, and the output volume unit will be the same.

cmethod

method for calculating cumulative methane production. Applies to dat.type = "vol" and dat.type = "pres" methods only. Use "removed" to base production on xCH4 and gas volumes removed (default). Use "total" to base it on the sum of methane removed and methane remaining in the reactor headspace. For "removed", xCH4 should be calculated based on methane and CO2 only (xCH4 + xCO2 = 1.0). For "total", xCH4 should be calculated including all biogas components (CH4, CO2, N2, H2S, etc.) except water. Length one character vector.

imethod

method used for interpolation of xCH4. This is passed as the method argument to interp. Length one character vector. Default is "linear" for linear interpolation.

extrap

should comp.name be extrapolated? Length one logical vector. This is passed as the extrap argument to interp. Default is FALSE.

addt0

is the earliest time in dat data frame “time zero” (start time)? If not, this argument adds a row with time.name = 0 for each reactor in order to calculate production rates for the first observation. This addition is only made when dat.type = "vol" or dat.type = "pres" and time.name is numeric (or integer). Length-one logical vector. Default is TRUE. To return these additional rows in the output, see showt0.

showt0

should “time zero” rows be returned in the output? Can be convenient for plotting cumulative volumes. Only applies if time.name is numeric (or integer). These rows may have been present in the original data (dat) or added by the function (see addt0). Default value depends on dat time.name column content. If time.name column is numeric and contains 0 then the default value is TRUE and otherwise FALSE.

dry

set to TRUE is volume data are standardised to dry conditions (e.g., AMPTS II data). Only applies to volumetric data (dat.type = 'vol'). The default (FALSE) means biogas is assumed to be saturated with water vapor.

empty.name

column containing a binary (logical, or integer or numeric (1 or 0)) variable indicating when accumulated biogas was emptied. Use for mix of cumulative/interval data. Only applies to volumetric data (dat.type = 'vol'). If used, interval is ignored.

std.message

should a message with the standard conditions be displayed? Default is TRUE.

check

should input data be checked for unreasonable values (with warnings)? Currently only composition values are checked. Default is TRUE.

temp.std

standard temperature for presentation of biogas and methane results. Length one numeric vector. Default value is 0 degrees C (set in stdVol). Argument is passed to stdVol.

pres.std

standard pressure for presentation of biogas and methane results. Length one numeric vector. Default value is 1.0 atm (101325 Pa) (set in stdVol). Argument is passed to stdVol.

unit.temp

temperature units for temp and temp.std arguments. Default is "C". Argument is passed to stdVol.

unit.pres

pressure units for pres and pres.std arguments. Default is "atm". Argument is passed to stdVol.

quiet

use to suppress messages. Default is FALSE.

Details

Using volume, mass, pressure, or molar quantity data from dat and gas composition from comp, this function will calculate standardised biogas and methane production (if comp is provided) for each observation, interpolating comp.name (from comp argument) to each time.name in dat if needed, and summing these for cumulative values. Use of volumetric measurements is the default case. However, this function is essentially deprecated for both volumetric and manometric methods, and the new calcBgMan and calcBgVol functions are recommended instead.

Alternatively, if reactor mass is given in dat, a gravimetric approach (Hafner et al. 2015) can be applied by setting dat.type to "mass". In this case, to determine total cumulative biogas production for batch reactors, an initial mass should be included for each reactor. If pressure is measured in dat, a manometric method can be applied by setting dat.type to "pres". Lastly, molar quantity of methane can be used in the absolute GC method by setting dat.type to "gca".

For the volumetric and absolute GC methods, all volumes (input and output) have the same units, e.g., mL, L, SCF. For the gravimetric method, output volumes will be in mL if input masses are in g (or in L if input masses are in kg, etc.). For the manometric method, inputs units are specified with unit.pres, and output volumes are the same as headspace volume, e.g., mL or L.

Biogas composition (comp.name column in comp) is specified as the mole fraction of methane in dry biogas, normalised so mole fractions of methane and carbon dioxide sum to unity (Richards et al. 1991). Alternatively, if cmethod is set to "total", biogas composition is the mole fraction of methane in dry biogas (include all the other gases except water).

Standard values and units for temperature and pressure can be globally set using the function options. See stdVol. To surpress volume correction to a “standard” temperature and pressure, leave temp as NULL (the default).

If check = TRUE, the input values of mole fraction of methane in biogas are checked, and a warning is returned if the are outside 0, 1.

Value

a data frame with all the columns originally present in dat, plus these others:

vBg

Standardised volume of biogas production for individual event.

xCH4

Interpolated mole fraction of methane in biogas.

vCH4

Standardised volume of methane production for individual event. Only if comp is provided.

vhsCH4

Standardised volume of methane present in reactor headspace. Only if method = "total" is used.

cvBg

Standardised cumulative volume of biogas production.

cvCH4

Standardised cumulative volume of methane production. Only if comp is provided.

rvBg

Production rate of biogas.

rvCH4

Production rate of methane. Only if comp is provided.

Author(s)

Sasha D. Hafner and Charlotte Rennuit

References

Hafner, S.D., Rennuit, C., Triolo, J.M., Richards, B.K. 2015. Validation of a simple gravimetric method for measuring biogas production in laboratory experiments. Biomass and Bioenergy 83, 297-301.

Hansen, T.L., Schmidt, J.E., Angelidaki, I., Marca, E., Jansen, J. la C., Mosbak, H. and Christensen, T.H. 2004. Method for determination of methane potentials of solid organic waste. Waste Management 24, 393-400

Richards, B.K., Cummings, R.J., White, T.E., Jewell, W.J. 1991. Methods for kinetic analysis of methane fermentation in high solids biomass digesters. Biomass and Bioenergy 1: 65-73.

See Also

calcBgMan, calcBgVol, calcBgGD, summBg, interp, stdVol, options

Examples


data("vol")
data("comp")

head(vol)
head(comp)

# Calculate cumulative production and rates from vol and comp
cum.prod <- cumBg(vol, comp = comp, temp = 20, pres = 1, id.name = "id", time.name = "days", 
		  comp.name = "xCH4", dat.name = "vol")
head(cum.prod)

# Note warnings and related NAs in results
# Set extrap = TRUE to extrapolate xCH4 to earliest times

# Calculate cumulative production and rates from vol and comp
cum.prod <- cumBg(vol, comp = comp, temp = 20, pres = 1, id.name = "id", time.name = "days", 
		  comp.name = "xCH4", dat.name = "vol", extrap = TRUE)
head(cum.prod)

# In this case, we can use default values for some column names, so this call is identical
cum.prod <- cumBg(vol, comp = comp, temp = 20, pres = 1, time.name = "days", extrap = TRUE)

# Plot results
## Not run: 
# Not run just because it is a bit slow
library(ggplot2)
qplot(x = days, y = cvCH4, data = cum.prod, xlab = "Time (d)", 
      ylab = "Cumulative methane production (mL)",color = id, geom = "line")

## End(Not run)

# Omit added time zero rows
cum.prod <- cumBg(vol, comp = comp, temp = 20, pres = 1, time.name = "days", extrap = TRUE, 
		  showt0 = FALSE)
head(cum.prod)

## Not run: 
# Not run just because it is a bit slow
qplot(x = days, y = cvCH4, data = cum.prod, xlab = "Time (d)", 
      ylab = "Cumulative methane production (mL)", color = id, geom = "line")

## End(Not run)

# Previous is different from never adding them in the first place (rates not calculated for first 
# observations here)
cum.prod <- cumBg(vol, comp = comp, temp = 20, pres = 1, time.name = "days", extrap = TRUE, 
		  addt0 = FALSE)
head(cum.prod)

## Not run: 
# Not run just because it is a bit slow
qplot(x = days, y = cvCH4, data = cum.prod, xlab = "Time (d)", 
      ylab = "Cumulative methane production (mL)", color = id, geom = "line")

## End(Not run)

# Can use POSIX objects for time (but cumBg cannot add t0 rows here)
class(vol$date.time)
class(comp$date.time)
cum.prod <- cumBg(vol, comp = comp, temp = 20, pres = 1, time.name = "date.time", extrap = TRUE)
head(cum.prod)

## Not run: 
# Not run just because it is a bit slow
qplot(x = date.time, y = cvCH4, data = cum.prod, xlab = "Time (d)", 
      ylab = "Cumulative methane production (mL)", color = id, geom = "line")

## End(Not run)

# Can leave out composition data, and then CH4 is not included in results
cum.prod <- cumBg(vol, temp = 20, pres = 1, time.name = "days")
head(cum.prod)

# Leave out pres or temp, and results are not standardised
cum.prod <- cumBg(vol, time.name = "days")
head(cum.prod)

# Example with input data frames with different column names
data("vol2")
data("comp2")

head(vol2)
head(comp2)

cum.prod <- cumBg(vol2, comp = comp2, temp = 20, pres = 1, 
                  id.name = "bottle", time.name = "days", 
		  dat.name = "meas.vol", comp.name = "CH4.conc")
head(cum.prod)
tail(cum.prod)

# Note warnings and related NAs in results
warnings()

# Set extrap = TRUE to avoid
cum.prod <- cumBg(vol2, comp = comp2, temp = 20, pres = 1, 
                  id.name = "bottle", time.name = "days", 
		  dat.name = "meas.vol", comp.name = "CH4.conc", 
                  extrap = TRUE)
head(cum.prod)

## Not run: 
# Not run just because it is a bit slow
qplot(x = days, y = cvCH4, data = cum.prod, xlab = "Time (d)", 
      ylab = "Cumulative methane production (mL)", 
      color = bottle, geom = "line")

## End(Not run)

# Mass example
data("mass")

mass

# Need to specify data type with dat.type argument (using default 
# values for id.name, dat.name, and comp.name)
cum.prod <- cumBg(mass, dat.type = "mass", comp = comp, temp = 35, 
                  pres = 1, time.name = "days")
cum.prod

# Drop time 0 rows
cum.prod <- cumBg(mass, dat.type = "mass", comp = comp, temp = 35, 
                  pres = 1, time.name = "days", showt0 = FALSE)
cum.prod

# Add initial headspace correction (alternatively, headspace could 
# be a data frame with a different volume for each reactor)
cum.prod <- cumBg(mass, dat.type = "mass", comp = comp, temp = 35, 
                  pres = 1, time.name = "days", headspace = 300, 
                  headcomp = "N2", temp.init = 20, showt0 = FALSE)
cum.prod

# Pressure example
data("strawPressure")
data("strawComp")
data("strawSetup")

cum.prod <- cumBg(strawPressure, dat.type = 'pres', 
                  comp = strawComp, temp = 35, 
                  id.name = 'bottle', time.name ='time', 
                  dat.name = 'pres', comp.name = 'xCH4',
                  pres.resid = 'pres.resid', temp.init = 20, 
                  pres.init = 101.325,
                  headspace = strawSetup, 
                  vol.hs.name = 'headspace', 
                  extrap = TRUE, 
                  unit.pres = 'kPa', pres.std = 101.325)

head(cum.prod)

# Absolute GC method (long format is the only option)

# Generate some data--two bottles with identical results
# Units for n1 and n2 are micromoles of CH4
biogas <- data.frame(id = rep(c('A', 'B'), each = 5), 
                     time.d = rep(1:5, 2), 
                     n1 = rep(c(1.1, 2.4, 3.8, 5.9, 2.3), 2), 
                     n2 = rep(c(NA, NA, NA, 1.2, NA), 2))

# Bottles were vented after the measurements on day 4
biogas

# Syringe volume is 0.25 mL
# Headspace volume is 50 mL

cp <- cumBg(biogas, id.name = 'id', time.name = 'time.d', 
            dat.name = 'n1', mol.f.name = 'n2', vol.syr= 0.25,
            headspace = 50, dat.type = 'gca')
cp

# Suppose the bottles had two difference headspace volumes
setup <- data.frame(id = c('A', 'B'), vol.hs = c(50, 60))

cp2 <- cumBg(biogas, id.name = 'id', time.name = 'time.d', 
            dat.name = 'n1', mol.f.name = 'n2', vol.syr= 0.25,
            headspace = setup, vol.hs.name = 'vol.hs', dat.type = 'gca')
cp2


# Different data structures
# Load example data
data("s3voll")
data("s3volw")
data("s3compl")
data("s3compw")
data("s3lcombo")

# wide

# Check data structure first
s3volw

s3compw

cum.prod <- cumBg(s3volw, comp = s3compw, temp = 25, pres = 1,
                  time.name = 'time.d',
                  data.struct = 'wide',
                  dat.name = 'D', comp.name = 'D',
                  extrap = TRUE)

cum.prod

# longcombo
s3lcombo

cum.prod <- cumBg(s3lcombo, temp = 25, pres = 1,
                  id.name = 'id', time.name = 'time.d',
                  data.struct = 'longcombo',
                  dat.name = 'vol.ml', comp.name = 'xCH4',
                  extrap = TRUE)

# Compare wide and longcombo to long (default)
s3voll
s3compl

cum.prod <- cumBg(s3lcombo, comp = s3compl, temp = 25, pres = 1,
                  id.name = 'id', time.name = 'time.d',
                  dat.name = 'vol.ml', comp.name = 'xCH4',
                  extrap = TRUE)

cum.prod



[Package biogas version 1.23.2 Index]