Merge branch 'master' of github.com:hollorol/RBBGCMuso
This commit is contained in:
@@ -32,7 +32,10 @@ Imports:
|
||||
ncdf4,
|
||||
future,
|
||||
httr,
|
||||
tcltk
|
||||
tcltk,
|
||||
Boruta,
|
||||
rpart,
|
||||
rpart.plot
|
||||
Maintainer: Roland Hollo's <hollorol@gmail.com>
|
||||
RoxygenNote: 7.1.0
|
||||
Suggests: knitr,
|
||||
|
||||
@@ -3,17 +3,22 @@
|
||||
export(calibMuso)
|
||||
export(calibrateMuso)
|
||||
export(changemulline)
|
||||
export(checkFileSystem)
|
||||
export(checkMeteoBGC)
|
||||
export(cleanupMuso)
|
||||
export(compareMuso)
|
||||
export(copyMusoExampleTo)
|
||||
export(corrigMuso)
|
||||
export(createSoilFile)
|
||||
export(flatMuso)
|
||||
export(getAnnualOutputList)
|
||||
export(getConstMatrix)
|
||||
export(getDailyOutputList)
|
||||
export(getFilePath)
|
||||
export(getFilesFromIni)
|
||||
export(getyearlycum)
|
||||
export(getyearlymax)
|
||||
export(multiSiteCalib)
|
||||
export(musoDate)
|
||||
export(musoGlue)
|
||||
export(musoMapping)
|
||||
@@ -81,6 +86,9 @@ importFrom(magrittr,'%>%')
|
||||
importFrom(openxlsx,read.xlsx)
|
||||
importFrom(rmarkdown,pandoc_version)
|
||||
importFrom(rmarkdown,render)
|
||||
importFrom(rpart,rpart)
|
||||
importFrom(rpart,rpart.control)
|
||||
importFrom(rpart.plot,rpart.plot)
|
||||
importFrom(scales,percent)
|
||||
importFrom(stats,approx)
|
||||
importFrom(tcltk,tk_choose.files)
|
||||
|
||||
@@ -23,9 +23,13 @@
|
||||
RMuso_varTable[[version]] <<- varTable
|
||||
})
|
||||
|
||||
RMuso_depTree<- read.csv(file.path(system.file("data",package="RBBGCMuso"),"depTree.csv"), stringsAsFactors=FALSE)
|
||||
|
||||
|
||||
options(RMuso_version=RMuso_version,
|
||||
RMuso_constMatrix=RMuso_constMatrix,
|
||||
RMuso_varTable=RMuso_varTable)
|
||||
RMuso_varTable=RMuso_varTable,
|
||||
RMuso_depTree=RMuso_depTree
|
||||
)
|
||||
# getOption("RMuso_constMatrix")$soil[[as.character(getOption("RMuso_version"))]]
|
||||
}
|
||||
|
||||
@@ -56,13 +56,13 @@ calibrateMuso <- function(measuredData, parameters =read.csv("parameters.csv", s
|
||||
})
|
||||
|
||||
# musoSingleThread(measuredData, parameters, startDate,
|
||||
# endDate, formatString,
|
||||
# dataVar, outLoc,
|
||||
# preTag, settings,
|
||||
# outVars, iterations = threadCount[i],
|
||||
# skipSpinup, plotName,
|
||||
# modifyOriginal, likelihood, uncertainity,
|
||||
# naVal, postProcString, i)
|
||||
# endDate, formatString,
|
||||
# dataVar, outLoc,
|
||||
# preTag, settings,
|
||||
# outVars, iterations = threadCount[i],
|
||||
# skipSpinup, plotName,
|
||||
# modifyOriginal, likelihood, uncertainity,
|
||||
# naVal, postProcString, i)
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -0,0 +1,267 @@
|
||||
getQueue <- function(depTree=options("RMuso_depTree")[[1]], startPoint){
|
||||
|
||||
if(length(startPoint) == 0){
|
||||
return(c())
|
||||
}
|
||||
parent <- depTree[depTree[,"name"] == startPoint,"parent"]
|
||||
c(getQueue(depTree, depTree[depTree[,"child"] == depTree[depTree[,"name"] == startPoint,"parent"],"name"]),parent)
|
||||
}
|
||||
|
||||
isRelative <- function(path){
|
||||
substr(path,1,1) != '/'
|
||||
}
|
||||
|
||||
#' getFilePath
|
||||
#'
|
||||
#' This function reads the ini file and for a chosen fileType it gives you the filePath
|
||||
#' @param iniName The name of the ini file
|
||||
#' @param filetype The type of the choosen file. For options see options("RMuso_depTree")[[1]]$name
|
||||
#' @param depTree The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]
|
||||
#' @export
|
||||
|
||||
getFilePath <- function(iniName, fileType, execPath = "./", depTree=options("RMuso_depTree")[[1]]){
|
||||
if(!file.exists(iniName) || dir.exists(iniName)){
|
||||
stop(sprintf("Cannot find iniFile: %s", iniName))
|
||||
}
|
||||
|
||||
startPoint <- fileType
|
||||
startRow <- depTree[depTree[,"name"] == startPoint,]
|
||||
startExt <- startRow$child
|
||||
|
||||
parentFile <- Reduce(function(x,y){
|
||||
tryCatch(file.path(execPath,gsub(sprintf("\\.%s.*",y),
|
||||
sprintf("\\.%s",y),
|
||||
grep(sprintf("\\.%s",y),readLines(x),value=TRUE,perl=TRUE))), error = function(e){
|
||||
stop(sprintf("Cannot find %s",x))
|
||||
})
|
||||
},
|
||||
getQueue(depTree,startPoint)[-1],
|
||||
init=iniName)
|
||||
if(startRow$mod > 0){
|
||||
tryCatch(
|
||||
gsub(sprintf("\\.%s.*", startExt),
|
||||
sprintf("\\.%s", startExt),
|
||||
grep(sprintf("\\.%s",startExt),readLines(parentFile),value=TRUE,perl=TRUE))[startRow$mod]
|
||||
,error = function(e){stop(sprintf("Cannot read %s",parentFile))})
|
||||
} else {
|
||||
res <- tryCatch(
|
||||
gsub(sprintf("\\.%s.*", startExt),
|
||||
sprintf("\\.%s",startExt),
|
||||
grep(sprintf("\\.%s",startExt),readLines(parentFile),value=TRUE, perl=TRUE))
|
||||
,error = function(e){stop(sprintf("Cannot read %s", parentFile))})
|
||||
unique(gsub(".*\\t","",res))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#' getFilesFromIni
|
||||
#'
|
||||
#' This function reads the ini file and gives yout back the path of all file involved in model run
|
||||
#' @param iniName The name of the ini file
|
||||
#' @param depTree The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]
|
||||
#' @export
|
||||
|
||||
getFilesFromIni <- function(iniName, execPath = "./", depTree=options("RMuso_depTree")[[1]]){
|
||||
res <- lapply(depTree$name,function(x){
|
||||
tryCatch(getFilePath(iniName,x,execPath,depTree), error = function(e){
|
||||
return(NA);
|
||||
})
|
||||
})
|
||||
names(res) <- depTree$name
|
||||
res
|
||||
}
|
||||
|
||||
#' flatMuso
|
||||
#'
|
||||
#' This function reads the ini file and creates a directory (named after the directory argument) with all the files the modell uses with this file. the directory will be flat.
|
||||
#' @param iniName The name of the ini file
|
||||
#' @param depTree The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]
|
||||
#' @param directory The destination directory for flattening. At default it will be flatdir
|
||||
#' @export
|
||||
|
||||
flatMuso <- function(iniName, execPath="./", depTree=options("RMuso_depTree")[[1]], directory="flatdir", d=TRUE,outE=TRUE){
|
||||
dir.create(directory, showWarnings=FALSE, recursive = TRUE)
|
||||
files <- getFilesFromIni(iniName,execPath,depTree)
|
||||
files <- sapply(unlist(files)[!is.na(files)], function(x){ifelse(isRelative(x),file.path(execPath,x),x)})
|
||||
file.copy(unlist(files), directory, overwrite=TRUE)
|
||||
file.copy(iniName, directory, overwrite=TRUE)
|
||||
|
||||
filesByName <- getFilesFromIni(iniName, execPath, depTree)
|
||||
for(i in seq_along(filesByName)){
|
||||
fileLines <- readLines(file.path(directory,list.files(directory, pattern = sprintf("*\\.%s", depTree$parent[i])))[1])
|
||||
|
||||
sapply(filesByName[[i]],function(origname){
|
||||
if(!is.na(origname)){
|
||||
fileLines <<- gsub(origname, basename(origname), fileLines, fixed=TRUE)
|
||||
}
|
||||
})
|
||||
|
||||
if(!is.na(filesByName[[i]][1])){
|
||||
writeLines(fileLines, file.path(directory,list.files(directory, pattern = sprintf("*\\.%s", depTree$parent[i])))[1])
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
iniLines <- readLines(file.path(directory, basename(iniName)))
|
||||
outPlace <- grep("OUTPUT_CONTROL", iniLines, perl=TRUE)+1
|
||||
if(outE){
|
||||
iniLines[outPlace] <- tools::file_path_sans_ext(basename(iniName))
|
||||
} else {
|
||||
iniLines[outPlace] <- basename(strsplit(iniLines[outPlace], split = "\\s+")[[1]][1])
|
||||
}
|
||||
if(d){
|
||||
iniLines[outPlace + 1] <- 1
|
||||
}
|
||||
writeLines(iniLines, file.path(directory, basename(iniName)))
|
||||
}
|
||||
|
||||
#' checkFileSystem
|
||||
#'
|
||||
#' This function checks the MuSo file system, if it is correct
|
||||
#' @param iniName The name of the ini file
|
||||
#' @param depTree The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]
|
||||
#' @export
|
||||
|
||||
checkFileSystem <- function(iniName,root = ".", depTree = options("RMuso_depTree")[[1]]){
|
||||
recoverAfterEval({
|
||||
setwd(root)
|
||||
fileNames <- getFilesFromIni(iniName, depTree)
|
||||
if(is.na(fileNames$management)){
|
||||
fileNames[getLeafs("management")] <- NA
|
||||
}
|
||||
fileNames <- fileNames[!is.na(fileNames)]
|
||||
errorFiles <- fileNames[!file.exists(unlist(fileNames))]
|
||||
})
|
||||
return(errorFiles)
|
||||
}
|
||||
|
||||
recoverAfterEval <- function(expr){
|
||||
wd <- getwd()
|
||||
tryCatch({
|
||||
eval(expr)
|
||||
setwd(wd)
|
||||
}, error=function(e){
|
||||
setwd(wd)
|
||||
stop(e)
|
||||
})
|
||||
}
|
||||
|
||||
getLeafs <- function(name, depTree=options("RMuso_depTree")[[1]]){
|
||||
|
||||
if(length(name) == 0){
|
||||
return(NULL)
|
||||
}
|
||||
|
||||
if(name[1] == "ini"){
|
||||
return(getLeafs(depTree$name))
|
||||
}
|
||||
|
||||
pname <- depTree[ depTree[,"name"] == name[1] , "child"]
|
||||
children <- depTree[depTree[,"parent"] == pname,"child"]
|
||||
|
||||
if(length(children)==0){
|
||||
if(length(name) == 1){
|
||||
return(NULL)
|
||||
} else{
|
||||
apname <- depTree[ depTree[,"name"] == name[2] , "child"]
|
||||
achildren <- depTree[depTree[,"parent"] == apname,"child"]
|
||||
if(length(achildren)!=0){
|
||||
return(c(name[1],name[2],getLeafs(name[-1])))
|
||||
} else{
|
||||
return(c(name[1], getLeafs(name[-1])))
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
childrenLogic <-depTree[,"child"] %in% children
|
||||
parentLogic <- depTree[,"parent"] ==pname
|
||||
res <- depTree[childrenLogic & parentLogic, "name"]
|
||||
getChildelem <- depTree[depTree[,"child"] == intersect(depTree[,"parent"], children), "name"]
|
||||
unique(c(res,getLeafs(getChildelem)))
|
||||
}
|
||||
|
||||
getParent <- function (name, depTree=options("RMuso_depTree")[[1]]) {
|
||||
parentExt <- depTree[depTree$name == name,"parent"]
|
||||
# if(length(parentExt) == 0){
|
||||
# browser()
|
||||
# }
|
||||
if(parentExt == "ini"){
|
||||
return("iniFile")
|
||||
}
|
||||
|
||||
depTree[depTree[,"child"] == parentExt,"name"]
|
||||
}
|
||||
|
||||
|
||||
|
||||
getFilePath2 <- function(iniName, fileType, depTree=options("RMuso_depTree")[[1]]){
|
||||
if(!file.exists(iniName) || dir.exists(iniName)){
|
||||
stop(sprintf("Cannot find iniFile: %s", iniName))
|
||||
}
|
||||
|
||||
startPoint <- fileType
|
||||
startRow <- depTree[depTree[,"name"] == startPoint,]
|
||||
startExt <- startRow$child
|
||||
|
||||
parentFile <- Reduce(function(x,y){
|
||||
tryCatch(gsub(sprintf("\\.%s.*",y),
|
||||
sprintf("\\.%s",y),
|
||||
grep(sprintf("\\.%s",y),readLines(x),value=TRUE,perl=TRUE)), error = function(e){
|
||||
stop(sprintf("Cannot find %s",x))
|
||||
})
|
||||
},
|
||||
getQueue(depTree,startPoint)[-1],
|
||||
init=iniName)
|
||||
res <- list()
|
||||
res["parent"] <- parentFile
|
||||
if(startRow$mod > 0){
|
||||
res["children"] <- tryCatch(
|
||||
gsub(sprintf("\\.%s.*", startExt),
|
||||
sprintf("\\.%s", startExt),
|
||||
grep(sprintf("\\.%s",startExt),readLines(parentFile),value=TRUE,perl=TRUE))[startRow$mod]
|
||||
,error = function(e){stop(sprintf("Cannot read %s",parentFile))})
|
||||
|
||||
} else {
|
||||
rows <- tryCatch(
|
||||
gsub(sprintf("\\.%s.*", startExt),
|
||||
sprintf("\\.%s",startExt),
|
||||
grep(sprintf("\\.%s",startExt),readLines(parentFile),value=TRUE, perl=TRUE))
|
||||
|
||||
,error = function(e){stop(sprintf("Cannot read %s", parentFile))})
|
||||
unique(gsub(".*\\t","",res))
|
||||
res["children"] <- unique(gsub(".*\\s+(.*\\.epc)","\\1",rows))
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
getFilesFromIni2 <- function(iniName, depTree=options("RMuso_depTree")[[1]]){
|
||||
res <- lapply(depTree$name,function(x){
|
||||
tryCatch(getFilePath2(iniName,x,depTree), error = function(e){
|
||||
return(NA);
|
||||
})
|
||||
})
|
||||
names(res) <- depTree$name
|
||||
res
|
||||
}
|
||||
|
||||
checkFileSystemForNotif <- function(iniName,root = ".", depTree = options("RMuso_depTree")[[1]]){
|
||||
recoverAfterEval({
|
||||
setwd(root)
|
||||
fileNames <- suppressWarnings(getFilesFromIni2(iniName, depTree))
|
||||
if(is.atomic(fileNames$management)){
|
||||
fileNames[getLeafs("management")] <- NA
|
||||
}
|
||||
|
||||
hasparent <- sapply(fileNames, function(x){
|
||||
!is.atomic(x)
|
||||
})
|
||||
notNA <- ! sapply(fileNames[hasparent], function(x) {is.na(x$children)})
|
||||
errorIndex <- ! sapply(fileNames[hasparent & notNA], function(x) file.exists(x$children))
|
||||
|
||||
})
|
||||
return(fileNames[hasparent & notNA][errorIndex])
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,640 @@
|
||||
`%between%` <- function(x, y){
|
||||
(x <= y[2]) & (x >= y[1])
|
||||
}
|
||||
|
||||
annualAggregate <- function(x, aggFun){
|
||||
tapply(x, rep(1:(length(x)/365), each=365), aggFun)
|
||||
}
|
||||
|
||||
SELECT <- function(x, selectPart){
|
||||
if(!is.function(selectPart)){
|
||||
index <- as.numeric(selectPart)
|
||||
tapply(x,rep(1:(length(x)/365),each=365), function(y){
|
||||
y[index]
|
||||
})
|
||||
} else {
|
||||
tapply(x,rep(1:(length(x)/365),each=365), selectPart)
|
||||
}
|
||||
}
|
||||
|
||||
bVectToInt<- function(bin_vector){
|
||||
bin_vector <- rev(as.integer(bin_vector))
|
||||
packBits(as.raw(c(bin_vector,numeric(32-length(bin_vector)))),"integer")
|
||||
}
|
||||
|
||||
constMatToDec <- function(constRes){
|
||||
tab <- table(apply(constRes,2,function(x){paste(x,collapse=" ")}))
|
||||
bitvect <- strsplit(names(tab[which.max(tab)]),split=" ")[[1]]
|
||||
bVectToInt(bitvect)
|
||||
}
|
||||
|
||||
compose <- function(expr){
|
||||
splt <- strsplit(expr,split="\\|")[[1]]
|
||||
lhs <- splt[1]
|
||||
rhs <- splt[2]
|
||||
penv <- parent.frame()
|
||||
lhsv <- eval(parse(text=lhs),envir=penv)
|
||||
penv[["lhsv"]] <- lhsv
|
||||
place <- regexpr("\\.[^0-9a-zA-Z]",rhs)
|
||||
|
||||
if(place != -1){
|
||||
finalExpression <- paste0(substr(rhs, 1, place -1),"lhsv",
|
||||
substr(rhs, place + 1, nchar(rhs)))
|
||||
} else {
|
||||
finalExpression <- paste0(rhs,"(lhsv)")
|
||||
}
|
||||
eval(parse(text=finalExpression),envir=penv)
|
||||
}
|
||||
|
||||
compoVect <- function(mod, constrTable, fileToWrite = "const_results.data"){
|
||||
with(as.data.frame(mod), {
|
||||
nexpr <- nrow(constrTable)
|
||||
filtered <- numeric(nexpr)
|
||||
vali <- numeric(nexpr)
|
||||
for(i in 1:nexpr){
|
||||
val <- compose(constrTable[i,1])
|
||||
filtered[i] <- (val <= constrTable[i,3]) &&
|
||||
(val >= constrTable[i,2])
|
||||
vali[i] <- val
|
||||
}
|
||||
|
||||
write(paste(vali,collapse=","), fileToWrite, append=TRUE)
|
||||
filtered
|
||||
})
|
||||
}
|
||||
|
||||
modCont <- function(expr, datf, interval, dumping_factor){
|
||||
tryCatch({
|
||||
if((with(datf,eval(parse(text=expr))) %between% interval)){
|
||||
return(NA)
|
||||
} else{
|
||||
return(dumping_factor)
|
||||
}
|
||||
},
|
||||
error = function(e){
|
||||
stop(sprintf("Cannot find the variable names in the dataframe, detail:\n%s",
|
||||
e))
|
||||
})
|
||||
}
|
||||
|
||||
copyToThreadDirs2 <- function(iniSource, thread_prefix = "thread", numCores, execPath="./",
|
||||
|
||||
executable = ifelse(Sys.info()[1]=="Linux", file.path(execPath, "muso"),
|
||||
file.path(execPath,"muso.exe"))){
|
||||
sapply(iniSource, function(x){
|
||||
flatMuso(x, execPath,
|
||||
directory=file.path("tmp", paste0(thread_prefix,"_1"),tools::file_path_sans_ext(basename(x)),""), d =TRUE)
|
||||
file.copy(executable,
|
||||
file.path("tmp", paste0(thread_prefix,"_1"),tools::file_path_sans_ext(basename(x))))
|
||||
tryCatch(file.copy(file.path(execPath,"cygwin1.dll"),
|
||||
file.path("tmp", paste0(thread_prefix,"_1"),tools::file_path_sans_ext(basename(x)))),
|
||||
error = function(e){"If you are in Windows..."})
|
||||
})
|
||||
sapply(2:numCores,function(thread){
|
||||
dir.create(sprintf("tmp/%s_%s",thread_prefix,thread), showWarnings=FALSE)
|
||||
file.copy(list.files(sprintf("tmp/%s_1",thread_prefix),full.names = TRUE),sprintf("tmp/%s_%s/",thread_prefix,thread),
|
||||
recursive=TRUE, overwrite = TRUE)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
|
||||
#' multiSiteCalib
|
||||
#'
|
||||
#' This funtion uses the Monte Carlo technique to uniformly sample the parameter space from user defined parameters of the Biome-BGCMuSo model. The sampling algorithm ensures that the parameters are constrained by the model logic which means that parameter dependencies are fully taken into account (parameter dependency means that e.g leaf C:N ratio must be smaller than C:N ratio of litter; more complicated rules apply to the allocation parameters where the allocation fractions to different plant compartments must sum up 1). This function implements a mathematically correct solution to provide uniform distriution of the random parameters on convex polytopes.
|
||||
#' @author Roland HOLLOS
|
||||
#' @importFrom future future
|
||||
#' @importFrom rpart rpart rpart.control
|
||||
#' @importFrom rpart.plot rpart.plot
|
||||
#' @param measuremets The table which contains the measurements
|
||||
#' @param calTable A dataframe which contantains the ini file locations and the domains they belongs to
|
||||
#' @param parameters A dataframe with the name, the minimum, and the maximum value for the parameters used in MonteCarlo experiment
|
||||
#' @param dataVar A named vector where the elements are the MuSo variable codes and the names are the same as provided in measurements and likelihood
|
||||
#' @param iterations The number of MonteCarlo experiments to be executed
|
||||
#' @param burnin Currently not used, altought it is the length of burnin period of the MCMC sampling used to generate random parameters
|
||||
#' @param likelihood A list of likelihood functions which names are linked to dataVar
|
||||
#' @param execPath If you are running the calibration from different location than the MuSo executable, you have to provide the path
|
||||
#' @param thread_prefix The prefix of thread directory names in the tmp directory created during the calibrational process
|
||||
#' @param numCores The number of processes used during the calibration. At default it uses one less than the number of threads available
|
||||
#' @param pb The progress bar function. If you use (web-)GUI you can provide a different function
|
||||
#' @param pbUpdate The update function for pb (progress bar)
|
||||
#' @param copyThread A boolean, recreate tmp directory for calibration or not (case of repeating the calibration)
|
||||
#' @param contsraints A dataframe containing the constraints logic the minimum and a maximum value for the calibration.
|
||||
#' @param th A trashold value for multisite calibration. What percentage of the site should satisfy the constraints.
|
||||
#' @param treeControl A list which controls (maximal complexity, maximal depth) the details of the decession tree making.
|
||||
#' @export
|
||||
multiSiteCalib <- function(measurements,
|
||||
calTable,
|
||||
parameters,
|
||||
dataVar,
|
||||
iterations = 100,
|
||||
burnin =ifelse(iterations < 3000, 3000, NULL),
|
||||
likelihood,
|
||||
execPath,
|
||||
thread_prefix="thread",
|
||||
numCores = (parallel::detectCores()-1),
|
||||
pb = txtProgressBar(min=0, max=iterations, style=3),
|
||||
pbUpdate = setTxtProgressBar,
|
||||
copyThread = TRUE,
|
||||
constraints=NULL, th = 10, treeControl=rpart.control()
|
||||
){
|
||||
future::plan(future::multisession)
|
||||
# file.remove(list.files(path = "tmp", pattern="progress.txt", recursive = TRUE, full.names=TRUE))
|
||||
# file.remove(list.files(path = "tmp", pattern="preservedCalib.csv", recursive = TRUE, full.names=TRUE))
|
||||
|
||||
# ____ _ _ _ _
|
||||
# / ___|_ __ ___ __ _| |_ ___ | |_| |__ _ __ ___ __ _ __| |___
|
||||
# | | | '__/ _ \/ _` | __/ _ \ | __| '_ \| '__/ _ \/ _` |/ _` / __|
|
||||
# | |___| | | __/ (_| | || __/ | |_| | | | | | __/ (_| | (_| \__ \
|
||||
# \____|_| \___|\__,_|\__\___| \__|_| |_|_| \___|\__,_|\__,_|___/
|
||||
if(copyThread){
|
||||
unlink("tmp",recursive=TRUE)
|
||||
copyToThreadDirs2(iniSource=calTable$site_id, numCores=numCores, execPath=execPath)
|
||||
} else {
|
||||
print("copy skipped")
|
||||
file.remove(file.path(list.dirs("tmp",recursive=FALSE),"progress.txt"))
|
||||
file.remove(file.path(list.dirs("tmp", recursive=FALSE), "const_results.data"))
|
||||
}
|
||||
|
||||
# ____ _ _ _
|
||||
# | _ \ _ _ _ __ | |_| |__ _ __ ___ __ _ __| |___
|
||||
# | |_) | | | | '_ \ | __| '_ \| '__/ _ \/ _` |/ _` / __|
|
||||
# | _ <| |_| | | | | | |_| | | | | | __/ (_| | (_| \__ \
|
||||
# |_| \_\\__,_|_| |_| \__|_| |_|_| \___|\__,_|\__,_|___/
|
||||
|
||||
threadCount <- distributeCores(iterations, numCores)
|
||||
fut <- lapply(1:numCores, function(i) {
|
||||
future({
|
||||
tryCatch(
|
||||
|
||||
{
|
||||
result <- multiSiteThread(measuredData = measurements, parameters = parameters, calTable=calTable,
|
||||
dataVar = dataVar, iterations = threadCount[i],
|
||||
likelihood = likelihood, threadNumber= i, constraints=constraints, th=th)
|
||||
# setwd("../../")
|
||||
# return(result)
|
||||
}
|
||||
|
||||
, error = function(e){
|
||||
# browser()
|
||||
sink("error.txt")
|
||||
print(e)
|
||||
sink()
|
||||
saveRDS(e,"error.RDS")
|
||||
writeLines(as.character(iterations),"progress.txt")
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
# _ _
|
||||
# __ ____ _| |_ ___| |__ _ __ _ __ ___ __ _ _ __ ___ ___ ___
|
||||
# \ \ /\ / / _` | __/ __| '_ \ | '_ \| '__/ _ \ / _` | '__/ _ \/ __/ __|
|
||||
# \ V V / (_| | || (__| | | | | |_) | | | (_) | (_| | | | __/\__ \__ \
|
||||
# \_/\_/ \__,_|\__\___|_| |_| | .__/|_| \___/ \__, |_| \___||___/___/
|
||||
# |_| |___/
|
||||
|
||||
getProgress <- function(){
|
||||
# threadfiles <- list.files(settings$inputLoc, pattern="progress.txt", recursive = TRUE)
|
||||
threadfiles <- list.files(pattern="progress.txt", recursive = TRUE)
|
||||
if(length(threadfiles)==0){
|
||||
return(0)
|
||||
} else {
|
||||
sum(sapply(threadfiles, function(x){
|
||||
partRes <- readLines(x)
|
||||
if(length(partRes)==0){
|
||||
return(0)
|
||||
} else {
|
||||
return(as.numeric(partRes))
|
||||
}
|
||||
|
||||
}))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
progress <- 0
|
||||
while(progress < iterations){
|
||||
Sys.sleep(1)
|
||||
progress <- tryCatch(getProgress(), error=function(e){progress})
|
||||
if(is.null(pb)){
|
||||
pbUpdate(as.numeric(progress))
|
||||
} else {
|
||||
pbUpdate(pb,as.numeric(progress))
|
||||
}
|
||||
}
|
||||
if(!is.null(pb)){
|
||||
close(pb)
|
||||
}
|
||||
|
||||
# ____ _ _
|
||||
# / ___|___ _ __ ___ | |__ (_)_ __ ___
|
||||
# | | / _ \| '_ ` _ \| '_ \| | '_ \ / _ \
|
||||
# | |__| (_) | | | | | | |_) | | | | | __/
|
||||
# \____\___/|_| |_| |_|_.__/|_|_| |_|\___|
|
||||
|
||||
if(!is.null(constraints)){
|
||||
constRes <- file.path(list.dirs("tmp", recursive=FALSE), "const_results.data")
|
||||
constRes <- lapply(constRes, function(f){read.csv(f, stringsAsFactors=FALSE, header=FALSE)})
|
||||
constRes <- do.call(rbind,constRes)
|
||||
write.csv(constRes, "constRes.csv")
|
||||
}
|
||||
resultFiles <- list.files(pattern="preservedCalib.*csv$",recursive=TRUE)
|
||||
res0 <- read.csv(grep("thread_1/",resultFiles, value=TRUE),stringsAsFactors=FALSE)
|
||||
resultFilesSans0 <- grep("thread_1/", resultFiles, value=TRUE, invert=TRUE)
|
||||
# results <- do.call(rbind,lapply(resultFilesSans0, function(f){read.csv(f, stringsAsFactors=FALSE)}))
|
||||
resultsSans0 <- lapply(resultFilesSans0, function(f){read.csv(f, stringsAsFactors=FALSE, header=FALSE)})
|
||||
resultsSans0 <- do.call(rbind,resultsSans0)
|
||||
colnames(resultsSans0) <- colnames(res0)
|
||||
results <- (rbind(res0,resultsSans0))
|
||||
write.csv(results,"result.csv")
|
||||
calibrationPar <- future::value(fut[[1]], stdout = FALSE, signal=FALSE)[["calibrationPar"]]
|
||||
if(!is.null(constraints)){
|
||||
tryCatch({
|
||||
notForTree <- c(seq(from = (length(calibrationPar)+1), length.out=3))
|
||||
notForTree <- c(notForTree,which(sapply(seq_along(calibrationPar),function(i){sd(results[,i])==0})))
|
||||
treeData <- results[,-notForTree]
|
||||
treeData["failType"] <- as.factor(results$failType)
|
||||
if(ncol(treeData) > 4){
|
||||
rp <- rpart(failType ~ .,data=treeData,control=treeControl)
|
||||
svg("treeplot.svg")
|
||||
rpart.plot(rp)
|
||||
dev.off()
|
||||
}
|
||||
}, error = function(e){
|
||||
print(e)
|
||||
})
|
||||
}
|
||||
origModOut <- future::value(fut[[1]], stdout = FALSE, signal=FALSE)[["origModOut"]]
|
||||
# Just single objective version TODO:Multiobjective
|
||||
results <- results[results[,"Const"] == 1,]
|
||||
if(nrow(results)==0){
|
||||
stop("No simulation suitable for constraints\n Please see treeplot.png for explanation, if you have more than four parameters.")
|
||||
}
|
||||
bestCase <- which.max(results[,length(calibrationPar) + 1])
|
||||
parameters <- results[bestCase,1:length(calibrationPar)] # the last two column is the (log) likelihood and the rmse
|
||||
#TODO: Have to put that before multiSiteThread, we should not have to calculate it at every iterations
|
||||
|
||||
firstDir <- list.dirs("tmp/thread_1",full.names=TRUE,recursive =FALSE)[1]
|
||||
epcFile <- list.files(firstDir, pattern = "\\.epc",full.names=TRUE)
|
||||
settingsProto <- setupMuso(inputLoc = firstDir,
|
||||
iniInput =rep(list.files(firstDir, pattern = "\\.ini",full.names=TRUE),2))
|
||||
alignIndexes <- commonIndexes(settingsProto, measurements)
|
||||
musoCodeToIndex <- sapply(dataVar,function(musoCode){
|
||||
settingsProto$dailyOutputTable[settingsProto$dailyOutputTable$code == musoCode,"index"]
|
||||
})
|
||||
|
||||
|
||||
setwd("tmp/thread_1")
|
||||
aposteriori<- spatialRun(settingsProto, calibrationPar, parameters, calTable)
|
||||
file.copy(list.files(list.dirs(full.names=TRUE, recursive=FALSE)[1], pattern=".*\\.epc", full.names=TRUE),
|
||||
"../../multiSiteOptim.epc", overwrite=TRUE)
|
||||
setwd("../../")
|
||||
#TODO: Have to put that before multiSiteThread, we should not have to calculate it at every iterations
|
||||
nameGroupTable <- calTable
|
||||
nameGroupTable[,1] <- tools::file_path_sans_ext(basename(nameGroupTable[,1]))
|
||||
res <- list()
|
||||
|
||||
res[["calibrationPar"]] <- calibrationPar
|
||||
res[["parameters"]] <- parameters
|
||||
# browser()
|
||||
res[["comparison"]] <- compareCalibratedWithOriginal(key = names(dataVar)[1], modOld=origModOut, modNew=aposteriori, mes=measurements,
|
||||
|
||||
likelihoods = likelihood,
|
||||
alignIndexes = alignIndexes,
|
||||
musoCodeToIndex = musoCodeToIndex,
|
||||
nameGroupTable = nameGroupTable, mean)
|
||||
res[["likelihood"]] <- results[bestCase,ncol(results)-2]
|
||||
comp <- res$comparison
|
||||
res[["originalMAE"]] <- mean(abs((comp[,1]-comp[,3])))
|
||||
res[["MAE"]] <- mean(abs((comp[,2]-comp[,3])))
|
||||
res[["RMSE"]] <- results[bestCase,ncol(results)-2]
|
||||
res[["originalRMSE"]] <- sqrt(mean((comp[,1]-comp[,3])^2))
|
||||
res[["originalR2"]] <- summary(lm(measured ~ original,data=res$comparison))$r.squared
|
||||
res[["R2"]] <- summary(lm(measured ~ calibrated, data=res$comparison))$r.squared
|
||||
saveRDS(res,"results.RDS")
|
||||
png("calibRes.png")
|
||||
opar <- par(mar=c(5,5,4,2)+0.1, xpd=FALSE)
|
||||
with(data=res$comparison, {
|
||||
plot(measured,original,
|
||||
ylim=c(min(c(measured,original,calibrated)),
|
||||
max(c(measured,original,calibrated))),
|
||||
xlim=c(min(c(measured,original,calibrated)),
|
||||
max(c(measured,original,calibrated))),
|
||||
xlab=expression("measured "~(kg[DM]~m^-2)),
|
||||
ylab=expression("simulated "~(kg[DM]~m^-2)),
|
||||
cex.lab=1.3,
|
||||
col="red",
|
||||
pch=19,
|
||||
pty="s"
|
||||
)
|
||||
points(measured,calibrated, pch=19, col="blue")
|
||||
abline(0,1)
|
||||
legend(x="top",
|
||||
pch=c(19,19),
|
||||
col=c("red","blue"),
|
||||
inset=c(0,-0.1),
|
||||
legend=c("original","calibrated"),
|
||||
ncol=2,
|
||||
box.lty=0,
|
||||
xpd=TRUE
|
||||
)
|
||||
})
|
||||
dev.off()
|
||||
return(res)
|
||||
}
|
||||
|
||||
#' multiSiteThread
|
||||
#'
|
||||
#' This is an
|
||||
#' @author Roland HOLLOS
|
||||
|
||||
|
||||
multiSiteThread <- function(measuredData, parameters = NULL, startDate = NULL,
|
||||
endDate = NULL, formatString = "%Y-%m-%d", calTable,
|
||||
dataVar, outLoc = "./calib",
|
||||
outVars = NULL, iterations = 300,
|
||||
skipSpinup = TRUE, plotName = "calib.jpg",
|
||||
modifyOriginal=TRUE, likelihood, uncertainity = NULL, burnin=NULL,
|
||||
naVal = NULL, postProcString = NULL, threadNumber, constraints=NULL,th=10) {
|
||||
|
||||
originalRun <- list()
|
||||
nameGroupTable <- calTable
|
||||
nameGroupTable[,1] <- tools::file_path_sans_ext(basename(nameGroupTable[,1]))
|
||||
setwd(paste0("tmp/thread_",threadNumber))
|
||||
firstDir <- list.dirs(full.names=FALSE,recursive =FALSE)[1]
|
||||
epcFile <- list.files(firstDir, pattern = "\\.epc",full.names=TRUE)
|
||||
settingsProto <- setupMuso(inputLoc = firstDir,
|
||||
iniInput =rep(list.files(firstDir, pattern = "\\.ini",full.names=TRUE),2))
|
||||
|
||||
# Exanding likelihood
|
||||
likelihoodFull <- as.list(rep(NA,length(dataVar)))
|
||||
names(likelihoodFull) <- names(dataVar)
|
||||
if(!missing(likelihood)) {
|
||||
lapply(names(likelihood),function(x){
|
||||
likelihoodFull[[x]] <<- likelihood[[x]]
|
||||
})
|
||||
}
|
||||
|
||||
defaultLikelihood <- which(is.na(likelihood))
|
||||
if(length(defaultLikelihood)>0){
|
||||
likelihoodFull[[defaultLikelihood]] <- (function(x, y){
|
||||
exp(-sqrt(mean((x-y)^2)))
|
||||
})
|
||||
}
|
||||
|
||||
mdata <- measuredData
|
||||
if(is.null(parameters)){
|
||||
parameters <- tryCatch(read.csv("parameters.csv", stringsAsFactor=FALSE), error = function (e) {
|
||||
stop("You need to specify a path for the parameters.csv, or a matrix.")
|
||||
})
|
||||
} else {
|
||||
if((!is.list(parameters)) & (!is.matrix(parameters))){
|
||||
parameters <- tryCatch(read.csv(parameters, stringsAsFactor=FALSE), error = function (e){
|
||||
stop("Cannot find neither parameters file neither the parameters matrix")
|
||||
})
|
||||
}}
|
||||
|
||||
print("optiMuso is randomizing the epc parameters now...",quote = FALSE)
|
||||
randVals <- musoRand(parameters = parameters,constrains = NULL, iterations = iterations)
|
||||
|
||||
origEpc <- readValuesFromFile(epcFile, randVals[[1]])
|
||||
partialResult <- matrix(ncol=length(randVals[[1]])+2*length(dataVar) + 2)
|
||||
colN <- randVals[[1]]
|
||||
colN[match(parameters[,2],randVals[[1]])] <- parameters[,1]
|
||||
colN[match(parameters[,2], randVals[[1]])[!is.na(match(parameters[,2],randVals[[1]]))]] <- parameters[,1]
|
||||
colnames(partialResult) <- c(colN,sprintf("%s_likelihood",names(dataVar)),
|
||||
sprintf("%s_rmse",names(dataVar)),"Const", "failType")
|
||||
numParameters <- length(colN)
|
||||
partialResult[1:numParameters] <- origEpc
|
||||
## Prepare the preservedCalib matrix for the faster
|
||||
## run.
|
||||
musoCodeToIndex <- sapply(dataVar,function(musoCode){
|
||||
settingsProto$dailyOutputTable[settingsProto$dailyOutputTable$code == musoCode,"index"]
|
||||
})
|
||||
|
||||
resultRange <- (numParameters + 1):(ncol(partialResult))
|
||||
randValues <- randVals[[2]]
|
||||
|
||||
settingsProto$calibrationPar <- randVals[[1]]
|
||||
|
||||
if(!is.null(naVal)){
|
||||
measuredData <- as.data.frame(measuredData)
|
||||
measuredData[measuredData == naVal] <- NA
|
||||
}
|
||||
resIterate <- 1:nrow(calTable)
|
||||
names(resIterate) <- tools::file_path_sans_ext(basename(calTable[,1]))
|
||||
alignIndexes <- commonIndexes(settingsProto, measuredData)
|
||||
if(threadNumber == 1){
|
||||
originalRun[["calibrationPar"]] <- randVals[[1]]
|
||||
|
||||
origModOut <- lapply(resIterate, function(i){
|
||||
dirName <- tools::file_path_sans_ext(basename(calTable[i,1]))
|
||||
setwd(dirName)
|
||||
settings <- settingsProto
|
||||
settings$outputLoc <- settings$inputLoc <- "./"
|
||||
settings$iniInput <- settings$inputFiles <- rep(paste0(dirName,".ini"),2)
|
||||
settings$outputNames <- rep(dirName,2)
|
||||
settings$executable <- ifelse(Sys.info()[1]=="Linux","./muso","./muso.exe") # set default exe option at start wold be better
|
||||
res <- tryCatch(calibMuso(settings=settings,parameters =origEpc, silent = TRUE, skipSpinup = TRUE), error=function(e){NA})
|
||||
setwd("../")
|
||||
res
|
||||
})
|
||||
originalRun[["origModOut"]] <- origModOut
|
||||
|
||||
partialResult[,resultRange] <- calcLikelihoodsForGroups(dataVar=dataVar,
|
||||
mod=origModOut,
|
||||
mes=measuredData,
|
||||
likelihoods=likelihood,
|
||||
alignIndexes=alignIndexes,
|
||||
musoCodeToIndex = musoCodeToIndex,nameGroupTable = nameGroupTable, groupFun=mean, constraints=constraints,th=th)
|
||||
|
||||
write.csv(x=randVals[[1]],"../randIndexes.csv")
|
||||
write.csv(x=partialResult, file="preservedCalib.csv",row.names=FALSE)
|
||||
}
|
||||
|
||||
print("Running the model with the random epc values...", quote = FALSE)
|
||||
for(i in 2:(iterations+1)){
|
||||
tmp <- lapply(resIterate, function(siteI){
|
||||
dirName <- tools::file_path_sans_ext(basename(calTable[siteI,1]))
|
||||
setwd(dirName)
|
||||
settings <- settingsProto
|
||||
settings$outputLoc <- settings$inputLoc <- "./"
|
||||
settings$iniInput <- settings$inputFiles <- rep(paste0(dirName,".ini"),2)
|
||||
settings$outputNames <- rep(dirName,2)
|
||||
settings$executable <- ifelse(Sys.info()[1]=="Linux","./muso","./muso.exe") # set default exe option at start wold be better
|
||||
|
||||
res <- tryCatch(calibMuso(settings=settings,parameters=randValues[(i-1),], silent = TRUE, skipSpinup = TRUE), error=function(e){NA})
|
||||
setwd("../")
|
||||
res
|
||||
})
|
||||
|
||||
if(is.null(tmp)){
|
||||
partialResult[,resultRange] <- NA
|
||||
} else {
|
||||
partialResult[,resultRange] <- calcLikelihoodsForGroups(dataVar=dataVar,
|
||||
mod=tmp,
|
||||
mes=measuredData,
|
||||
likelihoods=likelihood,
|
||||
alignIndexes=alignIndexes,
|
||||
musoCodeToIndex = musoCodeToIndex,nameGroupTable = nameGroupTable, groupFun=mean, constraints = constraints, th=th)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
partialResult[1:numParameters] <- randValues[(i-1),]
|
||||
write.table(x=partialResult, file="preservedCalib.csv", append=TRUE, row.names=FALSE,
|
||||
sep=",", col.names=FALSE)
|
||||
# write.csv(x=tmp, file=paste0(pretag, (i+1),".csv"))
|
||||
writeLines(as.character(i-1),"progress.txt") #UNCOMMENT IMPORTANT
|
||||
}
|
||||
}
|
||||
|
||||
if(threadNumber == 1){
|
||||
return(originalRun)
|
||||
}
|
||||
|
||||
return(0)
|
||||
}
|
||||
distributeCores <- function(iterations, numCores){
|
||||
perProcess<- iterations %/% numCores
|
||||
numSimu <- rep(perProcess,numCores)
|
||||
gainers <- sample(1:numCores, iterations %% numCores)
|
||||
numSimu[gainers] <- numSimu[gainers] + 1
|
||||
numSimu
|
||||
}
|
||||
|
||||
prepareFromAgroMo <- function(fName){
|
||||
obs <- read.table(fName, stringsAsFactors=FALSE, sep = ";", header=T)
|
||||
obs <- reshape(obs, timevar="var_id", idvar = "date", direction = "wide")
|
||||
dateCols <- apply(do.call(rbind,(strsplit(obs$date, split = "-"))),2,as.numeric)
|
||||
colnames(dateCols) <- c("year", "month", "day")
|
||||
cbind.data.frame(dateCols, obs)
|
||||
}
|
||||
|
||||
calcLikelihoodsForGroups <- function(dataVar, mod, mes,
|
||||
likelihoods, alignIndexes, musoCodeToIndex,
|
||||
nameGroupTable, groupFun, constraints,
|
||||
th = 10){
|
||||
|
||||
if(!is.null(constraints)){
|
||||
constRes<- sapply(mod,function(m){
|
||||
compoVect(m,constraints)
|
||||
})
|
||||
|
||||
failType <- constMatToDec(constRes)
|
||||
}
|
||||
|
||||
likelihoodRMSE <- sapply(names(dataVar),function(key){
|
||||
modelled <- as.vector(unlist(sapply(sort(names(alignIndexes)),
|
||||
function(domain_id){
|
||||
apply(do.call(cbind,
|
||||
lapply(nameGroupTable[,1][nameGroupTable[,2] == domain_id],
|
||||
function(site){mod[[site]][alignIndexes[[domain_id]]$model,musoCodeToIndex[key]]
|
||||
})),1,groupFun)
|
||||
|
||||
|
||||
|
||||
|
||||
})))
|
||||
|
||||
|
||||
measuredGroups <- split(mes,mes$domain_id)
|
||||
measured <- do.call(rbind.data.frame, lapply(names(measuredGroups), function(domain_id){
|
||||
measuredGroups[[domain_id]][alignIndexes[[domain_id]]$meas,]
|
||||
}))
|
||||
measured <- measured[measured$var_id == key,]
|
||||
res <- c(likelihoods[[key]](modelled, measured),
|
||||
sqrt(mean((modelled-measured$mean)^2))
|
||||
)
|
||||
|
||||
|
||||
print(abs(mean(modelled)-mean(measured$mean)))
|
||||
res
|
||||
})
|
||||
|
||||
likelihoodRMSE <- c(likelihoodRMSE[1,], likelihoodRMSE[2,],
|
||||
ifelse((100 * sum(apply(constRes, 2, prod)) / ncol(constRes)) >= th,
|
||||
1,0), failType)
|
||||
names(likelihoodRMSE) <- c(sprintf("%s_likelihood",dataVar), sprintf("%s_rmse",dataVar), "Const", "failType")
|
||||
return(likelihoodRMSE)
|
||||
}
|
||||
|
||||
commonIndexes <- function (settings,measuredData) {
|
||||
# Have to fix for other starting points also
|
||||
modelDates <- seq(from= as.Date(sprintf("%s-01-01",settings$startYear)),
|
||||
by="days",
|
||||
to=as.Date(sprintf("%s-12-31",settings$startYear+settings$numYears-1)))
|
||||
modelDates <- grep("-02-29",modelDates,invert=TRUE, value=TRUE)
|
||||
|
||||
lapply(split(measuredData,measuredData$domain_id),function(x){
|
||||
measuredDates <- x$date
|
||||
modIndex <- match(as.Date(measuredDates), as.Date(modelDates))
|
||||
measIndex <- which(!is.na(modIndex))
|
||||
modIndex <- modIndex[!is.na(modIndex)]
|
||||
cbind.data.frame(model=modIndex,meas=measIndex)
|
||||
})
|
||||
}
|
||||
|
||||
agroLikelihood <- function(modVector,measured){
|
||||
mu <- measured[,grep("mean", colnames(measured))]
|
||||
stdev <- measured[,grep("^sd", colnames(measured))]
|
||||
ndata <- nrow(measured)
|
||||
sum(sapply(1:ndata, function(x){
|
||||
dnorm(modVector, mu[x], stdev[x], log = TRUE)
|
||||
}), na.rm=TRUE)
|
||||
}
|
||||
|
||||
|
||||
#' compareCalibratedWithOriginal
|
||||
#'
|
||||
#' This functions compareses the likelihood and the RMSE values of the simulations and the measurements
|
||||
#' @param key
|
||||
compareCalibratedWithOriginal <- function(key, modOld, modNew, mes,
|
||||
likelihoods, alignIndexes, musoCodeToIndex, nameGroupTable,
|
||||
groupFun){
|
||||
|
||||
original <- as.vector(unlist(sapply(sort(names(alignIndexes)),
|
||||
function(domain_id){
|
||||
apply(do.call(cbind,
|
||||
lapply(nameGroupTable$site_id[nameGroupTable$domain_id == domain_id],
|
||||
function(site){
|
||||
modOld[[site]][alignIndexes[[domain_id]]$model,musoCodeToIndex[key]]
|
||||
})),1,groupFun)
|
||||
})))
|
||||
calibrated <- as.vector(unlist(sapply(sort(names(alignIndexes)),
|
||||
function(domain_id){
|
||||
apply(do.call(cbind,
|
||||
lapply(nameGroupTable$site_id[nameGroupTable$domain_id == domain_id],
|
||||
function(site){
|
||||
modNew[[site]][alignIndexes[[domain_id]]$model,musoCodeToIndex[key]]
|
||||
})),1,groupFun)
|
||||
})))
|
||||
measuredGroups <- split(mes,mes$domain_id)
|
||||
measured <- do.call(rbind.data.frame, lapply(names(measuredGroups), function(domain_id){
|
||||
measuredGroups[[domain_id]][alignIndexes[[domain_id]]$meas,]
|
||||
}))
|
||||
measured <- measured[measured$var_id == key,]
|
||||
return(data.frame(original = original, calibrated = calibrated,measured=measured$mean))
|
||||
}
|
||||
|
||||
|
||||
spatialRun <- function(settingsProto,calibrationPar, parameters, calTable){
|
||||
resIterate <- 1:nrow(calTable)
|
||||
names(resIterate) <- tools::file_path_sans_ext(basename(calTable[,1]))
|
||||
modOut <- lapply(resIterate, function(i){
|
||||
dirName <- tools::file_path_sans_ext(basename(calTable[i,1]))
|
||||
setwd(dirName)
|
||||
settings <- settingsProto
|
||||
settings$outputLoc <- settings$inputLoc <- "./"
|
||||
settings$iniInput <- settings$inputFiles <- rep(paste0(dirName,".ini"),2)
|
||||
settings$outputNames <- rep(dirName,2)
|
||||
settings$calibrationPar <- calibrationPar
|
||||
settings$executable <- ifelse(Sys.info()[1]=="Linux","./muso","./muso.exe") # set default exe option at start wold be better
|
||||
res <- tryCatch(calibMuso(settings=settings,parameters =parameters, silent = TRUE, skipSpinup = TRUE), error=function(e){NA})
|
||||
setwd("../")
|
||||
res
|
||||
})
|
||||
modOut
|
||||
}
|
||||
+61
-19
@@ -197,27 +197,69 @@ musoMonte <- function(settings=NULL,
|
||||
## csv files for each run
|
||||
|
||||
oneCsv <- function () {
|
||||
stop("This function is not implemented yet")
|
||||
## numDays <- settings$numdata[1]
|
||||
## if(!onDisk){
|
||||
## for(i in 1:iterations){
|
||||
|
||||
## parVar <- apply(parameters,1,function (x) {
|
||||
## runif(1, as.numeric(x[3]), as.numeric(x[4]))})
|
||||
|
||||
## preservedEpc[(i+1),] <- parVar
|
||||
## exportName <- paste0(preTag,".csv")
|
||||
## write.csv(parvar,"preservedEpc.csv",append=TRUE)
|
||||
## calibMuso(settings,debugging = "stamplog",
|
||||
## parameters = parVar,keepEpc = TRUE) %>%
|
||||
## {mutate(.,iD = i)} %>%
|
||||
## {write.csv(.,file=exportName,append=TRUE)}
|
||||
## }
|
||||
# stop("This function is not implemented yet")
|
||||
settings$iniInput[2] %>%
|
||||
(function(x) paste0(dirname(x),"/",tools::file_path_sans_ext(basename(x)),"-tmp.",tools::file_ext(x))) %>%
|
||||
unlink
|
||||
randValues <- randVals[[2]]
|
||||
settings$calibrationPar <- randVals[[1]]
|
||||
## randValues <- randValues[,randVals[[1]] %in% parameters[,2]][,rank(parameters[,2])]
|
||||
modellOut <- matrix(ncol = numVars, nrow = iterations + 1)
|
||||
|
||||
origModellOut <- calibMuso(settings=settings,silent=TRUE)
|
||||
write.csv(x=origModellOut, file=paste0(pretag,".csv"))
|
||||
|
||||
if(!is.list(fun)){
|
||||
funct <- rep(list(fun), numVars)
|
||||
}
|
||||
|
||||
## return(preservedEpc)
|
||||
## } else {
|
||||
tmp2 <- numeric(numVars)
|
||||
|
||||
for(j in 1:numVars){
|
||||
tmp2[j]<-funct[[j]](origModellOut[,j])
|
||||
}
|
||||
modellOut[1,]<- tmp2
|
||||
|
||||
for(i in 2:(iterations+1)){
|
||||
tmp <- tryCatch(calibMuso(settings = settings,
|
||||
parameters = randValues[(i-1),],
|
||||
silent= TRUE,
|
||||
skipSpinup = skipSpinup,
|
||||
keepEpc = keepEpc,
|
||||
debugging = debugging,
|
||||
outVars = outVars), error = function (e) NA)
|
||||
|
||||
## }
|
||||
if(!is.na(tmp)){
|
||||
for(j in 1:numVars){
|
||||
tmp2[j]<-funct[[j]](tmp[,j])
|
||||
}
|
||||
} else {
|
||||
for(j in 1:numVars){
|
||||
tmp2[j]<-rep(NA,length(settings$outputVars[[1]]))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
modellOut[i,]<- tmp2
|
||||
write.table(x=tmp, file=paste0(pretag,".csv"), append = TRUE,col.names = FALSE, sep = ",")
|
||||
setTxtProgressBar(progBar,i)
|
||||
}
|
||||
|
||||
paramLines <- parameters[,2]
|
||||
paramLines <- order(paramLines)
|
||||
randInd <- randVals[[1]][(randVals[[1]] %in% parameters[,2])]
|
||||
randInd <- order(randInd)
|
||||
|
||||
|
||||
epcStrip <- rbind(origEpc[order(parameters[,2])],
|
||||
randValues[,randVals[[1]] %in% parameters[,2]][,randInd])
|
||||
|
||||
|
||||
preservedEpc <- cbind(epcStrip,
|
||||
modellOut)
|
||||
colnames(preservedEpc) <- c(parameterNames[paramLines], sapply(outVarNames, function (x) paste0("mod.", x)))
|
||||
return(preservedEpc)
|
||||
}
|
||||
|
||||
netCDF <- function () {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#' @importFrom limSolve xsample
|
||||
#' @export
|
||||
|
||||
musoRand <- function(parameters, iterations=3000, fileType="epc", constrains = NULL){
|
||||
musoRand <- function(parameters, iterations=3000, fileType="epc", constrains = NULL, burnin = NULL){
|
||||
if(is.null(constrains)){
|
||||
constMatrix <- constrains
|
||||
constMatrix <- getOption("RMuso_constMatrix")[[fileType]][[as.character(getOption("RMuso_version"))]]
|
||||
@@ -176,7 +176,7 @@ musoRand <- function(parameters, iterations=3000, fileType="epc", constrains = N
|
||||
E <- do.call(rbind,lapply(Ef,function(x){x$E}))
|
||||
f <- do.call(c,lapply(Ef,function(x){x$f}))
|
||||
# browser()
|
||||
randVal <- suppressWarnings(limSolve::xsample(G=G,H=h,E=E,F=f,iter = iterations))$X
|
||||
randVal <- suppressWarnings(limSolve::xsample(G=G,H=h,E=E,F=f,burninlength=burnin, iter = iterations))$X
|
||||
} else{
|
||||
Gh0<-genMat0(dependences)
|
||||
randVal <- suppressWarnings(xsample(G=Gh0$G,H=Gh0$h, iter = iterations))$X
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
postProcMuso <- function(modelData, procString){
|
||||
cNames <- colnames(modelData)
|
||||
tocalc <- gsub("(@)(\\d)","modelData[,\\2]",procString)
|
||||
newVarName <- gsub("\\s","",unlist(strsplit(procString,"<-"))[1])
|
||||
assign(newVarName,eval(parse(text = unlist(strsplit(tocalc,"<-"))[2])))
|
||||
modelData <- cbind.data.frame(modelData,eval(parse(text = newVarName)))
|
||||
colnames(modelData) <- c(cNames,newVarName)
|
||||
modelData
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
## #' setupMuso6
|
||||
## #'
|
||||
## #' This is the setup function for MuSo version: 6
|
||||
## #'
|
||||
## #' @author Roland HOLLOS
|
||||
## #' @param setupFile
|
||||
## #' @export
|
||||
|
||||
## setupMuso6<- function(setupFile){
|
||||
|
||||
## }
|
||||
|
||||
## ini <- readLines("./hhs_apriori_MuSo6_normal.ini")
|
||||
## flags <- c("MET_INPUT",
|
||||
## "RESTART",
|
||||
## "TIME_DEFINE",
|
||||
## "CO2_CONTROL",
|
||||
## "NDEP_CONTROL",
|
||||
## "SITE",
|
||||
## "SOILPROP_FILE",
|
||||
## "EPC_FILE",
|
||||
## "MANAGEMENT_FILE",
|
||||
## "SIMULATION_CONTROL",
|
||||
## "W_STATE",
|
||||
## "CN_STATE",
|
||||
## "CLIM_CHANGE",
|
||||
## "CONDITIONAL_MANAGEMENT_STRATEGIES",
|
||||
## "OUTPUT_CONTROL",
|
||||
## "DAILY_OUTPUT",
|
||||
## "ANNUAL_OUTPUT",
|
||||
## "END_INIT")
|
||||
## getSegments <- function(ini, flags){
|
||||
## output <- list()
|
||||
## flagIterator <- 1:(length(flags)-1)
|
||||
## for(i in flagIterator){
|
||||
## output[[flags[i]]] <- lapply(ini[(grep(flags[i],ini)+1):(grep(flags[i+1],ini)-2)], function(x){
|
||||
## unlist(strsplit(x,split = "\\["))[1]
|
||||
## })
|
||||
## }
|
||||
## output
|
||||
## }
|
||||
## getSegments(ini,flags)
|
||||
|
||||
## gsub("(.*\\[\\|)([a-zA-Z1-9_]*)","",ini)
|
||||
## stringi::stri_trim_right("rexamine.com/", "\\[r\\]")
|
||||
## stri_extract("asdfasdf [|Ezat|]",regex = "\\[\\|*\\]")
|
||||
## lapply(ini,function(x) gsub("\\s","",(strsplit(x,split= "T]"))[[1]][2]))
|
||||
@@ -1,37 +0,0 @@
|
||||
---
|
||||
title: "An easy grouping algorithm"
|
||||
author: "Hollós Roland"
|
||||
date: "10/1/2019"
|
||||
output: pdf_document
|
||||
---
|
||||
|
||||
|
||||
|
||||
## R Markdown
|
||||
|
||||
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.
|
||||
|
||||
When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
|
||||
|
||||
|
||||
```r
|
||||
summary(cars)
|
||||
```
|
||||
|
||||
```
|
||||
## speed dist
|
||||
## Min. : 4.0 Min. : 2.00
|
||||
## 1st Qu.:12.0 1st Qu.: 26.00
|
||||
## Median :15.0 Median : 36.00
|
||||
## Mean :15.4 Mean : 42.98
|
||||
## 3rd Qu.:19.0 3rd Qu.: 56.00
|
||||
## Max. :25.0 Max. :120.00
|
||||
```
|
||||
|
||||
## Including Plots
|
||||
|
||||
You can also embed plots, for example:
|
||||
|
||||

|
||||
|
||||
Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 5.4 KiB |
@@ -1,27 +0,0 @@
|
||||
#' getDailyOutputList
|
||||
#'
|
||||
#' bla bla
|
||||
#' @param settings bla
|
||||
#' @export
|
||||
|
||||
|
||||
getDailyOutputList <- function(settings=NULL){
|
||||
if(is.null(settings)){
|
||||
settings<- setupMuso()
|
||||
}
|
||||
settings$dailyOutputTable
|
||||
}
|
||||
|
||||
#' getAnnualOutputList
|
||||
#'
|
||||
#' bla bla
|
||||
#' @param settings bla
|
||||
#' @export
|
||||
|
||||
|
||||
getAnnualOutputList <- function(settings=NULL){
|
||||
if(is.null(settings)){
|
||||
settings<- setupMuso()
|
||||
}
|
||||
settings$annualOutputTable
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
"child","parent","mod","name"
|
||||
"wth","ini",1,"weather"
|
||||
"endpoint","ini",1,"endpointIn"
|
||||
"endpoint","ini",2,"endpointOut"
|
||||
"txt","ini",1,"co2"
|
||||
"txt","ini",2,"nitrogen"
|
||||
"soi","ini",1,"soil"
|
||||
"epc","ini",1,"startEpc"
|
||||
"mgm","ini",1,"management"
|
||||
"plt","mgm",1,"planting"
|
||||
"thn","mgm",1,"thining"
|
||||
"mow","mgm",1,"mowing"
|
||||
"grz","mgm",1,"grazing"
|
||||
"hrv","mgm",1,"harvest"
|
||||
"cul","mgm",1,"cultivation"
|
||||
"frz","mgm",1,"fertilization"
|
||||
"irr","mgm",1,"irrigation"
|
||||
"epc","plt",0,"plantEpc"
|
||||
|
@@ -865,6 +865,7 @@
|
||||
"UNIT": "prop",
|
||||
"MIN": 0,
|
||||
"MAX": 0.1,
|
||||
"DEPENDENCE": 0,
|
||||
"GROUP": 0,
|
||||
"TYPE": 0
|
||||
},
|
||||
@@ -875,6 +876,7 @@
|
||||
"UNIT": "prop",
|
||||
"MIN": 0,
|
||||
"MAX": 0.1,
|
||||
"DEPENDENCE": 1,
|
||||
"GROUP": 0,
|
||||
"TYPE": 0
|
||||
},
|
||||
|
||||
@@ -2723,6 +2723,30 @@
|
||||
"units": "kgC m-2",
|
||||
"descriptions": "SUM of C deep leaching"
|
||||
},
|
||||
{
|
||||
"codes": 564,
|
||||
"names": "cwdc_above",
|
||||
"units": "kgC m-2",
|
||||
"descriptions": "Aboveground cwdc"
|
||||
},
|
||||
{
|
||||
"codes": 565,
|
||||
"names": "litrc_above",
|
||||
"units": "kgC m-2",
|
||||
"descriptions": "Aboveground litrc"
|
||||
},
|
||||
{
|
||||
"codes": 566,
|
||||
"names": "CNratioERR",
|
||||
"units": "kgC m-2",
|
||||
"descriptions": "CN ratio error"
|
||||
},
|
||||
{
|
||||
"codes": 567,
|
||||
"names": "flowHSsnk_C",
|
||||
"units": "kgC m-2",
|
||||
"descriptions": "C loss due to flower heat stress"
|
||||
},
|
||||
{
|
||||
"codes": 600,
|
||||
"names": "m_leafc_to_litr1c",
|
||||
@@ -12595,7 +12619,7 @@
|
||||
},
|
||||
{
|
||||
"codes": 2585,
|
||||
"names": "hydr_conductEND[6]",
|
||||
"names": "rootdepth5",
|
||||
"units": "ms-1",
|
||||
"descriptions": "Hydraulic conductivity at the end of the day of soil layer 7 (120-150 cm)"
|
||||
},
|
||||
|
||||
Regular → Executable
@@ -0,0 +1,21 @@
|
||||
context("Post processing")
|
||||
library(testthat)
|
||||
library(RBBGCMuso)
|
||||
setwd(system.file("examples/hhs","",package = "RBBGCMuso"))
|
||||
|
||||
test_that("Post processing string",{
|
||||
testMatrix1 <- data.frame(first = rep(1,5), second = rep(2,5), third = rep(3,5))
|
||||
testMatrix1c <- testMatrix1
|
||||
testMatrix1c[,"newCol"] <- testMatrix1c[,2] + 3 * testMatrix1c[,3]
|
||||
expect_equal(postProcMuso(testMatrix1,"newCol <- @2 + 3*@3"),testMatrix1c)
|
||||
})
|
||||
|
||||
test_that("calibMuso with postprocessing",{
|
||||
model <- calibMuso(skipSpinup = FALSE, silent = TRUE)
|
||||
modelc<- model
|
||||
newCol <- modelc[,1]
|
||||
modelc<- cbind.data.frame(modelc,newCol)
|
||||
modelc[,"newCol"]<- model[,5]+3*model[,7]
|
||||
expect_equal(calibMuso(skipSpinup = FALSE,silent = TRUE, postProcString = "newCol <- @5 + 3* @7"), modelc)
|
||||
})
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
\usage{
|
||||
calibrateMuso(
|
||||
measuredData,
|
||||
parameters = NULL,
|
||||
parameters = read.csv("parameters.csv", stringsAsFactor = FALSE),
|
||||
startDate = NULL,
|
||||
endDate = NULL,
|
||||
formatString = "\%Y-\%m-\%d",
|
||||
@@ -28,6 +28,7 @@ calibrateMuso(
|
||||
pb = txtProgressBar(min = 0, max = iterations, style = 3),
|
||||
maxLikelihoodEpc = TRUE,
|
||||
pbUpdate = setTxtProgressBar,
|
||||
outputLoc = "./",
|
||||
method = "GLUE",
|
||||
lg = FALSE,
|
||||
w = NULL,
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/flat.R
|
||||
\name{checkFileSystem}
|
||||
\alias{checkFileSystem}
|
||||
\title{checkFileSystem}
|
||||
\usage{
|
||||
checkFileSystem(iniName, root = ".", depTree = options("RMuso_depTree")[[1]])
|
||||
}
|
||||
\arguments{
|
||||
\item{iniName}{The name of the ini file}
|
||||
|
||||
\item{depTree}{The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]}
|
||||
}
|
||||
\description{
|
||||
This function checks the MuSo file system, if it is correct
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/multiSite.R
|
||||
\name{compareCalibratedWithOriginal}
|
||||
\alias{compareCalibratedWithOriginal}
|
||||
\title{compareCalibratedWithOriginal}
|
||||
\usage{
|
||||
compareCalibratedWithOriginal(
|
||||
key,
|
||||
modOld,
|
||||
modNew,
|
||||
mes,
|
||||
likelihoods,
|
||||
alignIndexes,
|
||||
musoCodeToIndex,
|
||||
nameGroupTable,
|
||||
groupFun
|
||||
)
|
||||
}
|
||||
\description{
|
||||
This functions compareses the likelihood and the RMSE values of the simulations and the measurements
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/flat.R
|
||||
\name{flatMuso}
|
||||
\alias{flatMuso}
|
||||
\title{flatMuso}
|
||||
\usage{
|
||||
flatMuso(
|
||||
iniName,
|
||||
execPath = "./",
|
||||
depTree = options("RMuso_depTree")[[1]],
|
||||
directory = "flatdir",
|
||||
d = TRUE,
|
||||
outE = TRUE
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{iniName}{The name of the ini file}
|
||||
|
||||
\item{depTree}{The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]}
|
||||
|
||||
\item{directory}{The destination directory for flattening. At default it will be flatdir}
|
||||
}
|
||||
\description{
|
||||
This function reads the ini file and creates a directory (named after the directory argument) with all the files the modell uses with this file. the directory will be flat.
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/flat.R
|
||||
\name{getFilePath}
|
||||
\alias{getFilePath}
|
||||
\title{getFilePath}
|
||||
\usage{
|
||||
getFilePath(
|
||||
iniName,
|
||||
fileType,
|
||||
execPath = "./",
|
||||
depTree = options("RMuso_depTree")[[1]]
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{iniName}{The name of the ini file}
|
||||
|
||||
\item{depTree}{The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]}
|
||||
|
||||
\item{filetype}{The type of the choosen file. For options see options("RMuso_depTree")[[1]]$name}
|
||||
}
|
||||
\description{
|
||||
This function reads the ini file and for a chosen fileType it gives you the filePath
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/flat.R
|
||||
\name{getFilesFromIni}
|
||||
\alias{getFilesFromIni}
|
||||
\title{getFilesFromIni}
|
||||
\usage{
|
||||
getFilesFromIni(
|
||||
iniName,
|
||||
execPath = "./",
|
||||
depTree = options("RMuso_depTree")[[1]]
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{iniName}{The name of the ini file}
|
||||
|
||||
\item{depTree}{The file dependency defining dataframe. At default it is: options("RMuso_depTree")[[1]]}
|
||||
}
|
||||
\description{
|
||||
This function reads the ini file and gives yout back the path of all file involved in model run
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/multiSite.R
|
||||
\name{multiSiteCalib}
|
||||
\alias{multiSiteCalib}
|
||||
\title{multiSiteCalib}
|
||||
\usage{
|
||||
multiSiteCalib(
|
||||
measurements,
|
||||
calTable,
|
||||
parameters,
|
||||
dataVar,
|
||||
iterations = 100,
|
||||
burnin = ifelse(iterations < 3000, 3000, NULL),
|
||||
likelihood,
|
||||
execPath,
|
||||
thread_prefix = "thread",
|
||||
numCores = (parallel::detectCores() - 1),
|
||||
pb = txtProgressBar(min = 0, max = iterations, style = 3),
|
||||
pbUpdate = setTxtProgressBar,
|
||||
copyThread = TRUE,
|
||||
constraints = NULL,
|
||||
th = 10,
|
||||
treeControl = rpart.control()
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{calTable}{A dataframe which contantains the ini file locations and the domains they belongs to}
|
||||
|
||||
\item{parameters}{A dataframe with the name, the minimum, and the maximum value for the parameters used in MonteCarlo experiment}
|
||||
|
||||
\item{dataVar}{A named vector where the elements are the MuSo variable codes and the names are the same as provided in measurements and likelihood}
|
||||
|
||||
\item{iterations}{The number of MonteCarlo experiments to be executed}
|
||||
|
||||
\item{burnin}{Currently not used, altought it is the length of burnin period of the MCMC sampling used to generate random parameters}
|
||||
|
||||
\item{likelihood}{A list of likelihood functions which names are linked to dataVar}
|
||||
|
||||
\item{execPath}{If you are running the calibration from different location than the MuSo executable, you have to provide the path}
|
||||
|
||||
\item{thread_prefix}{The prefix of thread directory names in the tmp directory created during the calibrational process}
|
||||
|
||||
\item{numCores}{The number of processes used during the calibration. At default it uses one less than the number of threads available}
|
||||
|
||||
\item{pb}{The progress bar function. If you use (web-)GUI you can provide a different function}
|
||||
|
||||
\item{pbUpdate}{The update function for pb (progress bar)}
|
||||
|
||||
\item{copyThread}{A boolean, recreate tmp directory for calibration or not (case of repeating the calibration)}
|
||||
|
||||
\item{th}{A trashold value for multisite calibration. What percentage of the site should satisfy the constraints.}
|
||||
|
||||
\item{treeControl}{A list which controls (maximal complexity, maximal depth) the details of the decession tree making.}
|
||||
|
||||
\item{measuremets}{The table which contains the measurements}
|
||||
|
||||
\item{contsraints}{A dataframe containing the constraints logic the minimum and a maximum value for the calibration.}
|
||||
}
|
||||
\description{
|
||||
This funtion uses the Monte Carlo technique to uniformly sample the parameter space from user defined parameters of the Biome-BGCMuSo model. The sampling algorithm ensures that the parameters are constrained by the model logic which means that parameter dependencies are fully taken into account (parameter dependency means that e.g leaf C:N ratio must be smaller than C:N ratio of litter; more complicated rules apply to the allocation parameters where the allocation fractions to different plant compartments must sum up 1). This function implements a mathematically correct solution to provide uniform distriution of the random parameters on convex polytopes.
|
||||
}
|
||||
\author{
|
||||
Roland HOLLOS
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
% Generated by roxygen2: do not edit by hand
|
||||
% Please edit documentation in R/multiSite.R
|
||||
\name{multiSiteThread}
|
||||
\alias{multiSiteThread}
|
||||
\title{multiSiteThread}
|
||||
\usage{
|
||||
multiSiteThread(
|
||||
measuredData,
|
||||
parameters = NULL,
|
||||
startDate = NULL,
|
||||
endDate = NULL,
|
||||
formatString = "\%Y-\%m-\%d",
|
||||
calTable,
|
||||
dataVar,
|
||||
outLoc = "./calib",
|
||||
outVars = NULL,
|
||||
iterations = 300,
|
||||
skipSpinup = TRUE,
|
||||
plotName = "calib.jpg",
|
||||
modifyOriginal = TRUE,
|
||||
likelihood,
|
||||
uncertainity = NULL,
|
||||
burnin = NULL,
|
||||
naVal = NULL,
|
||||
postProcString = NULL,
|
||||
threadNumber,
|
||||
constraints = NULL,
|
||||
th = 10
|
||||
)
|
||||
}
|
||||
\description{
|
||||
This is an
|
||||
}
|
||||
\author{
|
||||
Roland HOLLOS
|
||||
}
|
||||
@@ -4,7 +4,13 @@
|
||||
\alias{musoRand}
|
||||
\title{musoRand}
|
||||
\usage{
|
||||
musoRand(parameters, iterations = 3000, fileType = "epc", constrains = NULL)
|
||||
musoRand(
|
||||
parameters,
|
||||
iterations = 3000,
|
||||
fileType = "epc",
|
||||
constrains = NULL,
|
||||
burnin = NULL
|
||||
)
|
||||
}
|
||||
\arguments{
|
||||
\item{parameters}{This is a dataframe (heterogeneous data-matrix), where the first column is the name of the parameter, the second is a numeric vector of the rownumbers of the given variable in the input EPC file, and the last two columns describe the minimum and the maximum of the parameter (i.e. the parameter ranges), defining the interval for the randomization.}
|
||||
|
||||
@@ -10,7 +10,7 @@ saveAllMusoPlots(
|
||||
silent = TRUE,
|
||||
type = "line",
|
||||
outFile = "annual.csv",
|
||||
colour = NULL,
|
||||
colour = "blue",
|
||||
skipSpinup = FALSE
|
||||
)
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ updateMusoMapping(excelName, dest = "./", version = getOption("RMuso_version"))
|
||||
The output code-variable matrix, and also the function changes the global variable
|
||||
}
|
||||
\description{
|
||||
This function updates the Biome-BGCMuSo output code-variable matrix. Within Biome-BGCMuSo the state variables and fluxes are marked by integer numbers. In order to provide meaningful variable names (e.g. 3009 means Gross Primary Production in Biome-BGCMuSo v5) a conversion table is needed which is handled by this function.
|
||||
This function updates the Biome-BGCMuSo output code-variable matrix (creates a json file that is used internally by RBBGCMuso). Within Biome-BGCMuSo the output state variablesare marked by integer numbers (see the User's Guide). In order to provide meaningful variable names (e.g. 3009 means Gross Primary Production) a conversion table is needed which is handled by this function. The input Excel file must have the following column order: name, index, units, description (plus other optional columns line group). name refers to the abbreviation of the variable; index is the integer number of the output variable; unit is the unit of the variable; description is a meaningful text to explain the variable. The script will NOT work with other column order!
|
||||
}
|
||||
\author{
|
||||
Roland HOLLOS
|
||||
|
||||
Reference in New Issue
Block a user