diff --git a/modules/Units/R/transform_units_precipitation.R b/modules/Units/R/transform_units_precipitation.R index a24ef851559928b49537de62402375ac0c829ee0..5cc1e812fd31a8aec507c3cae283707a30c273b8 100644 --- a/modules/Units/R/transform_units_precipitation.R +++ b/modules/Units/R/transform_units_precipitation.R @@ -1,80 +1,70 @@ transform_units_precipitation <- function(data, original_units, new_units, var_name, freq, flux = FALSE, ncores = NULL, var_index = 1) { - ## TODO: Hard-coded subsetting + ## TODO consider higher frequencies (e.g. 6hourly) ## could create a constant hours <- 24 or hours <- 6 and use the same code + + data_arr <- data[[1]]$data + data_list <- asplit(data_arr, which(names(dim(data_arr)) == "var")) + + if (original_units == "ms-1") { if (new_units == "mm") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 3600 * 24 * 1000 - data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'mm' + data_list[[var_index]] <- data_list[[var_index]] * 3600 * 24 * 1000 + data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "mm" } else if (new_units == "m") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 3600 * 24 - data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm' + data_list[[var_index]] <- data_list[[var_index]] * 3600 * 24 + data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm' } else if (new_units == "kgm-2s-1") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 1000 - data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'kg m-2 s-1' + data_list[[var_index]] <- data_list[[var_index]] * 1000 + data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'kg m-2 s-1' } else { - stop(paste("Unknown transformation from", original_units, "to", - new_units)) + stop(paste("Unknown transformation from", original_units, "to", new_units)) } } else if (original_units == "mm") { if (new_units == "ms-1") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] / (3600 * 24 * 1000) + data_list[[var_index]] <- data_list[[var_index]] / (3600 * 24 * 1000) data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm s-1' } else if (new_units == "m") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] / 1000 + data_list[[var_index]] <- data_list[[var_index]] / 1000 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm' } else if (new_units == "kgm-2s-1") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] / (3600 * 24 ) + data_list[[var_index]] <- data_list[[var_index]] / (3600 * 24) data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'kg m-2 s-1' } else { - stop(paste("Unknown transformation from", original_units, "to", - new_units)) + stop(paste("Unknown transformation from", original_units, "to", new_units)) } } else if (original_units == "m") { if (new_units == "ms-1") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] / (3600 * 24) + data_list[[var_index]] <- data_list[[var_index]] / (3600 * 24) data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm s-1' } else if (new_units == "mm") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 1000 + data_list[[var_index]] <- data_list[[var_index]] * 1000 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'mm' } else if (new_units == "kgm-2s-1") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 1000 / (3600 * 24) + data_list[[var_index]] <- data_list[[var_index]] * 1000 / (3600 * 24) data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'kg m-2 s-1' } else { - stop(paste("Unknown transformation from", original_units, "to", - new_units)) + stop(paste("Unknown transformation from", original_units, "to", new_units)) } } else if (original_units == "kgm-2s-1") { if (new_units == "ms-1") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] / 1000 + data_list[[var_index]] <- data_list[[var_index]] / 1000 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm s-1' } else if (new_units == "mm") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 3600 * 24 + data_list[[var_index]] <- data_list[[var_index]] * 3600 * 24 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'mm' } else if (new_units == "m") { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 3600 * 24 / 1000 + data_list[[var_index]] <- data_list[[var_index]] * 3600 * 24 / 1000 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'm' } else { - stop(paste("Unknown transformation from", original_units, "to", - new_units)) + stop(paste("Unknown transformation from", original_units, "to", new_units)) } } else { stop("Unknown precipitation units transformation") } + if (flux) { data[[1]]$attrs$Variable$metadata[[var_name]]$units <- paste0( data[[1]]$attrs$Variable$metadata[[var_name]]$units, "/day") @@ -84,9 +74,8 @@ transform_units_precipitation <- function(data, original_units, new_units, time_pos <- which(lapply(data[[1]]$attrs$Variable$metadata[[var_name]]$dim, function(x) {x$name}) == 'time') cal <- tolower(data[[1]]$attrs$Variable$metadata[[var_name]]$dim[[time_pos]]$calendar) - data_subset <- Subset(data[[1]]$data, along = "var", indices = var_index, drop = 'selected') - data[[1]]$data[ , var_index, , , , , , , ] <- - Apply(list(data_subset, data[[1]]$attrs$Dates), + data_list[[var_index]] <- + Apply(list(data_list[[var_index]], data[[1]]$attrs$Dates), target_dim = list(c('syear'), c('syear')), extra_info = list(cal = cal, days_in_month = .days_in_month), fun = function(x, y) { @@ -96,9 +85,17 @@ transform_units_precipitation <- function(data, original_units, new_units, }, ncores = ncores)$output1 } } + + # Combine list back to array + data_arr <- array(unlist(data_list), + dim = c(dim(data_list[[1]]), var = length(data_list))) + data[[1]]$data <- aperm(data_arr, match(names(dim(data[[1]]$data)), + names(dim(data_arr)))) + return(data) } + .days_in_month <- function(x, cal) { if (cal %in% c('gregorian', 'standard', 'proleptic_gregorian')) { N_DAYS_IN_MONTHS <- lubridate:::N_DAYS_IN_MONTHS diff --git a/modules/Units/R/transform_units_pressure.R b/modules/Units/R/transform_units_pressure.R index 9712e9fe54b82638fb201bf276cbdc3f871553c9..58d51b1e98df3a5f1758a45ab7ee7817cc670267 100644 --- a/modules/Units/R/transform_units_pressure.R +++ b/modules/Units/R/transform_units_pressure.R @@ -1,33 +1,37 @@ transform_units_pressure <- function(data, original_units, new_units, var_name, var_index = 1) { - ## TODO: Hard-coded subsetting + data_arr <- data[[1]]$data + data_list <- asplit(data_arr, which(names(dim(data_arr)) == "var")) + if (original_units == 'pa') { + data_list[[var_index]] <- data_list[[var_index]] / 100 if (new_units == 'hpa') { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] /100 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'hPa' } else if (new_units == 'mb') { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] /100 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'mb' } } else if (original_units == 'hpa') { if (new_units == 'pa') { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 100 + data_list[[var_index]] <- data_list[[var_index]] * 100 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "Pa" } else if (new_units == "mb") { data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "mb" } } else if (original_units == "mb") { if (new_units == 'pa') { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] * 100 + data_list[[var_index]] <- data_list[[var_index]] * 100 data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "Pa" } else if (new_units == "hPa") { data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "hPa" - } + } } + + # Combine list back to array + data_arr <- array(unlist(data_list), + dim = c(dim(data_list[[1]]), var = length(data_list))) + data[[1]]$data <- aperm(data_arr, match(names(dim(data[[1]]$data)), + names(dim(data_arr)))) + return(data) } diff --git a/modules/Units/R/transform_units_temperature.R b/modules/Units/R/transform_units_temperature.R index 366f0d34cee4a523845351d0b8ffea12c239e037..985483f08897d6f0e84a40f2db66aab89f2c3bec 100644 --- a/modules/Units/R/transform_units_temperature.R +++ b/modules/Units/R/transform_units_temperature.R @@ -1,17 +1,22 @@ transform_units_temperature <- function(data, original_units, new_units, - var_name, var_index = 1, - var_dim = "var") { - ## TODO: Hard-coded subsetting + var_name, var_index = 1) { + + data_arr <- data[[1]]$data + data_list <- asplit(data_arr, which(names(dim(data_arr)) == "var")) if (original_units == 'c' & new_units == 'k') { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] + 273.15 - data[[1]]$attrs$Variable$metadata[[var_name]]$units <- 'K' + data_list[[var_index]] <- data_list[[var_index]] + 273.15 + data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "K" } if (original_units == 'k' & new_units == 'c') { - data[[1]]$data[ , var_index, , , , , , , ] <- - data[[1]]$data[ , var_index, , , , , , , ] - 273.15 - data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "C" - + data_list[[var_index]] <- data_list[[var_index]] - 273.15 + data[[1]]$attrs$Variable$metadata[[var_name]]$units <- "C" } + + # Combine list back to array + data_arr <- array(unlist(data_list), + dim = c(dim(data_list[[1]]), var = length(data_list))) + data[[1]]$data <- aperm(data_arr, match(names(dim(data[[1]]$data)), + names(dim(data_arr)))) + return(data) }