diff --git a/R/Start.R b/R/Start.R index 9a808b166a907eb5fd41dbd1cd9abc46c2c9b265..1cf059c09ca241be70daa515e6381450a341e424 100644 --- a/R/Start.R +++ b/R/Start.R @@ -2208,13 +2208,29 @@ print("-> SELECTORS REQUESTED BEFORE TRANSFORM.") subset_vars_to_transform[[var_with_selectors_name]] <- Subset(sub_array_of_values, inner_dim, sub_array_of_fri) } -## NOTE: Remove 'crop' from transform_params if no reorder. It causes error. -## But 'crop' has effect on reorder cases... need further investigation - if (is.null(dim_reorder_params[[inner_dim]])) { - if ('crop' %in% names(transform_params)) { - transform_params <- transform_params[-which(names(transform_params) == 'crop')] - } - } + +# Change the order of longitude crop if no reorder + from big to small. +# cdo -sellonlatbox, the lon is west, east (while lat can be north +# to south or opposite) + +# Before changing crop, first we need to find the name of longitude. +# NOTE: The potential bug here (also the bug for CDORemapper): the lon name +# is limited (only the ones listed in .KnownLonNames() are available. + known_lon_names <- s2dverification:::.KnownLonNames() + lon_name <- names(subset_vars_to_transform)[which(names(subset_vars_to_transform) %in% known_lon_names)[1]] + +# NOTE: The cases not considered: (1) if lon reorder(decreasing = T) +# It doesn't make sense, but if someone uses it, here should +# occur error. (2) crop = TRUE/FALSE + if ('crop' %in% names(transform_params) & var_with_selectors_name == lon_name & is.null(dim_reorder_params[[inner_dim]])) { + if (is.numeric(class(transform_params$crop))) { + if (transform_params$crop[1] > transform_params$crop[2]) { + tmp <- transform_params$crop[1] + transform_params$crop[1] <- transform_params$crop[2] + transform_params$crop[2] <- tmp + } + } + } transformed_subset_var <- do.call(transform, c(list(data_array = NULL, variables = subset_vars_to_transform, diff --git a/tests/testthat/test-Start-line_order-consistency.R b/tests/testthat/test-Start-line_order-consistency.R new file mode 100644 index 0000000000000000000000000000000000000000..1fe98ea1c394994372428c580c5ac7df8ffe5594 --- /dev/null +++ b/tests/testthat/test-Start-line_order-consistency.R @@ -0,0 +1,143 @@ +context("Start() line order consistency check") + + variable <- "tas" + obs.path <- "/esarchive/recon/ecmwf/era5/monthly_mean/tas_f1h/tas_$file_date$.nc" + dates_file <- "201702" + + lats.min <- -90 + lats.max <- 90 + lons.min <- 0 + lons.max <- 360 + +test_that("1. lon and lat order", { + + dat1 <- Start(dat = obs.path, + var = variable, + file_date = dates_file, + latitude = values(list(lats.min, lats.max)), + longitude = values(list(lons.min, lons.max)), + synonims = list(latitude=c('lat','latitude'), + longitude=c('lon','longitude')), + transform = CDORemapper, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lons.min,lons.max,lats.min,lats.max) + ), + transform_vars = c('latitude', 'longitude'), + return_vars = list(latitude = 'dat', + longitude = 'dat', + time = 'file_date'), + retrieve = T) + + dat2 <- Start(dat = obs.path, + var = variable, + file_date = dates_file, + longitude = values(list(lons.min, lons.max)), + latitude = values(list(lats.min, lats.max)), + synonims = list(latitude=c('lat','latitude'), + longitude=c('lon','longitude')), + transform = CDORemapper, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lons.min,lons.max,lats.min,lats.max) + ), + transform_vars = c('latitude', 'longitude'), + return_vars = list(latitude = 'dat', + longitude = 'dat', + time = 'file_date'), + retrieve = T) + + expect_equal( + length(attr(dat1, 'Variables')$dat1$latitude), + length(attr(dat2, 'Variables')$dat1$latitude) + ) + expect_equal( + length(attr(dat1, 'Variables')$dat1$longitude), + length(attr(dat2, 'Variables')$dat1$longitude) + ) +}) + + +test_that("2. dim length check: with/out reorder", { + + + dat1 <- Start(dat = obs.path, + var = variable, + file_date = dates_file, + latitude = values(list(lats.min, lats.max)), + longitude = values(list(lons.min, lons.max)), + synonims = list(latitude=c('lat','latitude'), + longitude=c('lon','longitude')), + transform = CDORemapper, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lons.min,lons.max,lats.min,lats.max) + ), + transform_vars = c('latitude', 'longitude'), + return_vars = list(latitude = 'dat', + longitude = 'dat', + time = 'file_date'), + retrieve = T) + + dat2 <- Start(dat = obs.path, + var = variable, + file_date = dates_file, + latitude = values(list(lats.min, lats.max)), + latitude_reorder = Sort(), + longitude = values(list(lons.min, lons.max)), + # longitude_reorder = CircularSort(0, 360), + synonims = list(latitude=c('lat','latitude'), + longitude=c('lon','longitude')), + transform = CDORemapper, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lons.min,lons.max,lats.min,lats.max) + ), + transform_vars = c('latitude', 'longitude'), + return_vars = list(latitude = 'dat', + longitude = 'dat', + time = 'file_date'), + retrieve = T) + + dat3 <- Start(dat = obs.path, + var = variable, + file_date = dates_file, + latitude = values(list(lats.min, lats.max)), + longitude = values(list(lons.min, lons.max)), + longitude_reorder = CircularSort(0, 361), + synonims = list(latitude=c('lat','latitude'), + longitude=c('lon','longitude')), + transform = CDORemapper, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lons.min,lons.max,lats.min,lats.max) + ), + transform_vars = c('latitude', 'longitude'), + return_vars = list(latitude = 'dat', + longitude = 'dat', + time = 'file_date'), + retrieve = T) + + expect_equal( + length(attr(dat1, 'Variables')$dat1$latitude), + length(attr(dat2, 'Variables')$dat1$latitude) + ) + expect_equal( + length(attr(dat1, 'Variables')$dat1$longitude), + length(attr(dat2, 'Variables')$dat1$longitude) + ) + expect_equal( + length(attr(dat1, 'Variables')$dat1$latitude), + length(attr(dat3, 'Variables')$dat1$latitude) + ) + expect_equal( + length(attr(dat1, 'Variables')$dat1$longitude), + length(attr(dat3, 'Variables')$dat1$longitude) + ) + +})