#!/usr/bin/env python # Wenchang Yang (wenchang@princeton.edu) # Wed Oct 5 11:09:59 EDT 2022 if __name__ == '__main__': import sys from misc.timer import Timer tt = Timer('start ' + ' '.join(sys.argv)) import sys, os.path, os, glob, datetime import xarray as xr, numpy as np, pandas as pd, matplotlib.pyplot as plt #more imports from modelout import get_modelout_data, update_modelout_data from modelout.getdata import funcs import xfilter nwindow, dimlp = 9, 'year' #lowpass = lambda x: x.filter.lowpass(1/nwindow, dim=dimlp, padtype='odd') lowpass = lambda x: x.rolling(year=nwindow, center=True, min_periods=1).mean() if x.year.size>9 else x import geoxarray # if __name__ == '__main__': tt.check('end import') # #start from here daname = 't_surf' #func = lambda x: x.load().geo.fldmean() #funcname = 'glbmean' func = funcs['nino34'] funcname = 'nino34' cleanup = False #remove cache or not das = dict() model = 'FLOR' #ctl1990_v201905 label = 'FLOR_ctl_1990_v201905' expname = 'CTL1990_v201905_tigercpu_intelmpi_18_576PE' da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname, years=range(1901,2000+1)) das[label] = da #ctl1990_v201905_FA label = 'FLOR_ctl_1990_v201905_FA' expname = 'CTL1990_v201905_FA_tigercpu_intelmpi_18_576PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, years=range(100,201)) das[label] = da #ctl1990_v201905_FAtrop label = 'FLOR_ctl_1990_v201905_FAtrop' expname = 'CTL1990_v201905_FAtrop_tigercpu_intelmpi_18_576PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, years=range(100,201)) das[label] = da #ctl1860_v202407 label = 'FLOR_ctl_1860_v202407' expname = 'CTL1860_v202407_tigercpu_intelmpi_18_576PE' da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname, years=range(1901,2000+1)) das[label] = da #ctl1860_v202407_FA label = 'FLOR_ctl_1860_v202407_FA' expname = 'CTL1860_v202407_FA_tigercpu_intelmpi_18_576PE' da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname, years=range(1901,2000+1)) das[label] = da #ctl1860_v202407_FAtrop label = 'FLOR_ctl_1860_v202407_FAtrop' expname = 'CTL1860_v202407_FAtrop_tigercpu_intelmpi_18_576PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) #, years=range(1901,2000+1)) das[label] = da #HadISST nino34 #ifile = '/home/wenchang//sGEOCLIM/CM2.5_data/input/SST_TARGETS/temp_restore_HadISST_1870-2017.nc' ifile = '/scratch/gpfs/GEOCLIM/wenchang/modelInput/CM2.5/input/SST_TARGETS/temp_restore_HadISST_1870-2017.nc' # tiger3 da_obs = xr.open_dataarray(ifile, decode_times=False) \ .rename(TIME='time', LONGITUDE='lon', LATITUDE='lat') \ .assign_coords(time=pd.date_range('1870-01', '2017-06',freq='MS')) \ .sel(time=slice('1980', '2016')) nino34_obs = da_obs.sel(lon=slice(-170,-120), lat=slice(-5,5)).geo.fldmean() def wyplot(da, label,**kws): #da = da.groupby('time.year').mean('time') da = da - 273.15 #K -> degC #da = da.pipe(lowpass) #da = da.sel(year=slice(1900,2000)) da.plot(label=label, **kws) def wyplot_std_mclim(da, label,**kws): ax = kws.pop('ax', plt.gca()) #da = da.groupby('time.year').mean('time') #da = da - 273.15 #K -> degC #da = da.pipe(lowpass) #da = da.sel(year=slice(1900,2000)) da.groupby('time.month').std('time').roll(month=-5).assign_coords(month=range(6, 18)).plot(label=label, **kws) ax.set_xticks(range(6,18)) ax.set_xticklabels(['Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb', 'Mar', 'Apr', 'May']) ax.set_xlabel('') if __name__ == '__main__': from wyconfig import * #my plot settings """ import cftime year_xlim = [1910, None][0] #might be overridden later fig,ax = plt.subplots(figsize=(11,4)) for label,da in das.items(): wyplot(da, label, ax=ax, alpha=0.6) ax.legend(ncol=2) ax.set_ylabel(f'Nino3.4 [degC]') #ax.set_xlim(1800, 2000) if year_xlim is not None: ax.set_xlim(None, cftime.datetime(year_xlim, 12, 31, calendar='noleap')) ax.set_title('') #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'.png') if year_xlim is not None: figname = figname.replace('.png', f'__1901-{year_xlim}.png') if 'overwritefig' in sys.argv or 'o' in sys.argv: wysavefig(figname, overwritefig=True) else: wysavefig(figname) """ #monthly std fig,ax = plt.subplots() #obs nino34_obs.groupby('time.month').std('time').roll(month=-5).assign_coords(month=range(6, 18)).plot(label='HadISST Nino34', color='k') #model results colors = ['C0', 'C1', 'C2']*2 linestyles = ['-']*3 + ['--']*3 for (label,da),color,linestyle in zip(das.items(), colors, linestyles): wyplot_std_mclim(da, label, ax=ax, ls=linestyle, color=color) ax.legend(ncol=2) ax.set_ylabel(f'Nino3.4 STD [degC]') #ax.set_xlim(1800, 2000) ax.set_title('') #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'__std.png') if 'overwritefig' in sys.argv or 'o' in sys.argv: wysavefig(figname, overwritefig=True) else: wysavefig(figname) tt.check(f'**Done**') print() if 'notshowfig' in sys.argv: pass else: plt.show()