#!/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 misc.modelout import get_modelout_data, update_modelout_data 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() import geoxarray # if __name__ == '__main__': tt.check('end import') # #start from here daname = 't_surf' func = lambda x: x.load().geo.fldmean() funcname = 'gmst' cleanup = False #remove cache or not das = dict() model = 'CM2.1p1' #ctl expname = 'CTL1860_tigercpu_intelmpi_18_80PE' #da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) das['cm2p1_ctl'] = da #ctl1990 expname = 'CTL1990_tigercpu_intelmpi_18_80PE' #da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) das['cm2p1_ctl_1990'] = da #pert exps = [ ('cm2p1_p6solar', 'CM2.1 +6% Solar', 'CTL1860_p6pctSolar_tigercpu_intelmpi_18_80PE'), ('cm2p1_m6solar', 'CM2.1 -6% Solar', 'CTL1860_m6pctSolar_tigercpu_intelmpi_18_80PE'), ] for key,label,expname in exps: da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, cleanup=cleanup) das[key] = da exps_cm2p1 = exps model = 'FLOR' #ctl expname = 'CTL1860_newdiag_tigercpu_intelmpi_18_576PE' #da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, years=range(100,201)) da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, years=range(100,201)) das['flor_ctl'] = da #ctl1860_v201904 expname = 'CTL1860_v201904_tigercpu_intelmpi_18_576PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, years=range(100,201)) das['flor_ctl_v201904'] = da #ctl1990 expname = 'CTL1990_v201905_tigercpu_intelmpi_18_576PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname)#, years=range(100,201)) das['flor_ctl_1990'] = da #pert exps = [ ('flor_p6solar', 'FLOR +6% Solar', 'p6p0sol_CTL1860_tigercpu_intelmpi_18_576PE'), ('flor_m6solar', 'FLOR -6% Solar', 'm6p0sol_CTL1860_tigercpu_intelmpi_18_576PE'), ] for key,label,expname in exps: #da = get_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) das[key] = da exps_flor = exps exps = exps_cm2p1 + exps_flor def wyplot(key, label, flip=False, **kws): ax = kws.pop('ax', plt.gca()) da = das[key] if key.startswith('cm2p1'): da_ctl = das['cm2p1_ctl'] elif key.startswith('flor'): da_ctl = das['flor_ctl'] da = da.groupby('time.year').mean('time') - da_ctl.sel(time=slice('0101','0200')).mean('time') #anom if da.year[0] == 101: da = xr.concat([da_ctl.sel(time='0100').groupby('time.year').mean('time')*0, da], dim='year') #da = da.groupby('time.month') - da_ctl.sel(time=slice('0101','0200')).groupby('time.month').mean('time') #anom if flip: da = -da da = da.pipe(lowpass) #da = da.assign_coords(year=da.year-100) #shift the year axis to start with 0 (instead of 100) da.plot(label=label, **kws) #ax.plot(da.isel(year=-1).year, da.isel(year=-1), marker='o', fillstyle='none', color='gray') #ax.text(da.year.values[-1], da.values[-1], f'{da.year.values[-1]}', color='gray') def wyplot_ctl(key,**kws): da = das[key] da = da.groupby('time.year').mean('time') da = da.pipe(lowpass) da.plot(label=key, **kws) if __name__ == '__main__': from wyconfig import * #my plot settings fig,ax = plt.subplots(figsize=(8,4)) wyplot('cm2p1_ctl', 'cm2p1_ctl', ls='-', color='k') wyplot('flor_ctl', 'flor_ctl', ls='-', color='gray') for key,label,expname in exps: if '-' in label: flip = False ls = '--' else: flip = True ls = '-' wyplot(key, label, flip=flip, ls=ls) ax.legend(ncol=1) #ax.set_xlim(100, 250) #ax.set_ylabel(f'GMST anom [K], {nwindow}-{dimlp}-lp') ax.set_ylabel(f'GMST anom [K], {nwindow}-{dimlp}-RunAvg') #ax.set_xlim(None, 1000) #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'.png') if 'overwritefig' in sys.argv or 'o' in sys.argv: wysavefig(figname, overwritefig=True) else: wysavefig(figname) #ctl fig,ax = plt.subplots(figsize=(8,4)) for key in ('cm2p1_ctl', 'cm2p1_ctl_1990', 'flor_ctl', 'flor_ctl_v201904', 'flor_ctl_1990'): wyplot_ctl(key) ax.legend() #ax.set_ylabel(f'GMST [K], {nwindow}-{dimlp}-lp') ax.set_ylabel(f'GMST [K], {nwindow}-{dimlp}-RunAvg') #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'__ctls.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()