poet/bench/dolo/dolo_interp.R
2025-12-04 17:49:16 +01:00

132 lines
3.1 KiB
R

rows <- 200
cols <- 400
grid_def <- matrix(2, nrow = rows, ncol = cols)
## Define grid configuration for POET model
grid_setup <- list(
pqc_in_file = "./dol.pqi",
pqc_db_file = "./phreeqc_kin.dat",
grid_def = grid_def,
grid_size = c(5, 2.5),
constant_cells = c()
)
bound_def_we <- list(
"type" = rep("constant", rows),
"sol_id" = rep(1, rows),
"cell" = seq(1, rows)
)
bound_def_ns <- list(
"type" = rep("constant", cols),
"sol_id" = rep(1, cols),
"cell" = seq(1, cols)
)
diffusion_setup <- list(
boundaries = list(
"W" = bound_def_we,
"E" = bound_def_we,
"N" = bound_def_ns,
"S" = bound_def_ns
),
inner_boundaries = list(
"row" = floor(rows / 2),
"col" = floor(cols / 2),
"sol_id" = c(3)
),
alpha_x = 1e-6,
alpha_y = 1e-6
)
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) {
## dht_species <- c(
## "H" = 3,
## "O" = 3,
## "Charge" = 3,
## "C" = 6,
## "Ca" = 6,
## "Cl" = 3,
## "Mg" = 5,
## "Calcite" = 4,
## "Dolomite" = 4
## )
## return(input[names(dht_species)])
## }
check_sign_cal_dol_interp <- function(to_interp, data_set) {
dht_species <- c(
"H" = 3,
"O" = 3,
"Charge" = 3,
"C" = 6,
"Ca" = 6,
"Cl" = 3,
"Mg" = 5,
"Calcite_kin" = 4,
"Dolomite_kin" = 4
)
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_kin == 0) == (to_interp["Calcite_kin"] == 0)
dol <- (data_set$Dolomite_kin == 0) == (to_interp["Dolomite_kin"] == 0)
cal_dol_same_sig <- cal == dol
return(rev(which(!cal_dol_same_sig)))
}
check_neg_cal_dol <- function(result) {
neg_sign <- (result["Calcite_kin"] < 0) || (result["Dolomite_kin"] < 0)
return(neg_sign)
}
## Optional when using Interpolation (example with less key species
## and custom significant digits)
pht_species <- c(
"C" = 3,
"Ca" = 3,
"Mg" = 2,
"Calcite_kin" = 2,
"Dolomite_kin" = 2
)
chemistry_setup <- list(
dht_species = c(
"H" = 3,
"O" = 3,
"Charge" = 3,
"C" = 6,
"Ca" = 6,
"Cl" = 3,
"Mg" = 5,
"Calcite_kin" = 4,
"Dolomite_kin" = 4
),
pht_species = pht_species,
hooks = list(
dht_fill = check_sign_cal_dol_dht,
## dht_fuzz = fuzz_input_dht_keys,
interp_pre = check_sign_cal_dol_interp,
interp_post = check_neg_cal_dol
)
)
## Define a setup list for simulation configuration
setup <- list(
Grid = grid_setup, ## Parameters related to the grid structure
Diffusion = diffusion_setup, ## Parameters related to the diffusion process
Chemistry = chemistry_setup ## Parameters related to the chemistry process
)