diff --git a/DESCRIPTION b/DESCRIPTION index a010557..e0d7cc1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: soilptf Type: Package Title: Estimate soil properties via pedotransferfunctions -Version: 0.5.0.9000 +Version: 0.5.1 Authors@R: c(person(given = "Gerard", family = "Ros", email = "gerard.ros@nmi-agro.nl", role = c("aut","cre")), person(given = "Kees", family = "van den Dool", email = "kees.vandendool@nmi-agro.nl", role = c("aut")), person(given = "Sven", family = "Verweij", email = "sven.verweij@nmi-agro.nl", role = c("aut")), diff --git a/NAMESPACE b/NAMESPACE index 2f7ba80..f17c493 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -295,6 +295,9 @@ export(sptf_cec72) export(sptf_cec73) export(sptf_cec74) export(sptf_cec75) +export(sptf_cec76) +export(sptf_cec77) +export(sptf_cec78) export(sptf_cec8) export(sptf_cec9) export(sptf_erodibility1) diff --git a/NEWS.md b/NEWS.md index 0595efa..8e3987a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,19 @@ # Changelog soilptf +## Version 0.5.1 2023-05-09 + +# Fixed +* NAm and SAm as abbreviation for North and South America causes errors due to confusion with NA, issue #3 +* replace `assert_int` with `assert_integer` for years in `sptf_cdec1`, issue #26 +* ensure correct CN ratios in `sptf_cdec1`, issue #26 + +# Changed +* all elements for A_CACO3_MI replaced with A_CACO3_IF, issue #30 + +# Added +* options for parameter `B_SOILCLASS_USDA` in `sptf_parameters`, issue #23 +* add ptfs cec75, cec76 and cec77 + ## Version 0.5.0 2023-04-29 ## Added diff --git a/R/bulkdensity.R b/R/bulkdensity.R index 64ba06e..54e3a73 100644 --- a/R/bulkdensity.R +++ b/R/bulkdensity.R @@ -2,10 +2,9 @@ #' Documentation of all possible bulk density pedotransfer function inputs #' -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) #' @param A_CEC_CO (numeric) Cation Exchange Capacity (mmol+/kg) #' @param A_CLAY_MI (numeric) The clay content of the mineral soil fraction (\%). -#' @param A_C_OF (numeric) Organic Carbon Content (g / kg) +#' @param A_C_OF (numeric) Organic Carbon Content (g / kg) #' @param A_DEPTH (numeric) The depth of the sampled soil layer (m) #' @param A_DENSITY (numeric) Soil density (g / kg) #' @param A_H20_T105 (numeric) The volumetric moisture content of the soil (\%) @@ -27,7 +26,7 @@ #' @param A_H2O_T105 (numeric) water content measured after drying at 105 degrees (\%) #' #' @export -sptf_bd0 <- function(A_CACO3_MI,A_CEC_CO,A_CLAY_MI,A_C_OF,A_DEPTH,A_DENSITY,A_H20_T105, +sptf_bd0 <- function(A_CEC_CO,A_CLAY_MI,A_C_OF,A_DEPTH,A_DENSITY,A_H20_T105, A_N_RT,A_PH_CC,A_PH_WA,A_SAND_M50,A_SAND_MI,A_SILT_MI,A_SOM_LOI, B_ALTITUDE,B_ROCKS_FR,B_SLOPE_ASPECT,B_SLOPE_DEGREE,mp_wp, mp_fc,D_BDS,A_CACO3_IF,A_H2O_T105){return(NULL)} diff --git a/R/cdec.R b/R/cdec.R index 3f96b38..2099353 100644 --- a/R/cdec.R +++ b/R/cdec.R @@ -17,13 +17,17 @@ sptf_cdec1 <- function(A_C_OF, A_N_RT, years) { # Check input arg.length <- max(length(A_N_RT),length(A_C_OF)) - checkmate::assert_numeric(A_N_RT, lower = 0, upper = 10000, len = arg.length) + checkmate::assert_numeric(A_N_RT, lower = 0, upper = 20000, len = arg.length) checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000, len = arg.length) + # estimate the CN ratio and check for really unrealistic values + cnratio <- A_C_OF *1000 / A_N_RT + checkmate::assert_numeric(cnratio, lower = 1, upper = 100) + # estimate the potential decomposition rate (Vermeulen en Hendriks, 1996) kpot <- 0.016 - 0.00021 * A_C_OF *1000 / A_N_RT - # estimate carbon decomposition + # estimate carbon decomposition (g / kg lost after x years) value <- A_C_OF * (1 - exp(-kpot * years)) # return value @@ -50,10 +54,14 @@ sptf_cdec2 <- function(A_C_OF, years) { # Check input checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000) - checkmate::assert_int(years,lower = 1) + checkmate::assert_integer(years,lower=1) + checkmate::assert_true(length(years)==1 | length(years)==length(A_C_OF)|(length(A_C_OF)==1 & length(years)>0)) # combine arguments in internal table - dt <- data.table(A_C_OF = A_C_OF,temp = 12) + dt <- data.table(id = 1:length(A_C_OF), + A_C_OF = A_C_OF, + temp = 12, + years = years) # add correction factor for annual temperature dt[, cor_temp := ifelse(temp<=-1,0,ifelse(temp<=9,0.1*(temp+1),ifelse(temp<=27,2^((temp-9)/9),4)))] diff --git a/R/cec.R b/R/cec.R index d22dcce..3a8f015 100644 --- a/R/cec.R +++ b/R/cec.R @@ -1295,7 +1295,7 @@ sptf_cec28 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_CC) { #' @param A_SOM_LOI (numeric) The percentage organic matter in the soil (\%). #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). -#' @param A_CACO3_MI (numeric) The carbonate content of the soil (\%). +#' @param A_CACO3_IF (numeric) The carbonate content of the soil (\%). #' @param A_PH_CC (numeric) The acidity of the soil, pH in CaCl2 (-). #' #' @import data.table @@ -1303,21 +1303,21 @@ sptf_cec28 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_CC) { #' @references Krogh et al. (2000) Cation Exchange Capacity Pedotransfer Functions For Danish Soils #' #' @export -sptf_cec29 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) { +sptf_cec29 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_IF, A_PH_CC) { # Check input - arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_PH_CC),length(A_SILT_MI),length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_PH_CC),length(A_SILT_MI),length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) checkmate::assert_numeric(A_PH_CC, lower = 3, upper = 12, len = arg.length) # make internal data.table dt <- data.table(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, - A_CACO3_MI = A_CACO3_MI, + A_CACO3_IF = A_CACO3_IF, A_PH_CC = A_PH_CC, value = NA_real_) @@ -1333,7 +1333,7 @@ sptf_cec29 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) { dt[A_SOM_LOI > 10, value := 21.11 + 1.88 * A_SOM_LOI] # update for calcareous soils (n = 136, R2 = 0.77) - dt[!is.na(A_CACO3_MI) & A_CACO3_MI > 0.1, value := -0.04 + 2.13 * A_SOM_LOI + 0.42 * A_CLAY_MI] + dt[!is.na(A_CACO3_IF) & A_CACO3_IF > 0.1, value := -0.04 + 2.13 * A_SOM_LOI + 0.42 * A_CLAY_MI] # update unit from cmol/kg to mmol/kg dt[, value := value * 10] @@ -2239,7 +2239,7 @@ sptf_cec49 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI) { #' @param A_SOM_LOI (numeric) The percentage organic matter in the soil (\%). #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). -#' @param A_CACO3_MI (numeric) The carbonate content of the soil (\%). +#' @param A_CACO3_IF (numeric) The carbonate content of the soil (\%). #' @param A_PH_CC (numeric) The acidity of the soil, pH in CaCl2 (-). #' #' @import data.table @@ -2247,26 +2247,26 @@ sptf_cec49 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI) { #' @references Razzaghi et al. (2021) Evaluating models to estimate cation exchange capacity of calcareous soils #' #' @export -sptf_cec50 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) { +sptf_cec50 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_IF, A_PH_CC) { # Check input - arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_PH_CC),length(A_SILT_MI),length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_PH_CC),length(A_SILT_MI),length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) checkmate::assert_numeric(A_PH_CC, lower = 3, upper = 12, len = arg.length) # make internal data.table dt <- data.table(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, - A_CACO3_MI = A_CACO3_MI, + A_CACO3_IF = A_CACO3_IF, A_PH_CC = A_PH_CC, value = NA_real_) # function for CEC at 8.2 (NH4Ac) (n = 38, R2 = 0.64) - dt[, value := 29.9 + 0.298 * A_CLAY_MI - 0.389 * A_CACO3_MI] + dt[, value := 29.9 + 0.298 * A_CLAY_MI - 0.389 * A_CACO3_IF] # update unit from cmol/kg to mmol/kg dt[, value := value * 10] @@ -2649,37 +2649,37 @@ sptf_cec57 <- function(A_SOM_LOI, A_SAND_MI,A_PH_WA) { #' @param A_SOM_LOI (numeric) The percentage organic matter in the soil (\%). #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). -#' @param A_CACO3_MI (numeric) The carbonate content of the soil (\%). +#' @param A_CACO3_IF (numeric) The carbonate content of the soil (\%). #' #' @import data.table #' #' @references Asadzadeh et al. (2019). Predicting cationic exhcnage capacity in calcareous soils of East Azerbaijen province, northwest Iran. Cited in Razzaghi et al. (2021). #' #' @export -sptf_cec58 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) { +sptf_cec58 <- function(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_IF) { # add visual bindings A_SAND_MI = NULL # Check input - arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # make internal data.table dt <- data.table(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SAND_MI = 100 - A_CLAY_MI - A_SILT_MI, - A_CACO3_MI = A_CACO3_MI, + A_CACO3_IF = A_CACO3_IF, value = NA_real_) # function for CEC at 8.2 (NH4Ac) (n = 417, R2 = 0.85) - dt[, value := 0.027 + 0.811 * A_CLAY_MI - 0.045 * A_SAND_MI + 0.168 * A_SOM_LOI - 0.091 * A_CACO3_MI] + dt[, value := 0.027 + 0.811 * A_CLAY_MI - 0.045 * A_SAND_MI + 0.168 * A_SOM_LOI - 0.091 * A_CACO3_IF] # update when input is missing (n = 417, R2 = 0.83) - dt[is.na(A_CACO3_MI), value := 0.112 + 0.878 * A_CLAY_MI + 0.127 * A_CLAY_MI / A_SOM_LOI] + dt[is.na(A_CACO3_IF), value := 0.112 + 0.878 * A_CLAY_MI + 0.127 * A_CLAY_MI / A_SOM_LOI] # update unit from cmol/kg to mmol/kg dt[, value := value * 10] @@ -2809,31 +2809,31 @@ sptf_cec61 <- function(A_C_OF, A_CLAY_MI) { #' @param A_C_OF (numeric) The carbon content of the soil (g / kg). #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). -#' @param A_CACO3_MI (numeric) The carbonate content of the soil (\%). +#' @param A_CACO3_IF (numeric) The carbonate content of the soil (\%). #' #' @import data.table #' #' @references Kashi et al. (2014) Estimation of Soil Infiltration and Cation Exchange Capacity Based on Multiple Regression, ANN (RBF, MLP), and ANFIS Models. #' #' @export -sptf_cec62 <- function(A_C_OF, A_CLAY_MI,A_SILT_MI,A_CACO3_MI) { +sptf_cec62 <- function(A_C_OF, A_CLAY_MI,A_SILT_MI,A_CACO3_IF) { # add visual bindings bd = sar = ec = A_SAND_MI = NULL # Check input - arg.length <- max(length(A_C_OF), length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_MI)) + arg.length <- max(length(A_C_OF), length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_IF)) checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 100, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 100, len = arg.length) # make internal data.table dt <- data.table(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_SAND_MI = 100 - A_CLAY_MI - A_SILT_MI, - A_CACO3_MI = A_CACO3_MI, + A_CACO3_IF = A_CACO3_IF, value = NA_real_) # estimate bulk density (in g/cm3) @@ -2849,7 +2849,7 @@ sptf_cec62 <- function(A_C_OF, A_CLAY_MI,A_SILT_MI,A_CACO3_MI) { dt[, value := 18.87 - 6.16 * bd - 0.019 * sar + 0.016 * A_SAND_MI + 0.026 * A_SILT_MI + 0.076 * A_CLAY_MI - 0.038 * ec] # when carbonate is known adapt - dt[, value := value - 0.07 * fifelse(is.na(A_CACO3_MI),19,A_CACO3_MI)] + dt[, value := value - 0.07 * fifelse(is.na(A_CACO3_IF),19,A_CACO3_IF)] # update unit from cmol/kg to mmol/kg dt[, value := value * 10] @@ -3382,6 +3382,137 @@ sptf_cec75 <- function(A_C_OF, A_CLAY_MI, A_PH_CC) { return(value) } + +#' Calculate the CEC +#' +#' This function calculates the CEC at pH 7 from agricultural topsoils (0-20 cm) in China +#' +#' @param A_SOM_LOI (numeric) The percentage organic matter in the soil (\%). +#' @param A_SAND_MI (numeric) The sand content of the soil (\%). +#' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) +#' +#' @import data.table +#' +#' @references Yunan et al. (2018) Study on Cation Exchange Capacity of Agricultural Soils +#' +#' @export +sptf_cec76 <- function(A_SOM_LOI, A_SAND_MI, A_PH_WA) { + + # Check input + arg.length <- max(length(A_SOM_LOI), length(A_SAND_MI),length(A_PH_WA)) + checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100,len = arg.length) + checkmate::assert_numeric(A_PH_WA, lower = 3, upper = 12, len = arg.length) + checkmate::assert_numeric(A_SAND_MI, lower = 0, upper = 100, len = arg.length) + + # make internal data.table (with SOM in g/kg) + dt <- data.table(A_SOM_LOI = A_SOM_LOI * 10, + A_SAND_MI = A_SAND_MI, + A_PH_WA = A_PH_WA) + + # function for CEC(n = 100, R2 = ) + dt[, value := 14.488 - 0.233 * A_SAND_MI + 0.121 * A_SOM_LOI + 1.458 * A_PH_WA] + + # update unit from cmol/kg to mmol/kg + dt[, value := value * 10] + + # select output variable + value <- dt[,value] + + # return value (mmol+ / kg) + return(value) + +} + +#' Calculate the CEC +#' +#' This function calculates the CEC at pH 7 from agricultural topsoils (0-30 cm) in Iran +#' +#' @param A_C_OF (numeric) The carbon content of the soil (g / kg). +#' @param A_CLAY_MI (numeric) The clay content of the soil (\%). +#' @param A_SILT_MI (numeric) The silt content of the soil (\%). +#' @param A_SAND_MI (numeric) The sand content of the soil (\%). +#' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) +#' +#' @import data.table +#' +#' @references Ghorbani et al. (2015) Estimation of Soil Cation Exchange Capacity using Multiple Regression, Artificial Neural Networks, and Adaptive Neuro-fuzzy Inference System Models in Golestan Province, Iran +#' +#' @export +sptf_cec77 <- function(A_C_OF, A_CLAY_MI,A_SILT_MI,A_SAND_MI, A_PH_WA) { + + # Check input + arg.length <- max(length(A_C_OF), length(A_CLAY_MI),length(A_SILT_MI),length(A_SAND_MI),length(A_PH_WA)) + checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000,len = arg.length) + checkmate::assert_numeric(A_PH_WA, lower = 3, upper = 12, len = arg.length) + checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) + checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) + checkmate::assert_numeric(A_SAND_MI, lower = 0, upper = 100, len = arg.length) + + # make internal data.table (with SOC in %) + dt <- data.table(A_C_OF = A_C_OF * 0.1, + A_CLAY_MI = A_CLAY_MI, + A_SILT_MI = A_SILT_MI, + A_SAND_MI = A_SAND_MI, + A_PH_WA = A_PH_WA) + + # function for CEC(n = 220, R2 = 0.77) + dt[, value := 31.59 - 5.38 * A_PH_WA - 2.69 * A_C_OF + 0.17 * A_SAND_MI + 0.19 * A_SILT_MI + 0.44 * A_CLAY_MI] + + # update unit from cmol/kg to mmol/kg + dt[, value := value * 10] + + # select output variable + value <- dt[,value] + + # return value (mmol+ / kg) + return(value) + +} + +#' Calculate the CEC +#' +#' This function calculates the CEC at pH 7 from agricultural topsoils (0-30 cm) in China +#' +#' @param A_SOM_LOI (numeric) The percentage organic matter in the soil (\%). +#' @param A_CLAY_MI (numeric) The clay content of the soil (\%). +#' @param A_SILT_MI (numeric) The silt content of the soil (\%). +#' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) +#' +#' @import data.table +#' +#' @references Wang et al. (2012) Distribution and Affecting Factors of Soil Cation Exchange Capacity in Watershed of the Loess Plateau. Cited in Yunan et al. (2018). +#' +#' @export +sptf_cec78 <- function(A_SOM_LOI, A_CLAY_MI,A_SILT_MI, A_PH_WA) { + + # Check input + arg.length <- max(length(A_SOM_LOI), length(A_CLAY_MI),length(A_SILT_MI),length(A_PH_WA)) + checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100,len = arg.length) + checkmate::assert_numeric(A_PH_WA, lower = 3, upper = 12, len = arg.length) + checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) + checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) + + + # make internal data.table + dt <- data.table(A_SOM_LOI = A_SOM_LOI, + A_CLAY_MI = A_CLAY_MI, + A_SILT_MI = A_SILT_MI, + A_PH_WA = A_PH_WA) + + # function for CEC(n = 18, R2 = 0.99) + dt[, value := -43.446 + 0.508 * A_SOM_LOI + 5.145 * A_PH_WA + 0.023 * A_SILT_MI + 0.397 * A_CLAY_MI] + + # update unit from cmol/kg to mmol/kg + dt[, value := value * 10] + + # select output variable + value <- dt[,value] + + # return value (mmol+ / kg) + return(value) + +} + # # montecillo, tropical # sinoga, spain diff --git a/R/mwd.R b/R/mwd.R index 883611b..9ebaa7c 100644 --- a/R/mwd.R +++ b/R/mwd.R @@ -102,26 +102,26 @@ sptf_mwd2 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI) { #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). #' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) +#' @param A_CACO3_IF (numeric) The calcium carbonate content of the soil (\%) #' #' @import data.table #' #' @references Saidi et al. (2015). Using Pedotransfer Functions to Assess Aggregate Stability: Application to the Lower Cheliff Soils, Algeria #' #' @export -sptf_mwd3 <- function(A_C_OF,A_CEC_CO,A_CLAY_MI,A_SILT_MI, A_PH_WA, A_CACO3_MI) { +sptf_mwd3 <- function(A_C_OF,A_CEC_CO,A_CLAY_MI,A_SILT_MI, A_PH_WA, A_CACO3_IF) { # add visual bindings B_SOILTYPE = A_SAND_MI = A_SOM_LOI = NULL # Check input - arg.length <- max(length(A_C_OF), length(A_CEC_CO),length(A_CLAY_MI),length(A_SILT_MI),length(A_PH_WA),length(A_CACO3_MI)) + arg.length <- max(length(A_C_OF), length(A_CEC_CO),length(A_CLAY_MI),length(A_SILT_MI),length(A_PH_WA),length(A_CACO3_IF)) checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000, any.missing = FALSE,len = arg.length) checkmate::assert_numeric(A_CEC_CO, lower = 0, upper = 600, len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_PH_WA, lower = 2, upper = 12, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # Collect data into a table (SOC in %) dt <- data.table(A_C_OF = A_C_OF * 0.1, @@ -131,7 +131,7 @@ sptf_mwd3 <- function(A_C_OF,A_CEC_CO,A_CLAY_MI,A_SILT_MI, A_PH_WA, A_CACO3_MI) A_SILT_MI = A_SILT_MI, A_SAND_MI = 100 - A_CLAY_MI - A_SILT_MI, A_PH_WA = A_PH_WA, - A_CACO3_MI = A_CACO3_MI, + A_CACO3_IF = A_CACO3_IF, value = NA_real_) # Estimate USDA soil type @@ -139,14 +139,14 @@ sptf_mwd3 <- function(A_C_OF,A_CEC_CO,A_CLAY_MI,A_SILT_MI, A_PH_WA, A_CACO3_MI) # replace missing pH and CaCo3 with mean values when inputs are missing dt[is.na(A_PH_WA), A_PH_WA := 7.32] - dt[is.na(A_CACO3_MI), A_CACO3_MI := 7.81] + dt[is.na(A_CACO3_IF), A_CACO3_IF := 7.81] dt[is.na(A_CEC_CO), A_CEC_CO := 15.8 * 10] # estimate Mean Weight Diamater in mm (n = 183, R2 = 0.67 ~ 0.71 ~ 0.91 ~ 0.94) - dt[grepl('sand',B_SOILTYPE), value := 0.017 * A_C_OF + 0.004 * A_SILT_MI + 0.002 * A_PH_WA + 0.018 * A_CACO3_MI + 0.14 * A_SOM_LOI + 0.0006 * A_CEC_CO + 0.052] - dt[grepl('silt',B_SOILTYPE), value := 0.007 * A_SILT_MI + 0.001 * A_SAND_MI + 0.05 * A_PH_WA + 2.6e-4 * A_CACO3_MI + 0.04 * A_SOM_LOI + 0.04 * 9.69 + 0.002 * A_CEC_CO - 0.3] + dt[grepl('sand',B_SOILTYPE), value := 0.017 * A_C_OF + 0.004 * A_SILT_MI + 0.002 * A_PH_WA + 0.018 * A_CACO3_IF + 0.14 * A_SOM_LOI + 0.0006 * A_CEC_CO + 0.052] + dt[grepl('silt',B_SOILTYPE), value := 0.007 * A_SILT_MI + 0.001 * A_SAND_MI + 0.05 * A_PH_WA + 2.6e-4 * A_CACO3_IF + 0.04 * A_SOM_LOI + 0.04 * 9.69 + 0.002 * A_CEC_CO - 0.3] dt[grepl('clay',B_SOILTYPE), value := 0.00056 * A_CEC_CO] - dt[grepl('silty clay',B_SOILTYPE), value := 0.005 * A_C_OF - 0.02 * A_PH_WA + 0.01 * A_CACO3_MI + 0.15 * A_SOM_LOI + 0.04 * 9.69 + 0.008 * A_CEC_CO] + dt[grepl('silty clay',B_SOILTYPE), value := 0.005 * A_C_OF - 0.02 * A_PH_WA + 0.01 * A_CACO3_IF + 0.15 * A_SOM_LOI + 0.04 * 9.69 + 0.008 * A_CEC_CO] # return value value <- dt[, value] @@ -163,24 +163,24 @@ sptf_mwd3 <- function(A_C_OF,A_CEC_CO,A_CLAY_MI,A_SILT_MI, A_PH_WA, A_CACO3_MI) #' @param A_C_OF (numeric) The fraction organic carbon in the soil (g / kg). #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) +#' @param A_CACO3_IF (numeric) The calcium carbonate content of the soil (\%) #' #' @import data.table #' #' @references Annabi et al. (2017) Spatial variability of soil aggregate stability at the scale of an agricultural region in Tunisia #' #' @export -sptf_mwd4 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI, A_CACO3_MI) { +sptf_mwd4 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI, A_CACO3_IF) { # add visual binding B_SOILTYPE = v1 = v2 = v3 = v4 = A_SAND_MI = NULL # Check input - arg.length <- max(length(A_C_OF),length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_MI)) + arg.length <- max(length(A_C_OF),length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_IF)) checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000, any.missing = FALSE,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # Collect data into a table (SOC and mineralogy in g/kg) dt <- data.table(id = 1:arg.length, @@ -188,7 +188,7 @@ sptf_mwd4 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI, A_CACO3_MI) { A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_SAND_MI = 100 - A_SILT_MI - A_CLAY_MI, - A_CACO3_MI = A_CACO3_MI) + A_CACO3_IF = A_CACO3_IF) # Estimate USDA soil type dt[, B_SOILTYPE := sptf_textureclass(A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_SAND_MI = A_SAND_MI)] @@ -196,14 +196,14 @@ sptf_mwd4 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI, A_CACO3_MI) { # update units to g/kg dt[,A_CLAY_MI := A_CLAY_MI * 10] dt[,A_SILT_MI := A_SILT_MI * 10] - dt[,A_CACO3_MI := A_CACO3_MI * 10] + dt[,A_CACO3_IF := A_CACO3_IF * 10] # add median A_CACO3 when the input missing - dt[is.na(A_CACO3_MI), A_CACO3_MI := 30] + dt[is.na(A_CACO3_IF), A_CACO3_IF := 30] # estimate Mean Weight Diamater in mm (r = 0.624, n = 113). Units for iron adapted because of too high outputs dt[, v1 := 0.5227 + 0.0015 * A_CLAY_MI - 0.0121 * A_C_OF] - dt[, v2 := 0.9535 + 0.0036 * A_SILT_MI - 0.0272 * A_C_OF + 0.0011 * A_CACO3_MI + 0.43 * 9.2 * 0.1] + dt[, v2 := 0.9535 + 0.0036 * A_SILT_MI - 0.0272 * A_C_OF + 0.0011 * A_CACO3_IF + 0.43 * 9.2 * 0.1] dt[, v3 := 0.262 + 0.0052 * A_SILT_MI - 0.0358 * A_C_OF + 0.4784 * 9.2 * 0.1] dt[, v4 := 0.5502 + 0.0031 * A_SILT_MI - 0.0214 * A_C_OF + 0.4460 * 9.2 * 0.1] @@ -344,25 +344,25 @@ sptf_mwd7 <- function(A_C_OF,A_SAND_MI) { #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). #' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) +#' @param A_CACO3_IF (numeric) The calcium carbonate content of the soil (\%) #' #' @import data.table #' #' @references Hamel et al. (2021). Evaluation of soil aggregate stability in Algerian northwestern soils using pedotransfer functions and artificial neural networks #' #' @export -sptf_mwd8 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { +sptf_mwd8 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_IF) { # add visual bindings B_SOILTYPE = EC = A_SAND_MI = NULL # Check input - arg.length <- max(length(A_SOM_LOI),length(A_CLAY_MI),length(A_SILT_MI), length(A_PH_WA), length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI),length(A_CLAY_MI),length(A_SILT_MI), length(A_PH_WA), length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100, any.missing = FALSE,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_PH_WA, lower = 2, upper = 12, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # Collect data into a table dt <- data.table(A_SOM_LOI = A_SOM_LOI, @@ -370,7 +370,7 @@ sptf_mwd8 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { A_SILT_MI = A_SILT_MI, A_SAND_MI = 100 - A_CLAY_MI - A_SILT_MI, A_PH_WA = A_PH_WA, - A_CACO3_MI = A_CACO3_MI, + A_CACO3_IF = A_CACO3_IF, value = NA_real_) # Estimate USDA soil type @@ -378,16 +378,16 @@ sptf_mwd8 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { # replace missing pH with mean values when inputs are missing dt[is.na(A_PH_WA), A_PH_WA := 7.97] - dt[is.na(A_CACO3_MI), A_CACO3_MI := 17.73] + dt[is.na(A_CACO3_IF), A_CACO3_IF := 17.73] # set mean EC dt[, EC := 10.73] # estimate MWD (mm) per soil type (n = 1248, 0-20cm, R2 varies from 0.22 to 0.65) - dt[grepl('sand',B_SOILTYPE), value := -1.385 + 0.019 * A_CLAY_MI + 0.017 * A_SILT_MI + 0.004 * A_SAND_MI + 0.17 * A_PH_WA - 0.016 * A_CACO3_MI + 0.01* A_SOM_LOI - 0.01 * EC] - dt[grepl('silt',B_SOILTYPE), value := 1.179 + 0.003 * A_CLAY_MI -0.003 * A_SILT_MI - 0.004 * A_SAND_MI -0.012 * A_PH_WA +0.007 * A_CACO3_MI -0.007* A_SOM_LOI + 0.004 * EC] - dt[grepl('clay',B_SOILTYPE), value := 0.426 -0.003 * A_CLAY_MI +0 * A_SILT_MI +0.0046 * A_SAND_MI -0.103 * A_PH_WA +0.0037 * A_CACO3_MI +0.003* A_SOM_LOI + 0.033 * EC] - dt[grepl('silty clay',B_SOILTYPE), value := 0.684 -0.009 * A_CLAY_MI +0.001 * A_SILT_MI +0.002 * A_SAND_MI -0.036 * A_PH_WA -0.004 * A_CACO3_MI +0.002* A_SOM_LOI + 0.006 * EC] + dt[grepl('sand',B_SOILTYPE), value := -1.385 + 0.019 * A_CLAY_MI + 0.017 * A_SILT_MI + 0.004 * A_SAND_MI + 0.17 * A_PH_WA - 0.016 * A_CACO3_IF + 0.01* A_SOM_LOI - 0.01 * EC] + dt[grepl('silt',B_SOILTYPE), value := 1.179 + 0.003 * A_CLAY_MI -0.003 * A_SILT_MI - 0.004 * A_SAND_MI -0.012 * A_PH_WA +0.007 * A_CACO3_IF -0.007* A_SOM_LOI + 0.004 * EC] + dt[grepl('clay',B_SOILTYPE), value := 0.426 -0.003 * A_CLAY_MI +0 * A_SILT_MI +0.0046 * A_SAND_MI -0.103 * A_PH_WA +0.0037 * A_CACO3_IF +0.003* A_SOM_LOI + 0.033 * EC] + dt[grepl('silty clay',B_SOILTYPE), value := 0.684 -0.009 * A_CLAY_MI +0.001 * A_SILT_MI +0.002 * A_SAND_MI -0.036 * A_PH_WA -0.004 * A_CACO3_IF +0.002* A_SOM_LOI + 0.006 * EC] # return value value <- dt[, value] @@ -625,25 +625,25 @@ sptf_mwd13 <- function(A_CLAY_MI,A_SOM_LOI) { #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). #' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) +#' @param A_CACO3_IF (numeric) The calcium carbonate content of the soil (\%) #' #' @import data.table #' #' @references Canasveras et al. (2010) Estimation of aggregate stability indices in Mediterranean soils by diffuse reflectance spectroscopy #' #' @export -sptf_mwd14 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { +sptf_mwd14 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_IF) { # add visual bindings fe = A_SAND_MI = NULL # Check input - arg.length <- max(length(A_SOM_LOI),length(A_CLAY_MI),length(A_SILT_MI), length(A_PH_WA), length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI),length(A_CLAY_MI),length(A_SILT_MI), length(A_PH_WA), length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100, any.missing = FALSE,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_PH_WA, lower = 2, upper = 12, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # Collect data into a table dt <- data.table(A_SOM_LOI = A_SOM_LOI * 10, @@ -651,14 +651,14 @@ sptf_mwd14 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { A_SILT_MI = A_SILT_MI * 10, A_SAND_MI = (100 - A_CLAY_MI - A_SILT_MI) * 10, A_PH_WA = A_PH_WA, - A_CACO3_MI = A_CACO3_MI * 10, + A_CACO3_IF = A_CACO3_IF * 10, value = NA_real_) # add mean Fe extractable with citrate-bicarbonate-dithionite dt[, fe := 8.3] # Estimate MWD (mm), R2 = 0.52, n = 80 topsoils, Spain - dt[, value := 2.573 - 0.001 * A_SAND_MI - 0.003 * A_CLAY_MI + 0.001 * A_CACO3_MI -0.119 * A_PH_WA + 0.012 * A_SOM_LOI + 0.042 * fe] + dt[, value := 2.573 - 0.001 * A_SAND_MI - 0.003 * A_CLAY_MI + 0.001 * A_CACO3_IF -0.119 * A_PH_WA + 0.012 * A_SOM_LOI + 0.042 * fe] # avoid values outside calibration range dt[value < 0.1 | value > 2.8, value := NA_real_] diff --git a/R/sptf_predict.R b/R/sptf_predict.R index b011540..b21b7b8 100644 --- a/R/sptf_predict.R +++ b/R/sptf_predict.R @@ -106,7 +106,7 @@ ptf_bd_old <- function(A_SOM_LOI = NA_real_, A_C_OF = NA_real_, # add visual bindings when no input is given if(!'A_H2O_T105' %in% colnames(dt)){A_H2O_T105 = NULL} if(!'A_PH_WA' %in% colnames(dt)){A_PH_WA = NULL} - if(!'A_CACO3_MI' %in% colnames(dt)){A_CACO3_MI = NULL} + if(!'A_CACO3_IF' %in% colnames(dt)){A_CACO3_IF = NULL} if(!'A_N_RT' %in% colnames(dt)){A_N_RT = NULL} if(!'A_SAND_M50' %in% colnames(dt)){A_SAND_M50 = NULL} if(!'B_SLOPE_DEGREE' %in% colnames(dt)){B_SLOPE_DEGREE = NULL} @@ -114,7 +114,7 @@ ptf_bd_old <- function(A_SOM_LOI = NA_real_, A_C_OF = NA_real_, if(!'B_ALTITUDE' %in% colnames(dt)){B_ALTITUDE = NULL} # add all possible inputs as NA when missing - cols <- c('A_PH_WA','A_CACO3_MI','A_N_RT','A_H2O_T105','A_SAND_M50','B_SLOPE_DEGREE','B_SLOPE_ASPECT','B_ALTITUDE') + cols <- c('A_PH_WA','A_CACO3_IF','A_N_RT','A_H2O_T105','A_SAND_M50','B_SLOPE_DEGREE','B_SLOPE_ASPECT','B_ALTITUDE') cols <- cols[!cols %in% colnames(dt)] dt[,c(cols) := NA_real_] @@ -1289,8 +1289,8 @@ ptf_cec_all <- function(dt){ p39 = p40 = p41 = p42 = p43 = p44 = p45 = p46 = p47 = p48 = p49 = p50 = NULL p51 = p52 = p53 = p54 = p55 = p56 = p57 = p58 = p59 = p60 = p61 = p62 = NULL p63 = p64 = p65 = p66 = p67 = p68 = p69 = p70 = p71 = p72 = p73 = p74 = NULL - p75 = NULL - num_obs = A_CACO3_MI = A_CLAY_MI = A_SAND_MI = A_SILT_MI = A_SOM_LOI = A_C_OF = A_PH_KCL = A_PH_CC = A_PH_WA = NULL + p75 = p76 = p77 = p78 = NULL + num_obs = A_CACO3_IF = A_CLAY_MI = A_SAND_MI = A_SILT_MI = A_SOM_LOI = A_C_OF = A_PH_KCL = A_PH_CC = A_PH_WA = NULL B_LU_PTFCLASS = id = A_CN_FR = B_SOILCLASS_USDA = B_CLIM_CAT1 = patterns = ptf_id = cec = NULL # make local copy @@ -1301,7 +1301,7 @@ ptf_cec_all <- function(dt){ # add all numeric inputs as NA when missing cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI', - 'A_CACO3_MI','A_PH_KCL','A_PH_CC','A_PH_WA','A_CN_FR') + 'A_CACO3_IF','A_PH_KCL','A_PH_CC','A_PH_WA','A_CN_FR') cols <- cols[!cols %in% colnames(dt)] dt[,c(cols) := NA_real_] @@ -1356,7 +1356,7 @@ ptf_cec_all <- function(dt){ dt[, p26 := sptf_cec26(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_WA = A_PH_WA,B_SOILCLASS_USDA=B_SOILCLASS_USDA)] dt[, p27 := sptf_cec27(A_SOM_LOI = A_SOM_LOI,A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI,B_CLIM_CAT1=B_CLIM_CAT1)] dt[, p28 := sptf_cec28(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_CC = A_PH_CC)] - dt[, p29 := sptf_cec29(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_MI=A_CACO3_MI,A_PH_CC = A_PH_CC)] + dt[, p29 := sptf_cec29(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_IF=A_CACO3_IF,A_PH_CC = A_PH_CC)] dt[, p30 := sptf_cec30(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI)] dt[, p31 := sptf_cec31(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,B_SOILCLASS_USDA=B_SOILCLASS_USDA)] dt[, p32 := sptf_cec32(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_CC = A_PH_CC)] @@ -1377,7 +1377,7 @@ ptf_cec_all <- function(dt){ dt[, p47 := sptf_cec47(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,B_LU_PTFCLASS = B_LU_PTFCLASS)] dt[, p48 := sptf_cec48(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI)] dt[, p49 := sptf_cec49(A_SOM_LOI = A_SOM_LOI,A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI)] - dt[, p50 := sptf_cec50(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_MI=A_CACO3_MI,A_PH_CC = A_PH_CC)] + dt[, p50 := sptf_cec50(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_IF=A_CACO3_IF,A_PH_CC = A_PH_CC)] dt[, p51 := sptf_cec51(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA)] dt[, p52 := sptf_cec52(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA)] dt[, p53 := sptf_cec53(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA)] @@ -1385,11 +1385,11 @@ ptf_cec_all <- function(dt){ dt[, p55 := sptf_cec55(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA)] dt[, p56 := sptf_cec56(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_PH_WA = A_PH_WA)] dt[, p57 := sptf_cec57(A_SOM_LOI = A_SOM_LOI, A_SAND_MI = A_SAND_MI, A_PH_WA = A_PH_WA)] - dt[, p58 := sptf_cec58(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_MI=A_CACO3_MI)] + dt[, p58 := sptf_cec58(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_IF=A_CACO3_IF)] dt[, p59 := sptf_cec59(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI)] dt[, p60 := sptf_cec60(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI)] dt[, p61 := sptf_cec61(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI)] - dt[, p62 := sptf_cec62(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_MI=A_CACO3_MI)] + dt[, p62 := sptf_cec62(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_IF=A_CACO3_IF)] dt[, p63 := sptf_cec63(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI)] dt[, p64 := sptf_cec64(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI)] dt[, p65 := sptf_cec65(A_C_OF = A_C_OF)] @@ -1403,6 +1403,9 @@ ptf_cec_all <- function(dt){ dt[, p73 := sptf_cec73(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA)] dt[, p74 := sptf_cec74(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA,B_SOILCLASS_USDA = B_SOILCLASS_USDA)] dt[, p75 := sptf_cec75(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI, A_PH_CC = A_PH_CC)] + dt[, p76 := sptf_cec76(A_SOM_LOI = A_SOM_LOI, A_SAND_MI = A_SAND_MI, A_PH_WA = A_PH_WA)] + dt[, p77 := sptf_cec77(A_C_OF = A_C_OF, A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_SAND_MI = A_SAND_MI, A_PH_WA = A_PH_WA)] + dt[, p78 := sptf_cec78(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_PH_WA = A_PH_WA)] # melt the data dt2 <- melt(dt, @@ -1753,7 +1756,7 @@ ptf_mwd_all <- function(dt){ p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = p10 = p11 = p12 = p13 = p14 = p15 = NULL A_CLAY_MI = A_SAND_MI = A_SILT_MI = A_SOM_LOI = A_C_OF = A_PH_KCL = A_PH_WA = A_PH_CC = NULL num_obs = patterns = ptf_id = id = mwd = NULL - B_LU_PTFCLASS = A_CEC_CO = A_CACO3_MI = NULL + B_LU_PTFCLASS = A_CEC_CO = A_CACO3_IF = NULL # make local copy dt <- copy(dt) @@ -1763,7 +1766,7 @@ ptf_mwd_all <- function(dt){ # add all possible numeric inputs as NA when missing cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI', - 'A_CEC_CO','A_CACO3_MI','A_PH_WA','A_PH_KCL','A_PH_CC') + 'A_CEC_CO','A_CACO3_IF','A_PH_WA','A_PH_KCL','A_PH_CC') cols <- cols[!cols %in% colnames(dt)] dt[,c(cols) := NA_real_] @@ -1793,18 +1796,18 @@ ptf_mwd_all <- function(dt){ dt[, p1 := sptf_mwd1(A_SOM_LOI = A_SOM_LOI)] dt[, p2 := sptf_mwd2(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI)] dt[, p3 := sptf_mwd3(A_C_OF = A_C_OF, A_CEC_CO=A_CEC_CO,A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, - A_PH_WA = A_PH_WA, A_CACO3_MI = A_CACO3_MI)] - dt[, p4 := sptf_mwd4(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_MI = A_CACO3_MI)] + A_PH_WA = A_PH_WA, A_CACO3_IF = A_CACO3_IF)] + dt[, p4 := sptf_mwd4(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_CACO3_IF = A_CACO3_IF)] dt[, p5 := sptf_mwd5(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_PH_WA = A_PH_WA)] dt[, p6 := sptf_mwd6(A_C_OF = A_C_OF)] dt[, p7 := sptf_mwd7(A_C_OF = A_C_OF,A_SAND_MI=A_SAND_MI)] - dt[, p8 := sptf_mwd8(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_WA = A_PH_WA, A_CACO3_MI = A_CACO3_MI)] + dt[, p8 := sptf_mwd8(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_WA = A_PH_WA, A_CACO3_IF = A_CACO3_IF)] dt[, p9 := sptf_mwd9(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_WA = A_PH_WA,B_LU_PTFCLASS=B_LU_PTFCLASS)] dt[, p10 := sptf_mwd10(A_C_OF = A_C_OF)] dt[, p11 := sptf_mwd11(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI)] dt[, p12 := sptf_mwd12(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI)] dt[, p13 := sptf_mwd13(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI)] - dt[, p14 := sptf_mwd14(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_WA = A_PH_WA, A_CACO3_MI = A_CACO3_MI)] + dt[, p14 := sptf_mwd14(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI,A_PH_WA = A_PH_WA, A_CACO3_IF = A_CACO3_IF)] dt[, p15 := sptf_mwd15(A_C_OF = A_C_OF, A_PH_WA = A_PH_WA)] # melt the data @@ -1961,7 +1964,7 @@ ptf_wsa_all <- function(dt){ p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = patterns = NULL patterns = num_obs = ptf_id = id = wsa = NULL A_CLAY_MI = A_SAND_MI = A_SILT_MI = A_SOM_LOI = A_C_OF = A_PH_KCL = A_PH_WA = A_PH_CC = NULL - A_K_AA = A_CACO3_MI = NULL + A_K_AA = A_CACO3_IF = NULL # make local copy dt <- copy(dt) @@ -1971,7 +1974,7 @@ ptf_wsa_all <- function(dt){ # add all possible inputs as NA when missing cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI', - 'A_CACO3_MI','A_PH_WA','A_K_AA','A_PH_KCL','A_PH_CC') + 'A_CACO3_IF','A_PH_WA','A_K_AA','A_PH_KCL','A_PH_CC') cols <- cols[!cols %in% colnames(dt)] dt[,c(cols) := NA_real_] @@ -1996,9 +1999,9 @@ ptf_wsa_all <- function(dt){ A_K_AA = A_K_AA, A_PH_WA = A_PH_WA)] dt[, p4 := sptf_wsa4(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI)] dt[, p5 := sptf_wsa5(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI)] - dt[, p6 := sptf_wsa6(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_CACO3_MI=A_CACO3_MI)] + dt[, p6 := sptf_wsa6(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, A_CACO3_IF=A_CACO3_IF)] dt[, p7 := sptf_wsa7(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI,A_SILT_MI = A_SILT_MI, - A_PH_WA = A_PH_WA,A_CACO3_MI = A_CACO3_MI)] + A_PH_WA = A_PH_WA,A_CACO3_IF = A_CACO3_IF)] dt[, p8 := sptf_wsa8(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI)] dt[, p9 := sptf_wsa9(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_PH_WA = A_PH_WA)] @@ -2358,7 +2361,7 @@ ptf_sss_all <- function(dt){ # add visual binding p1 = p2 = p3 = NULL - A_CACO3_MI = A_CLAY_MI = A_SAND_MI = A_SILT_MI = A_SOM_LOI = A_C_OF = A_PH_KCL = A_PH_WA = A_PH_CC = NULL + A_CACO3_IF = A_CLAY_MI = A_SAND_MI = A_SILT_MI = A_SOM_LOI = A_C_OF = A_PH_KCL = A_PH_WA = A_PH_CC = NULL num_obs = patterns = ptf_id = id = sss = NULL # make local copy @@ -2368,7 +2371,7 @@ ptf_sss_all <- function(dt){ if(!'id' %in% colnames(dt)){dt[,id := 1:.N]} # add all possible inputs as NA when missing - cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI','A_CACO3_MI') + cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI','A_CACO3_IF') cols <- cols[!cols %in% colnames(dt)] dt[,c(cols) := NA_real_] @@ -2386,7 +2389,7 @@ ptf_sss_all <- function(dt){ # dt[is.na(D_BDS), D_BDS := 1617 - 77.4 * log(A_C_OF) - 3.49 * A_C_OF] # estimate the soil shear strength - dt[, p1 := sptf_sss1(A_SOM_LOI = A_SOM_LOI, A_CACO3_MI = A_CACO3_MI)] + dt[, p1 := sptf_sss1(A_SOM_LOI = A_SOM_LOI, A_CACO3_IF = A_CACO3_IF)] dt[, p2 := sptf_sss2(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI)] dt[, p3 := sptf_sss3(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI)] @@ -2555,7 +2558,7 @@ ptf_metals_all <- function(dt){ if(!'id' %in% colnames(dt)){dt[,id := 1:.N]} # add all possible inputs as NA when missing - cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI','A_CACO3_MI', + cols <- c('A_SOM_LOI', 'A_C_OF', 'A_CLAY_MI','A_SAND_MI','A_SILT_MI','A_CACO3_IF', 'A_PH_WA','A_PH_CC','A_PH_KCL') cols <- cols[!cols %in% colnames(dt)] dt[,c(cols) := NA_real_] diff --git a/R/sss.R b/R/sss.R index da75e02..a4f652e 100644 --- a/R/sss.R +++ b/R/sss.R @@ -8,28 +8,28 @@ #' This function calculates the soil shear strength via various soil properties #' #' @param A_SOM_LOI (numeric) The percentage organic matter in the soil (\%). -#' @param A_CACO3_MI (numeric) The carbonate content of the soil (\%). +#' @param A_CACO3_IF (numeric) The carbonate content of the soil (\%). #' #' @import data.table #' #' @references Zhang et al. (2018) Estimation of surface shear strength of undisturbed soils in the eastern part of northern China’s wind erosion area #' #' @export -sptf_sss1 <- function(A_SOM_LOI,A_CACO3_MI) { +sptf_sss1 <- function(A_SOM_LOI,A_CACO3_IF) { # add visual bindings bd = v1 = v2 = v3 = A_C_OF = NULL # Check input - arg.length <- max(length(A_SOM_LOI), length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI), length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 1000, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 100, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 100, len = arg.length) # make internal data.table (density in g/cm3) dt <- data.table(id = 1: arg.length, A_SOM_LOI = A_SOM_LOI, A_C_OF = 0.5 * A_SOM_LOI * 10, - A_CACO3_MI = A_CACO3_MI) + A_CACO3_IF = A_CACO3_IF) # estimate bulk density (in g/cm3) dt[, bd := (1617 - 77.4 * log(A_C_OF) - 3.49 * A_C_OF) * 0.001] @@ -38,7 +38,7 @@ sptf_sss1 <- function(A_SOM_LOI,A_CACO3_MI) { dt[, v1 := 2.448 * A_SOM_LOI + 0.882] # Estimate sss using CaCO3 (R2 = 0.45, n = 11) - dt[, v2 := 5.260 * A_CACO3_MI - 4.311] + dt[, v2 := 5.260 * A_CACO3_IF - 4.311] # Estimate sss using bulk density (R2 = 0.42, n =11) dt[, v3 := 29.132 * bd + 34.840] diff --git a/R/wsa.R b/R/wsa.R index 1e27864..4b6fc48 100644 --- a/R/wsa.R +++ b/R/wsa.R @@ -248,39 +248,39 @@ sptf_wsa5 <- function(A_CLAY_MI,A_SILT_MI,A_SOM_LOI) { #' @param A_C_OF (numeric) The fraction organic carbon in the soil (g / kg). #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) +#' @param A_CACO3_IF (numeric) The calcium carbonate content of the soil (\%) #' #' @import data.table #' #' @references le Bissonnais et al. (2007) Erodibility of Mediterranean vineyard soils: relevant aggregate stability methods and significant soil variables #' #' @export -sptf_wsa6 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI,A_CACO3_MI) { +sptf_wsa6 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI,A_CACO3_IF) { # add visual bindings fsoc = NULL # Check input - arg.length <- max(length(A_C_OF), length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_MI)) + arg.length <- max(length(A_C_OF), length(A_CLAY_MI),length(A_SILT_MI),length(A_CACO3_IF)) checkmate::assert_numeric(A_C_OF, lower = 0, upper = 1000, any.missing = FALSE) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # Collect data into a table (units in g/kg) dt <- data.table(id = 1:arg.length, A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI * 10, A_SILT_MI = A_SILT_MI * 10, - A_CACO3_MI = A_CACO3_MI * 10, + A_CACO3_IF = A_CACO3_IF * 10, value = NA_real_) # set mean CaCO3 level when its value is unknown - dt[is.na(A_CACO3_MI), A_CACO3_MI := 456.4] + dt[is.na(A_CACO3_IF), A_CACO3_IF := 456.4] # estimate Aggregate Stability Index MA200 (r = 0.91, n = 68) dt[, fsoc := 35.6 + 52.86/(1 + 4.14e5 * exp(-0.67 * A_C_OF))] - dt[, value := -27.56 + 0.98 * fsoc + 0.41 * (A_CLAY_MI + A_SILT_MI) + 0.13 * A_CACO3_MI ] + dt[, value := -27.56 + 0.98 * fsoc + 0.41 * (A_CLAY_MI + A_SILT_MI) + 0.13 * A_CACO3_IF ] # return value (%) value <- dt[, value] @@ -298,25 +298,25 @@ sptf_wsa6 <- function(A_C_OF,A_CLAY_MI,A_SILT_MI,A_CACO3_MI) { #' @param A_CLAY_MI (numeric) The clay content of the soil (\%). #' @param A_SILT_MI (numeric) The silt content of the soil (\%). #' @param A_PH_WA (numeric) The acidity of the soil, pH in water (-) -#' @param A_CACO3_MI (numeric) The calcium carbonate content of the soil (\%) +#' @param A_CACO3_IF (numeric) The calcium carbonate content of the soil (\%) #' #' @import data.table #' #' @references Canasveras et al. (2010) Estimation of aggregate stability indices in Mediterranean soils by diffuse reflectance spectroscopy #' #' @export -sptf_wsa7 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { +sptf_wsa7 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_IF) { # add visual bindings fe = A_SAND_MI = NULL # Check input - arg.length <- max(length(A_SOM_LOI),length(A_CLAY_MI),length(A_SILT_MI), length(A_PH_WA), length(A_CACO3_MI)) + arg.length <- max(length(A_SOM_LOI),length(A_CLAY_MI),length(A_SILT_MI), length(A_PH_WA), length(A_CACO3_IF)) checkmate::assert_numeric(A_SOM_LOI, lower = 0, upper = 100, any.missing = FALSE,len = arg.length) checkmate::assert_numeric(A_CLAY_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_SILT_MI, lower = 0, upper = 100, len = arg.length) checkmate::assert_numeric(A_PH_WA, lower = 2, upper = 12, len = arg.length) - checkmate::assert_numeric(A_CACO3_MI, lower = 0, upper = 15, len = arg.length) + checkmate::assert_numeric(A_CACO3_IF, lower = 0, upper = 15, len = arg.length) # Collect data into a table dt <- data.table(A_SOM_LOI = A_SOM_LOI * 10, @@ -324,17 +324,17 @@ sptf_wsa7 <- function(A_SOM_LOI,A_CLAY_MI,A_SILT_MI,A_PH_WA, A_CACO3_MI) { A_SILT_MI = A_SILT_MI * 10, A_SAND_MI = (100 - A_CLAY_MI - A_SILT_MI) * 10, A_PH_WA = A_PH_WA, - A_CACO3_MI = A_CACO3_MI * 10, + A_CACO3_IF = A_CACO3_IF * 10, value = NA_real_) # add mean Fe extractable with citrate-bicarbonate-dithionite dt[, fe := 8.3] # set mean CaCO3 level when its value is unknown - dt[is.na(A_CACO3_MI), A_CACO3_MI := 310] + dt[is.na(A_CACO3_IF), A_CACO3_IF := 310] # Estimate wsa (g/kg), R2 = 0.37, n = 80 topsoils, Spain - dt[, value := 44.158 - 0.048 * A_SAND_MI - 0.087 * A_CLAY_MI + 0.002 * A_CACO3_MI +0.431 * A_PH_WA + 0.041 * A_SOM_LOI + 0.756 * fe] + dt[, value := 44.158 - 0.048 * A_SAND_MI - 0.087 * A_CLAY_MI + 0.002 * A_CACO3_IF +0.431 * A_PH_WA + 0.041 * A_SOM_LOI + 0.756 * fe] # avoid values outside calibration range dt[value < 0 | value > 499, value := NA_real_] diff --git a/data/sptf_bulkdensity.rda b/data/sptf_bulkdensity.rda index b370153..2d5ae79 100644 Binary files a/data/sptf_bulkdensity.rda and b/data/sptf_bulkdensity.rda differ diff --git a/data/sptf_countries.rda b/data/sptf_countries.rda index 0ad79d0..a2b3b35 100644 Binary files a/data/sptf_countries.rda and b/data/sptf_countries.rda differ diff --git a/data/sptf_parameters.rda b/data/sptf_parameters.rda index ec4aea4..4435492 100644 Binary files a/data/sptf_parameters.rda and b/data/sptf_parameters.rda differ diff --git a/data/sptf_soilproperties.rda b/data/sptf_soilproperties.rda index cb5d1f1..0673705 100644 Binary files a/data/sptf_soilproperties.rda and b/data/sptf_soilproperties.rda differ diff --git a/dev/derive_optimum_soc.R b/dev/derive_optimum_soc.R index dbc06cb..4ee1c29 100644 --- a/dev/derive_optimum_soc.R +++ b/dev/derive_optimum_soc.R @@ -6,11 +6,29 @@ require(data.table); require(soilptf) require(terra);require(sf) require(ggplot2);require(patchwork) +rm(list=ls()) + # --- step 1. develop meta-ptfs ---- # make a virtual dataset for a sandy soil varying in SOC levels, and derive optimum meta-ptfs per soil function + # helper fun to extract coefficients from lm model for the label with model description + hpf <- function(tpr,m1,r,cfin){ + + vals <- coefficients(m1) + pr <- paste(tpr," == ",round(vals[1],r[1])) + if(length(vals)>1){ + for(i in 2:length(vals)){ pr <- paste(pr, + fifelse(vals[i]<0,'-','+'), + round(abs(vals[i]),r[i]), + cfin[i-1])} + } else { + pr <- paste0(pr,cfin) + } + + return(pr)} + # for mineral soils only: 20% OS = 10% OC = 100 g/kg - dt1 <- data.table(A_C_OF = seq(0.5,100,1), A_CLAY_MI = 7.5, A_SAND_MI = 60, A_PH_CC = 5.4) + dt1 <- data.table(A_C_OF = seq(0.5,100,1), A_CLAY_MI = 3.5, A_SAND_MI = 60, A_PH_CC = 5.4) dt1[,id := .I] set.seed(124) dt1[,A_CN_FR := rnorm(.N,12,2)] @@ -23,25 +41,25 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.bd,by='id') m.bd <- lm(bd.mean~A_C_OF + I(log(A_C_OF)),data=dt1) p.bd <- predict(m.bd,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.bd <- paste('CEC == ', '2125 -1.056 * C - 257 * log(C)') + l.bd <- hpf('BD',m.bd,r=c(0,3,0),cfin=c('*C','*log(C)')) # the cation exchange capacity dt1.cec <- ptf_cec_all(dt1) dt1.cec <- dt1.cec[,list(cec.mean = mean(cec,na.rm=T), cec.se = sd(cec,na.rm=T)/sqrt(sum(!is.na(cec)))),by='id'] dt1 <- merge(dt1,dt1.cec,by='id') - m.cec <- lm(cec.mean~A_C_OF + I(A_C_OF^2),data=dt1) + m.cec <- lm(cec.mean~A_C_OF,data=dt1) p.cec <- predict(m.cec,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.cec <- paste('CEC == ', '64.9 + 2.92 * C - 0.0019 * C^2') - + l.cec <- hpf('CEC',m.cec,r=c(1,2),cfin=c('*C')) + # water stable aggregates dt1.wsa <- ptf_wsa_all(dt1) dt1.wsa <- dt1.wsa[,list(wsa.mean = mean(wsa,na.rm=T), wsa.se = sd(wsa,na.rm=T)/sqrt(sum(!is.na(wsa)))),by='id'] dt1 <- merge(dt1,dt1.wsa,by='id') - m.wsa <- lm(wsa.mean~A_C_OF + I(A_C_OF^2),data=dt1) + m.wsa <- lm(wsa.mean~A_C_OF,data=dt1) p.wsa <- predict(m.wsa,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.wsa <- paste('WSA == ', '64.2 + 1.04 * C - 0.0019 * C^2') + l.wsa <- hpf('WSA',m.wsa,r=c(0,3),cfin='*C') # see hamel for interpretation optimum dt1.mwd <- ptf_mwd_all(dt1) @@ -50,7 +68,7 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.mwd,by='id') m.mwd <- lm(mwd.mean~A_C_OF,data=dt1) p.mwd <- predict(m.mwd,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.mwd <- paste('MWD == ', '0.816 + 0.02634 * C') + l.mwd <- hpf('MWD',m.mwd,r=c(3,3),cfin='*C') # soil shearing dt1.sss <- ptf_sss_all(dt1) @@ -59,7 +77,7 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.sss,by='id') m.sss <- lm(sss.mean~A_C_OF + I(A_C_OF^2),data=dt1) p.sss <- predict(m.sss,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.sss <- paste('SSS == ', '66.62 + 0.526 * C + 0.0024 * C^2') + l.sss <- hpf('SSS',m.sss,r=c(1,3,4),cfin=c('*C','*C^2')) # derive water holding capacity dt1.whc <- ptf_whc_all(dt1) @@ -68,8 +86,8 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.whc,by='id') m.whc <- lm(whc.mean~I(A_C_OF^0.5),data=dt1) p.whc <- predict(m.whc,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.whc <- paste('WHC == ', '0.4228 + 0.01582 * C^0.5') - + l.whc <- hpf('WHC',m.whc,r=c(4,4),cfin=c('*C^0.5')) + # derive water plant available water dt1.paw <- ptf_paw_all(dt1) dt1.paw <- dt1.paw[,list(paw.mean = mean(paw,na.rm=T), @@ -77,8 +95,8 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.paw,by='id') m.paw <- lm(paw.mean~ I(A_C_OF^0.5),data=dt1) p.paw <- predict(m.paw,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.paw <- paste('PAW == ', '0.135 + 0.01193 * C^0.5') - + l.paw <- hpf('PAW',m.paw,r=c(4,4),cfin=c('*C^0.5')) + # potentially mineralizable N dt1.pmn <- ptf_pmn_all(dt1) dt1.pmn <- dt1.pmn[,list(pmn.mean = mean(pmn,na.rm=T), @@ -86,8 +104,8 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.pmn,by='id') m.pmn <- lm(pmn.mean~ A_C_OF+I(A_C_OF^2),data=dt1) p.pmn <- predict(m.pmn,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.pmn <- paste('PMN == ', '9.119 + 1.284 * C + 0.0102 * C^2') - + l.pmn <- hpf('PMN',m.pmn,r=c(2,4,4),cfin=c('*C','*C^2')) + # hot water carbon dt1.hwc <- ptf_hwc_all(dt1) dt1.hwc <- dt1.hwc[,list(hwc.mean = mean(hwc,na.rm=T), @@ -95,7 +113,11 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.hwc,by='id') m.hwc <- lm(hwc.mean~ A_C_OF+I(A_C_OF^2),data=dt1) p.hwc <- predict(m.hwc,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.hwc <- paste('HWC == ', '129.9 + 29.88 * C -0.036918 * C^2') + l.hwc <- hpf('HWC',m.hwc,r=c(0,1,3),cfin=c('*C','*C^2')) + + # disase supressiveness + dt1[,ods := OBIC::evaluate_logistic(A_C_OF * 2 * 0.1, b = 1.2, x0 = 1.7,v = 0.4)] + l.ods <- paste('DR ==','1/(1 + exp(-1.2 * (0.2*C - 1.7)))^(1/0.4)') # pH buffer capacity dt1.phbc <- ptf_phbc_all(dt1) @@ -104,7 +126,7 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.phbc,by='id') m.phbc <- lm(phbc.mean~ A_C_OF,data=dt1) p.phbc <- predict(m.phbc,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.phbc <- paste('pHBC == ', '1.669 + 1.286 * C') + l.phbc <- hpf('pHBC',m.phbc,r=c(3,3),cfin='*C') # metal freundlich coefficient dt1.metal <- ptf_metals_all(dt1) @@ -113,29 +135,54 @@ require(ggplot2);require(patchwork) dt1 <- merge(dt1,dt1.metal,by='id') m.metal <- lm(metal.mean~ I(A_C_OF^0.5),data=dt1) p.metal <- predict(m.metal,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.metal <- paste('Kf == ', '-4.01 + 10.2824 * C^0.5') + l.metal <- hpf('Kf',m.metal,r=c(1,1),cfin=c('*C^0.5')) # carbon decomposition, minip, and assume 10% uncertainty dt1.cdec <- ptf_cdec_all(dt1) dt1.cdec <- dt1.cdec[,list(cdec.mean = mean(cdec,na.rm=T), cdec.se = mean(cdec,na.rm=T)*0.10),by='id'] dt1 <- merge(dt1,dt1.cdec,by='id') - m.cdec <- lm(cdec.mean~A_C_OF,data=dt1) + m.cdec <- lm(cdec.mean~A_C_OF-1,data=dt1) p.cdec <- predict(m.cdec,newdata = data.frame(A_C_OF = dt1$A_C_OF)) - l.cdec <- paste('C-decomposition == ', '0.22 * C') + l.cdec <- hpf('C-decomposition',m.cdec,r=2,cfin='*C') dt1[, cyield := sptf_yield1(A_C_OF = A_C_OF,A_CLAY_MI = A_CLAY_MI)] m.cyield <- lm(cyield~A_C_OF + I(A_C_OF^2),data=dt1) - + l.cyield <- hpf('yield',m.cyield,r=c(2,2,4),cfin=c('*C','*C^2')) + + # individual metals + dt2 <- shi_metals(A_PH_CC = dt1$A_PH_CC, + A_SOM_LOI = dt1$A_C_OF * 2 / 10, + A_CLAY_MI = dt1$A_CLAY_MI, + type ='me_crit') + dt1 <- merge(dt1,dt2,by='id') + m.cd <- lm(ccd~A_C_OF-1,data=dt1) + m.cu <- lm(ccu~A_C_OF + I(A_C_OF^2),data=dt1) + m.pb <- lm(cpb~A_C_OF + I(A_C_OF^2),data=dt1) + m.zn <- lm(czn~A_C_OF-1,data=dt1) + l.cu <- hpf('Cu',m.cu,r=c(2,2,5),cfin=c('*C','*C^2')) + l.pb <- hpf('Pb',m.pb,r=c(2,2,5),cfin=c('*C','*C^2')) + l.cd <- hpf('Cd',m.cd,r=3,cfin='*C') + l.zn <- hpf('Zn',m.zn,r=3,cfin='*C') + + tabfuns <- data.table(parm = c('yield','phbc','cec','cd','cu', 'zn','pb','metals', + 'hwc','ods','pmn','cdec','dens','whc', + 'paw','wsa','mwd','sss'), + model = c(l.cyield,l.phbc,l.cec,l.cd,l.cu,l.zn,l.pb,l.metal, + l.hwc,l.ods,l.pmn,l.cdec,l.bd,l.whc,l.paw,l.wsa, + l.mwd,l.sss)) + + fwrite(tabfuns,file = 'D:/ESA/04 articles/2023/som_critical_levels/230508 tabel functions.csv') + + # optimum crop yield (see Young et al., 2021) # here is the target: dt1[, cyield1 := 0.5 + (1.75 - 0.5) * (A_CLAY_MI - 4)/(38 - 4)] # model of Oldfield, 118 kg N/ha default - -# --- step 2. define optimum SOC ---- -# here an example is given for the dataset prepared above, and its converted to a simple function to apply this procedure on new datasets. +# --- step 2. define optimum SOC (old) ---- + # here an example is given for the dataset prepared above, and its converted to a simple function to apply this procedure on new datasets. # note that this function is not yet optimized for speed - + # see optimcarbon_fx # inverse helper function to derive the lowest SOC to achieve the target in soil health indicator fmod <- function(model,var){ @@ -193,9 +240,9 @@ require(ggplot2);require(patchwork) dt2[, ophbc := 1 * 1000* (1000000 / (0.22 * bd * 100 * 100)) * 2/74.09] dt2[, cphbc := fmod(m.phbc,ophbc),by=id] - # optimum C decomposition is not higher than what can be added by annual grassland + # optimum C decomposition is not higher than what can be added by annual grassland over 10 years # kg EOS * 0.5 = kg C / ha - dt2[, ocdec := 3975 * 0.5 *1000 * 10/ ((2125 - 1.056 * A_C_OF - 257 * log(A_C_OF))*100*100*0.3)] + dt2[, ocdec := (3975 + 60 * 50) * 0.5 *1000 * 10/ ((2125 - 1.056 * A_C_OF - 257 * log(A_C_OF))*100*100*0.3)] dt2[, ccdec := fmod(m.cdec,ocdec),by=id] # optimum metal sorption, by default the highest one @@ -321,11 +368,573 @@ optimcarbon <- function(xs, dtr){ out <- dt5[,copt_av] + # return out + return(out) +} + + dt.oc <- copy(dt1[,.(A_C_OF,A_CLAY_MI,A_SAND_MI,A_PH_CC)]) + + # analytical solver + optimcarbon_fix <- function(A_C_OF,A_CLAY_MI,A_SAND_MI,A_PH_CC,type = 'copt'){ + + # make internal data.table + dt.oc <- data.table(A_C_OF = A_C_OF, + A_CLAY_MI = A_CLAY_MI, + A_SAND_MI = A_SAND_MI, + A_PH_CC = A_PH_CC) + + dt.oc[, id := 1:.N] + + # estimate bulk density (Ros & de Vries, 2023) + dt.oc[, bd := (1617 - 77.4 * log(A_C_OF) - 3.49 * A_C_OF) ] + + # optimum density for rootability (Ros, 2023) + # https://math.stackexchange.com/questions/433717/how-to-solve-equations-with-logarithms-like-this-ax-b-logx-c-0 + dt.oc[, odens := (1.75 - 0.009 * A_CLAY_MI) * 1000] + dt.oc[, fa := m.bd$coefficients[2]] + dt.oc[, fc := m.bd$coefficients[1] - odens] + dt.oc[, fb := m.bd$coefficients[3]] + dt.oc[, cdens := (fb/fa) * pracma::lambertWp((fa/fb)*exp(-fc/fb))] + dt.oc[,c('fa','fb','fc') := NULL] + + # optimum CEC level for soil fertility (van Erp, 2001; Ros et al, 2023) + dt.oc[, ocec := 100] + dt.oc[, ccec := (ocec - m.cec$coefficients[1])/m.cec$coefficients[2]] + + # optimum level water stable aggregates (from SHI, Moebius-Clune, 2017) + # The larger the MWD and GMD values are, the higher the average particle size agglomeration of soil aggregates are, and the stronger the stability of soil structure is + dt.oc[, owsa := 75] + dt.oc[, cwsa := (owsa - m.wsa$coefficients[1])/m.wsa$coefficients[2]] + + # optimum MWD value using method of Le Bissonnais (1996), cited Clergue et al. (2003) + # lower values are unstable, and high risk on crusttability + dt.oc[, omwd := 1.3] + dt.oc[, cmwd := (omwd - m.mwd$coefficients[1])/m.mwd$coefficients[2]] + + # for shear strength no optimum + dt.oc[, osss := NA_real_] + dt.oc[, csss := NA_real_] + + # more is better, optimum score (medium to high boundery) at 0.3 g / g (Moebius-Clune, 2017) + dt.oc[, owhc := 0.45] + dt.oc[, cwhc := ((owhc - m.whc$coefficients[1])/m.whc$coefficients[2])^2] + + # more is better, optimum score at 0.3 g / g (Moebius-Clune, 2017), border shi score 80 (from high to very high), 0.18 sand, 0.21 others + # if border from medium to high, then sand 0.13 and others 0.16 + dt.oc[, opaw := pmax(0.18,0.21 + A_SAND_MI * (0.18 - 0.21)/50)] + #dt.oc[, opaw := pmax(0.13,0.16 + A_SAND_MI * (0.13 - 0.16)/50)] + dt.oc[, cpaw := ((opaw - m.paw$coefficients[1])/m.paw$coefficients[2])^2] + + # more is better, optimum score at 30 mg N /kg (Moebius-Clune, 2017) + dt.oc[, opmn := 30] + dt.oc[,fa := m.pmn$coefficients[3]] + dt.oc[,fb := m.pmn$coefficients[2]] + dt.oc[,fc := m.pmn$coefficients[1] - opmn] + dt.oc[,cpmn1 := (-fb + sqrt(fb^2 - 4 * fa * fc))/(2*fa)] + dt.oc[,cpmn2 := (-fb - sqrt(fb^2 - 4 * fa * fc))/(2*fa)] + dt.oc[cpmn1 >= 0 & cpmn2 >= 0, cpmn := pmin(cpmn1,cpmn2)] + dt.oc[cpmn1 >= 0 & cpmn2 < 0, cpmn := cpmn1] + dt.oc[cpmn1 < 0 & cpmn2 >= 0, cpmn := cpmn2] + dt.oc[,c('cpmn1','cpmn2','fa','fb','fc') := NULL] + + # more is better, reference value of BLN arable systems + dt.oc[, ohwc := 500] + dt.oc[,fa := m.hwc$coefficients[3]] + dt.oc[,fb := m.hwc$coefficients[2]] + dt.oc[,fc := m.hwc$coefficients[1] - ohwc] + dt.oc[,chwc1 := (-fb + sqrt(fb^2 - 4 * fa * fc))/(2*fa)] + dt.oc[,chwc2 := (-fb - sqrt(fb^2 - 4 * fa * fc))/(2*fa)] + dt.oc[chwc1 >= 0 & chwc2 >= 0, chwc := pmin(chwc1,chwc2)] + dt.oc[chwc1 >= 0 & chwc2 < 0, chwc := chwc1] + dt.oc[chwc1 < 0 & chwc2 >= 0, chwc := chwc2] + dt.oc[,c('chwc1','chwc2','fa','fb','fc') := NULL] + + # disease supressiveness + dt.oc[,ods := 0.99] + dt.oc[,b := 1.2] + dt.oc[,x0 := 1.7] + dt.oc[,v := 0.4] + dt.oc[,cods := log(exp(log(1/ods)/(1/v))-1)/-b+x0] + dt.oc[,c('b','x0','v') := NULL] + + # optimum pH buffer capacity + dt.oc[, ophbc := 1 * 1000* (1000000 / (0.22 * bd * 100 * 100)) * 2/74.09] + dt.oc[, cphbc := (ophbc - m.phbc$coefficients[1])/m.phbc$coefficients[2]] + + # optimum C decomposition is not higher than what can be added by annual grassland + # kg EOS * 0.5 = kg C / ha + dt.oc[, ocdec := (3975 + 60 * 50) * 0.5 *1000 * 10/ ((2125 - 1.056 * A_C_OF - 257 * log(A_C_OF))*100*100*0.3)] + dt.oc[, ccdec := ocdec/m.cdec$coefficients[1]] + + # optimum metal sorption, by default the highest one + dt.oc[, ometals := 100] + dt.oc[, cmetals := NA_real_] + + # derive critical SOC values for metal concentrations for Ecoogical Health (de Vries et al., 2008) + dt.oc.metals <- shi_metals(A_PH_CC = dt.oc$A_PH_CC, + A_SOM_LOI = dt.oc$A_C_OF * 2 / 10, + A_CLAY_MI = dt.oc$A_CLAY_MI + ) + + dt.oc[,omcd := NA_real_] + dt.oc[,cmcd := dt.oc.metals$a_cd_rt] + dt.oc[,omcu := NA_real_] + dt.oc[,cmcu := dt.oc.metals$a_cu_rt] + dt.oc[,ompb := NA_real_] + dt.oc[,cmpb := dt.oc.metals$a_pb_rt] + dt.oc[,omzn := NA_real_] + dt.oc[,cmzn := dt.oc.metals$a_zn_rt] + + # optimum SOC for crop yield based on Oldfield et al. (2009) + dt.oc[, oyield := 3] + #dt.oc[, cyieldo := fmod(m.cyield,3),by=id] + dt.oc[,fa := m.cyield$coefficients[3]] + dt.oc[,fb := m.cyield$coefficients[2]] + dt.oc[,fc := m.cyield$coefficients[1] - oyield] + dt.oc[,chwc1 := (-fb + sqrt(fb^2 - 4 * fa * fc))/(2*fa)] + dt.oc[,chwc2 := (-fb - sqrt(fb^2 - 4 * fa * fc))/(2*fa)] + dt.oc[chwc1 >= 0 & chwc2 >= 0, cyield1 := pmin(chwc1,chwc2)] + dt.oc[chwc1 >= 0 & chwc2 < 0, cyield1 := chwc1] + dt.oc[chwc1 < 0 & chwc2 >= 0, cyield1 := chwc2] + dt.oc[,c('chwc1','chwc2','fa','fb','fc') := NULL] + + # optimum SOC for crop yield based on Korschens + # 0.5% at 4% clay and 1.75% for 38% of clay + dt.oc[, cyield2 := 10* pmax(0.5,pmin(1.75,0.5 + (A_CLAY_MI -4) * (1.75-0.5)/(38-4)))] + dt.oc[, cyield := (cyield1 + cyield2)/2] + dt.oc[,c('cyield1','cyield2'):=NULL] + + # melt + dt3 <- melt(dt.oc, + id.vars = c('id','A_C_OF','A_CLAY_MI'), + measure=patterns(target="^o", copt = "^c")) + vars <- c('dens','cec','wsa','mwd','sss','whc','paw','pmn','hwc','ods','phbc','cdec','metals','cd','cu','pb','zn','yield') + dt3[,parm := vars[variable]] + + dt4 <- dt3[!is.na(copt)] + dt4[grepl('hwc|pmn|dec|ods',parm),parmc := 'darkgreen'] + dt4[grepl('yield',parm),parmc := 'black'] + dt4[grepl('wsa|mwd|dens|whc|paw',parm),parmc := 'skyblue'] + dt4[grepl('phbc|cec|cu|pb|zn|cd',parm),parmc := 'orange'] + dt4[,parm := factor(parm,levels = rev(c('yield','phbc','cec','cd','cu','pb','zn', + 'hwc','ods','pmn','cdec','wsa','mwd','dens','whc','paw')))] + # weging contributie of soil health indicators + dt4[parm=='dens', wf := 2/8] + dt4[grepl('whc|paw',parm), wf := 1/8] + dt4[grepl('wsa|mwd',parm), wf := 1/8] + dt4[parm=='cdec', wf := 1/8] + dt4[parm=='hwc', wf := 4/8] + dt4[parm=='pmn', wf := 3/8] + dt4[parm=='cec', wf := 3/8] + dt4[parm=='phbc', wf := 1/8] + dt4[grepl('cu|pb|zn|cd',parm), wf := 1/32] + dt4[parm=='yield', wf := 8/8] + dt4[parm=='ods', wf := 1/8] + + dt4[grepl('hwc|pmn|dec|ods',parm),wf0 := 25] + dt4[grepl('yield',parm),wf0 := 25] + dt4[grepl('wsa|mwd|dens|whc|paw',parm),wf0 := 25] + dt4[grepl('phbc|cec|cu|n|pb|cd',parm),wf0 := 25] + + dt4[,wf1 := wf0 * wf] + + dt5 <- dt4[,list(copt_av = weighted.mean(copt,w = wf1), + copt_se = sqrt(Hmisc::wtd.var(copt,weights = wf1,normwt = F))/sqrt(.N), + copt_oa = max(copt), + copt_qant = quantile(copt,0.75), + copt_median = median(copt)),by=id] + + if(type=='copt'){ out <- dt5[,.(copt_av,copt_se)]} + if(type=='summary'){out <- dt5} + if(type=='all'){out <- dt4} + # return out return(out) } -# --- step 4. plot figures of meta-ptfs ---- + # predict a change in carbon (expressed in delta distance to /above target) + predcarbon <- function(A_C_OF,A_CLAY_MI,A_SAND_MI,A_PH_CC,type = 'ddtt',type2 ='max',dsoc = 1){ + + # make internal data.table + dp <- data.table(A_C_OF = A_C_OF, + A_CLAY_MI = A_CLAY_MI, + A_SAND_MI = A_SAND_MI, + A_PH_CC = A_PH_CC) + + # add id + dp[, id := 1:.N] + + # estimate bulk density (Ros & de Vries, 2023) + dp[, bd := (1617 - 77.4 * log(A_C_OF) - 3.49 * A_C_OF) ] + + # predict oc dependent crop yield, and SHI for current situation + dp[, byield := predict(m.cyield,newdata = data.frame(A_C_OF))] + dp[A_C_OF > 30, byield := 3.3] + dp[, bcec := predict(m.cec,newdata = data.frame(A_C_OF))] + dp[, bphbc := predict(m.phbc,newdata = data.frame(A_C_OF))] + dp[, bmetals := predict(m.metal,newdata = data.frame(A_C_OF))] + dp[, bcu := predict(m.cu,newdata = data.frame(A_C_OF))] + dp[, bzn := predict(m.zn,newdata = data.frame(A_C_OF))] + dp[, bpb := predict(m.pb,newdata = data.frame(A_C_OF))] + dp[, bcd := predict(m.cd,newdata = data.frame(A_C_OF))] + dp[, bpmn := predict(m.pmn,newdata = data.frame(A_C_OF))] + dp[, bhwc := predict(m.hwc,newdata = data.frame(A_C_OF))] + dp[, bods := OBIC::evaluate_logistic(A_C_OF*2/10, b = 1.2, x0 = 1.7,v = 0.4)] + dp[, bcdec := predict(m.cdec,newdata = data.frame(A_C_OF))] + dp[, bbd := predict(m.bd,newdata = data.frame(A_C_OF))] + dp[, bwsa := predict(m.wsa,newdata = data.frame(A_C_OF))] + dp[, bsss := predict(m.sss,newdata = data.frame(A_C_OF))] + dp[, bmwd := predict(m.mwd,newdata = data.frame(A_C_OF))] + dp[, bwhc := predict(m.whc,newdata = data.frame(A_C_OF))] + dp[, bpaw := predict(m.paw,newdata = data.frame(A_C_OF))] + + # predict oc dependent crop yield, and SHI for situation with 1 g/kg C extra + dp[, ebyield := predict(m.cyield,newdata = data.frame(A_C_OF = A_C_OF + dsoc))] + dp[A_C_OF > 30, ebyield := 3.3] + dp[, ebcec := predict(m.cec,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebphbc := predict(m.phbc,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebmetals := predict(m.metal,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebcu := predict(m.cu,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebzn := predict(m.zn,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebpb := predict(m.pb,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebcd := predict(m.cd,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebpmn := predict(m.pmn,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebhwc := predict(m.hwc,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebods := OBIC::evaluate_logistic((A_C_OF + dsoc)*2/10, b = 1.2, x0 = 1.7,v = 0.4)] + dp[, ebcdec := predict(m.cdec,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebbd := predict(m.bd,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebwsa := predict(m.wsa,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebsss := predict(m.sss,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebmwd := predict(m.mwd,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebwhc := predict(m.whc,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + dp[, ebpaw := predict(m.paw,newdata = data.frame(A_C_OF =A_C_OF + dsoc))] + + # factor to estimate max + cfmax <- 3 + + # add max per SHI, cfmax x opt + dp[, odens := 850] + dp[, ocec := cfmax * 100] + dp[, owsa := cfmax * 75] + dp[, omwd := cfmax * 1.3] + dp[, osss := NA_real_] + dp[, owhc := cfmax * 0.45] + dp[, opaw := cfmax * pmax(0.18,0.21 + A_SAND_MI * (0.18 - 0.21)/50)] + dp[, opmn := cfmax * 30] + dp[, ohwc := cfmax * 500] + dp[, oods := 1.0] + dp[, ophbc := cfmax * 1 * 1000* (1000000 / (0.22 * bd * 100 * 100)) * 2/74.09] + dp[, ocdec := cfmax * (3975 + 60 * 50) * 0.5 *1000 * 10/ ((2125 - 1.056 * A_C_OF - 257 * log(A_C_OF))*100*100*0.3)] + dp[, ometals := 100] + + dt2 <- shi_metals(A_PH_CC = dp$A_PH_CC, + A_SOM_LOI = dp$A_C_OF * 2 / 10, + A_CLAY_MI = dp$A_CLAY_MI, + type ='me_crit') + dp[,omcd := cfmax * dt2$ccd] + dp[,omcu := cfmax * dt2$ccu] + dp[,ompb := cfmax * dt2$cpb] + dp[,omzn := cfmax * dt2$czn] + dp[, oyield := cfmax * 3] + + if(type2 == 'max'){ + # estimate improvement + dp[, iyield := (ebyield - byield)/oyield] + dp[, icec := (ebcec - bcec)/ocec] + dp[, iphbc := (ebphbc - bphbc)/ophbc] + dp[, imetals := (ebmetals - bmetals)/ometals] + dp[, icu := (ebcu - bcu)/omcu] + dp[, izn := (ebzn - bzn)/omzn] + dp[, ipb := (ebpb - bpb)/ompb] + dp[, icd := (ebcd - bcd)/omcd] + dp[, ipmn := (ebpmn - bpmn)/opmn] + dp[, ihwc := (ebhwc - bhwc)/ohwc] + dp[, iods := (ebods - bods)/oods] + dp[, icdec := (ebcdec - bcdec)/ocdec] + dp[, ibd := (ebbd - bbd)/-odens] + dp[, iwsa := (ebwsa - bwsa)/owsa] + dp[, isss := (ebsss - bsss)/osss] + dp[, imwd := (ebmwd - bmwd)/omwd] + dp[, iwhc := (ebwhc - bwhc)/owhc] + dp[, ipaw := (ebpaw - bpaw)/opaw] + + } else { + + # estimate improvement + dp[, iyield := (ebyield / byield)] + dp[, icec := (ebcec / bcec)] + dp[, iphbc := (ebphbc / bphbc)] + dp[, imetals := (ebmetals / bmetals)] + dp[, icu := (ebcu / bcu)] + dp[, izn := (ebzn / bzn)] + dp[, ipb := (ebpb / bpb)] + dp[, icd := (ebcd / bcd)] + dp[, ipmn := (ebpmn / bpmn)] + dp[, ihwc := (ebhwc / bhwc)] + dp[, iods := (ebods / bods)] + dp[, icdec := (ebcdec / bcdec)] + dp[, ibd := (ebbd / bbd)] + dp[, iwsa := (ebwsa / bwsa)] + dp[, isss := (ebsss / bsss)] + dp[, imwd := (ebmwd / bmwd)] + dp[, iwhc := (ebwhc / bwhc)] + dp[, ipaw := (ebpaw / bpaw)] + + } + + + # melt + cols <- colnames(dp)[grepl('^i',colnames(dp))] + cols <- cols[cols != 'id'] + + dt3 <- melt(dp, + id.vars = c('id','A_C_OF','A_CLAY_MI'), + measure.vars = cols, + variable.name = 'shi', + value.name ='dist_to_max') + + dt4 <- dt3[!is.na(dist_to_max)] + dt4[grepl('hwc|pmn|dec|ods',shi),parmc := 'darkgreen'] + dt4[grepl('yield',shi),parmc := 'black'] + dt4[grepl('wsa|mwd|dens|bd|whc|paw',shi),parmc := 'skyblue'] + dt4[grepl('phbc|cec|cu|pb|zn|cd',shi),parmc := 'orange'] + dt4[,shi := factor(shi,levels = rev(c('iyield','iphbc','icec','icd','icu','ipb','izn','imetals', + 'ihwc','iods','ipmn','icdec','iwsa','imwd','ibd', + 'iwhc','ipaw','isss')))] + # weging contributie of soil health indicators + dt4[shi=='ibd', wf := 2/8] + dt4[grepl('whc|paw',shi), wf := 1/8] + dt4[grepl('wsa|mwd|sss',shi), wf := 1/8] + dt4[shi=='icdec', wf := 1/8] + dt4[shi=='ihwc', wf := 4/8] + dt4[shi=='ipmn', wf := 3/8] + dt4[shi=='icec', wf := 3/8] + dt4[shi=='iphbc', wf := 1/8] + dt4[grepl('cu|pb|zn|cd',shi), wf := 1/32] + dt4[shi=='iyield', wf := 8/8] + dt4[shi=='iods', wf := 1/8] + dt4[shi=='imetals', wf := 1/8] + + dt4[grepl('hwc|pmn|dec|ods',shi),wf0 := 25] + dt4[grepl('yield',shi),wf0 := 25] + dt4[grepl('wsa|mwd|dens|bd|whc|paw|sss',shi),wf0 := 25] + dt4[grepl('phbc|cec|cu|n|pb|cd|metal',shi),wf0 := 25] + + dt4[,wf1 := wf0 * wf] + + dt5 <- dt4[,list(ddtt_av = weighted.mean(dist_to_max,w = wf1), + ddtt_se = sqrt(Hmisc::wtd.var(dist_to_max,weights = wf1,normwt = F))/sqrt(.N), + ddtt_oa = max(dist_to_max), + ddtt_qant = quantile(dist_to_max,0.75), + ddtt_median = median(dist_to_max)),by=id] + + if(type=='ddtt'){ out <- dt5[,.(ddtt_av,ddtt_se)]} + if(type=='summary'){out <- dt5} + if(type=='all'){out <- dt4} + + return(out) + + } + + + +# --- step 4. SHI comparison ----------- + + # default soil series with variable SOC + dt1 <- data.table(A_C_OF = seq(0.5,100,1), A_CLAY_MI = 3.5, A_SAND_MI = 80, A_PH_CC = 5.4) + dt1[,id := .I] + set.seed(124) + dt1[,A_CN_FR := rnorm(.N,12,2)] + dt1[,A_N_RT := A_C_OF * 1000 / A_CN_FR] + + # make a course example + dt.coarse <- copy(dt1) + dt.fine <- copy(dt1) + dt.fine[,A_CLAY_MI := 50] + dt.fine[,A_SAND_MI := 20] + + # calculate optima + dt.coarse[,c('copt','copt_se') := optimcarbon_fix(A_C_OF,A_CLAY_MI,A_SAND_MI,A_PH_CC)] + dt.fine[,c('copt','copt_se') := optimcarbon_fix(A_C_OF,A_CLAY_MI,A_SAND_MI,A_PH_CC)] + + # make logistic shi + # a = seq(0,8,0.01) + # coarse shi + # plot(a,OBIC::evaluate_logistic(a,b=1.9,x0=1.5,v=0.4),type='l',col='black') + # medium shi + # lines(a,OBIC::evaluate_logistic(a,b=1.5,x0=2.5,v=0.5),col='blue') + # fine + # lines(a,OBIC::evaluate_logistic(a,b=1.6,x0=3.5,v=0.4),col='red') + + # calculate SHI evaluation score + dt.shi <- data.table(som = seq(0,8,0.01), + coarse = OBIC::evaluate_logistic(seq(0,8,0.01),b=1.9,x0=1.5,v=0.4), + fine = OBIC::evaluate_logistic(seq(0,8,0.01),b=1.6,x0=3.5,v=0.4)) + + # convert optimum to soil score and adapt score for axis max + dt.coarse[,a_c_of := dt1$A_C_OF] + dt.coarse[,a_som_loi := a_c_of * 2 * 0.1] + dt.coarse[, score := a_c_of/copt] + dt.coarse[, score_sd := sqrt((copt_se/copt)^2 + (0.0001/a_c_of)^2) * score * sqrt(16)] + dt.coarse[,pscore := pmin(1,score)] + dt.coarse[,pscore_psd := pmin(1.2,score + score_sd)] + dt.coarse[,pscore_msd := score- score_sd] + dt.coarse[, texture := 'coarse'] + + # convert optimum to soil score and adapt score for axis max + dt.fine[,a_c_of := A_C_OF] + dt.fine[,a_som_loi := a_c_of * 2 * 0.1] + dt.fine[, score := a_c_of/copt] + dt.fine[, score_sd := sqrt((copt_se/copt)^2 + (0.0001/a_c_of)^2) * score * sqrt(16)] + dt.fine[,pscore := pmin(1,score)] + dt.fine[,pscore_psd := pmin(1.2,score + score_sd)] + dt.fine[,pscore_msd := score- score_sd] + dt.fine[, texture := 'fine'] + + # classification colouring for sOM + df.class <- data.table(xmin = rep(0,5), + xmax = rep(8,5), + ymin = c(0,0.25,0.5,0.75,1.00), + ymax = c(0.25,0.5,0.75,1.0,1.25), + classUK = c('very low', 'low', 'moderate', 'high', 'very high'), + classNL = c('Vrij laag','Laag','Gemiddeld','Hoog','Vrij hoog')) + df.class[,classUK := factor(classUK,levels=rev(c('very low', 'low', 'moderate', 'high', 'very high')))] + + # make a polygon for uncertainty + dt.poly.coarse <- rbind(dt.coarse[1:.N,.(a_som_loi,pscore=pmin(1,pscore_psd))], + dt.coarse[rev(1:.N),.(a_som_loi,pscore=pmin(1,pscore_msd))]) + dt.poly.coarse <- dt.poly.coarse[a_som_loi<=8] + + dt.poly.fine <- rbind(dt.fine[1:.N,.(a_som_loi,pscore=pmin(1,pscore_psd))], + dt.fine[rev(1:.N),.(a_som_loi,pscore=pmin(1,pscore_msd))]) + dt.poly.fine <- dt.poly.fine[a_som_loi<=8] + + legendti_col <- 'class' + col5 <- c('#238b45','#238b45','#ffffbf','#fdae61','#d7191c') # '#abdda4' + require(ggplot2) + + # plot evaluation score for sandy soil + p1 <- ggplot(data = dt.coarse, aes(x = a_som_loi)) +theme_bw() + + geom_rect(data = df.class, + aes(x = NULL, y = NULL, xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = classUK), + alpha = 0.6, show.legend = FALSE) + + geom_polygon(data = dt.poly.coarse,aes(x=a_som_loi,y=pscore),fill='gray75',alpha = 0.5,show.legend = F)+ + geom_line(data = dt.coarse, + aes(y = pscore,group = texture,linetype=factor('1',levels=c('1','2')), + color='1'), + linewidth = 0.8) + xlim(0,8) + + theme(legend.position = c(0.75,0.25)) + + geom_line(data = dt.coarse, aes(y = pmin(1,pscore_psd),linetype='2', color = '2'), linewidth = 0.4,show.legend = F)+ + geom_line(data = dt.coarse, aes(y = pmin(1,pscore_msd),linetype='2',color = '2'),linewidth = 0.4,show.legend = F)+ + geom_line(data = dt.shi,aes(x = som, y = coarse,linetype = '3',color='3'),linewidth = 0.8,show.legend = F)+ + scale_fill_manual(name = legendti_col, values=col5) + + scale_linetype_manual(values = c('solid','solid','dotdash'), + labels = c('mean (this study)','standard deviation (this study)','SHI (Cornell)'), + name ='SOM assessment') + + scale_color_manual(values = c('gray25','gray75','gray25'), + labels = c('mean (this study)','standard deviation (this study)','SHI (Cornell)'), + name ='SOM assessment' + ) + + scale_y_continuous(limits=c(0, 1), breaks=seq(0, 1.0, by = 0.25)) + + xlab('Soil organic matter (%)') + ylab('Score') + + labs(title = "Agronomic SOM Assessment Score", + subtitle = "for a coarse sandy soil") + ptl + + + # plot evaluation score for fine textured soil + p2 <- ggplot(data = dt.fine, aes(x = a_som_loi)) +theme_bw() + + geom_rect(data = df.class, + aes(x = NULL, y = NULL, xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = classUK), + alpha = 0.6, show.legend = FALSE) + + geom_polygon(data = dt.poly.fine,aes(x=a_som_loi,y=pscore),fill='gray75',alpha = 0.5,show.legend = F)+ + geom_line(data = dt.fine, + aes(y = pscore,linetype=factor('1',levels=c('1','2')),color='1'), + linewidth = 0.8) + xlim(0,8) + + theme(legend.position = c(0.75,0.25)) + + geom_line(data = dt.fine, aes(y = pmin(1,pscore_psd),linetype='2', color = '2'), linewidth = 0.4,show.legend = F)+ + geom_line(data = dt.fine, aes(y = pmin(1,pscore_msd),linetype='2',color = '2'),linewidth = 0.4,show.legend = F)+ + geom_line(data = dt.shi,aes(x = som, y = fine,linetype = '3',color='3'),linewidth = 0.8,show.legend = F)+ + scale_fill_manual(name = legendti_col, values=col5) + + scale_linetype_manual(values = c('solid','solid','dotdash'), + labels = c('mean (this study)','standard deviation (this study)','SHI (Cornell)'), + name ='SOM assessment') + + scale_color_manual(values = c('gray25','gray75','gray25'), + labels = c('mean (this study)','standard deviation (this study)','SHI (Cornell)'), + name ='SOM assessment') + + scale_y_continuous(limits=c(0, 1), breaks=seq(0, 1.0, by = 0.25)) + + xlab('Soil organic matter (%)') + ylab('Score') + + labs(title = "Agronomic SOM Assessment Score", + subtitle = "for a fine textured clay soil") + ptl + + p12 <- p1 | p2 + ggsave(plot=p12,filename = "D:/ESA/04 articles/2023/som_critical_levels/shi_comparison.png", + width = 33, height = 17, units = c("cm"), dpi = 1200) + +# --- step 5. plot per indicator ----- + + # default soil series with variable SOC + dt1 <- data.table(A_C_OF = c(7.5,7.5), A_CLAY_MI = c(3.5,25), A_SAND_MI = c(80,20), A_PH_CC = c(5.4,6.5)) + dt1[,id := .I] + dt1[,A_N_RT := A_C_OF * 1000 / 12] + + d1.opt <- optimcarbon_fix(dt1$A_C_OF, + dt1$A_CLAY_MI, + dt1$A_SAND_MI, + dt1$A_PH_CC, + type ='all') + d1.opt[,parm := factor(parm,levels = rev(c('yield','phbc','cec','cd','cu', 'zn','pb', + 'hwc','ods','pmn','cdec','dens','whc','paw','wsa','mwd')))] + d1.opt.sand <- d1.opt[id==1,] + d1.opt.sand[,copt_av := weighted.mean(copt,w=wf1)] + d1.opt.sand[,wfn := 100/.N,by='parmc'] + d1.opt.sand[,copt_av2 := weighted.mean(copt,w=wfn)] + d1.opt.sand[, parmc := factor(parmc,levels= c('black','orange','darkgreen','skyblue'))] + + d1.opt.clay <- d1.opt[id==2,] + d1.opt.clay[,copt_av := weighted.mean(copt,w=wf1)] + d1.opt.clay[,wfn := 100/.N,by='parmc'] + d1.opt.clay[,copt_av2 := weighted.mean(copt,w=wfn)] + d1.opt.clay[, parmc := factor(parmc,levels= c('black','orange','darkgreen','skyblue'))] + + + # plot the optimum SOC per soil health indicator for sandy soil + pf1 <- ggplot(data = d1.opt.sand, aes(x= parm, y=copt,color=parmc)) + + geom_segment( aes(x=parm, xend=parm, y=0, yend=copt)) + + geom_hline(yintercept = d1.opt.sand$copt_av, linetype="dotted", + color = "black", linewidth=1)+ + geom_point(size=4, alpha=0.6) + + theme_bw() + + scale_color_manual(values = c('black','orange','darkgreen','skyblue'), + labels = c('crop yield','chemical','biological','physical'), + name ='SOM assessment')+ + coord_flip() + ylab('Critical SOC (g/kg)') + xlab('') + + theme(legend.position = c(0.8,0.8))+ + labs(title = "Agronomic SOM Assessment per Soil Health Indicator", + subtitle = "for a coarse sandy soil (with 1.5% SOM, 3.5% clay and pH 5.4)") + ptl + + # plot the optimum SOC per soil health indicator for clay soil + pf2 <- ggplot(data = d1.opt.clay, aes(x= parm, y=copt,color=parmc)) + + geom_segment( aes(x=parm, xend=parm, y=0, yend=copt)) + + geom_hline(yintercept = d1.opt.clay$copt_av, linetype="dotted", + color = "black", linewidth=1)+ + geom_point(size=4, alpha=0.6) + + theme_bw() + + scale_color_manual(values = c('black','orange','darkgreen','skyblue'), + labels = c('crop yield','chemical','biological','physical'), + name ='SOM assessment')+ + coord_flip() + ylab('Critical SOC (g/kg)') + xlab('') + + theme(legend.position = c(0.8,0.8))+ + labs(title = "Agronomic SOM Assessment per Soil Health Indicator", + subtitle = "for a finetextured clay soil (with 1.5% SOM, 25% clay and pH 6.5)") + ptl + + pf12 <- pf1 | pf2 + ggsave(filename = "D:/ESA/04 articles/2023/som_critical_levels/230506_opt_funcions.png", + plot = pf12, width = 33, height = 17, units = c("cm"), dpi = 1200) + + + + +# --- step 6. plot figures of meta-ptfs ---- # plot figures of the pedotransfer functions ptl <- theme(plot.subtitle=element_text(size=10, face="italic", color="black"), @@ -441,6 +1050,14 @@ optimcarbon <- function(xs, dtr){ labs(title = "L. Relationship between bulk density and SOC", subtitle = "derived from 181 ptfs for mineral soils") + ptl + p13 <- ggplot(data = dt1,aes(x = A_C_OF,y=ods)) + geom_point() + geom_line()+ + geom_errorbar(aes(ymin=ods - 0.05, ymax = ods + 0.05),width = 0.2) + + ylim(0,1.2) + + annotate('text',x = 25, y = 0.5, label = l.ods,parse = T,size = 4,adj=0) + + xlab('organic carbon content (g/kg)') + ylab('disease resistance score') + theme_bw() + + labs(title = "M. Relationship between disease resistance and SOC", + subtitle = "derived from OBIC for mineral soils") + ptl + require(patchwork) pfin <- (p1 | p2 | p3 | p4) / (p5 | p6 | p7 | p8) / (p9 | p10 | p11 | p12) @@ -448,7 +1065,7 @@ optimcarbon <- function(xs, dtr){ plot = pfin, width = 65, height = 40, units = c("cm"), dpi = 1200) -# --- step 5. apply this approach on integrator dataset ---- +# --- step 7. apply this approach on integrator dataset ---- # load an earlier prepared dataset db.int <- readRDS('D:/ESA/04 articles/2023/som_critical_levels/dbint.rds') @@ -459,27 +1076,35 @@ optimcarbon <- function(xs, dtr){ db.int <- fread('D:/ESA/04 articles/2023/som_critical_levels/db_final_europe.csv') db.int <- db.int[,.(ncu,crop_name,area_ncu,clay,ph,cn,soc_ref)] db.int <- db.int[,.(area = sum(area_ncu),A_CLAY_MI = clay[1],ph = ph[1],cn = cn[1],A_C_OF = soc_ref[1]*10),by=ncu] + db.int[,A_SAND_MI := (100-A_CLAY_MI)*0.5] - # apply the function multi-session (since function is not yet optimized) - require(future.apply); require(progressr) - plan(multisession) - - # Run the schedule for farm evaluation - runcoptmodel <- function(xs) { - p <- progressor(along = xs, enable = TRUE) - dt <- future_lapply(xs, optimcarbon, dtr = db.int) - } - out <- runcoptmodel(1:nrow(db.int)) + # calculate optimum soc + db.int[, c('copt','copt_se') := optimcarbon_fix(A_C_OF = A_C_OF, + A_CLAY_MI = A_CLAY_MI, + A_SAND_MI = A_SAND_MI, + A_PH_CC = ph, + type='copt')] - # combine all outputs into one vector and add to original data.table - out <- unlist(out) - db.int[,copt := out] - saveRDS(db.int,'D:/ESA/04 articles/2023/som_critical_levels/dbint.rds') + # # apply the function multi-session (since function is not yet optimized) + # require(future.apply); require(progressr) + # plan(multisession) + # + # # Run the schedule for farm evaluation + # runcoptmodel <- function(xs) { + # p <- progressor(along = xs, enable = TRUE) + # dt <- future_lapply(xs, optimcarbon, dtr = db.int) + # } + # out <- runcoptmodel(1:nrow(db.int)) + # + # # combine all outputs into one vector and add to original data.table + # out <- unlist(out) + # db.int[,copt := out] + # saveRDS(db.int,'D:/ESA/04 articles/2023/som_critical_levels/dbint.rds') } -# --- step 6. plot the EU results ---- +# --- step 8. apply on the EU scale ---- # set theme theme_set(theme_bw()) @@ -538,7 +1163,8 @@ optimcarbon <- function(xs, dtr){ labs(fill = name) + theme(text = element_text(size = 16), legend.text=element_text(size=12), - legend.position = 'right', + #legend.position = 'right', + legend.position = c(0.2,0.8), legend.background = element_rect(fill = "white",color='white'), panel.border = element_blank(), plot.title = element_text(hjust = 0.5)) + @@ -549,9 +1175,288 @@ optimcarbon <- function(xs, dtr){ pm1 <- visualize(raster = r.fin, layer = 'copt_dif', name = "Distance to Copt\n(g/kg)", - breaks = c(-1000,0,5,10,50), + breaks = c(-5000,0,5,10,50), labels = c('< 0','0-5','5-10','>10'), - ftitle = 'Distance to optimum soil C content (g/kg)') - ggsave(filename = "D:/ESA/04 articles/2023/som_critical_levels/230427_eu_copt.png", + ftitle = 'Distance to critical soil C content (g/kg)') + ggsave(filename = "D:/ESA/04 articles/2023/som_critical_levels/230508_eu_copt.png", plot = pm1, width = 25, height = 25, units = c("cm"), dpi = 1200) +# --- step 9. apply on global scale ------ + + # require packages + require(sf);require(terra) + + # get the rasters with soil properties + rlist <- list.files('D:/DATA/01 soil/',pattern='.tif$',full.names = T) + rlist <- rlist[grepl('0_5',rlist)|grepl('soc_',rlist)] + r1 <- sds(rlist) + names(r1) <- gsub('_mean_0_5|isric_','',names(r1)) + r.soil <- rast(r1) + names(r.soil) <- names(r1) + + # load crop area harvested as raster + if(FALSE){ + + # get the file names of the tiffs + rfiles <- list.files('D:/DATA/04 crop/spam2010', pattern = '_H.tif$',full.names = TRUE) + + # read in all files and convert to spatrasters + r.crop <- sds(rfiles) + r.crop <- rast(r.crop) + + # aggregate to 0.5 x 0.5 degree + r.crop <- terra::aggregate(r.crop,fact = 0.5/0.083333,fun = "sum", na.rm=T) + + # adjust names + names(r.crop) <- stringr::str_extract(names(r.crop),'[A-Z]{4}') + + # sum all areas for all crops + r.crop.all = app(r.crop,fun = sum,na.rm=T) + names(r.crop.all) <- 'croparea' + + # reproject to isric map + r.crop <- resample(r.crop.all,r.soil,method='bilinear') + + # write raster + terra::writeRaster(r.crop,'D:/ESA/04 articles/2023/som_critical_levels/global_crops.tif', overwrite = TRUE) + + + } else { + + # read the raster with cropping data + r.crop <- rast('D:/ESA/04 articles/2023/som_critical_levels/global_crops.tif') + + } + + r.all <- c(r.soil,r.crop) + r.df <- as.data.frame(r.all,xy = TRUE, na.rm = FALSE) + r.df <- as.data.table(r.df) + r.df[,id := .I] + + r.dfa <- r.df[!is.na(croparea) & croparea>0] + rm(r.all) + + # update SOC for first 30 cm and filter values > 0 + r.dfa[, soc := (5 * soc + 10 * soc_mean_5_15 + 15 * soc_mean_15_30)/30] + r.dfa[,c('soc_mean_15_30', 'soc_mean_5_15') := NULL] + #r.dfa <- r.dfa[soc>0] + + # update units to common ones + r.dfa[,bdod := bdod * 1000/ 100] + r.dfa[,clay := clay * 0.1] + r.dfa[,sand := sand * 0.1] + r.dfa[,silt := silt * 0.1] + r.dfa[,ntot := ntot * 1000 / 100] + r.dfa[,phw := phw * 0.1] + r.dfa[,soc := soc * 0.1] + + cols <- colnames(r.dfa)[!grepl('^x|^y|^id|crop',colnames(r.dfa))] + r.dfa[, c(cols) := lapply(.SD,function(x) fifelse(x <= 0|is.na(x), 0.01,x)),.SDcols = cols] + r.dfa[, c(cols) := lapply(.SD,function(x) fifelse(x > quantile(x,0.99), 0.01,x)),.SDcols = cols] + + r.dfa[,a_ph_cc := 6.01 + 1.384*(2.285 - 4.819/(1 + exp(-3.935 + 0.608 *phw) + 0.092 * log(0.2)))] + + # calculate optimum soc + r.dfa[, c('copt','copt_se') := optimcarbon_fix(A_C_OF = soc, + A_CLAY_MI = clay, + A_SAND_MI = sand, + A_PH_CC = a_ph_cc, + type='copt')] + + # calculate the weighed average progress in Soil Health after change 1 unit + r.dfa[, c('cddt','cddt_se') := predcarbon(A_C_OF = soc, + A_CLAY_MI = clay, + A_SAND_MI = sand, + A_PH_CC = a_ph_cc, + type='ddtt',type2='relative')] + + # calculate the weighed average progress in Soil Health after change 10 unit + r.dfa[, c('cddt10','cddt10_se') := predcarbon(A_C_OF = soc, + A_CLAY_MI = clay, + A_SAND_MI = sand, + A_PH_CC = a_ph_cc, + type='ddtt',type2='relative', + dsoc = 10)] + + #r.dfa.fin <- rbind(r.dfa,r.df[is.na(croparea) | croparea<=0],fill = T) + #setorder(r.dfa.fin,'id') + saveRDS(r.dfa,file='D:/ESA/04 articles/2023/som_critical_levels/dbglobal.rds') + #saveRDS(r.dfa,file='D:/ESA/04 articles/2023/som_critical_levels/dbglobal_relchange.rds') + +# --- step 10. plot global maps --------- + + library(rnaturalearth) + library(rnaturalearthdata) + + r.dfa.fin <- readRDS('D:/ESA/04 articles/2023/som_critical_levels/dbglobal.rds') + + # get base world map + world <- ne_countries(scale = "medium", returnclass = "sf") + world <- world[!grepl('Antarctica|Seven', world$continent),] + + r.plot <- copy(r.dfa.fin) + r.plot <- r.plot[!is.na(copt)] + r.plot[,cdiff := copt- soc] + + r.plot <- copy(r.dfa) + r.plot <- r.plot[!is.na(cddt)] + + # plot a basic world map plot (using dbglobal.rds) + pbreaks <- c(0,14,15,16,18,20) + plabs <- c('<13','13-15','15-16','16-18','18-20') + p1 <- ggplot(data = world) + geom_sf(color = "black", fill = "gray92") + + geom_tile(data = r.plot, + aes(x=x,y=y,fill= cut(copt, pbreaks,labels = plabs))) + + scale_fill_viridis_d(direction=-1,na.translate = F)+ + theme_bw() + + labs(fill = expression(SOC['opt'] (g/kg)))+ + theme(text = element_text(size = 12), + legend.text=element_text(size=6), + legend.title = element_text(size=8), + legend.position = c(0.15,0.26), + legend.key.size = unit(0.5,'cm'), + legend.background = element_rect(fill = "white",color='white'), + panel.border = element_blank(), + plot.title = element_text(hjust = 0.5,size=14))+ + xlab("") + ylab("") + + ggtitle("Critical SOC in croplands") + + coord_sf(crs = 4326) + ggsave(plot = p1, filename = 'D:/ESA/04 articles/2023/som_critical_levels/230508_socopt_global.png', + width = 20, height = 10, units = c("cm"), dpi = 1200) + + # plot difference critical and current (using dbglobal.rds) + pbreaks <- c(-1000,-10,0,10,1000) + plabs <- c('< -10','-10 - 0','0 - 10','>10') + r.plot[,ccdiff := cut(cdiff,breaks = pbreaks,labels = plabs)] + + p2 <- ggplot(data = world) + geom_sf(color = "black", fill = "gray92") + + geom_tile(data = r.plot,aes(x=x,y=y,fill= ccdiff)) + + scale_fill_viridis_d(direction=-1)+ + theme_bw() + + labs(fill = 'Difference in SOC\n critical minus current') + + theme(text = element_text(size = 12), + legend.text=element_text(size=6), + legend.title = element_text(size=8), + legend.position = c(0.15,0.26), + legend.key.size = unit(0.5,'cm'), + legend.background = element_rect(fill = "white",color='white'), + panel.border = element_blank(), + plot.title = element_text(hjust = 0.5,size=14), + plot.subtitle = element_text(hjust=0.5,size=10,face="italic"))+ + xlab("") + ylab("") + + ggtitle("Difference between critical and current SOC (g/kg)") + + coord_sf(crs = 4326) + ggsave(plot = p2, filename = 'D:/ESA/04 articles/2023/som_critical_levels/230506_soc_critdiff.png', + width = 20, height = 10, units = c("cm"), dpi = 1200) + + + # plot relative change (using dbglobal.rds) + r.plot[,cddt := cddt * 100] + pbreaks <- c(0,0.92,1.0,1.3,1.8,1000) + plabs <- c('<0.92','0.92-1.00','1.00-1.30','1.30-1.80','>1.80') + r.plot[,ccddt := cut(cddt,breaks = pbreaks,labels = plabs)] + + p2 <- ggplot(data = world) + geom_sf(color = "black", fill = "gray92") + + geom_tile(data = r.plot,aes(x=x,y=y,fill= ccddt)) + + scale_fill_viridis_d(direction=-1)+ + theme_bw() + + labs(fill = 'Change in Soil Health (%)\n per extra unit C (g/kg)') + + theme(text = element_text(size = 12), + legend.text=element_text(size=6), + legend.title = element_text(size=8), + legend.position = c(0.15,0.26), + legend.key.size = unit(0.5,'cm'), + legend.background = element_rect(fill = "white",color='white'), + panel.border = element_blank(), + plot.title = element_text(hjust = 0.5,size=14), + plot.subtitle = element_text(hjust=0.5,size=10,face="italic"))+ + xlab("") + ylab("") + + ggtitle("Change in Soil Health (%)",subtitle = 'per unit change in SOC (g/kg)') + + coord_sf(crs = 4326) + ggsave(plot = p2, filename = 'D:/ESA/04 articles/2023/som_critical_levels/230506_socchange_global2.png', + width = 20, height = 10, units = c("cm"), dpi = 1200) + + # plot relative change with 10 g C/kg (using dbglobal_relchange.rds) + r.plot[,cddt := (cddt -1)* 100] + pbreaks <- c(0,0.92,1.0,1.3,1.8,1000) + plabs <- c('<0.92','0.92-1.00','1.00-1.30','1.30-1.80','>1.80') + r.plot[,ccddt := cut(cddt,breaks = pbreaks,labels = plabs)] + + r.plot[,cddt10 := (cddt10 -1)* 100] + pbreaks <- c(0,5,10,15,30,1000) + plabs <- c('<5','5-10','10-15','15-30','>30') + r.plot[,ccddt10 := cut(cddt10,breaks = pbreaks,labels = plabs)] + + p3 <- ggplot(data = world) + geom_sf(color = "black", fill = "gray92") + + geom_tile(data = r.plot,aes(x=x,y=y,fill= ccddt10)) + + scale_fill_viridis_d(direction=-1)+ + theme_bw() + + labs(fill = 'Change in Soil Health (%)\n per 1% increase of SOC') + + theme(text = element_text(size = 12), + legend.text=element_text(size=6), + legend.title = element_text(size=8), + legend.position = c(0.15,0.26), + legend.key.size = unit(0.5,'cm'), + legend.background = element_rect(fill = "white",color='white'), + panel.border = element_blank(), + plot.title = element_text(hjust = 0.5,size=14), + plot.subtitle = element_text(hjust=0.5,size=10,face="italic"))+ + xlab("") + ylab("") + + ggtitle("Change in Soil Health (%)",subtitle = 'per 1% change in SOC') + + coord_sf(crs = 4326) + ggsave(plot = p3, filename = 'D:/ESA/04 articles/2023/som_critical_levels/230506_socchange_global3_10.png', + width = 20, height = 10, units = c("cm"), dpi = 1200) + + # soc current (g/kg) + pbreaks <- c(0,5,10,15,30,1000) + plabs <- c('<5','5-10','10-15','15-30','>30') + r.plot[,csoc := cut(soc,breaks = pbreaks,labels = plabs)] + p4 <- ggplot(data = world) + geom_sf(color = "black", fill = "gray92") + + geom_tile(data = r.plot,aes(x=x,y=y,fill= csoc)) + + scale_fill_viridis_d(direction=-1)+ + theme_bw() + + labs(fill = 'Current SOC (g / kg)') + + theme(text = element_text(size = 12), + legend.text=element_text(size=6), + legend.title = element_text(size=8), + legend.position = c(0.15,0.26), + legend.key.size = unit(0.5,'cm'), + legend.background = element_rect(fill = "white",color='white'), + panel.border = element_blank(), + plot.title = element_text(hjust = 0.5,size=14), + plot.subtitle = element_text(hjust=0.5,size=10,face="italic"))+ + xlab("") + ylab("") + + ggtitle("Current SOC in topsoil (0-30cm)") + + coord_sf(crs = 4326) + ggsave(plot = p4, filename = 'D:/ESA/04 articles/2023/som_critical_levels/230508_currentsoc.png', + width = 20, height = 10, units = c("cm"), dpi = 1200) + + d.bp <- r.plot[,.(id,current = soc,critical = copt)] + d.bp <- melt(d.bp,id.vars='id',value.name='soc') + p4 <- ggplot(d.bp,aes(x = soc)) + + geom_density(data = d.bp[variable=='original'],fill='red',alpha=0.2) + + geom_density(data = d.bp[variable=='critical'],fill='blue',alpha=1) + +# ---- step 10 quantifying cobenefits ---- + + # relative change in SHI by 10 g C kg-1 extra C + r.dfa.fin <- readRDS('D:/ESA/04 articles/2023/som_critical_levels/dbglobal.rds') + r.plot <- r.dfa.fin[!is.na(cddt)] + r.plot.d4 <- predcarbon(A_C_OF = r.plot$soc, + A_CLAY_MI = r.plot$clay, + A_SAND_MI = r.plot$sand, + A_PH_CC = r.plot$a_ph_cc, + type='all',dsoc = 10) + r.plot2 <- dcast(r.plot.d4,id~shi,value.var='dist_to_max') + r.plot[,id := .I] + r.plot2 <- merge(r.plot[,.(x,y,id,croparea,A_C_OF = soc)],r.plot2,by='id') + + # estimate area weighted average + cols <- colnames(r.plot2)[grepl('^i',colnames(r.plot2))] + cols <- cols[!cols =='id'] + + r.plot3a <- r.plot2[,lapply(.SD,function(x) weighted.mean(x,w = croparea)),.SDcols = cols] + r.plot3b <- r.plot2[,lapply(.SD,function(x) sqrt(Hmisc::wtd.var(x,weights = croparea,normwt = F))),.SDcols = cols] + r.plot3 <- data.table(shi = cols,dsoc = round(unlist(r.plot3a)*100,1),dsoc_sd = round(unlist(r.plot3b)*100,3)) +r.plot3 + \ No newline at end of file diff --git a/dev/ptf_tables.R b/dev/ptf_tables.R index 8de8a59..fbd897e 100644 --- a/dev/ptf_tables.R +++ b/dev/ptf_tables.R @@ -5,11 +5,8 @@ require(usethis) # load the csv file with pdtf for bulk density - d1 <- fread('dev/sptf_bulkdensity.csv',na.strings=NULL, dec=',') + d1 <- fread('dev/sptf_bulkdensity.csv',na.strings='', dec=',') - # set empty string to NA - d1$landuse[d1$landuse==''] <- NA_character_ - # make copy for package table sptf_bulkdensity <- copy(d1) @@ -36,6 +33,10 @@ # set countries to lower case d2[, country_name := tolower(country_name)] + # set NA for north-america to NAm + d2[is.na(continent_code)|continent_code =='NA', continent_code := 'NAm'] + d2[continent_code=='SA', continent_code := 'SAm'] + # make copy for package table sptf_countries <- copy(d2) @@ -45,6 +46,9 @@ # load data d3 <- fread('dev/sptf_soilproperties.csv',encoding = 'UTF-8') + # set empty continentcode to NA + d3[continent_code=='', continent_code := NA_character_] + # make copy for package table sptf_soilproperties <- copy(d3) @@ -53,7 +57,7 @@ - # parameters ==== +# parameters sptf_parameters <- fread('dev/sptf_parameters.csv',encoding = 'UTF-8') usethis::use_data(sptf_parameters, overwrite = TRUE) diff --git a/dev/sptf_bulkdensity.csv b/dev/sptf_bulkdensity.csv index decbf6e..c61ee4e 100644 --- a/dev/sptf_bulkdensity.csv +++ b/dev/sptf_bulkdensity.csv @@ -1,36 +1,36 @@ ptf_id;country_code;continent_code;soiltype;landuse;depth;nsample;r2;soilproperties;reference;url 1;NL;EU;variable;agriculture;30;;;a_som_loi||a_clay_mi;cbgv_2022;https://edepot.wur.nl/413891 -2;US;NA;sandy loam;forest;30;103;0,96;a_som_loi;curtis_1964;https://doi.org/10.2136/sssaj1964.03615995002800020044x +2;US;NAm;sandy loam;forest;30;103;0,96;a_som_loi;curtis_1964;https://doi.org/10.2136/sssaj1964.03615995002800020044x 3;GB;EU;silty clay;forest;30;77;0,9;a_som_loi;adams_1973;https://doi.org/10.1111/j.1365-2389.1973.tb00737.x -4;US;NA;variable;variable;292;721;0,462;a_c_of;alexander_1980;https://doi.org/10.2136/sssaj1980.03615995004400040005x -5;US;NA;variable;variable;264;721;0,332;a_c_of;alexander_1980;https://doi.org/10.2136/sssaj1980.03615995004400040005x -6;US;NA;loam;forest;80;130;;a_som_loi;federer_1983;https://doi.org/10.2136/sssaj1983.03615995004700050034x -7;US;NA;loamy sand;forest;45;60;0,75;a_c_of;huntington_1989;https://journals.lww.com/soilsci/abstract/1989/11000/carbon,_organic_matter,_and_bulk_density.9.aspx -8;US;NA;loamy sand;forest;45;60;0,75;a_som_loi;huntington_1989;https://journals.lww.com/soilsci/abstract/1989/11000/carbon,_organic_matter,_and_bulk_density.9.aspx -9;US;NA;variable;variable;;19651;0,41;a_c_of;manrique_1991;https://doi.org/10.2136/sssaj1991.03615995005500020030x -10;US;NA;variable;variable;;19651;0,36;a_c_of;manrique_1991;https://doi.org/10.2136/sssaj1991.03615995005500020030x -11;US;NA;sandy loam||silt loam;forest;30;480;;a_som_loi;federer_1993;https://doi.org/10.1139/x93-131 +4;US;NAm;variable;variable;292;721;0,462;a_c_of;alexander_1980;https://doi.org/10.2136/sssaj1980.03615995004400040005x +5;US;NAm;variable;variable;264;721;0,332;a_c_of;alexander_1980;https://doi.org/10.2136/sssaj1980.03615995004400040005x +6;US;NAm;loam;forest;80;130;;a_som_loi;federer_1983;https://doi.org/10.2136/sssaj1983.03615995004700050034x +7;US;NAm;loamy sand;forest;45;60;0,75;a_c_of;huntington_1989;https://journals.lww.com/soilsci/abstract/1989/11000/carbon,_organic_matter,_and_bulk_density.9.aspx +8;US;NAm;loamy sand;forest;45;60;0,75;a_som_loi;huntington_1989;https://journals.lww.com/soilsci/abstract/1989/11000/carbon,_organic_matter,_and_bulk_density.9.aspx +9;US;NAm;variable;variable;;19651;0,41;a_c_of;manrique_1991;https://doi.org/10.2136/sssaj1991.03615995005500020030x +10;US;NAm;variable;variable;;19651;0,36;a_c_of;manrique_1991;https://doi.org/10.2136/sssaj1991.03615995005500020030x +11;US;NAm;sandy loam||silt loam;forest;30;480;;a_som_loi;federer_1993;https://doi.org/10.1139/x93-131 12;FI;EU;variable;forest;65;75;0,61;a_som_loi;tamminen_1994;https://helda.helsinki.fi/bitstream/handle/1975/9162/028-1_Tamminen.pdf?sequence=3 13;FI;EU;variable;forest;65;75;0,7;a_som_loi;tamminen_1994;https://helda.helsinki.fi/bitstream/handle/1975/9162/028-1_Tamminen.pdf?sequence=3 -14;BR;SA;variable;forest;;613;0,22;a_c_of||a_silt_mi||a_clay_mi;tomasella_1998; -15;BR;SA;variable;forest;35;323;0,498;a_c_of||a_clay_mi;bernoux_1998;https://doi.org/10.2136/sssaj1998.03615995006200030029x +14;BR;SAm;variable;forest;;613;0,22;a_c_of||a_silt_mi||a_clay_mi;tomasella_1998; +15;BR;SAm;variable;forest;35;323;0,498;a_c_of||a_clay_mi;bernoux_1998;https://doi.org/10.2136/sssaj1998.03615995006200030029x 16;;;variable;variable;35;;;a_som_loi;post_2000;https://doi.org/10.1046/j.1365-2486.2000.00308.x 17;LT;EU;;forest;35;;;a_c_of||a_silt_mi||a_clay_mi;leonaviciute_2000; 18;LT;EU;;forest;35;;;a_c_of||a_silt_mi||a_clay_mi||a_sand_mi;leonaviciute_2000; 19;LT;EU;;forest;35;;;a_c_of||a_silt_mi||a_clay_mi||a_sand_mi;leonaviciute_2000; 20;LT;EU;;forest;35;;;a_c_of||a_silt_mi||a_clay_mi||a_sand_mi;leonaviciute_2000; 21;IN;AS;variable;variable;110;224;0,5;a_c_of||a_silt_mi||a_clay_mi;kaur_2002;https://www.publish.csiro.au/sr/sr01023 -22;CA;NA;variable;forest;30;284;;a_som_loi;tremblay_2002;https://doi.org/10.1139/x02-023 -23;CA;NA;loamy sand | silty sand;forest;30;288;0,77;a_som_loi;prevost_2004;https://doi.org/10.2136/sssaj2004.9430 -24;CA;NA;loamy sand | silty sand;forest;30;126;0,637;a_som_loi;prevost_2004;https://doi.org/10.2136/sssaj2004.9430 -25;US;NA;variable;variable;300;47015;0,44;a_c_of||a_silt_mi||a_clay_mi||b_depth||a_h2o_t105;heuscher_2005;https://doi.org/10.2136/sssaj2005.0051a -26;CA;NA;loamy to sandy loams;forest;100;125;0,82;a_som_loi;perie_2007;https://doi.org/10.4141/CJSS06008 -27;CA;NA;loamy to sandy loams;forest;100;125;0,1;a_som_loi;perie_2007;https://doi.org/10.4141/CJSS06008 +22;CA;NAm;variable;forest;30;284;;a_som_loi;tremblay_2002;https://doi.org/10.1139/x02-023 +23;CA;NAm;loamy sand | silty sand;forest;30;288;0,77;a_som_loi;prevost_2004;https://doi.org/10.2136/sssaj2004.9430 +24;CA;NAm;loamy sand | silty sand;forest;30;126;0,637;a_som_loi;prevost_2004;https://doi.org/10.2136/sssaj2004.9430 +25;US;NAm;variable;variable;300;47015;0,44;a_c_of||a_silt_mi||a_clay_mi||b_depth||a_h2o_t105;heuscher_2005;https://doi.org/10.2136/sssaj2005.0051a +26;CA;NAm;loamy to sandy loams;forest;100;125;0,82;a_som_loi;perie_2007;https://doi.org/10.4141/CJSS06008 +27;CA;NAm;loamy to sandy loams;forest;100;125;0,1;a_som_loi;perie_2007;https://doi.org/10.4141/CJSS06008 28;AU;OC;variable;variable;100;1407;0,405;a_sand_mi||b_depth;tranter_2007;https://doi.org/10.1111/j.1475-2743.2007.00092.x 29;AU;OC;variable;variable;100;546;0,498;a_sand_mi||b_depth;tranter_2007;https://doi.org/10.1111/j.1475-2743.2007.00092.x -30;BR;SA;variable;variable;100;1396;0,63;a_c_of||a_clay_mi;benites_2007;https://doi.org/10.1016/j.geoderma.2007.01.005 -31;BR;SA;variable;variable;100;1396;0,42;a_clay_mi;benites_2007;https://doi.org/10.1016/j.geoderma.2007.01.005 -32;US;NA;variable;agriculture;30;609;0,872;a_c_of;ruehlmann_2009;https://doi.org/10.2136/sssaj2007.0149 +30;BR;SAm;variable;variable;100;1396;0,63;a_c_of||a_clay_mi;benites_2007;https://doi.org/10.1016/j.geoderma.2007.01.005 +31;BR;SAm;variable;variable;100;1396;0,42;a_clay_mi;benites_2007;https://doi.org/10.1016/j.geoderma.2007.01.005 +32;US;NAm;variable;agriculture;30;609;0,872;a_c_of;ruehlmann_2009;https://doi.org/10.2136/sssaj2007.0149 33;SE;EU;variable;variable;30;171;0,81;a_som_loi||a_clay_mi||a_sand_mi;keller_2010;https://doi.org/10.1016/j.geoderma.2009.11.013 34;CN;AS;variable;variable;200;1566;0,76;a_som_loi;han_2012;https://doi.org/10.1097/SS.0B013E31823FD493 35;CN;AS;variable;variable;200;1566;0,791;a_som_loi;han_2012;https://doi.org/10.1097/SS.0B013E31823FD493 @@ -56,10 +56,10 @@ 55;SE;EU;variable;forest;30;101;0,9604;a_som_loi;harrison_1981;https://www.jstor.org/stable/2402382 56;GB;EU;variable;grassland;30;50;0,3969;a_som_loi;harrison_1981;https://www.jstor.org/stable/2402382 57;NZ;OC;variable;grassland;30;51;0,6889;a_som_loi;harrison_1981;https://www.jstor.org/stable/2402382 -58;US;NA;variable;forest;5;812;0,75;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 -59;US;NA;variable;forest;30;812;0,95;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 -60;US;NA;peat;nature;25;232;0,89;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 -61;US;NA;peat;nature;175;232;0,89;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 +58;US;NAm;variable;forest;5;812;0,75;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 +59;US;NAm;variable;forest;30;812;0,95;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 +60;US;NAm;peat;nature;25;232;0,89;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 +61;US;NAm;peat;nature;175;232;0,89;a_som_loi;grigal_1989;https://doi.org/10.4141/cjss89-092 62;AU;OC;clay;forest;80;136;0,95;a_som_loi;honeysett_1989;https://doi.org/10.1111/j.1365-2389.1989.tb01275.x 63;AU;OC;clay;forest;80;136;0,95;a_som_loi;honeysett_1989;https://doi.org/10.1111/j.1365-2389.1989.tb01275.x 64;CZ;EU;;forest;30;360;0,26;a_som_loi;cienciala_2006;http://dx.doi.org/10.17221/4519-JFS @@ -78,23 +78,23 @@ 77;SE;EU;variable;variable;100;1283;0,59;a_c_of;katterer_2006;https://doi.org/10.1080/09064710500310170 78;TN;AF;variable;variable;100;707;0,55;a_c_of||a_clay_mi||a_sand_mi||a_ph_wa;brahim_2012;https::/doi.org/10.1016/j.jaridenv.2012.01.012 79;TN;AF;variable;variable;40;141;0,58;a_c_of||a_sand_mi|Ia_silt_mi||a_ph_wa;brahim_2012;https::/doi.org/10.1016/j.jaridenv.2012.01.012 -80;TN;AF;variable;variable;100;90;0,31;a_c_of||a_clay_mi||a_caco3_mi;brahim_2012;https::/doi.org/10.1016/j.jaridenv.2012.01.012 -81;US;NA;variable;variable;100;174339;0,682;a_c_of;abeldaki_2016;https://doi.org/10.1016/j.asej.2016.12.002 +80;TN;AF;variable;variable;100;90;0,31;a_c_of||a_clay_mi||a_caco3_if;brahim_2012;https::/doi.org/10.1016/j.jaridenv.2012.01.012 +81;US;NAm;variable;variable;100;174339;0,682;a_c_of;abeldaki_2016;https://doi.org/10.1016/j.asej.2016.12.002 82;NG;AF;variable;variable;100;1161;0,109;a_sand_mi||a_silt_mi;akpa_2016;https://doi.org/10.1111/sum.12310 83;NG;AF;variable;variable;40;260;0,161;a_sand_mi||a_silt_mi;akpa_2016;https://doi.org/10.1111/sum.12310 -84;BR;SA;organic;variable;30;228;0,56;a_c_of||a_clay_mi;beutler_2017;https://doi.org/10.1590/18069657rbcs20160158 -85;BR;SA;organic;variable;30;228;0,52;a_c_of;beutler_2017;https://doi.org/10.1590/18069657rbcs20160158 +84;BR;SAm;organic;variable;30;228;0,56;a_c_of||a_clay_mi;beutler_2017;https://doi.org/10.1590/18069657rbcs20160158 +85;BR;SAm;organic;variable;30;228;0,52;a_c_of;beutler_2017;https://doi.org/10.1590/18069657rbcs20160158 86;CD;AF;variable;variable;100;196;0,244;a_c_of||a_clay_mi||a_sand_mi;botula_2015;https://doi.org/10.2136/sssaj2014.06.0238 -87;;AF||AS||SA;variable;variable;100;670;0,46;a_som_loi||a_sand_mi||b_depth;minasny_2011;https:://doi.org/10.1016/j.earscirev.2011.01.005 -88;IR;AS;variable;grassland;60;250;;a_c_of||a_clay_mi||a_caco3_mi||a_ph_wa;shiri_2017;https://doi-org.ezproxy.library.wur.nl/10.1016/j.jhydrol.2017.04.035 -89;US;NA;variable;variable;270;937;0,724;a_c_of||a_silt_mi||a_clay_mi;calhoun_2001;https://doi.org/10.2136/sssaj2001.653811x +87;;AF||AS||SAm;variable;variable;100;670;0,46;a_som_loi||a_sand_mi||b_depth;minasny_2011;https:://doi.org/10.1016/j.earscirev.2011.01.005 +88;IR;AS;variable;grassland;60;250;;a_c_of||a_clay_mi||a_caco3_if||a_ph_wa;shiri_2017;https://doi-org.ezproxy.library.wur.nl/10.1016/j.jhydrol.2017.04.035 +89;US;NAm;variable;variable;270;937;0,724;a_c_of||a_silt_mi||a_clay_mi;calhoun_2001;https://doi.org/10.2136/sssaj2001.653811x 90;NL||PL;EU;variable;agriculture;30;119;0,78;a_som_loi||a_clay_mi;dexter_2004;https://doi.org/10.1016/j.geoderma.2003.09.004 -91;US;NA;variable;forest;30;156;0,708964;a_som_loi;drew_1973;https://conservancy.umn.edu/bitstream/handle/11299/169571/Drew%20243%20Forestry%20Notes.pdf?sequence=1 -92;US;NA;variable;variable;30;134;0,695;a_som_loi||a_clay_mi;eschner_1957;https://www.nrs.fs.fed.us/pubs/sp/sp_ne089.pdf +91;US;NAm;variable;forest;30;156;0,708964;a_som_loi;drew_1973;https://conservancy.umn.edu/bitstream/handle/11299/169571/Drew%20243%20Forestry%20Notes.pdf?sequence=1 +92;US;NAm;variable;variable;30;134;0,695;a_som_loi||a_clay_mi;eschner_1957;https://www.nrs.fs.fed.us/pubs/sp/sp_ne089.pdf 93;SI;EU;variable;forest;135;106;0,7958;a_c_of;kobal_2011;https://hrcak.srce.hr/file/97195 -94;US;NA;variable;variable;100;2100;;a_som_loi||a_clay_mi||a_sand_mi;rawls_2004;https://doi.org/10.1016/S0166-2481(04)30006-1 +94;US;NAm;variable;variable;100;2100;;a_som_loi||a_clay_mi||a_sand_mi;rawls_2004;https://doi.org/10.1016/S0166-2481(04)30006-1 95;IE;EU;variable;variable;30;2950;0,899;a_c_of;reidy_2016;https://doi.org/10.5194/soil-2-25-2016 -96;US;NA;variable;variable;30;40;0,648025;a_som_loi;saini_1966;https://www.nature.com/articles/2101295a0 +96;US;NAm;variable;variable;30;40;0,648025;a_som_loi;saini_1966;https://www.nature.com/articles/2101295a0 97;GR;EU;variable;variable;10;32;;a_c_of||a_sand_mi;sevastas_2018;https://doi.org/10.1016/j.GEODRS.2018.e00169 98;GR;EU;variable;variable;10;32;;a_c_of;sevastas_2018;https://doi.org/10.1016/j.GEODRS.2018.e00169 99;GB;EU;variable;grassland;30;37;0,69;a_c_of;williams_1970;https://doi.org/10.23637/ERADOC-1-34799 @@ -111,19 +111,19 @@ 110;;;variable;forest;100;1259;0,52;a_c_of||b_depth;zinke_1986; 111;FR;EU;variable;variable;295;7090;;a_c_of;chen_2018;http://dx.doi.org/10.1016/j.geoderma.2017.10.009 112;FR;EU;variable;variable;295;7090;0,389;a_c_of;chen_2018;http://dx.doi.org/10.1016/j.geoderma.2017.10.009 -113;BR;SA;variable;variable;100;125;0,41;a_c_of||a_ph_wa||a_clay_mi;souza_2016;http://dx.doi.org/10.1590/0103-9016-2015-0485 +113;BR;SAm;variable;variable;100;125;0,41;a_c_of||a_ph_wa||a_clay_mi;souza_2016;http://dx.doi.org/10.1590/0103-9016-2015-0485 114;SI;EU;variable;forest;135;106;0,7958;a_c_of;urbancic_2011; 115;GB;EU;variable;variable;100;1568;0,56;a_c_of||a_clay_mi||a_sand_mi||a_silt_mi;hallet_1998; -116;CA;NA;mineral;forest;100;702;0,99;a_c_of;hossain_2015;https://doi.org/10.1016/j.inpa.2015.09.001 -117;CA;NA;organic;forest;100;674;0,93;a_c_of;hossain_2015;https://doi.org/10.1016/j.inpa.2015.09.001 -118;CA;NA;variable;forest;100;1376;0,984;a_c_of;hossain_2015;https://doi.org/10.1016/j.inpa.2015.09.001 +116;CA;NAm;mineral;forest;100;702;0,99;a_c_of;hossain_2015;https://doi.org/10.1016/j.inpa.2015.09.001 +117;CA;NAm;organic;forest;100;674;0,93;a_c_of;hossain_2015;https://doi.org/10.1016/j.inpa.2015.09.001 +118;CA;NAm;variable;forest;100;1376;0,984;a_c_of;hossain_2015;https://doi.org/10.1016/j.inpa.2015.09.001 119;AU;OC;;;;;;a_c_of;merry_2005; 120;CN;AS;variable;variable;;;;a_c_of||a_clay_mi||a_sand_mi;men_2008; -121;IT;EU;variable;variable;15;3316;0,167;a_sand_mi||a_clay_mi||a_c_of||a_ph_wa||a_caco3_mi||b_slope_degree||b_altitude;palladino_2022;https://doi.org/10.1016/j.geoderma.2022.115726 +121;IT;EU;variable;variable;15;3316;0,167;a_sand_mi||a_clay_mi||a_c_of||a_ph_wa||a_caco3_if||b_slope_degree||b_altitude;palladino_2022;https://doi.org/10.1016/j.geoderma.2022.115726 122;IT;EU;variable;variable;15;12019;0,07;a_c_of||a_clay_mi||a_sand|mi;palladino_2022;https://doi.org/10.1016/j.geoderma.2022.115726 123;IT;EU;variable;variable;15;3316;0,07;a_c_of||a_clay_mi||a_sand|mi;palladino_2022;https://doi.org/10.1016/j.geoderma.2022.115726 -124;US;NA;variable;variable;60;193;0,74;a_c_of;gosselink_1984; -125;US;NA;variable;variable;20;95;0,75;a_c_of;gosselink_1984; +124;US;NAm;variable;variable;60;193;0,74;a_c_of;gosselink_1984; +125;US;NAm;variable;variable;20;95;0,75;a_c_of;gosselink_1984; 126;AT;EU;variable;variable;70;1732;0,58;a_c_of||a_silt_mi||b_depth;foldal_2020;https://doi.org/10.2478/boku-2020-0020 127;AT;EU;variable;cropland;50;567;0,43;a_c_of||b_depth;foldal_2020;https://doi.org/10.2478/boku-2020-0020 128;AT;EU;variable;forest;60;348;0,58;a_c_of;foldal_2020;https://doi.org/10.2478/boku-2020-0020 @@ -139,30 +139,30 @@ 138;CN;AS;sand;forest;30;120;0,71;a_som_loi||a_silt_mi;sun_2019;https://doi.org/10.1016/j.jhydrol.2019.124227 139;IT;EU;variable;variable;272;2569;0,38;a_som_loi||a_clay_mi||a_sand_mi;pellegrini_2007; 140;IN;AS;clay;agriculture;30;174;0,23;a_c_of||a_sand_mi||a_silt_mi||a_clay_mi;patil_2011;http://dx.doi.org/10.1080/03650340.2010.530254 -141;BR;SA;variable;agriculture;;1460;0,51;a_c_of||a_sand_mi||a_clay_mi||a_n_rt;mello_2007; +141;BR;SAm;variable;agriculture;;1460;0,51;a_c_of||a_sand_mi||a_clay_mi||a_n_rt;mello_2007; 142;SK;EU;variable;variable;10;262;0,26;a_clay_mi||a_sand_mi||a_silt_mi;makovnikova_2017;https://doi.org/10.1515/intag-2016-0079 143;SK;EU;variable;variable;10;262;0,46;a_c_of||a_clay_mi||a_sand_mi||a_silt_mi;makovnikova_2017;https://doi.org/10.1515/intag-2016-0079 -144;BR;SA;variable;variable;60;126;0,4624;a_c_of||a_clay_mi||a_sand_mi;ramos_2022;https://brazilianjournals.com/ojs/index.php/BRJD/article/view/50185/pdf -145;BR;SA;variable;variable;60;126;;a_c_of||a_clay_mi||a_sand_mi||a_silt_mi;ramos_2022;https://brazilianjournals.com/ojs/index.php/BRJD/article/view/50185/pdf +144;BR;SAm;variable;variable;60;126;0,4624;a_c_of||a_clay_mi||a_sand_mi;ramos_2022;https://brazilianjournals.com/ojs/index.php/BRJD/article/view/50185/pdf +145;BR;SAm;variable;variable;60;126;;a_c_of||a_clay_mi||a_sand_mi||a_silt_mi;ramos_2022;https://brazilianjournals.com/ojs/index.php/BRJD/article/view/50185/pdf 146;DK;EU;variable;variable;170;1809;;a_c_of;katual_2020;https://doi.org/10.1016/j.geoderma.2019.114080 147;DK;EU;variable;variable;170;1809;0,48;a_c_of;katual_2020;https://doi.org/10.1016/j.geoderma.2019.114080 -148;BR;SA;variable;variable;30;70;0,95;a_som_loi||a_clay_mi;marcolin_2011;https://doi.org/10.4025/actasciagron.v33i2.6120 +148;BR;SAm;variable;variable;30;70;0,95;a_som_loi||a_clay_mi;marcolin_2011;https://doi.org/10.4025/actasciagron.v33i2.6120 149;IR;AS;variable;variable;30;224;;a_c_of;chari_2021;https://doi.org/10.22069/EJSMS.2021.18180.1964 -150;ID;SA;variable;variable;90;45;0,42;a_c_of||b_depth;yanti_2021;https://doi.org/10.24425/jwld.2021.139029 +150;ID;SAm;variable;variable;90;45;0,42;a_c_of||b_depth;yanti_2021;https://doi.org/10.24425/jwld.2021.139029 151;TR;AS;clay;variable;100;131;0,13;a_sand_mi||a_silt_mi||a_clay_mi;sakin_2022;https://doi.org/10.5897/AJAR10.502 152;TR;AS;clay;variable;100;131;0,99;a_som_loi;sakin_2022;https://doi.org/10.5897/AJAR10.502 153;HR;EU;clay;forest;100;90;0,799;a_som_loi||a_clay_mi;rubinic_2019;https://doi.org/https://doi.org/10.5513/JCEA01/20.1.2159 -154;BR;SA;variable;variable;30;483;0,4745;a_c_of||a_ph_wa;gomes_2017;http://dx.doi.org/10.1590/1678-992X-2016-0310 -155;BR;SA;variable;variable;100;483;0,2474;a_c_of||a_silt_mi;gomes_2017;http://dx.doi.org/10.1590/1678-992X-2016-0310 -156;CA;NA;variable;variable;30;88;0,5;a_c_of||a_clay_mi;perreault_2022;https://doi.org/10.3390/agronomy12020526 -157;CA;NA;variable;variable;60;121;0,49;a_c_of||a_clay_mi||a_silt_mi;perreault_2022;https://doi.org/10.3390/agronomy12020526 -158;CA;NA;variable;variable;100;95;0,52;a_c_of||a_clay_mi||a_silt_mi;perreault_2022;https://doi.org/10.3390/agronomy12020526 +154;BR;SAm;variable;variable;30;483;0,4745;a_c_of||a_ph_wa;gomes_2017;http://dx.doi.org/10.1590/1678-992X-2016-0310 +155;BR;SAm;variable;variable;100;483;0,2474;a_c_of||a_silt_mi;gomes_2017;http://dx.doi.org/10.1590/1678-992X-2016-0310 +156;CA;NAm;variable;variable;30;88;0,5;a_c_of||a_clay_mi;perreault_2022;https://doi.org/10.3390/agronomy12020526 +157;CA;NAm;variable;variable;60;121;0,49;a_c_of||a_clay_mi||a_silt_mi;perreault_2022;https://doi.org/10.3390/agronomy12020526 +158;CA;NAm;variable;variable;100;95;0,52;a_c_of||a_clay_mi||a_silt_mi;perreault_2022;https://doi.org/10.3390/agronomy12020526 159;NL;EU;variable;variable;30;;0,64;a_c_of||a_clay_mi;hoekstra_1982; 160;IN;AS;variable;variable;15;200;0,67;a_som_loi;athira_2019; 161;IN;AS;variable;variable;15;200;;a_som_loi;athira_2019; 162;TR;AS;clay;variable;100;230;0,13;a_c_of;sakin_2012;https://doi.org/10.5897/AJB11.2297 163;IN;AS;variable;nature;35;25;;a_c_of;tanveera_2016;https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.1043.2541&rep=rep1&type=pdf -164;CA;NA;variable;agriculture;15;112;0,85;a_som_loi||a_clay_mi||a_sand_mi||a_silt_mi;shaykewich_1968; +164;CA;NAm;variable;agriculture;15;112;0,85;a_som_loi||a_clay_mi||a_sand_mi||a_silt_mi;shaykewich_1968; 165;GB;EU;;;;58;0,52;a_som_loi;soane_1975; 166;UG;AF;loam;variable;5;31;0,11;a_c_of;taulya_2005; 167;NL;EU;;;;;;a_som_loi||a_clay_mi;poelman_1975; @@ -177,6 +177,6 @@ 176;NL;EU;organic||peat||clay;;;;0,85;a_som_loi;vanwallenburg_1988; 177;NL;EU;sand;;;;0,72;a_som_loi||a_clay_mi||a_silt_mi;wosten_1997; 178;NL;EU;clay;;;;0,77;a_som_loi||a_clay_mi;wosten_1997; -179;CL;SA;variable;variable;225;1007;0,67;a_som_loi||a_clay_mi||a_sand_mi||a_silt_mi||a_ph_wa;melendez_2017; -180;CL;SA;variable;variable;225;632;0,32;a_som_loi||a_clay_mi||a_sand_mi;melendez_2017; +179;CL;SAm;variable;variable;225;1007;0,67;a_som_loi||a_clay_mi||a_sand_mi||a_silt_mi||a_ph_wa;melendez_2017; +180;CL;SAm;variable;variable;225;632;0,32;a_som_loi||a_clay_mi||a_sand_mi;melendez_2017; 181;EG;AS;variable;agriculture;30;160;0,79;a_som_loi||a_clay_mi||a_silt_mi;abdel_2019;https://doi.org/10.1080/00103624.2019.1654504 diff --git a/dev/sptf_parameters.csv b/dev/sptf_parameters.csv index 667c86b..62f6462 100644 --- a/dev/sptf_parameters.csv +++ b/dev/sptf_parameters.csv @@ -1,19 +1,20 @@ code;parameter;unit;product;element;method1;method2;data_type;value_min;value_max;explanation;enum;options -A_CACO3_IF;Carbonated Lime;%;A;CACO3;IF;"";num;0.1;50;"";FALSE;"" -A_CEC_CO;Cation Exchange Capacity;mmol+/kg;A;CEC;CO;"";num;1;1000;"";FALSE;"" -A_CLAY_MI;Clay content;%;A;CLAY;MI;"";num;0.1;75;"";FALSE;"" -A_C_OF;Organic Carbon Content;g / kg;A;C;OF;"";num;0.1;600;"";FALSE;"" -A_DENSITY_SA;Dry bulk density;g/cm3;A;DENSITY;SA;"";num;0.5;3;"";FALSE;"" -A_DEPTH;Depth of the soil layer;m;A;DEPTH;"";"";num;0;2;"";FALSE;"" -A_H2O_T105;The volumetric moisture content of the soil;%;A;H2O;T105;"";num;0;100;"";FALSE;"" -A_N_RT;Total nitrogen content;mg N/ kg;A;N;RT;"";num;1;30000;"";FALSE;"" -A_PH_CC;Acidity in CaCl2;-;A;PH;CC;"";num;3;10;"";FALSE;"" -A_PH_WA;Acidity in water;-;A;PH;WA;"";num;3;10;"";FALSE;"" -A_SAND_M50;Particle size of the mass median of the sandfraction (50-2000µm);µm;A;SAND;M50;"";num;50;2000;"";FALSE;"" -A_SAND_MI;Sand content;%;A;SAND;MI;"";num;0.1;100;"";FALSE;"" -A_SILT_MI;Silt content;%;A;SILT;MI;"";num;0.1;100;"";FALSE;"" -A_SOM_LOI;Organic matter content;%;A;SOM;LOI;"";num;0.5;75;"";FALSE;"" -B_ALTITUDE;The altitude of the soil surface;m;B;ALTITUDE;"";"";num;-414;8849;"";FALSE;"" -B_SLOPE_ASPECT;Slope aspect of the field;degrees;B;SLOPE;ASPECT;"";num;0;360;"";FALSE;"" -B_SLOPE_DEGREE;Slope of the field;degrees;B;SLOPE;DEGREE;"";num;0;30;"";FALSE;"" -D_BDS;Bulk density;kg / m3;D;BDS;"";"";num;100;1900;"";FALSE;"" +A_CACO3_IF;Carbonated Lime;%;A;CACO3;IF;;num;0.1;50;;FALSE; +A_CEC_CO;Cation Exchange Capacity;mmol+/kg;A;CEC;CO;;num;1;1000;;FALSE; +A_CLAY_MI;Clay content;%;A;CLAY;MI;;num;0.1;75;;FALSE; +A_C_OF;Organic Carbon Content;g / kg;A;C;OF;;num;0.1;600;;FALSE; +A_DENSITY_SA;Dry bulk density;g/cm3;A;DENSITY;SA;;num;0.5;3;;FALSE; +A_DEPTH;Depth of the soil layer;m;A;DEPTH;;;num;0;2;;FALSE; +A_H2O_T105;The volumetric moisture content of the soil;%;A;H2O;T105;;num;0;100;;FALSE; +A_N_RT;Total nitrogen content;mg N/ kg;A;N;RT;;num;1;30000;;FALSE; +A_PH_CC;Acidity in CaCl2;-;A;PH;CC;;num;3;10;;FALSE; +A_PH_WA;Acidity in water;-;A;PH;WA;;num;3;10;;FALSE; +A_SAND_M50;Particle size of the mass median of the sandfraction (50-2000µm);µm;A;SAND;M50;;num;50;2000;;FALSE; +A_SAND_MI;Sand content;%;A;SAND;MI;;num;0.1;100;;FALSE; +A_SILT_MI;Silt content;%;A;SILT;MI;;num;0.1;100;;FALSE; +A_SOM_LOI;Organic matter content;%;A;SOM;LOI;;num;0.5;75;;FALSE; +B_ALTITUDE;The altitude of the soil surface;m;B;ALTITUDE;;;num;-414;8849;;FALSE; +B_SLOPE_ASPECT;Slope aspect of the field;degrees;B;SLOPE;ASPECT;;num;0;360;;FALSE; +B_SLOPE_DEGREE;Slope of the field;degrees;B;SLOPE;DEGREE;;num;0;30;;FALSE; +D_BDS;Bulk density;kg / m3;D;BDS;;;num;100;1900;;FALSE; +B_SOILCLASS_USDA;Soil type class according to USDA Soil Taconomy;-;B;SOILCLASS;USDA;;char;;;;TRUE;"""alfisol||andisol||aridisol||entisol||gelisol||inceptisol||mollisol||oxisol||spodosol||ultisol||vertisol||histosol" diff --git a/dev/sptf_soilproperties.csv b/dev/sptf_soilproperties.csv index b248d99..3749805 100644 --- a/dev/sptf_soilproperties.csv +++ b/dev/sptf_soilproperties.csv @@ -4,7 +4,7 @@ 3;2;ph;NL;EU;sand||clay;variable;220;88;90,7;a_ph_kcl||a_som_loi;wosten_1997;https://edepot.wur.nl/299664 4;2;cec;NL;EU;variable;agriculture;30;;;a_ph_kcl||a_som_loi||a_clay_mi;goselink_1999;not available 5;3;cec;NL;EU;variable;agriculture;30;39;89;a_ph_cc||a_c_of||a_clay_mi;erp_2001;https://doi.org/10.1081/CSS-100102990 -6;4;cec;US;NA;variable;variable;30;60;99;a_ph_cc||a_c_of||a_clay_mi;helling_1964;https://doi.org/10.2136/sssaj1964.03615995002800040020x +6;4;cec;US;NAm;variable;variable;30;60;99;a_ph_cc||a_c_of||a_clay_mi;helling_1964;https://doi.org/10.2136/sssaj1964.03615995002800040020x 7;5;cec;NL;EU;variable;agriculture;30;133;94;a_som_loi||a_clay_mi;bussink_2008;not available 8;6;cec;NL;EU;variable;agriculture;30;133;94;a_som_loi||a_clay_mi||a_silt_mi||a_ph_cc;bussink_2008;not available 9;7;cec;NL;EU;sand;agriculture;30;26313;88;a_som_loi||a_clay_mi||a_ph_cc||b_lu_ptfclass;ros_2015;not available @@ -12,36 +12,36 @@ 11;9;cec;NL;EU;clay;agriculture;30;17984;93;a_som_loi||a_clay_mi||a_ph_cc||b_lu_ptfclass;ros_2015;not available 12;10;cec;CH;EU;variable;forest;30;1189;85;a_som_loi||a_clay_mi||a_ph_cc||b_lu_ptfclass;soly_2020;https://doi.org/10.3389/ffgc.2020.00098 13;11;cec;CH;EU;variable;forest;220;2326;84;a_som_loi||a_clay_mi||a_ph_cc||b_lu_ptfclass;soly_2020;https://doi.org/10.3389/ffgc.2020.00098 -14;12;cec;BR;SA;variable;forest;500;444;87;a_som_loi||b_lu_ptfclass;aprile_2012;https://doi.org/10.5539/jas.v4n6p278 -15;13;cec;CA;NA;variable;agriculture;22;11;83;a_som_loi||a_clay_mi;martel_1987;https://doi.org/10.2136/sssaj1978.03615995004200050023x -16;14;cec;US;NA;variable;variable;22;169;79;a_som_loi||a_clay_mi;wilding_1966;https://doi.org/10.2136/sssaj1966.03615995003000060034x -17;15;cec;US;NA;variable;agriculture;30;57;69;a_som_loi||a_clay_mi;wright_1972;https://doi.org/10.2136/sssaj1972.03615995003600010027x -18;16;cec;US;NA;variable;agriculture;30;12;81;a_som_loi||a_clay_mi||a_ph_wa;mclean_1969;https://doi.org/10.2136/sssaj1969.03615995003300060018x +14;12;cec;BR;SAm;variable;forest;500;444;87;a_som_loi||b_lu_ptfclass;aprile_2012;https://doi.org/10.5539/jas.v4n6p278 +15;13;cec;CA;NAm;variable;agriculture;22;11;83;a_som_loi||a_clay_mi;martel_1987;https://doi.org/10.2136/sssaj1978.03615995004200050023x +16;14;cec;US;NAm;variable;variable;22;169;79;a_som_loi||a_clay_mi;wilding_1966;https://doi.org/10.2136/sssaj1966.03615995003000060034x +17;15;cec;US;NAm;variable;agriculture;30;57;69;a_som_loi||a_clay_mi;wright_1972;https://doi.org/10.2136/sssaj1972.03615995003600010027x +18;16;cec;US;NAm;variable;agriculture;30;12;81;a_som_loi||a_clay_mi||a_ph_wa;mclean_1969;https://doi.org/10.2136/sssaj1969.03615995003300060018x 19;17;cec;CN;AS;variable;grassland||nature;10;5;92;a_som_loi||b_lu_ptfclass;liu_2020;https://doi.org/10.1016/j.catena.2020.104526 -20;18;cec;US;NA;variable;agriculture;30;83;91;a_som_loi||a_clay_mi;yuan_1967;not available -21;19;cec;US;NA;variable;variable;30;60;92;a_ph_cc||a_c_of||a_clay_mi;helling_1964;https://doi.org/10.2136/sssaj1964.03615995002800040020x +20;18;cec;US;NAm;variable;agriculture;30;83;91;a_som_loi||a_clay_mi;yuan_1967;not available +21;19;cec;US;NAm;variable;variable;30;60;92;a_ph_cc||a_c_of||a_clay_mi;helling_1964;https://doi.org/10.2136/sssaj1964.03615995002800040020x 22;20;cec;NG;AF;variable;forest;30;35;71;a_c_of||a_clay_mi||a_ph_wa;olorunfemi_2016;https://doi.org/10.18393/ejss.2016.4.266-274 23;21;cec;SD;AF;variable;agriculture;200;301;95;a_clay_mi||a_silt_mi;adam_2021;https://doi.org/10.1177/11786221211042381 -24;22;cec;AR;SA;loess;agriculture;20;24;38;a_som_loi||a_clay_mi||a_silt_mi;hepper_2006;https://doi.org/10.1016/j.geoderma.2005.12.005 -25;23;cec;US;NA;variable;forest||nature;25;283;52;a_c_of||a_clay_mi||a_ph_cc;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 -26;24;cec;US;NA;variable;forest||nature;220;275;77;a_c_of||a_clay_mi||a_ph_cc;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 -27;25;cec;US;NA;variable;forest||nature;220;12685;90;a_c_of||a_clay_mi||a_ph_cc;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 -28;26;cec;US;NA;variable;forest||nature;220;4129;73;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa||b_soilclass_usda;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 +24;22;cec;AR;SAm;loess;agriculture;20;24;38;a_som_loi||a_clay_mi||a_silt_mi;hepper_2006;https://doi.org/10.1016/j.geoderma.2005.12.005 +25;23;cec;US;NAm;variable;forest||nature;25;283;52;a_c_of||a_clay_mi||a_ph_cc;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 +26;24;cec;US;NAm;variable;forest||nature;220;275;77;a_c_of||a_clay_mi||a_ph_cc;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 +27;25;cec;US;NAm;variable;forest||nature;220;12685;90;a_c_of||a_clay_mi||a_ph_cc;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 +28;26;cec;US;NAm;variable;forest||nature;220;4129;73;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa||b_soilclass_usda;seybold_2005;https://doi.org/10.2136/sssaj2004.0026 29;27;cec;NG;AF;variable;agriculture;20;905;48;a_som_loi||a_clay_mi||a_silt_mi||b_clim_cat1;asadu_1997;not available 30;28;cec;DK;EU;variable;agriculture;170;1340;90;a_som_loi||a_clay_mi||a_silt_mi||a_ph_cc;krogh_2000;https://doi.org/10.1080/090647100750014358 -31;29;cec;DK;EU;variable;agriculture;170;711;88;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_mi||a_ph_cc;krogh_2000;https://doi.org/10.1080/090647100750014358 -32;30;cec;US;NA;variable;agriculture;220;274;59;a_som_loi||a_clay_mi;drake_1982;not available -33;31;cec;US;NA;variable;agriculture;220;170;74;a_som_loi||a_clay_mi||b_soilclass_usda;drake_1982;not available +31;29;cec;DK;EU;variable;agriculture;170;711;88;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_if||a_ph_cc;krogh_2000;https://doi.org/10.1080/090647100750014358 +32;30;cec;US;NAm;variable;agriculture;220;274;59;a_som_loi||a_clay_mi;drake_1982;not available +33;31;cec;US;NAm;variable;agriculture;220;170;74;a_som_loi||a_clay_mi||b_soilclass_usda;drake_1982;not available 34;32;cec;CN;AS;variable;agriculture;20;100;80;a_som_loi||a_clay_mi||a_silt_mi||a_ph_cc;liao_2015;https://doi.org/10.1111/sum.12207 -35;33;cec;US;NA;variable;agriculture;30;12000;55;a_c_of||a_clay_mi||a_ph_cc;liao_2015;https://doi.org/10.1111/sum.12207 +35;33;cec;US;NAm;variable;agriculture;30;12000;55;a_c_of||a_clay_mi||a_ph_cc;liao_2015;https://doi.org/10.1111/sum.12207 36;34;cec;GE;EU;variable;forest;30;2000;72;a_c_of||a_clay_mi||a_ph_cc;meyer_1994;https://doi.org/10.4141/cjss94-053 37;35;cec;GE;EU;variable;variable;30;;;a_c_of||a_clay_mi||a_ph_cc;liao_2015;https://doi.org/10.1111/sum.12207 38;36;cec;GE;EU;variable;variable;30;;;a_c_of||a_clay_mi||a_ph_cc;liao_2015;https://doi.org/10.1111/sum.12207 -39;37;cec;US;NA;variable;agriculture;30;2725;79;a_c_of||a_clay_mi||a_ph_cc;franzmeier_1990;not available -40;38;cec;CA;NA;variable;agriculture;30;111;79;a_c_of||a_clay_mi;arnaud_1972;https://doi.org/10.4141/cjss72-015 -41;39;cec;CA;NA;variable;variable;30;;;a_c_of||a_clay_mi;liao_2015;https://doi.org/10.1111/sum.12207 -42;40;cec;US;NA;variable;agriculture;30;;;a_c_of||a_clay_mi;macdonald_1998;not available -43;41;cec;US;NA;variable;forest;220;125;86;a_som_loi||a_clay_mi;miller_1970;https://www.jstor.org/stable/42932818 +39;37;cec;US;NAm;variable;agriculture;30;2725;79;a_c_of||a_clay_mi||a_ph_cc;franzmeier_1990;not available +40;38;cec;CA;NAm;variable;agriculture;30;111;79;a_c_of||a_clay_mi;arnaud_1972;https://doi.org/10.4141/cjss72-015 +41;39;cec;CA;NAm;variable;variable;30;;;a_c_of||a_clay_mi;liao_2015;https://doi.org/10.1111/sum.12207 +42;40;cec;US;NAm;variable;agriculture;30;;;a_c_of||a_clay_mi;macdonald_1998;not available +43;41;cec;US;NAm;variable;forest;220;125;86;a_som_loi||a_clay_mi;miller_1970;https://www.jstor.org/stable/42932818 44;42;cec;CM;AF;variable;variable;220;79;75;a_c_of||a_clay_mi||a_silt_mi;enang_2022;https://doi.org/10.1016/j.geodrs.2022.e00514 45;43;cec;NG;AF;variable;variable;220;2124;58;a_c_of||a_clay_mi||a_silt_mi||a_ph_cc;apka_2016;https://doi.org/10.1111/sum.12310 46;44;cec;NG;AF;variable;variable;40;627;81;a_c_of||a_clay_mi||a_silt_mi||a_ph_cc;apka_2016;https://doi.org/10.1111/sum.12310 @@ -50,19 +50,19 @@ 49;47;cec;NG;AF;variable;variable;20;36;35;a_som_loi||a_clay_mi||a_silt_mi||b_lu_ptfclass;asadu_1997;not available 50;48;cec;IR;AS;variable;agriculture;50;20;67;a_som_loi||a_clay_mi;salehi_2008;not available 51;49;cec;IQ;AS;variable;agriculture;30;200;90;a_som_loi||a_clay_mi||a_silt_mi||b_lu_ptfclass;fattah_2021;https://doi.org/10.36103/ijas.v52i6.1490 -52;50;cec;IR;AS;variable;agriculture;30;38;64;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_mi||a_ph_cc;razzaghi_2021;https://doi.org/10.1016/j.geoderma.2021.115221 +52;50;cec;IR;AS;variable;agriculture;30;38;64;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_if||a_ph_cc;razzaghi_2021;https://doi.org/10.1016/j.geoderma.2021.115221 53;51;cec;IR;AS;variable;agriculture;100;65;52;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa;khaledian_2017;https://doi.org/10.1016/j.catena.2017.07.002 54;52;cec;IQ;AS;variable;agriculture;100;40;91;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa;khaledian_2017;https://doi.org/10.1016/j.catena.2017.07.002 55;53;cec;ES;EU;variable;agriculture;100;40;82;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa;khaledian_2017;https://doi.org/10.1016/j.catena.2017.07.002 56;54;cec;;;variable;variable;100;170;71;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa;khaledian_2017;https://doi.org/10.1016/j.catena.2017.07.002 57;55;cec;;;variable;variable;100;170;80;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa;khaledian_2017;https://doi.org/10.1016/j.catena.2017.07.002 -58;56;cec;MX;NA;variable;variable;20;148;96;a_som_loi||a_clay_mi||a_ph_wa;bell_1995;https://doi.org/10.2136/sssaj1995.03615995005900030034x -59;57;cec;MX;NA;variable;variable;20;68;62;a_som_loi||a_sand_mi||a_ph_wa;bell_1993;not available -60;58;cec;IR;AS;variable;variable;20;417;85;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_mi;asadzadeh_2019;https://doi.org/10.1080/00103624.2019.1604728 +58;56;cec;MX;NAm;variable;variable;20;148;96;a_som_loi||a_clay_mi||a_ph_wa;bell_1995;https://doi.org/10.2136/sssaj1995.03615995005900030034x +59;57;cec;MX;NAm;variable;variable;20;68;62;a_som_loi||a_sand_mi||a_ph_wa;bell_1993;not available +60;58;cec;IR;AS;variable;variable;20;417;85;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_if;asadzadeh_2019;https://doi.org/10.1080/00103624.2019.1604728 61;59;cec;AU;OC;variable;agriculture;30;1930;74;a_c_of||a_clay_mi;mcbratney_2002;https://doi.org/10.1016/S0016-7061(02)00139-8 62;60;cec;;;variable;variable;30;235;53;a_c_of||a_clay_mi;rehman_2019;https://doi.org/10.2136/vzj2018.10.0192 63;61;cec;IR;AS;variable;variable;170;1141;60;a_c_of||a_clay_mi;khodaverdiloo_2018;https://doi.org/10.1002/clen.201700670 -64;62;cec;IR;AS;variable;agriculture;30;200;80;a_c_of||a_clay_mi||a_silt_mi||a_caco3_mi;kashi_2014;https://doi.org/10.1080/00103624.2013.874029 +64;62;cec;IR;AS;variable;agriculture;30;200;80;a_c_of||a_clay_mi||a_silt_mi||a_caco3_if;kashi_2014;https://doi.org/10.1080/00103624.2013.874029 65;63;cec;IT;EU;variable;agriculture;20;15;62;a_c_of||a_clay_mi;bazzoffi_1994;not available 66;64;cec;NZ;OC;variable;agriculture;15;34;66;a_c_of||a_clay_mi;curtin_2013;http://dx.doi.org/10.1071/SR13137 67;65;cec;IR;AS;variable;agriculture;30;57;73;a_c_of;rashidi_2008;not available @@ -71,50 +71,50 @@ 70;1;wsa;UK;EU;variable;agriculture;20;48;61;a_c_of;stengel_1984;https://doi.org/10.1016/0167-1987(84)90015-1 71;2;wsa;UK;EU;sand;grassland;15;14;87;a_c_of;ekwue_1990;https://doi.org/10.1016/0167-1987(90)90102-J 72;3;wsa;TR;AS;variable;agriculture;20;176;55;a_som_loi||a_clay_mi||a_silt_mi||a_k_aa||a_ph_wa;gulster_2018;not available -73;4;wsa;AR;SA;variable;agriculture;20;28;92;a_c_of||a_clay_mi||a_silt_mi;colazo_2010;http://dx.doi.org/10.1016/j.geoderma.2010.07.016 -74;5;wsa;US;NA;variable;agriculture;10;108;38;a_som_loi||a_clay_mi||a_silt_mi;salchow_1996;https://doi.org/10.1016/0016-7061(96)00044-4 -75;6;wsa;FR;EU;variable;agriculture;5;68;91;a_c_of||a_clay_mi||a_silt_mi||a_caco3_mi;bissonnais_2007;https://doi.org/10.1111/j.1365-2389.2006.00823.x -76;7;wsa;ES;EU;variable;agriculture;10;80;37;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_mi||a_ph_wa;canasveras_2010;https://doi.org/10.1016%2Fj.geoderma.2009.09.004 -77;8;wsa;CA;NA;variable;agriculture;18;36;83;a_som_loi||a_clay_mi;perfect_1993;https://doi.org/10.1016/0167-1987(93)90022-H -78;9;wsa;CL;SA;variable;variable;17;109;59;a_som_loi||a_clay_mi||a_ph_wa;rivera_2020;https://doi.org/10.1016/j.catena.2019.104408 +73;4;wsa;AR;SAm;variable;agriculture;20;28;92;a_c_of||a_clay_mi||a_silt_mi;colazo_2010;http://dx.doi.org/10.1016/j.geoderma.2010.07.016 +74;5;wsa;US;NAm;variable;agriculture;10;108;38;a_som_loi||a_clay_mi||a_silt_mi;salchow_1996;https://doi.org/10.1016/0016-7061(96)00044-4 +75;6;wsa;FR;EU;variable;agriculture;5;68;91;a_c_of||a_clay_mi||a_silt_mi||a_caco3_if;bissonnais_2007;https://doi.org/10.1111/j.1365-2389.2006.00823.x +76;7;wsa;ES;EU;variable;agriculture;10;80;37;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_if||a_ph_wa;canasveras_2010;https://doi.org/10.1016%2Fj.geoderma.2009.09.004 +77;8;wsa;CA;NAm;variable;agriculture;18;36;83;a_som_loi||a_clay_mi;perfect_1993;https://doi.org/10.1016/0167-1987(93)90022-H +78;9;wsa;CL;SAm;variable;variable;17;109;59;a_som_loi||a_clay_mi||a_ph_wa;rivera_2020;https://doi.org/10.1016/j.catena.2019.104408 79;1;mwd;UK;EU;variable;agriculture;20;26;74;a_som_loi;chaney_1984;https://doi.org/10.1111/j.1365-2389.1984.tb00278.x 80;2;mwd;NZ;OC;variable;agriculture;20;26;44;a_c_of||a_clay_mi||a_silt_mi;haynes_1991;https://doi.org/10.1016/0167-1987(91)90111-A -81;3;mwd;DZ;AF;variable;variable;20;183;67;a_c_of||a_clay_mi||a_cec_co||a_silt_mi||a_ph_wa||a_caco3_mi;saidi_2015;https://doi.org/10.9734/IJPSS/2015/12316 -82;4;mwd;TN;AF;variable;agriculture;10;113;62;a_c_of||a_clay_mi||a_silt_mi||a_caco3_mi;annabi_2017;https://doi.org/10.1016/j.catena.2017.02.010 +81;3;mwd;DZ;AF;variable;variable;20;183;67;a_c_of||a_clay_mi||a_cec_co||a_silt_mi||a_ph_wa||a_caco3_if;saidi_2015;https://doi.org/10.9734/IJPSS/2015/12316 +82;4;mwd;TN;AF;variable;agriculture;10;113;62;a_c_of||a_clay_mi||a_silt_mi||a_caco3_if;annabi_2017;https://doi.org/10.1016/j.catena.2017.02.010 83;5;mwd;RS;EU;variable;agriculture;20;120;63;a_c_of||a_clay_mi||a_ph_wa;ciric_2012;https://www.scielo.cl/pdf/jsspn/v12n4/aop2512.pdf 84;6;mwd;CN;AS;loess;agriculture;20;6;95;a_c_of;gao_2019;https://doi.org/10.1016/j.catena.2018.09.043 85;7;mwd;IQ;AS;variable;agriculture;10;100;83;a_c_of||a_sand_mi;hatamvand_2021;not available -86;8;mwd;DZ;AF;variable;agriculture;20;1248;22;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_mi||a_ph_wa;hamel_2021;https://doi.org/10.1016/j.chnaes.2021.04.00 +86;8;mwd;DZ;AF;variable;agriculture;20;1248;22;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_if||a_ph_wa;hamel_2021;https://doi.org/10.1016/j.chnaes.2021.04.00 87;9;mwd;FR;EU;variable;variable;20;129;65;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa||b_lu_ptfclass;clergue_2023;https://doi.org/10.1016/j.soisec.2023.100088 88;10;mwd;FR;EU;variable;agriculture;5;68;92;a_c_of;bissonnais_2007;https://doi.org/10.1111/j.1365-2389.2006.00823.x 89;11;mwd;IT;EU;variable;agriculture;20;15;63;a_c_of||a_clay_mi;bazzoffi_1994;not available 90;12;mwd;IN;AS;variable;agriculture;30;120;65;a_som_loi||a_clay_mi||a_silt_mi;bhattacharya_2021;https://doi.org/10.1002/agj2.20469 91;13;mwd;MA;AF;variable;agriculture;40;77;59;a_som_loi||a_clay_mi;bouslihim_2021;https://doi.org/10.1016/j.heliyon.2021.e06480 -92;14;mwd;ES;EU;variable;agriculture;10;80;52;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_mi||a_ph_wa;canasveras_2010;https://doi.org/10.1016%2Fj.geoderma.2009.09.004 +92;14;mwd;ES;EU;variable;agriculture;10;80;52;a_som_loi||a_clay_mi||a_silt_mi||a_caco3_if||a_ph_wa;canasveras_2010;https://doi.org/10.1016%2Fj.geoderma.2009.09.004 93;15;mwd;BE;EU;variable;agriculture;10;83;85;a_c_of||a_ph_wa;shi_2020;https://doi.org/10.1016/j.geoderma.2019.113958 94;1;tv;IR;AS;variable;agriculture;3;22;42;a_som_loi||a_clay_mi||a_amwd_dm;razaei_2022;https://doi.org/10.1002/ldr.4309 95;2;tv;;;variable;variable;20;2015;;a_clay_mi||a_silt_mi;unknown; 96;3;tv;HU;EU;variable;agriculture;20;80;72;a_clay_mi||a_silt_mi;negyesi_2016;https://doi.org/10.1007/s12517-016-2626-0 97;1;erodibility;IR;AS;variable;agriculture;20;3;99;a_amwd_dm;zamani_2013;https://doi.org/10.1080/03650340.2012.748984 -98;2;erodibility;AR;SA;variable;agriculture;20;28;86;a_c_of||a_clay_mi||a_silt_mi;colazo_2010;http://dx.doi.org/10.1016/j.geoderma.2010.07.016 -99;1;sss;CN;SA;variable;agriculture;4;153;59;a_som_loi||a_caco3_mi;zhang_2018;https://doi.org/10.1016/j.still.2017.12.014 +98;2;erodibility;AR;SAm;variable;agriculture;20;28;86;a_c_of||a_clay_mi||a_silt_mi;colazo_2010;http://dx.doi.org/10.1016/j.geoderma.2010.07.016 +99;1;sss;CN;SAm;variable;agriculture;4;153;59;a_som_loi||a_caco3_if;zhang_2018;https://doi.org/10.1016/j.still.2017.12.014 100;2;sss;DK;EU;variable;agriculture;12;931;51;a_som_loi||a_clay_mi;schjonning_2021;https://doi.org/10.1016/j.still.2021.105049 101;3;sss;DK;EU;variable;agriculture;80;1651;84;a_som_loi||a_clay_mi;schjonning_2021;https://doi.org/10.1016/j.still.2021.105049 102;1;phbc;AU;OC;variable;agriculture;30;85;79;a_c_of||a_clay_mi;mcbratney_2002;https://doi.org/10.1016/S0016-7061(02)00139-8 103;2;phbc;AU;OC;variable;agriculture;10;89;89;a_c_of;wong_2013;https://doi.org/10.1111/sum.12022 104;3;phbc;AU;OC;variable;agriculture;30;16;87;a_c_of||a_clay_mi;wong_2013;https://doi.org/10.1111/sum.12022 105;4;phbc;NZ;OC;variable;agriculture;15;30;83;a_c_of||a_clay_mi;curtin_2013;http://dx.doi.org/10.1071/SR13137 -106;5;phbc;US;NA;variable;agriculture;15;136;62;a_c_of;weaver_2004;https://doi.org/10.2136/sssaj2004.6620 +106;5;phbc;US;NAm;variable;agriculture;15;136;62;a_c_of;weaver_2004;https://doi.org/10.2136/sssaj2004.6620 107;6;phbc;AU;OC;variable;agriculture;15;40;83;a_c_of||a_clay_mi;aitken_1990;https://doi.org/10.1071/SR9900695 108;7;phbc;GH;AF;variable;agriculture;22;6;92;a_c_of||a_clay_mi||a_ph_wa;owusu_1995;https://doi.org/10.1080/00103629509369346 109;8;phbc;FR;EU;variable;variable;;;;a_c_of||a_clay_mi;joret_1934;not available 110;68;cec;NZ;OC;variable;forest;;347;70;a_c_of||a_clay_mi;parfitt_1995;https://doi.org/10.1080/00103629509369376 111;69;cec;IN;AS;variable;variable;;42;83;a_c_of||a_clay_mi;somani_1983;not available -112;70;cec;US;NA;variable;agriculture;30;17;88;a_c_of||a_clay_mi;martel_1976;not available +112;70;cec;US;NAm;variable;agriculture;30;17;88;a_c_of||a_clay_mi;martel_1976;not available 113;71;cec;IE;EU;variable;agriculture;30;51;58;a_c_of||a_clay_mi;curtin_1976;not available 114;72;cec;AU;OC;variable;variable;;92;69;a_c_of||a_clay_mi||a_ph_wa;tranter_2009;doi:10.1016/j.geoderma.2009.01.006 115;73;cec;GE;EU;variable;variable;30;1533;;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa;deumlich_2015;https://doi.org/10.1080/03650340.2014.961434 -116;74;cec;US;NA;variable;variable;220;12000;58;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa||b_soilclass_usda;;https://doi.org/10.1080/00103629009368363 +116;74;cec;US;NAm;variable;variable;220;12000;58;a_c_of||a_clay_mi||a_silt_mi||a_ph_wa||b_soilclass_usda;;https://doi.org/10.1080/00103629009368363 117;1;hwc;NL;EU;variable;agriculture;30;100;83;a_c_of||a_clay_mi;ros_2011;https://edepot.wur.nl/168954 118;2;hwc;NL;EU;variable;agriculture;30;47;55;a_c_of;ros_2011;https://edepot.wur.nl/168954 119;3;hwc;NL;EU;variable;agriculture;30;34;64;a_c_of||a_ph_cc;ros_2011;not available @@ -127,34 +127,34 @@ 126;10;hwc;NL;EU;variable;agriculture;30;170;83;a_c_of||a_ph_cc;hanegraaf_2009;not available 127;11;hwc;NL;EU;variable;agriculture;30;20;69;a_c_of||a_clay_mi;vaneekeren_2009;not available 128;12;hwc;NL;EU;variable;agriculture;30;1033;79;a_c_of||a_clay_mi;fujita_2023;not available -129;1;whc;US;NA;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 -130;2;whc;US;NA;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 -131;3;whc;US;NA;variable;agriculture;30;10;94;a_sand_mi||a_clay_mi;saxton_1986;https://doi.org/10.2136/sssaj1986.03615995005000040039x -132;4;whc;CA;NA;variable;agriculture;30;298;96;a_c_of||a_sand_mi||a_clay_mi;oosterveld_1980;https://library.csbe-scgab.ca/docs/journal/22/22_2_149_raw.pdf +129;1;whc;US;NAm;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 +130;2;whc;US;NAm;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 +131;3;whc;US;NAm;variable;agriculture;30;10;94;a_sand_mi||a_clay_mi;saxton_1986;https://doi.org/10.2136/sssaj1986.03615995005000040039x +132;4;whc;CA;NAm;variable;agriculture;30;298;96;a_c_of||a_sand_mi||a_clay_mi;oosterveld_1980;https://library.csbe-scgab.ca/docs/journal/22/22_2_149_raw.pdf 133;5;whc;;EU;variable;variable;100;5521;76;a_som_loi||a_clay_mi||a_silt_mi;wosten_1999;https://doi.org/10.1016/S0016-7061(98)00132-3 134;6;whc;BE;EU;variable;variable;100;48;;a_c_of||a_sand_mi||a_clay_mi;vereecken_1989;https://doi.org/10.1097/00010694-198912000-00001 135;7;whc;;EU;variable;variable;100;2196;;a_c_of||a_sand_mi||a_clay_mi||a_silt_mi;szabo_2021;https://doi.org/10.5194/gmd-14-151-2021 136;8;whc;BE;EU;variable;forest;100;182;84;a_c_of||a_sand_mi||a_clay_mi;weynants_2009;https://doi:10.2136/vzj2008.0062 -137;9;whc;BR;SA;variable;variable;200;196;90;a_c_of||a_silt_mi||a_clay_mi;tomasella_1998;https://doi.org/10.1097/00010694-199803000-00003 -138;10;whc;US;NA;variable;variable;100;5350;58;a_c_of||a_sand_mi||a_clay_mi||a_silt_mi;rawls_1982;not available -139;11;whc;US;NA;variable;variable;100;24;99;a_c_of||a_silt_mi||a_clay_mi;campbell_1992;not available -140;12;whc;US;NA;variable;variable;;;;a_c_of||a_sand_mi||a_clay_mi;rawls_1985;not available +137;9;whc;BR;SAm;variable;variable;200;196;90;a_c_of||a_silt_mi||a_clay_mi;tomasella_1998;https://doi.org/10.1097/00010694-199803000-00003 +138;10;whc;US;NAm;variable;variable;100;5350;58;a_c_of||a_sand_mi||a_clay_mi||a_silt_mi;rawls_1982;not available +139;11;whc;US;NAm;variable;variable;100;24;99;a_c_of||a_silt_mi||a_clay_mi;campbell_1992;not available +140;12;whc;US;NAm;variable;variable;;;;a_c_of||a_sand_mi||a_clay_mi;rawls_1985;not available 141;13;whc;;;variable;agriculture;100;408;;a_c_of||a_sand_mi||a_clay_mi;tian_2021;https://doi.org/10.1016/j.still.2020.104812 142;14;whc;NL;EU;variable;agriculture;100;36;71;a_som_loi||a_clay_mi||a_silt_mi;wosten_1997;https://doi.org/10.1016/S0166-2481(97)80037-2 143;15;whc;NL;EU;variable;agriculture;100;832;72;a_som_loi||a_clay_mi||a_silt_mi;wosten_2001;https://edepot.wur.nl/43272 144;16;whc;NL;EU;variable;agriculture;100;832;95;a_som_loi||a_clay_mi||a_silt_mi;wosten_2001;https://edepot.wur.nl/43272 -145;1;paw;US;NA;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 -146;2;paw;US;NA;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 -147;3;paw;US;NA;variable;agriculture;30;10;94;a_sand_mi||a_clay_mi;saxton_1986;https://doi.org/10.2136/sssaj1986.03615995005000040039x -148;4;paw;CA;NA;variable;agriculture;30;298;96;a_c_of||a_sand_mi||a_clay_mi;oosterveld_1980;https://library.csbe-scgab.ca/docs/journal/22/22_2_149_raw.pdf +145;1;paw;US;NAm;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 +146;2;paw;US;NAm;variable;agriculture;15;1731;88;a_c_of||a_sand_mi||a_clay_mi;bagdal_2022;https://doi.org/10.1002/saj2.2039 +147;3;paw;US;NAm;variable;agriculture;30;10;94;a_sand_mi||a_clay_mi;saxton_1986;https://doi.org/10.2136/sssaj1986.03615995005000040039x +148;4;paw;CA;NAm;variable;agriculture;30;298;96;a_c_of||a_sand_mi||a_clay_mi;oosterveld_1980;https://library.csbe-scgab.ca/docs/journal/22/22_2_149_raw.pdf 149;5;paw;;EU;variable;variable;100;5521;76;a_som_loi||a_clay_mi||a_silt_mi;wosten_1999;https://doi.org/10.1016/S0016-7061(98)00132-3 150;6;paw;BE;EU;variable;variable;100;48;;a_c_of||a_sand_mi||a_clay_mi;vereecken_1989;https://doi.org/10.1097/00010694-198912000-00001 151;7;paw;;EU;variable;variable;100;2196;;a_c_of||a_sand_mi||a_clay_mi||a_silt_mi;szabo_2021;https://doi.org/10.5194/gmd-14-151-2021 152;8;paw;BE;EU;variable;forest;100;182;84;a_c_of||a_sand_mi||a_clay_mi;weynants_2009;https://doi:10.2136/vzj2008.0062 -153;9;paw;BR;SA;variable;variable;200;196;90;a_c_of||a_silt_mi||a_clay_mi;tomasella_1998;https://doi.org/10.1097/00010694-199803000-00003 -154;10;paw;US;NA;variable;variable;100;5350;58;a_c_of||a_sand_mi||a_clay_mi||a_silt_mi;rawls_1982;not available -155;11;paw;US;NA;variable;variable;100;24;99;a_c_of||a_silt_mi||a_clay_mi;campbell_1992;not available -156;12;paw;US;NA;variable;variable;;;;a_c_of||a_sand_mi||a_clay_mi;rawls_1985;not available +153;9;paw;BR;SAm;variable;variable;200;196;90;a_c_of||a_silt_mi||a_clay_mi;tomasella_1998;https://doi.org/10.1097/00010694-199803000-00003 +154;10;paw;US;NAm;variable;variable;100;5350;58;a_c_of||a_sand_mi||a_clay_mi||a_silt_mi;rawls_1982;not available +155;11;paw;US;NAm;variable;variable;100;24;99;a_c_of||a_silt_mi||a_clay_mi;campbell_1992;not available +156;12;paw;US;NAm;variable;variable;;;;a_c_of||a_sand_mi||a_clay_mi;rawls_1985;not available 157;13;paw;;;variable;agriculture;100;408;;a_c_of||a_sand_mi||a_clay_mi;tian_2021;https://doi.org/10.1016/j.still.2020.104812 158;14;paw;NL;EU;variable;agriculture;100;36;71;a_som_loi||a_clay_mi||a_silt_mi;wosten_1997;https://doi.org/10.1016/S0166-2481(97)80037-2 159;15;paw;NL;EU;variable;agriculture;100;832;72;a_som_loi||a_clay_mi||a_silt_mi;wosten_2001;https://edepot.wur.nl/43272 @@ -163,12 +163,12 @@ 162;2;pmn;CN;AS;variable;agriculture;50;27;;a_c_of||a_silt_mi||a_n_rt||a_ph_cc;zou_2018;https://doi.org/10.4236/ojss.2018.82006 163;3;pmn;NL;EU;variable;agriculture;30;100;44;a_c_of||a_n_rt||a_clay_mi;ros_2020;https://edepot.wur.nl/168954 164;4;pmn;NL;EU;variable;agriculture;30;47;52;a_c_of||a_n_rt||a_clay_mi;ros_2020;not available -165;5;pmn;US;NA;variable;agriculture;30;39;65;a_c_of||a_n_rt||a_cec_co;rasiah_1995;https://doi.org/10.1080/00103629509369414 -166;6;pmn;CA;NA;variable;agriculture;30;33;29;a_c_of||a_n_rt||a_clay_mi||a_silt_mi||a_ph_cc;rasiah_1995;https://doi.org/10.1080/00103629509369414 +165;5;pmn;US;NAm;variable;agriculture;30;39;65;a_c_of||a_n_rt||a_cec_co;rasiah_1995;https://doi.org/10.1080/00103629509369414 +166;6;pmn;CA;NAm;variable;agriculture;30;33;29;a_c_of||a_n_rt||a_clay_mi||a_silt_mi||a_ph_cc;rasiah_1995;https://doi.org/10.1080/00103629509369414 167;7;pmn;IN;AS;variable;agriculture;15;15;92;a_c_of||a_clay_mi;haer_2003;https://doi.org/10.1080/15324980301586 168;8;pmn;IE;EU;variable;agriculture;10;72;89;a_n_rt||a_cec_co||a_silt_mi;herlihy_1979;https://www.jstor.org/stable/42934963 -169;9;pmn;CA;NA;variable;agriculture;15;33;78;a_n_rt;campbell_1984;https://cdnsciencepub.com/doi/pdf/10.4141/cjss84-035 -170;10;pmn;CA;NA;variable;agriculture;20;20;58;a_n_rt;simard_1993;https://doi.org/10.4141/cjss93-003 +169;9;pmn;CA;NAm;variable;agriculture;15;33;78;a_n_rt;campbell_1984;https://cdnsciencepub.com/doi/pdf/10.4141/cjss84-035 +170;10;pmn;CA;NAm;variable;agriculture;20;20;58;a_n_rt;simard_1993;https://doi.org/10.4141/cjss93-003 171;11;pmn;NL;EU;variable;agriculture;30;100;44;a_c_of||a_clay_mi;ros_2011;https://edepot.wur.nl/168954 172;12;pmn;NL;EU;variable;agriculture;30;47;52;a_c_of;ros_2011;not available 173;13;pmn;NL;EU;variable;agriculture;30;20;37;a_c_of;vaneekeren_2009;not available @@ -185,3 +185,6 @@ 184;4;metals;NL;EU;variable;agriculture;30;1400;79;a_som_loi||a_clay_mi||a_ph_wa;romkens_2004;https://edepot.wur.nl/16988 185;1;cdec;NL;EU;peat;agriculture;30;;;a_c_of||a_n_rt;wosten_1997;https://edepot.wur.nl/299664 186;2;cdec;NL;EU;variable;agriculture;30;;;a_c_of;janssen_1984;not available +187;75;cec;CN;AS;variable;agriculture;20;100;37;a_som_loi||a_sand_mi||a_ph_wa;yunan_2018;doi:10.1088/1757-899X/392/4/042039 +188;76;cec;IR;AS;variable;agriculture;30;220;77;a_c_of||a_clay_mi||a_silt_mi||a_sand_mi||a_ph_wa;ghorbani_2015;https://doi.org/10.1080/00103624.2015.1006367 +189;77;cec;CN;AS;loess;agriculture;30;18;99;a_som_loi||a_clay_mi||a_silt_mi||a_ph_wa;wang_2012;not available diff --git a/man/sptf_bd0.Rd b/man/sptf_bd0.Rd index eef2280..1e656f4 100644 --- a/man/sptf_bd0.Rd +++ b/man/sptf_bd0.Rd @@ -5,7 +5,6 @@ \title{Documentation of all possible bulk density pedotransfer function inputs} \usage{ sptf_bd0( - A_CACO3_MI, A_CEC_CO, A_CLAY_MI, A_C_OF, @@ -31,8 +30,6 @@ sptf_bd0( ) } \arguments{ -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} - \item{A_CEC_CO}{(numeric) Cation Exchange Capacity (mmol+/kg)} \item{A_CLAY_MI}{(numeric) The clay content of the mineral soil fraction (\%).} diff --git a/man/sptf_cec29.Rd b/man/sptf_cec29.Rd index 6eb0b29..4af9e34 100644 --- a/man/sptf_cec29.Rd +++ b/man/sptf_cec29.Rd @@ -4,7 +4,7 @@ \alias{sptf_cec29} \title{Calculate the CEC} \usage{ -sptf_cec29(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) +sptf_cec29(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_IF, A_PH_CC) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} @@ -13,7 +13,7 @@ sptf_cec29(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) \item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} -\item{A_CACO3_MI}{(numeric) The carbonate content of the soil (\%).} +\item{A_CACO3_IF}{(numeric) The carbonate content of the soil (\%).} \item{A_PH_CC}{(numeric) The acidity of the soil, pH in CaCl2 (-).} } diff --git a/man/sptf_cec50.Rd b/man/sptf_cec50.Rd index 7e4f3bf..ffede12 100644 --- a/man/sptf_cec50.Rd +++ b/man/sptf_cec50.Rd @@ -4,7 +4,7 @@ \alias{sptf_cec50} \title{Calculate the CEC} \usage{ -sptf_cec50(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) +sptf_cec50(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_IF, A_PH_CC) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} @@ -13,7 +13,7 @@ sptf_cec50(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI, A_PH_CC) \item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} -\item{A_CACO3_MI}{(numeric) The carbonate content of the soil (\%).} +\item{A_CACO3_IF}{(numeric) The carbonate content of the soil (\%).} \item{A_PH_CC}{(numeric) The acidity of the soil, pH in CaCl2 (-).} } diff --git a/man/sptf_cec58.Rd b/man/sptf_cec58.Rd index 25d8d70..f09fa21 100644 --- a/man/sptf_cec58.Rd +++ b/man/sptf_cec58.Rd @@ -4,7 +4,7 @@ \alias{sptf_cec58} \title{Calculate the CEC} \usage{ -sptf_cec58(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) +sptf_cec58(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_IF) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} @@ -13,7 +13,7 @@ sptf_cec58(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) \item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} -\item{A_CACO3_MI}{(numeric) The carbonate content of the soil (\%).} +\item{A_CACO3_IF}{(numeric) The carbonate content of the soil (\%).} } \description{ This function calculates the CEC at pH 8.2 for calcareous soils in Iran diff --git a/man/sptf_cec62.Rd b/man/sptf_cec62.Rd index 87e9a6b..6b407bd 100644 --- a/man/sptf_cec62.Rd +++ b/man/sptf_cec62.Rd @@ -4,7 +4,7 @@ \alias{sptf_cec62} \title{Calculate the CEC} \usage{ -sptf_cec62(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) +sptf_cec62(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_IF) } \arguments{ \item{A_C_OF}{(numeric) The carbon content of the soil (g / kg).} @@ -13,7 +13,7 @@ sptf_cec62(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) \item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} -\item{A_CACO3_MI}{(numeric) The carbonate content of the soil (\%).} +\item{A_CACO3_IF}{(numeric) The carbonate content of the soil (\%).} } \description{ This function calculates the CEC at pH 8.2 for calcareous soils in Iran diff --git a/man/sptf_cec76.Rd b/man/sptf_cec76.Rd new file mode 100644 index 0000000..4525065 --- /dev/null +++ b/man/sptf_cec76.Rd @@ -0,0 +1,21 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cec.R +\name{sptf_cec76} +\alias{sptf_cec76} +\title{Calculate the CEC} +\usage{ +sptf_cec76(A_SOM_LOI, A_SAND_MI, A_PH_WA) +} +\arguments{ +\item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} + +\item{A_SAND_MI}{(numeric) The sand content of the soil (\%).} + +\item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} +} +\description{ +This function calculates the CEC at pH 7 from agricultural topsoils (0-20 cm) in China +} +\references{ +Yunan et al. (2018) Study on Cation Exchange Capacity of Agricultural Soils +} diff --git a/man/sptf_cec77.Rd b/man/sptf_cec77.Rd new file mode 100644 index 0000000..1d3eae3 --- /dev/null +++ b/man/sptf_cec77.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cec.R +\name{sptf_cec77} +\alias{sptf_cec77} +\title{Calculate the CEC} +\usage{ +sptf_cec77(A_C_OF, A_CLAY_MI, A_SILT_MI, A_SAND_MI, A_PH_WA) +} +\arguments{ +\item{A_C_OF}{(numeric) The carbon content of the soil (g / kg).} + +\item{A_CLAY_MI}{(numeric) The clay content of the soil (\%).} + +\item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} + +\item{A_SAND_MI}{(numeric) The sand content of the soil (\%).} + +\item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} +} +\description{ +This function calculates the CEC at pH 7 from agricultural topsoils (0-30 cm) in Iran +} +\references{ +Ghorbani et al. (2015) Estimation of Soil Cation Exchange Capacity using Multiple Regression, Artificial Neural Networks, and Adaptive Neuro-fuzzy Inference System Models in Golestan Province, Iran +} diff --git a/man/sptf_cec78.Rd b/man/sptf_cec78.Rd new file mode 100644 index 0000000..29f1e06 --- /dev/null +++ b/man/sptf_cec78.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/cec.R +\name{sptf_cec78} +\alias{sptf_cec78} +\title{Calculate the CEC} +\usage{ +sptf_cec78(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA) +} +\arguments{ +\item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} + +\item{A_CLAY_MI}{(numeric) The clay content of the soil (\%).} + +\item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} + +\item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} +} +\description{ +This function calculates the CEC at pH 7 from agricultural topsoils (0-30 cm) in China +} +\references{ +Wang et al. (2012) Distribution and Affecting Factors of Soil Cation Exchange Capacity in Watershed of the Loess Plateau. Cited in Yunan et al. (2018). +} diff --git a/man/sptf_mwd14.Rd b/man/sptf_mwd14.Rd index bf63041..ec8893e 100644 --- a/man/sptf_mwd14.Rd +++ b/man/sptf_mwd14.Rd @@ -4,7 +4,7 @@ \alias{sptf_mwd14} \title{Predicting the the Mean Weight Diameter for soils} \usage{ -sptf_mwd14(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) +sptf_mwd14(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_IF) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} @@ -15,7 +15,7 @@ sptf_mwd14(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) \item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} +\item{A_CACO3_IF}{(numeric) The calcium carbonate content of the soil (\%)} } \description{ Calculate the Mean Weight Diamater for agricultural soils (0-10cm) in southern Spain given the pedotransferfunction of Canasveras et al. (2010) diff --git a/man/sptf_mwd3.Rd b/man/sptf_mwd3.Rd index a7b2e93..b3ed648 100644 --- a/man/sptf_mwd3.Rd +++ b/man/sptf_mwd3.Rd @@ -4,7 +4,7 @@ \alias{sptf_mwd3} \title{Calculate the Mean Weight Diamater} \usage{ -sptf_mwd3(A_C_OF, A_CEC_CO, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) +sptf_mwd3(A_C_OF, A_CEC_CO, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_IF) } \arguments{ \item{A_C_OF}{(numeric) The fraction organic carbon in the soil (g / kg).} @@ -17,7 +17,7 @@ sptf_mwd3(A_C_OF, A_CEC_CO, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) \item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} +\item{A_CACO3_IF}{(numeric) The calcium carbonate content of the soil (\%)} } \description{ Calculate the Mean Weight Diamater for soils (0-20cm) in Northwestern Algeria given the pedotransferfunction of Saidi et al. (2015) diff --git a/man/sptf_mwd4.Rd b/man/sptf_mwd4.Rd index 4ad747c..176406b 100644 --- a/man/sptf_mwd4.Rd +++ b/man/sptf_mwd4.Rd @@ -4,7 +4,7 @@ \alias{sptf_mwd4} \title{Calculate the Mean Weight Diamater} \usage{ -sptf_mwd4(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) +sptf_mwd4(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_IF) } \arguments{ \item{A_C_OF}{(numeric) The fraction organic carbon in the soil (g / kg).} @@ -13,7 +13,7 @@ sptf_mwd4(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) \item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} +\item{A_CACO3_IF}{(numeric) The calcium carbonate content of the soil (\%)} } \description{ Calculate the Mean Weight Diamater for agricultural soils (0-10cm) in Tunesia given the pedotransferfunction of Annabi et al. (2017) diff --git a/man/sptf_mwd8.Rd b/man/sptf_mwd8.Rd index d441782..3ed5119 100644 --- a/man/sptf_mwd8.Rd +++ b/man/sptf_mwd8.Rd @@ -4,7 +4,7 @@ \alias{sptf_mwd8} \title{Calculate the Mean Weight Diamater} \usage{ -sptf_mwd8(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) +sptf_mwd8(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_IF) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} @@ -15,7 +15,7 @@ sptf_mwd8(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) \item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} +\item{A_CACO3_IF}{(numeric) The calcium carbonate content of the soil (\%)} } \description{ Calculate the Mean Weight Diamater for agricultural soils (0-20cm) for Algeria, extended withh data from published results from other countries, given the pedotransferfunction of Hamel et al. (2021) diff --git a/man/sptf_parameters.Rd b/man/sptf_parameters.Rd index 36881df..7cf0bd5 100644 --- a/man/sptf_parameters.Rd +++ b/man/sptf_parameters.Rd @@ -5,7 +5,7 @@ \alias{sptf_parameters} \title{Table with variables that functions may use} \format{ -An object of class \code{data.table} (inherits from \code{data.frame}) with 18 rows and 13 columns. +An object of class \code{data.table} (inherits from \code{data.frame}) with 19 rows and 13 columns. } \usage{ sptf_parameters diff --git a/man/sptf_sss1.Rd b/man/sptf_sss1.Rd index 57e2b41..db18691 100644 --- a/man/sptf_sss1.Rd +++ b/man/sptf_sss1.Rd @@ -4,12 +4,12 @@ \alias{sptf_sss1} \title{Calculate the soil shear strength.} \usage{ -sptf_sss1(A_SOM_LOI, A_CACO3_MI) +sptf_sss1(A_SOM_LOI, A_CACO3_IF) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} -\item{A_CACO3_MI}{(numeric) The carbonate content of the soil (\%).} +\item{A_CACO3_IF}{(numeric) The carbonate content of the soil (\%).} } \description{ This function calculates the soil shear strength via various soil properties diff --git a/man/sptf_wsa6.Rd b/man/sptf_wsa6.Rd index cae4ca1..0c6fa4c 100644 --- a/man/sptf_wsa6.Rd +++ b/man/sptf_wsa6.Rd @@ -4,7 +4,7 @@ \alias{sptf_wsa6} \title{Predicting the percentage water stable aggregates} \usage{ -sptf_wsa6(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) +sptf_wsa6(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_IF) } \arguments{ \item{A_C_OF}{(numeric) The fraction organic carbon in the soil (g / kg).} @@ -13,7 +13,7 @@ sptf_wsa6(A_C_OF, A_CLAY_MI, A_SILT_MI, A_CACO3_MI) \item{A_SILT_MI}{(numeric) The silt content of the soil (\%).} -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} +\item{A_CACO3_IF}{(numeric) The calcium carbonate content of the soil (\%)} } \description{ Calculate the water stable aggragates for brown calcareous soils (0-5 cm) within the Mediterranean basin in France given the pedotransferfunction of le Bissonnais et al. (2007) diff --git a/man/sptf_wsa7.Rd b/man/sptf_wsa7.Rd index 853b28c..97a00d6 100644 --- a/man/sptf_wsa7.Rd +++ b/man/sptf_wsa7.Rd @@ -4,7 +4,7 @@ \alias{sptf_wsa7} \title{Predicting the percentage water stable aggregates} \usage{ -sptf_wsa7(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) +sptf_wsa7(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_IF) } \arguments{ \item{A_SOM_LOI}{(numeric) The percentage organic matter in the soil (\%).} @@ -15,7 +15,7 @@ sptf_wsa7(A_SOM_LOI, A_CLAY_MI, A_SILT_MI, A_PH_WA, A_CACO3_MI) \item{A_PH_WA}{(numeric) The acidity of the soil, pH in water (-)} -\item{A_CACO3_MI}{(numeric) The calcium carbonate content of the soil (\%)} +\item{A_CACO3_IF}{(numeric) The calcium carbonate content of the soil (\%)} } \description{ Calculate the water stable aggragates for agricultural topsoils in Spain given the pedotransferfunction of Canasveras et al. (2010) diff --git a/tests/testthat/test-sptf-cec.R b/tests/testthat/test-sptf-cec.R index 3d35ef8..8ecf453 100644 --- a/tests/testthat/test-sptf-cec.R +++ b/tests/testthat/test-sptf-cec.R @@ -18,7 +18,7 @@ test_that("cec functions returns the correct values", { A_DEPTH <- c(0.3, 1) D_BDS <- c(1200, 1100) topsoil <- c(10, 20) - A_CACO3_MI = c(3, 7) + A_CACO3_IF = c(3, 7) B_LU_PTFCLASS <- c('cropland', 'grassland') B_SOILCLASS_USDA <- c('alfisol','andisol') @@ -171,7 +171,7 @@ test_that("cec functions returns the correct values", { tolerance = 0.01 ) expect_equal( - sptf_cec29(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI,A_CACO3_MI = A_CACO3_MI, A_PH_CC = A_PH_CC), + sptf_cec29(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI,A_CACO3_IF = A_CACO3_IF, A_PH_CC = A_PH_CC), expected = c(467.6 , 190.1), tolerance = 0.01 ) @@ -330,7 +330,7 @@ test_that("cec functions returns the correct values", { expect_equal( - sptf_cec50(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_CACO3_MI = A_CACO3_MI, A_PH_CC = A_PH_CC), + sptf_cec50(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_CACO3_IF = A_CACO3_IF, A_PH_CC = A_PH_CC), expected = c(317.13 , 331.37), tolerance = 0.01 ) @@ -370,7 +370,7 @@ test_that("cec functions returns the correct values", { tolerance = 0.01 ) expect_equal( - sptf_cec58(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_CACO3_MI = A_CACO3_MI), + sptf_cec58(A_SOM_LOI = A_SOM_LOI, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_CACO3_IF = A_CACO3_IF), expected = c(82.09 , 133.00), tolerance = 0.01 ) @@ -391,7 +391,7 @@ test_that("cec functions returns the correct values", { tolerance = 0.01 ) expect_equal( - sptf_cec62(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_CACO3_MI = A_CACO3_MI), + sptf_cec62(A_C_OF = A_C_OF, A_CLAY_MI = A_CLAY_MI, A_SILT_MI = A_SILT_MI, A_CACO3_IF = A_CACO3_IF), expected = c(245.3428 , 178.3788), tolerance = 0.01 ) diff --git a/tests/testthat/test-sptf-decomposition.R b/tests/testthat/test-sptf-decomposition.R index c52895e..a299ab9 100644 --- a/tests/testthat/test-sptf-decomposition.R +++ b/tests/testthat/test-sptf-decomposition.R @@ -5,7 +5,7 @@ test_that("decomposition functions returns the correct values", { # Define test data - A_C_OF <- c(500, 200) + A_C_OF <- c(50, 20) A_N_RT <- c(1500, 2500) years <- c(5, 25) @@ -13,7 +13,7 @@ test_that("decomposition functions returns the correct values", { expect_equal( sptf_cdec1(A_C_OF = A_C_OF, A_N_RT = A_N_RT, years = years), - expected = c(-154.982225, -4.040268), + expected = c(2.2, 6.02), tolerance = 0.01 )