#!/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=False, min_periods=1).mean() import geoxarray # if __name__ == '__main__': tt.check('end import') # #start from here model = 'CM2.1p1' daname = 't_surf' func = lambda x: x.load().geo.fldmean() funcname = 'glbmean' labels = [] das = [] dass = {} label = 'CTL1860' expname = 'CTL1860_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da da_ctl = da label = '4xCO2' expname = 'CTL1860_4xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) das.append(da) labels.append(label) dass[label] = da label = '2xCO2' expname = 'CTL1860_2xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '0.5xCO2' expname = 'CTL1860_p5xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '0.25xCO2' expname = 'CTL1860_p25xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '0.125xCO2' expname = 'CTL1860_p125xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '+6% Solar' expname = 'CTL1860_p6pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '+4% Solar' expname = 'CTL1860_p4pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '+2% Solar' expname = 'CTL1860_p2pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '+1% Solar' expname = 'CTL1860_p1pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-1% Solar' expname = 'CTL1860_m1pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-2% Solar' expname = 'CTL1860_m2pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-4% Solar' expname = 'CTL1860_m4pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-6% Solar' expname = 'CTL1860_m6pctSolar_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '1%to4xCO2' expname = 'CTL1860_1pct4xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '1%to4xCO2back' expname = 'CTL1860_1pct4xCO2back_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '1%to4xCO2new' expname = 'CTL1860_1pct4xCO2new_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '1%to4xCO2newback' expname = 'CTL1860_1pct4xCO2newback_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-6% Solar from1001' expname = 'CTL1860_m6pctSolar_from1001_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-6% Solar from2001' expname = 'CTL1860_m6pctSolar_from2001_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-6% Solar from3001' expname = 'CTL1860_m6pctSolar_from3001_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-1%toP25xCO2' expname = 'CTL1860_m1pctP25xCO2_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da label = '-1%toP25xCO2back' expname = 'CTL1860_m1pctP25xCO2back_tigercpu_intelmpi_18_80PE' da = update_modelout_data(daname=daname, model=model, expname=expname, func=func, funcname=funcname) labels.append(label) das.append(da) dass[label] = da def wyplot(da, flip=False, reset_year=False, yearspan_ctl=None, lowpass_on=True, **kws): if yearspan_ctl is None: yearspan_ctl=slice(101,200) year_start = yearspan_ctl.start year_end = yearspan_ctl.stop timespan_ctl = slice(f'{year_start:04d}', f'{year_end:04d}') label = kws['label'] ax = kws.pop('ax', plt.gca()) da = da.groupby('time.year').mean('time') - da_ctl.groupby('time.year').mean('time').sel(year=yearspan_ctl).mean('year') #anom if flip: #anomaly of the control run not zero for some experiments if 'from1001' in label or '-1%toP25xCO2' in label: da_offset = da_ctl.sel(time=slice('1001', '1100')).mean('time') - da_ctl.sel(time=timespan_ctl).mean('time') elif 'from2001' in label: da_offset = da_ctl.sel(time=slice('2001', '2100')).mean('time') - da_ctl.sel(time=timespan_ctl).mean('time') elif 'from3001' in label: da_offset = da_ctl.sel(time=slice('3001', '3100')).mean('time') - da_ctl.sel(time=timespan_ctl).mean('time') else: da_offset = 0 da = da_offset*2 - da if reset_year: years = range(int(reset_year), da.year.size+int(reset_year)) da = da.assign_coords(year=years) if da.year.size >= nwindow and lowpass_on: 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(**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') if __name__ == '__main__': from wyconfig import * #my plot settings fig,ax = plt.subplots(figsize=(8,4)) for label,da in dass.items(): if label=='CTL1860': da.pipe(wyplot, label=label, color='k') ax.set_prop_cycle(None) else: da.pipe(wyplot, label=label) ax.legend(ncol=2) ax.set_ylabel(f'K') ax.set_xlim(None, da_ctl.time.dt.year.values[-1]+500*0) ax.set_title(f'CM2.1 GMST anom, {nwindow}-{dimlp}-lp') #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) #mirror the negative forcing fig,ax = plt.subplots(figsize=(8,4)) label = 'CTL1860' da = dass[label] da.pipe(wyplot, label=label, color='k') label = '2xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C0', ls='-') label = '0.5xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C0', ls='--', flip=True) label = '4xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C1', ls='-') label = '0.25xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C1', ls='--', flip=True) label = '0.125xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C2', ls='--', flip=True) label = '+1% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C3', ls='-') label = '-1% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C3', ls='--', flip=True) label = '+2% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C4', ls='-') label = '-2% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C4', ls='--', flip=True) label = '+4% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C5', ls='-') label = '-4% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C5', ls='--', flip=True) label = '+6% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C6', ls='-') label = '-6% Solar' da = dass[label] da.pipe(wyplot, label=label, color='C6', ls='--', flip=True) label = '-6% Solar from1001' da = dass[label] da.pipe(wyplot, label=label, color='C6', ls='--', flip=True) label = '-6% Solar from2001' da = dass[label] da.pipe(wyplot, label=label, color='C6', ls='--', flip=True) label = '-6% Solar from3001' da = dass[label] da.pipe(wyplot, label=label, color='C6', ls='--', flip=True) label = '1%to4xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C7', ls='-') label = '1%to4xCO2back' da = dass[label] da.pipe(wyplot, label=label, color='C8', ls='-') label = '1%to4xCO2new' da = dass[label] da.pipe(wyplot, label=label, color='C9', ls='-') label = '1%to4xCO2newback' da = dass[label] da.pipe(wyplot, label=label, color='C10', ls='-') label = '-1%toP25xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C7', ls='--', flip=True) label = '-1%toP25xCO2back' da = dass[label] da.pipe(wyplot, label=label, color='C8', ls='--', flip=True) ax.legend(ncol=3) ax.set_ylabel(f'K') ax.set_xlim(None, da_ctl.time.dt.year.values[-1]+500*0) ax.set_title(f'CM2.1 GMST anom, {nwindow}-{dimlp}-lp') #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'__mirror.png') if 'overwritefig' in sys.argv or 'o' in sys.argv: wysavefig(figname, overwritefig=True) else: wysavefig(figname) # all the -6% solar experiments fig,ax = plt.subplots(figsize=(8,4)) label = '-6% Solar' da = dass[label] da.pipe(wyplot, label=label+' from0101', reset_year=True) label = '-6% Solar from1001' yearspan_ctl = slice(1001,1100) da = dass[label] da.pipe(wyplot, label=label, reset_year=True, yearspan_ctl=yearspan_ctl) label = '-6% Solar from2001' yearspan_ctl = slice(2001,2100) da = dass[label] da.pipe(wyplot, label=label, reset_year=True, yearspan_ctl=yearspan_ctl) label = '-6% Solar from3001' yearspan_ctl = slice(3001,3100) da = dass[label] da.pipe(wyplot, label=label, reset_year=True, yearspan_ctl=yearspan_ctl) ax.legend() ax.set_ylabel(f'K') ax.set_title(f'CM2.1 GMST anom, $-6$% solar, {nwindow}-{dimlp}-lp') #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'__m6solar.png') if 'overwritefig' in sys.argv or 'o' in sys.argv: wysavefig(figname, overwritefig=True) else: wysavefig(figname) # 4xCO2 related experiments fig,ax = plt.subplots(figsize=(8,4)) lowpass_on = False label = '4xCO2' da = dass[label] da = da.sel(time=slice(None, '1000')) da.pipe(wyplot, label=label, color='C0', ls='-', reset_year=1, lowpass_on=lowpass_on) label = '0.25xCO2' da = dass[label] da = da.sel(time=slice(None, '1000')) da.pipe(wyplot, label=label, color='C1', ls='-', reset_year=1, lowpass_on=lowpass_on) da.pipe(wyplot, label=label+'_mirror', color='C1', ls='--', flip=True, reset_year=1, lowpass_on=lowpass_on) yearspan_ctl = slice(1001, 1100) label = '1%to4xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C2', ls='-', reset_year=1, yearspan_ctl=yearspan_ctl, lowpass_on=lowpass_on) label = '1%to4xCO2back' da = dass[label] da.pipe(wyplot, label=label, color='C3', ls='-', reset_year=141, yearspan_ctl=yearspan_ctl, lowpass_on=lowpass_on) label = '1%to4xCO2new' da = dass[label] da.pipe(wyplot, label=label, color='C4', ls='-', reset_year=281, yearspan_ctl=yearspan_ctl, lowpass_on=lowpass_on) label = '1%to4xCO2newback' da = dass[label] da.pipe(wyplot, label=label, color='C5', ls='-', reset_year=421, yearspan_ctl=yearspan_ctl, lowpass_on=lowpass_on) label = '-1%toP25xCO2' da = dass[label] da.pipe(wyplot, label=label, color='C6', ls='-', reset_year=1, yearspan_ctl=yearspan_ctl, lowpass_on=lowpass_on) da.pipe(wyplot, label=label+'_mirror', color='C6', ls='--', reset_year=1, yearspan_ctl=yearspan_ctl, flip=True, lowpass_on=lowpass_on) label = '-1%toP25xCO2back' da = dass[label] da.pipe(wyplot, label=label, color='C7', ls='-', reset_year=141, yearspan_ctl=yearspan_ctl, lowpass_on=lowpass_on) da.pipe(wyplot, label=label+'_mirror', color='C7', ls='--', reset_year=141, yearspan_ctl=yearspan_ctl, flip=True, lowpass_on=lowpass_on) ax.legend() ax.set_ylabel(f'K') ax.set_title(f'CM2.1 GMST anom, 4xCO2, {nwindow}-{dimlp}-lp') ax.axhline(0, color='gray', ls='--') #savefig if 'savefig' in sys.argv or 's' in sys.argv: figname = __file__.replace('.py', f'__4xCO2.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()