computePETProcs <- function(){
message <- .cdtData$GalParams$message
Insert.Messages.Out(paste(message[['10']], .cdtData$GalParams$Tstep, "......"), TRUE, "i")
if(.cdtData$GalParams$data.type == "cdtstation"){
tmin <- getStnOpenData(.cdtData$GalParams$cdtstation$tmin)
if(is.null(tmin)) return(NULL)
tmin <- getCDTdataAndDisplayMsg(tmin, .cdtData$GalParams$Tstep, .cdtData$GalParams$cdtstation$tmin)
if(is.null(tmin)) return(NULL)
tmax <- getStnOpenData(.cdtData$GalParams$cdtstation$tmax)
if(is.null(tmax)) return(NULL)
tmax <- getCDTdataAndDisplayMsg(tmax, .cdtData$GalParams$Tstep, .cdtData$GalParams$cdtstation$tmax)
if(is.null(tmax)) return(NULL)
if(!any(tmin$id %in% tmax$id)){
Insert.Messages.Out(message[['11']], TRUE, 'e')
return(NULL)
}
if(!any(tmin$dates %in% tmax$dates)){
Insert.Messages.Out(message[['12']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
prec <- getStnOpenData(.cdtData$GalParams$cdtstation$prec)
if(is.null(prec)) return(NULL)
prec <- getCDTdataAndDisplayMsg(prec, .cdtData$GalParams$Tstep, .cdtData$GalParams$cdtstation$prec)
if(is.null(prec)) return(NULL)
if(length(Reduce(intersect, list(tmin$id, tmax$id, prec$id))) == 0){
Insert.Messages.Out(message[['13']], TRUE, 'e')
return(NULL)
}
if(length(Reduce(intersect, list(tmin$dates, tmax$dates, prec$dates))) == 0){
Insert.Messages.Out(message[['14']], TRUE, 'e')
return(NULL)
}
}
##################
inx <- match(tmin$dates, tmax$dates)
inx <- inx[!is.na(inx)]
tmax$dates <- tmax$dates[inx]
if(.cdtData$GalParams$method == "HAR"){
daty <- tmax$dates
tmax$data <- tmax$data[inx, , drop = FALSE]
tmin$data <- tmin$data[tmin$dates %in% tmax$dates, , drop = FALSE]
}else{
inp <- match(tmin$dates, prec$dates)
inp <- inp[!is.na(inp)]
prec$dates <- prec$dates[inp]
ixp <- match(tmax$dates, prec$dates)
ixp <- ixp[!is.na(ixp)]
daty <- prec$dates[ixp]
prec$data <- prec$data[ixp, , drop = FALSE]
tmax$data <- tmax$data[tmax$dates %in% prec$dates, , drop = FALSE]
tmin$data <- tmin$data[tmin$dates %in% prec$dates, , drop = FALSE]
}
##################
jnx <- match(tmin$id, tmax$id)
jnx <- jnx[!is.na(jnx)]
tmax$id <- tmax$id[jnx]
if(.cdtData$GalParams$method == "HAR"){
stn.id <- tmax$id
stn.lon <- tmax$lon[jnx]
stn.lat <- tmax$lat[jnx]
tmax$data <- tmax$data[, jnx, drop = FALSE]
tmin$data <- tmin$data[, tmin$id %in% tmax$id, drop = FALSE]
}else{
jnp <- match(tmin$id, prec$id)
jnp <- jnp[!is.na(jnp)]
prec$id <- prec$id[jnp]
jxp <- match(tmax$id, prec$id)
jxp <- jxp[!is.na(jxp)]
stn.id <- prec$id[jxp]
stn.lon <- prec$lon[jxp]
stn.lat <- prec$lat[jxp]
prec$data <- prec$data[, jxp, drop = FALSE]
tmax$data <- tmax$data[, tmax$id %in% prec$id, drop = FALSE]
tmin$data <- tmin$data[, tmin$id %in% prec$id, drop = FALSE]
}
##################
Ra <- extraterrestrial_radiation_annual(stn.lat, .cdtData$GalParams$Tstep)
indx <- cdt.index.RA.PET(daty, .cdtData$GalParams$Tstep)
Ra <- Ra[indx$index, , drop = FALSE]
prec <- if(.cdtData$GalParams$method == "MHAR") prec else NULL
etp <- Ref.ET.Hargreaves(tmax$data, tmin$data, Ra, .cdtData$GalParams$Tstep, prec$data)
etp <- indx$multi * etp
etp <- round(etp, 1)
##################
etp[is.na(etp)] <- .cdtData$Config$missval
xhead <- rbind(stn.id, stn.lon, stn.lat)
chead <- c('ID.STN', 'LON', paste0(toupper(.cdtData$GalParams$Tstep), '/LAT'))
infohead <- cbind(chead, xhead)
etp <- rbind(infohead, cbind(daty, etp))
writeFiles(etp, .cdtData$GalParams$output)
rm(tmax, tmin, prec, etp, Ra)
}
#######################################################
if(.cdtData$GalParams$data.type == "cdtnetcdf"){
tnDataInfo <- getNCDFSampleData(.cdtData$GalParams$cdtnetcdf$tmin$sample)
if(is.null(tnDataInfo)){
Insert.Messages.Out(message[['15']], TRUE, 'e')
return(NULL)
}
txDataInfo <- getNCDFSampleData(.cdtData$GalParams$cdtnetcdf$tmax$sample)
if(is.null(txDataInfo)){
Insert.Messages.Out(message[['16']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
rrDataInfo <- getNCDFSampleData(.cdtData$GalParams$cdtnetcdf$prec$sample)
if(is.null(rrDataInfo)){
Insert.Messages.Out(message[['17']], TRUE, 'e')
return(NULL)
}
}
##################
SP1 <- defSpatialPixels(tnDataInfo[c('lon', 'lat')])
SP2 <- defSpatialPixels(txDataInfo[c('lon', 'lat')])
if(is.diffSpatialPixelsObj(SP1, SP2, tol = 1e-04)){
Insert.Messages.Out(message[['18']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
SP3 <- defSpatialPixels(rrDataInfo[c('lon', 'lat')])
if(is.diffSpatialPixelsObj(SP1, SP3, tol = 1e-04)){
Insert.Messages.Out(message[['19']], TRUE, 'e')
return(NULL)
}
rm(SP3)
}
rm(SP1, SP2)
##################
tstep <- .cdtData$GalParams$Tstep
months <- 1:12
start.date <- as.Date(.cdtData$GalParams$cdtnetcdf$range[1])
end.date <- as.Date(.cdtData$GalParams$cdtnetcdf$range[2])
tmin.DIR <- .cdtData$GalParams$cdtnetcdf$tmin$dir
tmin.Format <- .cdtData$GalParams$cdtnetcdf$tmin$format
tmin.errmsg <- message[['20']]
tminInfo <- ncFilesInfo(tstep, start.date, end.date, months, tmin.DIR, tmin.Format, tmin.errmsg)
if(is.null(tminInfo)) return(NULL)
tminInfo$ncinfo <- list(xo = tnDataInfo$ilon, yo = tnDataInfo$ilat, varid = tnDataInfo$varid)
tminInfo$dates <- tminInfo$dates[tminInfo$exist]
tminInfo$nc.files <- tminInfo$nc.files[tminInfo$exist]
tminInfo$exist <- tminInfo$exist[tminInfo$exist]
tmax.DIR <- .cdtData$GalParams$cdtnetcdf$tmax$dir
tmax.Format <- .cdtData$GalParams$cdtnetcdf$tmax$format
tmax.errmsg <- message[['21']]
tmaxInfo <- ncFilesInfo(tstep, start.date, end.date, months, tmax.DIR, tmax.Format, tmax.errmsg)
if(is.null(tmaxInfo)) return(NULL)
tmaxInfo$ncinfo <- list(xo = txDataInfo$ilon, yo = txDataInfo$ilat, varid = txDataInfo$varid)
tmaxInfo$dates <- tmaxInfo$dates[tmaxInfo$exist]
tmaxInfo$nc.files <- tmaxInfo$nc.files[tmaxInfo$exist]
tmaxInfo$exist <- tmaxInfo$exist[tmaxInfo$exist]
if(.cdtData$GalParams$method == "MHAR"){
prec.DIR <- .cdtData$GalParams$cdtnetcdf$prec$dir
prec.Format <- .cdtData$GalParams$cdtnetcdf$prec$format
prec.errmsg <- message[['22']]
precInfo <- ncFilesInfo(tstep, start.date, end.date, months, prec.DIR, prec.Format, prec.errmsg)
if(is.null(tmaxInfo)) return(NULL)
precInfo$ncinfo <- list(xo = rrDataInfo$ilon, yo = rrDataInfo$ilat, varid = rrDataInfo$varid)
precInfo$dates <- precInfo$dates[precInfo$exist]
precInfo$nc.files <- precInfo$nc.files[precInfo$exist]
precInfo$exist <- precInfo$exist[precInfo$exist]
rm(rrDataInfo)
}
rm(tnDataInfo, txDataInfo)
##################
if(!any(tminInfo$dates %in% tmaxInfo$dates)){
Insert.Messages.Out(message[['12']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
if(length(Reduce(intersect, list(tminInfo$dates, tmaxInfo$dates, precInfo$dates))) == 0){
Insert.Messages.Out(message[['14']], TRUE, 'e')
return(NULL)
}
}
##################
inx <- match(tminInfo$dates, tmaxInfo$dates)
inx <- inx[!is.na(inx)]
tmaxInfo$dates <- tmaxInfo$dates[inx]
if(.cdtData$GalParams$method == "HAR"){
tmaxInfo$nc.files <- tmaxInfo$nc.files[inx]
tmaxInfo$exist <- tmaxInfo$exist[inx]
tndaty <- tminInfo$dates %in% tmaxInfo$dates
tminInfo$dates <- tminInfo$dates[tndaty]
tminInfo$nc.files <- tminInfo$nc.files[tndaty]
tminInfo$exist <- tminInfo$exist[tndaty]
}else{
inp <- match(tminInfo$dates, precInfo$dates)
inp <- inp[!is.na(inp)]
precInfo$dates <- precInfo$dates[inp]
ixp <- match(tmaxInfo$dates, precInfo$dates)
ixp <- ixp[!is.na(ixp)]
precInfo$dates <- precInfo$dates[ixp]
precInfo$nc.files <- precInfo$nc.files[ixp]
precInfo$exist <- precInfo$exist[ixp]
txdaty <- tmaxInfo$dates %in% precInfo$dates
tmaxInfo$dates <- tmaxInfo$dates[txdaty]
tmaxInfo$nc.files <- tmaxInfo$nc.files[txdaty]
tmaxInfo$exist <- tmaxInfo$exist[txdaty]
tndaty <- tminInfo$dates %in% precInfo$dates
tminInfo$dates <- tminInfo$dates[tndaty]
tminInfo$nc.files <- tminInfo$nc.files[tndaty]
tminInfo$exist <- tminInfo$exist[tndaty]
}
##################
nc <- ncdf4::nc_open(tminInfo$nc.files[1])
nc.lon <- nc$var[[tminInfo$ncinfo$varid]]$dim[[tminInfo$ncinfo$xo]]$vals
nc.lat <- nc$var[[tminInfo$ncinfo$varid]]$dim[[tminInfo$ncinfo$yo]]$vals
ncdf4::nc_close(nc)
xo.tn <- order(nc.lon)
nc.lon <- nc.lon[xo.tn]
yo.tn <- order(nc.lat)
nc.lat <- nc.lat[yo.tn]
len.lon <- length(nc.lon)
len.lat <- length(nc.lat)
nc <- ncdf4::nc_open(tmaxInfo$nc.files[1])
nc.lon1 <- nc$var[[tmaxInfo$ncinfo$varid]]$dim[[tmaxInfo$ncinfo$xo]]$vals
nc.lat1 <- nc$var[[tmaxInfo$ncinfo$varid]]$dim[[tmaxInfo$ncinfo$yo]]$vals
ncdf4::nc_close(nc)
xo.tx <- order(nc.lon1)
yo.tx <- order(nc.lat1)
if(.cdtData$GalParams$method == "MHAR"){
nc <- ncdf4::nc_open(precInfo$nc.files[1])
nc.lon2 <- nc$var[[precInfo$ncinfo$varid]]$dim[[precInfo$ncinfo$xo]]$vals
nc.lat2 <- nc$var[[precInfo$ncinfo$varid]]$dim[[precInfo$ncinfo$yo]]$vals
ncdf4::nc_close(nc)
xo.rr <- order(nc.lon2)
yo.rr <- order(nc.lat2)
}
##################
Ra <- extraterrestrial_radiation_annual(nc.lat, .cdtData$GalParams$Tstep)
indx <- cdt.index.RA.PET(tminInfo$dates, .cdtData$GalParams$Tstep)
##################
dx <- ncdf4::ncdim_def("Lon", "degreeE", nc.lon)
dy <- ncdf4::ncdim_def("Lat", "degreeN", nc.lat)
xy.dim <- list(dx, dy)
if(.cdtData$GalParams$method == "MHAR")
longname <- paste("Modified Hargreaves", .cdtData$GalParams$Tstep, "evapotranspiration")
else
longname <- paste("Hargreaves", .cdtData$GalParams$Tstep, "evapotranspiration")
grdNC <- ncdf4::ncvar_def("pet", 'mm', xy.dim, -99, longname = longname, prec = 'float', compression = 9)
##################
ncdir <- paste0("PET_", .cdtData$GalParams$Tstep)
outNCDIR <- file.path(.cdtData$GalParams$output, ncdir)
dir.create(outNCDIR, showWarnings = FALSE, recursive = TRUE)
##################
etp.method <- .cdtData$GalParams$method
Tstep <- .cdtData$GalParams$Tstep
##################
parsL <- doparallel.cond(length(tminInfo$nc.files) >= 180)
ret <- cdt.foreach(seq_along(tminInfo$nc.files), parsL, GUI = TRUE,
progress = TRUE, FUN = function(jj)
{
nc <- try(ncdf4::nc_open(tminInfo$nc.files[jj]), silent = TRUE)
if(inherits(nc, "try-error")) return(NULL)
tmin <- ncdf4::ncvar_get(nc, varid = tminInfo$ncinfo$varid)
ncdf4::nc_close(nc)
tmin <- if(tminInfo$ncinfo$xo < tminInfo$ncinfo$yo) tmin[xo.tn, yo.tn] else t(tmin)[xo.tn, yo.tn]
##################
nc <- try(ncdf4::nc_open(tmaxInfo$nc.files[jj]), silent = TRUE)
if(inherits(nc, "try-error")) return(NULL)
tmax <- ncdf4::ncvar_get(nc, varid = tmaxInfo$ncinfo$varid)
ncdf4::nc_close(nc)
tmax <- if(tmaxInfo$ncinfo$xo < tmaxInfo$ncinfo$yo) tmax[xo.tx, yo.tx] else t(tmax)[xo.tx, yo.tx]
##################
if(etp.method == "MHAR"){
nc <- try(ncdf4::nc_open(precInfo$nc.files[jj]), silent = TRUE)
if(inherits(nc, "try-error")) return(NULL)
prec <- ncdf4::ncvar_get(nc, varid = precInfo$ncinfo$varid)
ncdf4::nc_close(nc)
prec <- if(precInfo$ncinfo$xo < precInfo$ncinfo$yo) prec[xo.rr, yo.rr] else t(prec)[xo.rr, yo.rr]
}else prec <- NULL
##################
Ra.mat <- matrix(Ra[indx$index[jj], ], nrow = len.lon, ncol = len.lat, byrow = TRUE)
etp <- Ref.ET.Hargreaves(tmax, tmin, Ra.mat, Tstep, prec)
etp <- indx$multi[jj] * etp
etp[is.na(etp)] <- -99
##################
outfile <- file.path(outNCDIR, paste0("pet_", tminInfo$dates[jj], ".nc"))
nc <- ncdf4::nc_create(outfile, grdNC)
ncdf4::ncvar_put(nc, grdNC, etp)
ncdf4::nc_close(nc)
rm(tmin, tmax, etp, Ra.mat); gc()
return(0)
})
rm(tminInfo, tmaxInfo, Ra)
}
#######################################################
if(.cdtData$GalParams$data.type == "cdtdataset"){
tmin <- try(readRDS(.cdtData$GalParams$cdtdataset$tmin), silent = TRUE)
if(inherits(tmin, "try-error")){
Insert.Messages.Out(paste(message[['23']], .cdtData$GalParams$cdtdataset$tmin), TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$Tstep != tmin$TimeStep){
Insert.Messages.Out(paste(message[['24']], .cdtData$GalParams$Tstep), TRUE, 'e')
return(NULL)
}
tmax <- try(readRDS(.cdtData$GalParams$cdtdataset$tmax), silent = TRUE)
if(inherits(tmax, "try-error")){
Insert.Messages.Out(paste(message[['23']], .cdtData$GalParams$cdtdataset$tmax), TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$Tstep != tmax$TimeStep){
Insert.Messages.Out(paste(message[['25']], .cdtData$GalParams$Tstep), TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
prec <- try(readRDS(.cdtData$GalParams$cdtdataset$prec), silent = TRUE)
if(inherits(prec, "try-error")){
Insert.Messages.Out(paste(message[['23']], .cdtData$GalParams$cdtdataset$prec), TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$Tstep != prec$TimeStep){
Insert.Messages.Out(paste(message[['26']], .cdtData$GalParams$Tstep), TRUE, 'e')
return(NULL)
}
}
##################
SP1 <- defSpatialPixels(list(lon = tmin$coords$mat$x, lat = tmin$coords$mat$y))
SP2 <- defSpatialPixels(list(lon = tmax$coords$mat$x, lat = tmax$coords$mat$y))
if(is.diffSpatialPixelsObj(SP1, SP2, tol = 1e-04)){
Insert.Messages.Out(message[['18']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
SP3 <- defSpatialPixels(list(lon = prec$coords$mat$x, lat = prec$coords$mat$y))
if(is.diffSpatialPixelsObj(SP1, SP3, tol = 1e-04)){
Insert.Messages.Out(message[['19']], TRUE, 'e')
return(NULL)
}
rm(SP3)
}
rm(SP1, SP2)
##################
if(tmin$chunksize != tmax$chunksize){
Insert.Messages.Out(message[['27']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
if(tmin$chunksize != prec$chunksize){
Insert.Messages.Out(message[['28']], TRUE, 'e')
return(NULL)
}
}
##################
if(!any(tmin$dateInfo$date %in% tmax$dateInfo$date)){
Insert.Messages.Out(message[['12']], TRUE, 'e')
return(NULL)
}
if(.cdtData$GalParams$method == "MHAR"){
if(length(Reduce(intersect, list(tmin$dateInfo$date, tmax$dateInfo$date, prec$dateInfo$date))) == 0){
Insert.Messages.Out(message[['14']], TRUE, 'e')
return(NULL)
}
}
##################
inx <- match(tmin$dateInfo$date, tmax$dateInfo$date)
inx <- inx[!is.na(inx)]
tmax$dateInfo$date <- tmax$dateInfo$date[inx]
if(.cdtData$GalParams$method == "HAR"){
tmax$dateInfo$index <- tmax$dateInfo$index[inx]
tndaty <- tmin$dateInfo$date %in% tmax$dateInfo$date
tmin$dateInfo$date <- tmin$dateInfo$date[tndaty]
tmin$dateInfo$index <- tmin$dateInfo$index[tndaty]
}else{
inp <- match(tmin$dateInfo$date, prec$dateInfo$date)
inp <- inp[!is.na(inp)]
prec$dateInfo$date <- prec$dateInfo$date[inp]
ixp <- match(tmax$dateInfo$date, prec$dateInfo$date)
ixp <- ixp[!is.na(ixp)]
prec$dateInfo$date <- prec$dateInfo$date[ixp]
prec$dateInfo$index <- prec$dateInfo$index[ixp]
txdaty <- tmax$dateInfo$date %in% prec$dateInfo$date
tmax$dateInfo$date <- tmax$dateInfo$date[txdaty]
tmax$dateInfo$index <- tmax$dateInfo$index[txdaty]
tndaty <- tmin$dateInfo$date %in% prec$dateInfo$date
tmin$dateInfo$date <- tmin$dateInfo$date[tndaty]
tmin$dateInfo$index <- tmin$dateInfo$index[tndaty]
}
##################
daty <- tmin$dateInfo$date
indx <- cdt.index.RA.PET(daty, .cdtData$GalParams$Tstep)
##################
if(.cdtData$GalParams$method == "MHAR")
longname <- paste("Modified Hargreaves", .cdtData$GalParams$Tstep, "evapotranspiration")
else
longname <- paste("Hargreaves", .cdtData$GalParams$Tstep, "evapotranspiration")
index.out <- tmin
index.out$varInfo$name <- "pet"
index.out$varInfo$units <- "mm"
index.out$varInfo$longname <- longname
dataset <- paste0("PET_", .cdtData$GalParams$Tstep)
outDIR <- file.path(.cdtData$GalParams$output, dataset)
dir.create(outDIR, showWarnings = FALSE, recursive = TRUE)
datadir <- file.path(outDIR, 'DATA')
dir.create(datadir, showWarnings = FALSE, recursive = TRUE)
datafileIdx <- file.path(outDIR, paste0(dataset, '.rds'))
##################
chunkfile <- sort(unique(tmin$colInfo$index))
chunkcalc <- split(chunkfile, ceiling(chunkfile/tmin$chunkfac))
do.parChunk <- if(tmin$chunkfac > length(chunkcalc)) TRUE else FALSE
do.parCALC <- if(do.parChunk) FALSE else TRUE
##################
GalParams <- .cdtData$GalParams
cdtParallelCond <- .cdtData$Config$parallel
##################
parsL <- doparallel.cond(do.parCALC & (length(chunkcalc) > 10))
ret <- cdt.foreach(seq_along(chunkcalc), parsL, GUI = TRUE,
progress = TRUE, FUN = function(j)
{
tn <- readCdtDatasetChunk.sequence(chunkcalc[[j]], GalParams$cdtdataset$tmin, cdtParallelCond, do.par = do.parChunk)
tn <- tn[tmin$dateInfo$index, , drop = FALSE]
tx <- readCdtDatasetChunk.sequence(chunkcalc[[j]], GalParams$cdtdataset$tmax, cdtParallelCond, do.par = do.parChunk)
tx <- tx[tmax$dateInfo$index, , drop = FALSE]
if(GalParams$method == "MHAR"){
rr <- readCdtDatasetChunk.sequence(chunkcalc[[j]], GalParams$cdtdataset$prec, cdtParallelCond, do.par = do.parChunk)
rr <- rr[prec$dateInfo$index, , drop = FALSE]
}else rr <- NULL
lat <- tmin$coords$df$y[tmin$colInfo$index %in% chunkcalc[[j]]]
Ra <- extraterrestrial_radiation_annual(lat, GalParams$Tstep)
Ra <- Ra[indx$index, , drop = FALSE]
etp <- Ref.ET.Hargreaves(tx, tn, Ra, GalParams$Tstep, rr)
etp <- indx$multi * etp
writeCdtDatasetChunk.sequence(etp, chunkcalc[[j]], index.out, datadir, cdtParallelCond, do.par = do.parChunk)
rm(tn, tx, rr, Ra, etp); gc()
return(0)
})
##################
index.out$dateInfo$date <- daty
index.out$dateInfo$index <- seq(length(daty))
con <- gzfile(datafileIdx, compression = 6)
open(con, "wb")
saveRDS(index.out, con)
close(con)
rm(tmin, tmax, index.out)
}
return(0)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.