
Stoichiometric O\(_2\) Demand from Reduced-Pool Inventories
Source:R/rri_o2_demand.R
rri_o2_demand.RdComputes the complete-oxidation O\(_2\) demand for a given rhizosphere reduced-pool inventory and compares it to the specified O\(_2\) stock on the same dry-soil mass basis:
$$O_2^{\mathrm{demand}} = \sum_{j} n_j \cdot s_j$$
where \(n_j\) is the molar inventory (mmol kg\(^{-1}\)) of reduced species \(j\) and \(s_j\) is the stoichiometric O\(_2\) coefficient for complete oxidation to the specified endpoint.
Stoichiometric coefficients follow the electron balance table of Ghotbi, Ghotbi, Mühling and Stukenbrock (Box 1 of the mechanistic review, submitted):
| Reduced pool | Endpoint | O\(_2\) (mol mol\(^{-1}\)) |
| Fe\(^{2+}\) | Fe(III) oxyhydroxide | 0.25 |
| Mn\(^{2+}\) | MnO\(_2\) | 0.50 |
| HS\(^{-}\) | SO\(_4^{2-}\) | 2.00 |
| FeS (mackinawite) | Fe(III) + SO\(_4^{2-}\) | 2.25 |
| FeS\(_2\) (pyrite) | Fe(III) + 2SO\(_4^{2-}\) | 3.75 |
| NH\(_4^+\) | NO\(_3^-\) | 2.00 |
| CH\(_4\) | CO\(_2\) | 2.00 |
| Acetate equivalents | CO\(_2\) | 2.00 |
The O\(_2\) deficit ratio (O2_deficit_ratio) is
\(O_2^{\mathrm{demand}} / O_2^{\mathrm{supply}}\): values \(>1\)
indicate that the specified O\(_2\) stock is smaller than the demand.
This stock ratio does not determine recovery or account for continuing O2 delivery.
Usage
rri_o2_demand(
soil_df,
fe2_col = NULL,
mn2_col = NULL,
hs_col = NULL,
fes_col = NULL,
fes2_col = NULL,
nh4_col = NULL,
ch4_col = NULL,
acetate_col = NULL,
ch4_unit = c("mmol_kg", "umol_kg"),
acetate_basis = c("acetate", "carbon"),
o2_supply_col = NULL,
custom_coefs = NULL,
bulk_density = NULL,
theta_v = NULL,
particle_density = 2.65,
return_components = TRUE
)Arguments
- soil_df
Data frame with soil chemistry (rows = samples).
- fe2_col
Character or
NULL. Column for Fe\(^{2+}\) (mmol kg\(^{-1}\)). Default stoichiometric coefficient: 0.25.- mn2_col
Character or
NULL. Column for Mn\(^{2+}\) (mmol kg\(^{-1}\)). Coefficient: 0.50.- hs_col
Character or
NULL. Column for HS\(^{-}\) (mmol kg\(^{-1}\)). Coefficient: 2.00.- fes_col
Character or
NULL. Column for FeS/mackinawite (mmol kg\(^{-1}\)). Coefficient: 2.25.- fes2_col
Character or
NULL. Column for FeS\(_2\)/pyrite (mmol kg\(^{-1}\)). Coefficient: 3.75.- nh4_col
Character or
NULL. Column for NH\(_4^+\) (mmol kg\(^{-1}\)). Coefficient: 2.00.- ch4_col
Character or
NULL. Column for CH\(_4\).- acetate_col
Character or
NULL. Column for dissolved organic matter expressed as acetate or acetate-carbon equivalents.- ch4_unit
Character. Unit of
ch4_col:"mmol_kg"(default) or"umol_kg".- acetate_basis
Character.
"acetate"(default; 2 mol O2 per mol acetate) or"carbon"(1 mol O2 per mol acetate-C).- o2_supply_col
Character or
NULL. Column for an explicitly defined O\(_2\) inventory (mmol O\(_2\) kg\(^{-1}\)). IfNULL, deficit ratio is not computed.- custom_coefs
Optional named numeric vector to override or extend the built-in stoichiometric coefficients. Names must match the argument names above (e.g.,
c(fe2_col = 0.25)). Useful for system-specific endpoint assumptions.- bulk_density
Numeric of length one or nrow(soil_df). Soil bulk density (g cm\(^{-3}\)) for volumetric conversion of demand to mmol O\(_2\) L\(^{-1}\) porewater. Set to
NULLto skip volumetric conversion.- theta_v
Numeric of length one or nrow(soil_df), or
NULL. Volumetric water content (L water L\(^{-1}\) bulk soil). When omitted andbulk_densityis supplied, saturated porosity is estimated as1 - bulk_density / particle_density.- particle_density
Numeric. Particle density in g cm\(^{-3}\) used only for the saturated-porosity estimate. Default 2.65.
- return_components
Logical. If
TRUE(default), return a per-species contribution matrix.
Value
A list:
o2_demandNumeric vector (mmol O\(_2\) kg\(^{-1} dry soil\)) of complete-oxidation O\(_2\) demand per sample.
o2_deficit_ratioPer-sample \(O_2^{\mathrm{demand}} / O_2^{\mathrm{supply}}\). Values \(>1\) indicate demand exceeds the specified stock.
NAwheno2_supply_colis absent.o2_demand_volVolumetric O\(_2\) demand (mmol L\(^{-1}\) porewater);
NAifbulk_densityisNULL.n_species_usedInteger. Number of reduced-pool columns found.
n_species_observedInteger vector. Number of species with a finite inventory in each row, so a low demand from sparse data is not mistaken for a low demand from a small inventory.
species_coveragePer-row fraction of the requested species that were observed. Columns named but absent from
soil_dfcount against coverage.interpretationCharacter. A one-line reminder that the ratio compares a demand to a stock, not to a delivery rate.
ch4_unit_used,acetate_basis_usedThe resolved values of
ch4_unitandacetate_basis, recorded because both change the numbers returned.componentsData frame (one row per species) with:
species,n_observed,stoich_coef,mean_inventory_mmol,mean_o2_contribution,fraction_total_demand. Returned only whenreturn_components = TRUE.stoich_tableData frame of the coefficients actually applied, one row per species found, including any custom overrides:
species_arg,column_used,stoich_coef_O2,endpoint. Species not present insoil_dfare absent.
Details
Interpretation — the 26-fold contrast.
The mechanistic review (Ghotbi et al., submitted) provides a worked example: a Fe-rich rhizosphere containing 50 mmol Fe(II) kg\(^{-1}\), 5 mmol FeS kg\(^{-1}\), 2 mmol Mn(II) kg\(^{-1}\), 2 mmol NH\(_4^+\) kg\(^{-1}\), 2 mmol acetate kg\(^{-1}\), and 0.5 mmol CH\(_4\) kg\(^{-1}\) has a complete-oxidation O\(_2\) ceiling of \(\approx 34\) mmol O\(_2\) kg\(^{-1}\), versus only \(\approx 1.3\) mmol O\(_2\) kg\(^{-1}\) in an illustrative initial pore-gas stock: about a 26-fold contrast. The assumed stock is not air-saturated porewater. Continuing atmospheric and root O2 delivery can replenish it. Accessibility, reaction kinetics and transport determine realized demand during an event.
Pyrite stoichiometry.
Complete pyrite oxidation to sulfate and Fe(III) oxyhydroxide releases
4 mol H\(^+\) mol\(^{-1}\) FeS\(_2\) and consumes 3.75 mol O\(_2\):
FeS\(_2\) + 15/4 O\(_2\) + 7/2 H\(_2\)O →
Fe(OH)\(_3\) + 2H\(_2\)SO\(_4\).
Partial oxidation to sulfur intermediates (S\(^0\), thiosulfate) requires
fewer moles; adjust via custom_coefs.
pH coupling.
Under the applicable rate law, homogeneous abiotic Fe(II) oxidation increases \(\approx\)100-fold per unit pH rise (Stumm & Lee, 1961; Millero et al., 1987). The stoichiometric demand computed here is for complete oxidation and is independent of pH, but actual O\(_2\) consumption rates will be pH-modulated. This function reports a stoichiometric potential demand, not a thermodynamic limit or rate.
References
Ghotbi, M., Ghotbi, M., Mühling, K. H., & Stukenbrock, E. H. Rhizosphere redox recovery after hydrological disturbances: mechanisms across the soil–plant–microbiome continuum. Submitted to Soil Biology & Biochemistry.
Stumm, W., & Lee, G. F. (1961). Oxygenation of ferrous iron. Industrial & Engineering Chemistry, 53, 143–146. doi:10.1021/ie50614a030
Millero, F. J., Sotolongo, S., & Izaguirre, M. (1987). The oxidation kinetics of Fe(II) in seawater. Geochimica et Cosmochimica Acta, 51, 793–801. doi:10.1016/0016-7037(87)90093-7
Examples
## Reproduce the worked example from Box 1 of the mechanistic review
worked_example <- data.frame(
Fe2 = 50.0, # mmol kg-1
FeS = 5.0,
Mn2 = 2.0,
NH4 = 2.0,
acetate = 2.0,
CH4 = 0.5, # mmol kg-1; set ch4_unit = "umol_kg" for umol input
O2_pw = 1.3 # assumed initial O2 stock, mmol/kg; NOT air-saturated porewater
)
demand <- rri_o2_demand(
soil_df = worked_example,
fe2_col = "Fe2",
mn2_col = "Mn2",
fes_col = "FeS",
nh4_col = "NH4",
acetate_col = "acetate",
ch4_col = "CH4",
o2_supply_col = "O2_pw",
return_components = TRUE
)
demand$o2_demand # should be ~34 mmol O2 kg-1
#> [1] 33.75
demand$o2_deficit_ratio # should be ~26
#> [1] 25.96154
demand$components
#> species n_observed stoich_coef mean_inventory_mmol mean_o2_contribution
#> 1 Fe2 1 0.25 50.0 12.50
#> 2 Mn2 1 0.50 2.0 1.00
#> 3 FeS 1 2.25 5.0 11.25
#> 4 NH4 1 2.00 2.0 4.00
#> 5 CH4 1 2.00 0.5 1.00
#> 6 acetate 1 2.00 2.0 4.00
#> fraction_total_demand
#> 1 0.3704
#> 2 0.0296
#> 3 0.3333
#> 4 0.1185
#> 5 0.0296
#> 6 0.1185