123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- #!/usr/bin/env Rscript
- library(s2dverification)
- args <- commandArgs(TRUE)
- comptrend <- T # Trend as a function of the start date for each leadtime
- compcor <- T # Correlation Coefficient
- comprms <- T # Root Mean Square Error
- comprmsss <- T # Root Mean Square Skill Score
- compratrms <- T # Ratio RMSE expid1 / expid2
- var <- args[1] # tos/tas/prlr
- season <- args[2] # Year/DJF/MAM/JJA/SON
- ly <- args[3] # ly1/ly2-5/ly6-9 for Forecast year 1 / years 2 to 5 / years
- # 6 to 9
- nltimemax <- 124 # number of leadtimes max in the experiments (in months)
- lstexpid <- c('i00k','b02p') # list of ids
- mon0 <- 11 # initial month
- year0 <- 1960 # first start date
- yearf <- 2005 # last start date
- intsdate <- 5 # interval between start dates
- obs <- switch(var, 'tas' = 'GHCNERSSTGISS', 'tos' = 'ERSST', 'prlr' = 'GPCC')
- syears <- seq(year0, yearf, intsdate)
- imon2 <- paste("0", as.character(mon0), sep = "")
- sdates <- paste(as.character(syears), substr(imon2, nchar(imon2) - 1,
- nchar(imon2)), '01', sep = "")
- savename <- paste(var, '_', season, '_', ly, sep = '')
- for (expid in lstexpid ) {
- savename <- paste(savename, '_', expid, sep = '')
- }
- savename <- paste(savename, '.sav', sep = '')
- if (file.exists(savename)) {
- load(savename)
- } else {
- if (is.na(match('b02p', lstexpid)) == TRUE) {
- lstload <- lstexpid
- } else {
- lstload <- lstexpid[-match('b02p', lstexpid)]
- }
- toto <- Load(var, lstload, obs,sdates, nleadtime = nltimemax,
- leadtimemin = switch(ly, 'ly1' = 1, 'ly2-5' = 13, 'ly6-9' = 61),
- leadtimemax = switch(ly, 'ly1' = switch(season, 'SON' = 13, 12),
- 'ly2-5' = switch(season, 'SON' = 61, 60),
- 'ly6-9' = switch(season, 'SON' = 109, 108)), output = 'lonlat')
- if (is.na(match('b02p', lstexpid)) == FALSE) {
- toto1bis <- Load(var, 'b02p', obs = NULL, '19501101', output = 'lonlat')
- toto1ter <- Histo2Hindcast(toto1bis$mod, '19501101', paste(as.character(
- syears + switch(ly, 'ly1' = 0, 'ly2-5' = 1, 'ly6-9' = 5)),
- substr(imon2, nchar(imon2) - 1, nchar(imon2)), '01', sep = ""),
- nleadtimesout = switch(ly, 'ly1' = switch(season, 'SON' = 13,
- 12), switch(season, 'SON' = 49, 48)))
- toto1beta <- array(dim = c(dim(toto$mod)[1] + dim(toto1ter)[1],
- max(dim(toto$mod)[2], dim(toto1ter)[2]), dim(toto$mod)[3:6]))
- toto1beta[1:dim(toto$mod)[1], 1:dim(toto$mod)[2], , , , ] <- toto$mod
- toto1beta[(dim(toto$mod)[1] + 1):(dim(toto$mod)[1] + dim(toto1ter)[1]),
- 1:dim(toto1ter)[2], , , , ] <- toto1ter
- toto$mod <- toto1beta
- lstexpid <- c(lstload, 'b02p')
- }
- toto_exp <- InsertDim(Mean1Dim(Season(toto$mod, 4, mon0, switch(season,
- 'Year' = mon0, 'DJF' = 12, 'MAM' = 3, 'JJA' = 6,
- 'SON' = 9), switch(season,
- 'Year' = (mon0 + 12 - 2) %% 12 + 1, 'DJF' = 2,
- 'MAM' = 5, 'JJA' = 8, 'SON' = 11)), 4), 4, 1)
- toto_obs <- InsertDim(Mean1Dim(Season(toto$obs, 4, mon0, switch(season,
- 'Year' = mon0, 'DJF' = 12, 'MAM' = 3, 'JJA' = 6,
- 'SON' = 9), switch(season,
- 'Year' = (mon0 + 12 - 2) %% 12 + 1, 'DJF' = 2,
- 'MAM' = 5, 'JJA' = 8, 'SON' = 11)), 4), 4, 1)
- if (var == 'prlr') {
- toto$mod <- toto$mod * 1000 * 3600 * 24
- toto$obs <- toto$obs * 1000 * 3600 * 24
- }
- toto=list(mod=toto_exp,obs=toto_obs,lat=toto$lat,lon=toto$lon)
- save(toto,file=savename)
- }
- clims <- Clim(toto$mod, toto$obs)
- ano_exp <- Ano(toto$mod, clims$clim_exp)
- ano_obs <- Ano(toto$obs, clims$clim_obs)
- if (compcor) {
- cor <- Corr(Mean1Dim(ano_exp, 2), Mean1Dim(ano_obs, 2), 1, 2)
- cols <- c("dodgerblue4", "dodgerblue1", "forestgreen", "yellowgreen",
- "white", "white", "yellow", "orange", "red", "saddlebrown")
- lims <- seq(-1, 1, 0.2)
- for (jexp in 1:length(lstexpid)) {
- flag <- array(F, dim = dim(cor[jexp, 1, 2, 1, , ]))
- flag[which(cor[jexp, 1, 2, 1, , ] > cor[jexp, 1, 4, 1, , ])] <- T
- postscript(paste('CorCoef2d_', var, '_', lstexpid[jexp], '_', season, '_',
- ly, '.eps', sep = ''))
- PlotEquiMap(cor[jexp, 1, 2, 1, , ], toto$lon, toto$lat,
- toptitle = paste('Correlation Coefficient', lstexpid[jexp],
- switch(season, 'Year' = 'annual', season), switch(var,
- 'tas' = 'near surface temperature',
- 'tos' = 'sea surface temperature', 'prlr' = 'precipitation'),
- switch(var, 'tas' = 'GHCNv2+ERSSTv3b+GISTEMP',
- 'tas' = 'ERSSTv3b', 'prlr' = 'GPCC'), switch(ly,
- 'ly1' = 'Year1', 'ly2-5' = 'Year2-5', 'ly6-9' = 'Year6-9')),
- sizetit = 0.8, brks = lims, cols = cols, colNA = switch(var,
- 'prlr' = 'white', grey(0.4)), filled.continents = switch(var,
- 'tas' = F, 'tos' = T, 'prlr' = F), dots = t(flag), intylat = 45)
- dev.off()
- }
- }
- if (comprms) {
- rmse <- RMS(Mean1Dim(ano_exp, 2), Mean1Dim(ano_obs, 2), 1, 2)
- cols <- rev(c("dodgerblue4", "dodgerblue1", "forestgreen", "yellowgreen",
- "white", "white", "yellow", "orange", "red", "saddlebrown"))
- lims <- c(0, 0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.7, 1, 1.5, 2)
- lims <- switch(var, 'tas' = lims * 2, 'tos' = lims * 2, lims)
- rmse[which(rmse > max(lims))] <- max(lims)
- for (jexp in 1:length(lstexpid)) {
- postscript(paste('RMSE2d_', var, '_', lstexpid[jexp], '_', season, '_', ly,
- '.eps', sep = ''))
- PlotEquiMap(rmse[jexp, 1, 2, 1, , ], toto$lon, toto$lat,
- toptitle = paste('RMSE', lstexpid[jexp], switch(season,
- 'Year' = 'annual', season), switch(var,
- 'tas' = 'near surface temperature',
- 'tos' = 'sea surface temperature', 'prlr' = 'precipitation'),
- switch(var, 'tas' = 'GHCNv2+ERSSTv3b+GISTEMP',
- 'tas' = 'ERSSTv3b', 'prlr' = 'GPCC'), switch(ly,
- 'ly1' = 'Year1', 'ly2-5' = 'Year2-5', 'ly6-9' = 'Year6-9')),
- sizetit = 0.8, brks = lims, cols = cols, colNA = switch(var,
- 'prlr' = 'white', grey(0.4)), filled.continents = switch(var,
- 'tas' = F, 'tos' = T, 'prlr' = F), intylat = 45)
- dev.off()
- }
- }
- if (comprmsss) {
- rmsss <- RMSSS(Mean1Dim(ano_exp, 2), Mean1Dim(ano_obs, 2), 1, 2)
- cols <- c("dodgerblue4", "dodgerblue1", "forestgreen", "yellowgreen",
- "white", "white", "yellow", "orange", "red", "saddlebrown")
- lims <- seq(-1, 1, 0.2)
- for (jexp in 1:length(lstexpid)) {
- flag <- array(F, dim = dim(rmsss[jexp, 1, 2, 1, , ]))
- flag[which(rmsss[jexp, 1, 2, 1, , ] < 0.05)] <- T
- rmsss[which(-1 > rmsss)] = -1
- postscript(paste('RMSSS2d_', var, '_', lstexpid[jexp], '_', season, '_', ly,
- '.eps', sep = ''))
- PlotEquiMap(rmsss[jexp, 1, 1, 1, , ], toto$lon, toto$lat,
- toptitle = paste('RMSSS', lstexpid[jexp], switch(season,
- 'Year' = 'annual', season), switch(var,
- 'tas' = 'near surface temperature',
- 'tos' = 'sea surface temperature', 'prlr' = 'precipitation'),
- switch(var, 'tas' = 'GHCNv2+ERSSTv3b+GISTEMP',
- 'tas' = 'ERSSTv3b', 'prlr' = 'GPCC'), switch(ly,
- 'ly1' = 'Year1', 'ly2-5' = 'Year2-5', 'ly6-9' = 'Year6-9')),
- sizetit = 0.8, brks = lims, cols = cols, colNA = switch(var,
- 'prlr' = 'white', grey(0.4)), filled.continents = switch(var,
- 'tas' = F, 'tos' = T, 'prlr' = F), dots = t(flag), intylat = 45)
- dev.off()
- }
- }
- if (compratrms) {
- ratrms <- RatioRMS(Mean1Dim(ano_exp, 2)[1, , 1, , ],
- Mean1Dim(ano_exp, 2)[2, , 1, , ],
- Mean1Dim(ano_obs, 2)[1, , 1, , ], 1)
- cols <- rev(c("dodgerblue4", "dodgerblue1", "forestgreen", "yellowgreen",
- "white", "white", "yellow", "orange", "red", "saddlebrown"))
- lims <- c(0, 0.5, 0.8, 0.9, 0.95, 1, 1.05, 1.1, 1.2, 2, 6)
- flag <- array(F, dim = dim(ratrms[1, , ]))
- flag[which(ratrms[2, , ] < 0.05)] <- T
- postscript(paste('Rati_RMSE2d_', var, '_', lstexpid[1], '_', lstexpid[2],
- '_', season, '_', ly, '.eps', sep = ''))
- PlotEquiMap(ratrms[1, , ], toto$lon, toto$lat, toptitle = paste('RMSE',
- lstexpid[1], '/ RMSE', lstexpid[2], switch(season,
- 'Year' = 'annual', season), switch(var,
- 'tas' = 'near surface temperature',
- 'tos' = 'sea surface temperature', 'prlr' = 'precipitation'),
- switch(var, 'tas' = 'GHCNv2+ERSSTv3b+GISTEMP', 'tas' = 'ERSSTv3b',
- 'prlr' = 'GPCC'), switch(ly, 'ly1' = 'Year1', 'ly2-5' = 'Year2-5',
- 'ly6-9' = 'Year6-9')), sizetit = 0.8, brks = lims, cols = cols,
- colNA = switch(var, 'prlr' = 'white', grey(0.4)),
- filled.continents = switch(var, 'tas' = F, 'tos' = T, 'prlr' = F),
- dots = t(flag), intylat = 45)
- dev.off()
- }
|