From 8beca69231c417e926634015260628a5d02041e6 Mon Sep 17 00:00:00 2001 From: aho Date: Thu, 2 Apr 2020 20:13:47 +0200 Subject: [PATCH 1/2] Bugfix for lon transform across_meridian case. The index was misordered before. --- R/Start.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/R/Start.R b/R/Start.R index 0076e9a..407c0bd 100644 --- a/R/Start.R +++ b/R/Start.R @@ -2203,7 +2203,9 @@ print("-> SELECTORS REQUESTED BEFORE TRANSFORM.") if (!is.null(dim_reorder_params[[inner_dim]])) { transformed_subset_var_reorder <- dim_reorder_params[[inner_dim]](transformed_subset_var) transformed_subset_var <- transformed_subset_var_reorder$x - transformed_subset_var_unorder <- sort(transformed_subset_var_reorder$ix, index.return = TRUE)$ix +#NOTE: The fix here solves the mis-ordered lon when across_meridian. + transformed_subset_var_unorder <- transformed_subset_var_reorder$ix +# transformed_subset_var_unorder <- sort(transformed_subset_var_reorder$ix, index.return = TRUE)$ix } else { transformed_subset_var_unorder <- 1:length(transformed_subset_var) } -- GitLab From 3e7b6a8eea5e07bd7cd7b129e058d7ac5d59a865 Mon Sep 17 00:00:00 2001 From: aho Date: Thu, 2 Apr 2020 20:14:47 +0200 Subject: [PATCH 2/2] Add unit test for lon order check when transform + across_meridian. --- ...test-Start-transform-lon-across_meridian.R | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 tests/testthat/test-Start-transform-lon-across_meridian.R diff --git a/tests/testthat/test-Start-transform-lon-across_meridian.R b/tests/testthat/test-Start-transform-lon-across_meridian.R new file mode 100644 index 0000000..a5dc84d --- /dev/null +++ b/tests/testthat/test-Start-transform-lon-across_meridian.R @@ -0,0 +1,77 @@ +context("Start() transform across_meridian lon order check") + +test_that("first test", { + + + repos <- "/esarchive/exp/ecmwf/system5_m1/monthly_mean/tas_f6h/$var$_$sdate$.nc" + var <- 'tas' + lon.min <- 170 + lon.max <- 185 #359.723 #360 + lat.min <- -10 #-90 + lat.max <- 20 #90 + + data_across <- Start(dat = repos, + var = var, + sdate = c('20170101'), + ensemble = indices(1), + time = indices(1), + latitude = values(list(lat.min, lat.max)), + latitude_reorder = Sort(decreasing = T), + longitude = values(list(lon.min, lon.max)), + longitude_reorder = CircularSort(-180, 180), + transform = CDORemapper, + transform_extra_cells = 0, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lon.min,lon.max,lat.min,lat.max) + ), + transform_vars = c('latitude', 'longitude'), + return_vars = list(time = 'sdate', + longitude = 'dat', + latitude = 'dat'), + retrieve = T) + + data_no_across <- Start(dat = repos, + var = var, + sdate = c('20170101'), + ensemble = indices(1), + time = indices(1), + latitude = values(list(lat.min, lat.max)), + latitude_reorder = Sort(decreasing = T), + longitude = values(list(lon.min, lon.max)), + longitude_reorder = CircularSort(0, 360), + transform = CDORemapper, + transform_extra_cells = 0, + transform_params = list( + grid = 'r360x181', + method = 'con', + crop = c(lon.min,lon.max,lat.min,lat.max) + ), + transform_vars = c('latitude', 'longitude'), + + return_vars = list(time = 'sdate', + longitude = 'dat', + latitude = 'dat'), + retrieve = T) + + + expect_equal( + as.vector(attr(data_across, 'Variables')$dat1$longitude), + c(-180:-175, 170:179) + ) + expect_equal( + as.vector(attr(data_no_across, 'Variables')$dat1$longitude), + c(170:185) + ) + + expect_equal( + data_across[1,1,1,1,1,1,8:16], + data_no_across[1,1,1,1,1,1,2:10] + ) + expect_equal( + data_across[1,1,1,1,1,1,2:5], + data_no_across[1,1,1,1,1,1,12:15] + ) + +}) -- GitLab