Climatology Functions#
Warning
This is not meant to be a standalone notebook. This notebook is part of the process we have for adding entries to the NCL Index and is not meant to be used as tutorial or example code.
Functions covered#
NCL code#
; Note the use of the calendar attribute to assign calendar information
; calcDayAnomTLL
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/calcDayanomTLL.shtml
f = addfile("CMIP6_sea_ice_daily_subset.nc", "r")
time = f->time
time@calendar = "noleap"
TIME = cd_calendar(time,0)
year = toint(TIME(:,0))
year@calendar = "noleap"
month = toint(TIME(:,1))
day = toint(TIME(:,2))
ddd = day_of_year(year, month, day)
yyyyddd = year*1000+ddd
yyyyddd@calendar = "noleap"
aice_d = f->aice_d
aiceClmDay = clmDayTLL(aice_d, yyyyddd)
aiceDayAnom = calcDayAnomTLL(aice_d, yyyyddd, aiceClmDay)
print(aiceDayAnom(0,10,10))
; calcMonAnomTLL
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/calcMonAnomTLL.shtml
f = addfile("CMIP6_sea_ice_monthly_subset.nc", "r")
aice = f->aice
aiceClmMon = clmMonTLL(aice)
aiceMonAnom = calcMonAnomTLL(aice,aiceClmMon)
print(aiceMonAnom(0,10,10))
; clmDayTLL
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/clmDayTLL.shtml
f = addfile("CMIP6_sea_ice_daily_subset.nc", "r")
time = f->time
time@calendar = "noleap"
TIME = cd_calendar(time,0)
year = toint(TIME(:,0))
year@calendar = "noleap"
month = toint(TIME(:,1))
day = toint(TIME(:,2))
ddd = day_of_year(year, month, day)
yyyyddd = year*1000+ddd
yyyyddd@calendar = "noleap"
aice_d = f->aice_d
aiceClmDay = clmDayTLL(aice_d, yyyyddd)
print(aiceClmDay(0,10,10))
; clmMonTLL
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/clmMonTLL.shtml
f = addfile("CMIP6_sea_ice_monthly_subset.nc", "r")
aice = f->aice
aiceClmMon = clmMonTLL(aice)
print(aiceClmMon(0,10,10))
; month_to_season
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/calcDayAnomTLL.shtml
f = addfile("CMIP6_sea_ice_monthly_subset.nc", "r")
aice = f->aice
aiceSeason = month_to_season(aice, "ASO")
print(aiceSeason(0,10,10))
; rmMonAnnCycTLL
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/month_to_season.shtml
f = addfile("CMIP6_sea_ice_monthly_subset.nc", "r")
aice = f->aice
aiceRmMonAnnCyc = rmMonAnnCycTLL(aice)
print(aiceRmMonAnnCyc(0,10,10))
; stdMonTLL
; Adapted from www.ncl.ucar.edu/Document/Functions/Contributed/stdMonTLL.shtml
f = addfile("CMIP6_sea_ice_monthly_subset.nc", "r")
aice = f->aice
aiceStdMon = stdMonTLL(aice)
print(aiceStdMon(0,10,10))
Python Functionality#
import math
import xarray as xr
import geocat.datafiles as gdf
from geocat.comp import month_to_season
results = {}
ds_m = xr.open_dataset(
gdf.get("applications_files/inputs/CMIP6_sea_ice_monthly_subset.nc")
)
ds_d = xr.open_dataset(
gdf.get("applications_files/inputs/CMIP6_sea_ice_daily_subset.nc")
)
# calcDayAnomTLL
aice = ds_d.aice_d[:, 10, 10]
DayTLL = aice.groupby(aice.time.dt.dayofyear)
clmDayTLL = DayTLL.mean(dim="time")
calcDayAnomTLL = DayTLL - clmDayTLL
results["calcDayAnomTLL"] = calcDayAnomTLL.item(0)
# calcMonAnomTLL
aice = ds_m.aice[:, 10, 10]
MonTLL = aice.groupby(aice.time.dt.month)
clmMonTLL = MonTLL.mean(dim="time")
calcMonAnomTLL = MonTLL - clmMonTLL
results["calcMonAnomTLL"] = calcMonAnomTLL.item(0)
# clmDayTLL
aice = ds_d.aice_d[:, 10, 10]
DayTLL = aice.groupby(aice.time.dt.dayofyear)
clmDayTLL = DayTLL.mean(dim="time")
results["clmDayTLL"] = clmDayTLL.item(0)
# clmMonTLL
aice = ds_m.aice[:, 10, 10]
MonTLL = aice.groupby(aice.time.dt.month)
clmMonTLL = MonTLL.mean(dim="time")
results["clmMonTLL"] = clmMonTLL.item(0)
# month_to_season
aice = ds_m.aice[:, 10, 10]
mon_to_season = month_to_season(aice, "ASO")
results["month_to_season"] = mon_to_season.item(0)
# rmMonAnnCycTLL
aice = ds_m.aice[:, 10, 10]
MonTLL = aice.groupby(aice.time.dt.month)
clmMonTLL = MonTLL.mean(dim="time")
rmMonAnnCycTLL = MonTLL - clmMonTLL
results["rmMonAnnCycTLL"] = rmMonAnnCycTLL.item(0)
# stdMonTLL
aice = ds_m.aice[:, 10, 10]
MonTLL = aice.groupby(aice.time.dt.month)
stdMonTLL = MonTLL.std(ddof=1)
results["stdMonTLL"] = stdMonTLL.item(0)
Comparison#
# dictionary of climatology functions results
ncl_results = {
"calcDayAnomTLL": -0.02774364,
"calcMonAnomTLL": 0.003319263,
"clmDayTLL": 0.7408184,
"clmMonTLL": 0.8063018,
"month_to_season": 0.9931215,
"rmMonAnnCycTLL": 0.003319263,
"stdMonTLL": 0.07392025,
}
for c in ncl_results.keys() & results.keys():
print(f"{c}: \n\tpython:\t\t{results[c]}\n\tncl:\t\t{ncl_results[c]}\n")
assert math.isclose(ncl_results[c], results[c], rel_tol=1e-06, abs_tol=1e-06)
rmMonAnnCycTLL:
python: 0.0033192038536071777
ncl: 0.003319263
calcMonAnomTLL:
python: 0.0033192038536071777
ncl: 0.003319263
clmDayTLL:
python: 0.7408185005187988
ncl: 0.7408184
stdMonTLL:
python: 0.07392024993896484
ncl: 0.07392025
month_to_season:
python: 0.9931214451789856
ncl: 0.9931215
clmMonTLL:
python: 0.8063018918037415
ncl: 0.8063018
calcDayAnomTLL:
python: -0.02774369716644287
ncl: -0.02774364
Differences#
for c in ncl_results.keys() & results.keys():
print(f"{c}:")
print(f"\t{results[c] - ncl_results[c]}")
rmMonAnnCycTLL:
-5.9146392822079924e-08
calcMonAnomTLL:
-5.9146392822079924e-08
clmDayTLL:
1.0051879884009907e-07
stdMonTLL:
-6.103516303479495e-11
month_to_season:
-5.482101439469034e-08
clmMonTLL:
9.180374149764248e-08
calcDayAnomTLL:
-5.7166442871126044e-08