From 938a29f9f646c6239b670557845f1528d5c7fd7e Mon Sep 17 00:00:00 2001 From: "nicolas.forquet" <nicolas.forquet@irstea.fr> Date: Thu, 22 Oct 2020 18:01:23 +0200 Subject: [PATCH] * re-organizing code (turn it into function) * add HP1 support --- hydrus/{file_manip.R => file_manip_fcn.R} | 61 +++++++++++------ hydrus/main_script.R | 83 ++++++++++++++++++----- hydrus/simulation_fcn.R | 13 +++- 3 files changed, 118 insertions(+), 39 deletions(-) rename hydrus/{file_manip.R => file_manip_fcn.R} (78%) diff --git a/hydrus/file_manip.R b/hydrus/file_manip_fcn.R similarity index 78% rename from hydrus/file_manip.R rename to hydrus/file_manip_fcn.R index c26d655..e76c162 100644 --- a/hydrus/file_manip.R +++ b/hydrus/file_manip_fcn.R @@ -1,22 +1,22 @@ # Nicolas Forquet, 2015 -new.hydrus.subfolder = function(new.name,reference.folder,hydrus.folder.path){ - # new.name : name of the new hydrus subfolder - # reference.folder : folder containing all new hydrus subfolder - # hydrus.folder : folder containing the reference model obtained with the GUI - # NOTE: the reference folder must contain a copy of the Hydrus batch executable file : H2D_Calc.exe - - # get the content list from the reference folder - files2copy <- list.files(path = hydrus.folder.path) - # create a new folder into the reference folder - setwd(reference.folder) - dir.create(new.name) - # copy all input files - file.copy(list.files(pattern = ".exe", ignore.case = TRUE),paste0(new.name,"/",list.files(pattern = ".exe", ignore.case = TRUE))) - for (i in 1:length(files2copy)){ - file.copy(paste(hydrus.folder,files2copy[i],sep = "/"),paste(new.name,files2copy[i],sep = "/")) - } -} +# new.hydrus.subfolder = function(new.name,reference.folder,hydrus.folder.path){ +# # new.name : name of the new hydrus subfolder +# # reference.folder : folder containing all new hydrus subfolder +# # hydrus.folder : folder containing the reference model obtained with the GUI +# # NOTE: the reference folder must contain a copy of the Hydrus batch executable file : H2D_Calc.exe +# +# # get the content list from the reference folder +# files2copy <- list.files(path = hydrus.folder.path) +# # create a new folder into the reference folder +# setwd(reference.folder) +# dir.create(new.name) +# # copy all input files +# file.copy(list.files(pattern = ".exe", ignore.case = TRUE),paste0(new.name,"/",list.files(pattern = ".exe", ignore.case = TRUE))) +# for (i in 1:length(files2copy)){ +# file.copy(paste(hydrus.folder,files2copy[i],sep = "/"),paste(new.name,files2copy[i],sep = "/")) +# } +# } dummy.white.space = function(char.line){ temp = unlist(strsplit(char.line," ",fixed = TRUE)) @@ -109,13 +109,32 @@ write_domain = function(reference.folder, file.name.out = "empty", Axz = "empty" return(new_linn) } -level_01.creator = function(new.subfolder.path){ - # new.name : name of the new hydrus subfolder - # reference.folder : folder containing all new hydrus subfolder +level_01.creator = function(new.subfolder.path, HP1 = FALSE){ + # new.subfolder.path : the path to which create the level_01.dir file (and the path.dat file if HP1 is in use) + file.create(paste(new.subfolder.path,"/Level_01.dir",sep="")) level01.file = file(paste(new.subfolder.path,"/Level_01.dir",sep=""),"w") - #working.directory = paste(reference.folder,"/",new.name,sep="") writeLines(new.subfolder.path,level01.file) close(level01.file) + if (HP1 == TRUE){ + file.create(paste(new.subfolder.path,"/path.dat",sep="")) + path.file = file(paste(new.subfolder.path,"/path.dat",sep=""),"w") + writeLines(new.subfolder.path,path.file) + close(path.file) + } +} + +exe_copy = function(hydrus.path, new.subfolder.path, HP1 = FALSE){ + path <- paste0(hydrus.path, "/H1D_CALC.EXE") + new.path <- paste0(new.subfolder.path, "/H1D_CALC.EXE") + file_copy(path, new.path, overwrite = TRUE) + if (HP1 == TRUE){ + path <- paste0(hydrus.path, "/HP1.exe") + new.path <- paste0(new.subfolder.path, "/HP1.exe") + file_copy(path, new.path, overwrite = TRUE) + path <- paste0(hydrus.path, "/Phreeqc.dll") + new.path <- paste0(new.subfolder.path, "/Phreeqc.dll") + file_copy(path, new.path, overwrite = TRUE) + } } modify.selector = function(new.name,hydrus.folder,data,header.size = 24, end.size = 65){ diff --git a/hydrus/main_script.R b/hydrus/main_script.R index d37eea0..9d012df 100644 --- a/hydrus/main_script.R +++ b/hydrus/main_script.R @@ -1,22 +1,73 @@ -# specify the location of the rhydrus folder: -rhydrus.folder <- "C:/Users/forquet/Documents/script_R/rhydrus" -# source the file with functions dedicated to file manipulation -filename <- paste0(rhydrus.folder,"/file_manip.R") -source(filename) - -# This function process the output of the script .bat that estimates processor usage. -output.bat <- function(output){ - usage <- rep(0,5) - for (i in 1:5){ - usage[i] <- as.numeric(strsplit(output[4+i],split='"',fixed=TRUE)[[1]][4]) +hydrus.batch <- function(parameter.file, HP1 = FALSE){ + #--------- load necessary libraries ----------# + library(fs) + library(rjson) + library(tidyverse) + + #---- check if the parameter file exists ----# + if (file.exists(path = parameter.file) == FALSE){ + stop("invalid parameter file path") + } + + #----------- import parameters -------------# + parameter <- fromJSON(file = parameter.file) + + #------------ Check parameter file ------------# + + # check if the working folder is valid + if (dir.exists(path = parameter$working.folder) == FALSE){ + stop("invalid working folder path") + } + + # check if the rhydrus folder is valid + if (dir.exists(path = parameter$rhydrus.folder) == FALSE){ + stop("invalid rhydrus folder path") + } + + # check if the hydrus folder is valid + if (dir.exists(path = parameter$hydrus.folder) == FALSE){ + stop("invalid hydrus folder path") + } + + # check the reference model folder is valid: + if (dir.exists(path = parameter$reference.model.folder) == FALSE){ + stop("invalid reference model path") + } + + # convert simulation number to integer and check for valid output + parameter$simulation.number <- parse_integer(parameter$simulation.number) + if(is.na(parameter$simulation.number) == TRUE){ + stop("invalid format for simulation.number") + } + + + #--------- load rhydrus functions --------# + + # source the file with the functions dedicated to file manipulation + filename <- paste0(parameter$rhydrus.folder,"/file_manip_fcn.R") + source(filename) + + # source the file with the functions dedicated to run simulations + filename <- paste0(parameter$rhydrus.folder,"/simulation_fcn.R") + source(filename) + + #-------- create file tree --------# + + for (i in 1:parameter$simulation.number){ + # copy the reference model folder + dir_copy(path = parameter$reference.model.folder, + new_path = paste0(parameter$working.folder,"/","simulation","_",as.character(i)), overwrite = TRUE) + + # modify input files + + # create level_01.dir (and path.dat) + level_01.creator(paste0(parameter$working.folder,"/","simulation","_",as.character(i)), HP1 = HP1) + # and copy executable file(s) + exe_copy(parameter$hydrus.folder, paste0(parameter$working.folder,"/","simulation","_",as.character(i)), HP1 = HP1) + } - mean_usage <- mean(usage) - return(mean_usage) } -# repository that contains all Hydrus folders -main.directory <- "C:/Users/forquet/Documents/script_R/rhydrus_demo/PF_1pulse" - # set the working directory to main.directory setwd(main.directory) diff --git a/hydrus/simulation_fcn.R b/hydrus/simulation_fcn.R index 3b0863d..066b936 100644 --- a/hydrus/simulation_fcn.R +++ b/hydrus/simulation_fcn.R @@ -1,7 +1,16 @@ # This function process the output of the script .bat that estimates processor usage. +#output.bat <- function(output){ +# usage <- as.numeric(trimws(strsplit(output[2],"\r"))) +# return(usage) +#} +# This function process the output of the script .bat that estimates processor usage. output.bat <- function(output){ - usage <- as.numeric(trimws(strsplit(output[2],"\r"))) - return(usage) + usage <- rep(0,5) + for (i in 1:5){ + usage[i] <- as.numeric(strsplit(output[4+i],split='"',fixed=TRUE)[[1]][4]) + } + mean_usage <- mean(usage) + return(mean_usage) } # This function creates the file tree necessary to run simulation -- GitLab