## Time-stamp: "Last modified 2023-08-16 17:05:04 mluebke" database <- normalizePath("../share/poet/bench/dolo/phreeqc_kin.dat") input_script <- normalizePath("../share/poet/bench/dolo/dolo_inner.pqi") ################################################################# ## Section 1 ## ## Grid initialization ## ################################################################# n <- 2000 m <- 1000 types <- c("scratch", "phreeqc", "rds") init_cell <- list( "H" = 110.683, "O" = 55.3413, "Charge" = -5.0822e-19, "C" = 1.2279E-4, "Ca" = 1.2279E-4, "Cl" = 0, "Mg" = 0, "O2g" = 0.499957, "Calcite" = 2.07e-4, "Dolomite" = 0 ) grid <- list( n_cells = c(n, m), s_cells = c(2, 1), type = types[1] ) ################################################################## ## Section 2 ## ## Diffusion parameters and boundary conditions ## ################################################################## ## initial conditions init_diffu <- list( "H" = 110.683, "O" = 55.3413, "Charge" = -5.0822e-19, "C(4)" = 1.2279E-4, "Ca" = 1.2279E-4, "Cl" = 0, "Mg" = 0 ) ## diffusion coefficients alpha_diffu <- c( "H" = 1E-6, "O" = 1E-6, "Charge" = 1E-6, "C(4)" = 1E-6, "Ca" = 1E-6, "Cl" = 1E-6, "Mg" = 1E-6 ) ## list of boundary conditions/inner nodes vecinj_diffu <- list( list( "H" = 110.683, "O" = 55.3413, "Charge" = 1.90431e-16, "C(4)" = 0, "Ca" = 0, "Cl" = 0.002, "Mg" = 0.001 ), list( "H" = 110.683, "O" = 55.3413, "Charge" = 1.90431e-16, "C(4)" = 0, "Ca" = 0.0, "Cl" = 0.004, "Mg" = 0.002 ) ) vecinj_inner <- list( l1 = c(1, 400, 200), l2 = c(2, 1400, 800), l3 = c(2, 1600, 800) ) boundary <- list( # "N" = c(1, rep(0, n-1)), "N" = rep(0, n), "E" = rep(0, m), "S" = rep(0, n), "W" = rep(0, m) ) diffu_list <- names(alpha_diffu) vecinj <- do.call(rbind.data.frame, vecinj_diffu) names(vecinj) <- names(init_diffu) diffusion <- list( init = as.data.frame(init_diffu, check.names = FALSE), vecinj = vecinj, vecinj_inner = vecinj_inner, vecinj_index = boundary, alpha = alpha_diffu ) ################################################################# ## Section 3 ## ## Chemistry module (Phreeqc) ## ################################################################# ## # Needed when using DHT dht_species <- c( "H" = 10, "O" = 10, "Charge" = 3, "C(4)" = 5, "Ca" = 5, "Cl" = 5, "Mg" = 5, "Calcite" = 5, "Dolomite" = 5 ) check_sign_cal_dol_dht <- function(old, new) { if ((old["Calcite"] == 0) != (new["Calcite"] == 0)) { return(TRUE) } if ((old["Dolomite"] == 0) != (new["Dolomite"] == 0)) { return(TRUE) } return(FALSE) } fuzz_input_dht_keys <- function(input) { return(input[names(dht_species)]) } check_sign_cal_dol_interp <- function(to_interp, data_set) { data_set <- as.data.frame(do.call(rbind, data_set), check.names = FALSE, optional = TRUE) names(data_set) <- names(dht_species) cal <- (data_set$Calcite == 0) == (to_interp["Calcite"] == 0) dol <- (data_set$Dolomite == 0) == (to_interp["Dolomite"] == 0) cal_dol_same_sig <- cal == dol return(rev(which(!cal_dol_same_sig))) } check_neg_cal_dol <- function(result) { neg_sign <- (result["Calcite"] <- 0) || (result["Dolomite"] < 0) return(any(neg_sign)) } hooks <- list( dht_fill = check_sign_cal_dol_dht, dht_fuzz = fuzz_input_dht_keys, interp_pre_func = check_sign_cal_dol_interp, interp_post_func = check_neg_cal_dol ) chemistry <- list( database = database, input_script = input_script, dht_species = dht_species, hooks = hooks ) ################################################################# ## Section 4 ## ## Putting all those things together ## ################################################################# iterations <- 500 dt <- 50 setup <- list( grid = grid, diffusion = diffusion, chemistry = chemistry, iterations = iterations, timesteps = rep(dt, iterations), store_result = TRUE, out_save = seq(5, iterations, by = 5) )