mirror of
https://git.gfz-potsdam.de/naaice/poet.git
synced 2025-12-15 12:28:22 +01:00
feat: implement NamedVector based on Rcpp::NumericVector feat: remove hard coded checks and substitute by R hook functions, defined in the input script refactor: modify API of DHT_Wrapper/InterpolationModule to expect a work package structure, where input/output values are stored as 2D vectors test: add tests for NamedVector test: extend tests for Field
205 lines
4.6 KiB
R
205 lines
4.6 KiB
R
## Time-stamp: "Last modified 2023-08-16 14:57:25 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 <- 400
|
|
m <- 200
|
|
|
|
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(5, 2.5),
|
|
type = types[1]
|
|
)
|
|
|
|
|
|
##################################################################
|
|
## Section 2 ##
|
|
## Diffusion parameters and boundary conditions ##
|
|
##################################################################
|
|
|
|
## initial conditions
|
|
init_diffu <- list(
|
|
"H" = 1.110124E+02,
|
|
"O" = 5.550833E+01,
|
|
"Charge" = -1.216307659761E-09,
|
|
"C(4)" = 1.230067028174E-04,
|
|
"Ca" = 1.230067028174E-04,
|
|
"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" = 1.110124E+02,
|
|
"O" = 5.550796E+01,
|
|
"Charge" = -3.230390327801E-08,
|
|
"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
|
|
),
|
|
init_diffu
|
|
)
|
|
|
|
vecinj_inner <- list(
|
|
l1 = c(1, floor(n / 2), floor(m / 2))
|
|
# l2 = c(2,1400,800),
|
|
# l3 = c(2,1600,800)
|
|
)
|
|
|
|
boundary <- list(
|
|
# "N" = c(1, rep(0, n-1)),
|
|
"N" = rep(3, n),
|
|
"E" = rep(3, m),
|
|
"S" = rep(3, n),
|
|
"W" = rep(3, 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) ##
|
|
#################################################################
|
|
|
|
|
|
## # optional when using DHT
|
|
dht_species <- c(
|
|
"H" = 3,
|
|
"O" = 3,
|
|
"Charge" = 3,
|
|
"C(4)" = 6,
|
|
"Ca" = 6,
|
|
"Cl" = 3,
|
|
"Mg" = 5,
|
|
"Calcite" = 4,
|
|
"Dolomite" = 4
|
|
)
|
|
|
|
## # Optional when using Interpolation (example with less key species and custom
|
|
## # significant digits)
|
|
|
|
# pht_species <- c(
|
|
# "C(4)" = 3,
|
|
# "Ca" = 3,
|
|
# "Mg" = 2,
|
|
# "Calcite" = 2,
|
|
# "Dolomite" = 2
|
|
# )
|
|
|
|
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
|
|
# pht_species = pht_species
|
|
)
|
|
|
|
#################################################################
|
|
## Section 4 ##
|
|
## Putting all those things together ##
|
|
#################################################################
|
|
|
|
|
|
iterations <- 20000
|
|
dt <- 200
|
|
|
|
setup <- list(
|
|
grid = grid,
|
|
diffusion = diffusion,
|
|
chemistry = chemistry,
|
|
iterations = iterations,
|
|
timesteps = rep(dt, iterations),
|
|
store_result = TRUE,
|
|
out_save = c(1, seq(50, iterations, by = 50))
|
|
)
|