Nothing
## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
## ----setup, include = FALSE---------------------------------------------------
library(CFtime)
## -----------------------------------------------------------------------------
# Setting up
library(ncdfCF)
fn <- list.files(path = system.file("extdata", package = "CFtime"), full.names = TRUE)[1]
(ds <- ncdfCF::open_ncdf(fn))
# The T axis, with name "time" has a CFTime instance
t <- ds[["time"]]$time()
# Create monthly factors for a baseline era and early, mid and late 21st century eras
baseline <- t$factor(era = 1991:2020)
future <- t$factor(era = list(early = 2021:2040, mid = 2041:2060, late = 2061:2080))
str(baseline)
str(future)
## -----------------------------------------------------------------------------
# Get the data for the "pr" data variable from the netCDF data set.
# The `CFData$array()` method ensures that data are in standard R orientation.
# Converts units of kg m-2 s-1 to mm/day.
pr <- ds[["pr"]]$data()$array() * 86400
# Get a global attribute from the file
experiment <- ds$attribute("experiment_id")
# Calculate the daily average precipitation per month for the baseline period
# and the three future eras.
pr_base <- apply(pr, 1:2, tapply, baseline, mean) # an array
pr_future <- lapply(future, function(f) apply(pr, 1:2, tapply, f, mean)) # a list of arrays
# Calculate the precipitation anomalies for the future eras against the baseline.
# Working with daily averages per month so we can simply subtract and then multiply by days
# per month for each of the factor levels using the CF calendar.
ano <- mapply(function(pr, f) {(pr - pr_base) * t$factor_units(f)}, pr_future, future, SIMPLIFY = FALSE)
# Plot the results
plot(1:12, ano$early[,1,1], type = "o", col = "blue", ylim = c(-50, 40), xlim = c(1, 12),
main = paste0("Hamilton, New Zealand\nExperiment: ", experiment),
xlab = "month", ylab = "Precipitation anomaly (mm)")
lines(1:12, ano$mid[,1,1], type = "o", col = "green")
lines(1:12, ano$late[,1,1], type = "o", col = "red")
## -----------------------------------------------------------------------------
# Get the list of files that make up the ensemble members, here:
# GFDL ESM4 and MRI ESM2 models for experiment SSP2-4.5, precipitation, CMIP6 2015-01-01 to 2099-12-31
lf <- list.files(path = system.file("extdata", package = "CFtime"), full.names = TRUE)
# Loop over the files individually
# ano is here a list with each element holding the results for a single model
ano <- lapply(lf, function(fn) {
ds <- ncdfCF::open_ncdf(fn)
t <- ds[["time"]]$time()
pr <- ds[["pr"]]$data()$array() * 86400
baseline <- t$factor(era = 1991:2020)
pr_base <- apply(pr, 1:2, tapply, baseline, mean)
future <- t$factor(era = list(early = 2021:2040, mid = 2041:2060, late = 2061:2080))
pr_future <- lapply(future, function(f) apply(pr, 1:2, tapply, f, mean))
mapply(function(pr, f) {(pr - pr_base) * t$factor_units(f)}, pr_future, future, SIMPLIFY = FALSE)
})
# Era names
eras <- c("early", "mid", "late")
dim(eras) <- 3
# Build the ensemble for each era
# For each era, grab the data for each of the ensemble members, simplify to an array
# and take the mean per row (months, in this case)
ensemble <- apply(eras, 1, function(e) {
rowMeans(sapply(ano, function(a) a[[e]], simplify = TRUE))})
colnames(ensemble) <- eras
rownames(ensemble) <- rownames(ano[[1]][[1]])
ensemble
## ----eval = FALSE-------------------------------------------------------------
# library(ncdfCF)
# library(abind)
#
# prepare_CORDEX <- function(fn, var, aoi) {
# data <- vector("list", length(fn))
# for (i in 1:length(fn)) {
# ds <- ncdfCF::open_ncdf(fn[i])
# if (i == 1) {
# # Get a CFTime instance from the first file
# t <- ds[["time"]]$time()
# } else {
# # Add offsets from the file and add to the CFTime instance
# t <- t + ds[["time"]]$time()$offsets
# }
#
# # Put the subsetted data array in the list
# data[[i]] <- ds[[var]]$subset(aoi = aoi)$array()
# }
#
# # Create a list for output with the CFTime instance and
# # the data bound in a single 3-dimensional array
# list(CFTime = t, data = abind(data, along = 3))
# }
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.