#!/usr/bin/env python # Wenchang Yang (wenchang@princeton.edu) # Fri Sep 9 16:18:43 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.seasons import sel_season from misc.landmask import whereland import salem # if __name__ == '__main__': tt.check('end import') # #start from here def roll_lon(da, lonmax=180): if lonmax == 180: if da.lon.max() > 180: da = da.roll(lon=da.lon.size//2, roll_coords=True) lon_new = da.lon.where(da.lon<=180, other=da.lon-360).values da = da.assign_coords(lon=lon_new) elif lonmax == 360: if da.lon.min() < 0: da = da.roll(lon=da.lon.size//2, roll_coords=True) lon_new = da.lon.where(da.lon>0, other=da.lon+360).values da = da.assign_coords(lon=lon_new) return da #model = 'AM2.5C360' if 'AM2.5C360' in sys.argv else 'FLOR' model = os.path.basename(os.getcwd()) #ifile = 'precip_FLOR_HistRCP45_tigercpu_intelmpi_18_576PE_10ens_1981-2020_region.18_30_35_45.nc' #ifile = glob.glob('precip_*_region.18_30_35_45.nc')[0] if model=='AM2.5C360': ifile = 'precip_AM2.5C360_amipHadISSTrcp45_tigercpu_intelmpi_18_1080PE_3ens_1990-2020_region.285_320_-40_-15.RioGrandeLarge.nc' elif model == 'FLOR': ifile = 'precip_FLOR_HistRCP45_tigercpu_intelmpi_18_576PE_10ens_1990-2020_region.285_320_-40_-15.RioGrandeLarge.nc' print(f'{ifile = }') #ifiles = 'precip_FLOR_HistRCP45_tigercpu_intelmpi_18_576PE_ens??_1860-2100_NHE.nc' #years = slice('1991', '2020') years = slice('1990', '2020') season = """ OND JJAS MAM """.split()[-1] tag = f'{model}_{season}{years.start}-{years.stop}' ofile = __file__.replace('.py', f'__{tag}.nc') if os.path.exists(ofile) and not 'o' in sys.argv: print('[loaded]:', ofile) da = xr.open_dataarray(ofile) else: #ds = xr.open_mfdataset(ifiles, combine='nested', concat_dim=['time', 'ens']) #daname = list(ds.data_vars)[0] #da = ds[daname].sel(time=years).pipe(sel_season).load().mean(['time', 'ens'], keep_attrs=True) print('loading...') da = xr.open_dataarray(ifile) da = da.assign_coords(lon=da.lon.values-360) # convert values >180 to negative da = da.sel(time=years).load().pipe(sel_season, season=season).mean(['time', 'ens'], keep_attrs=True) print('saving...') da.to_dataset().to_netcdf(ofile) print('[saved]:', ofile) def plot_subregion(region_name='region of the event', **kws): shapefile = '../state_Rio_Grande_do_Sul/43UF2500G.shp' shdf = salem.read_shapefile(shapefile) ax = kws.pop('ax', plt.gca()) #label = kws.pop('label', region_name) #lonmin,lonmax,latmin,latmax = 20, 28.5, 36, 42.5 #lon = [lonmin, lonmax, lonmax, lonmin, lonmin] #lat = [latmin, latmin, latmax, latmax, latmin] #ax.plot(lon, lat, label=label, **kws) shdf.boundary.plot(ax=ax, color='C1') if __name__ == '__main__': from wyconfig import * #my plot settings from geoplots import mapplot figsize = None fig, ax = plt.subplots(figsize=figsize) #da.plot(cmap='YlGnBu', vmax=10, vmin=0, levels=11) #func = lambda da: (da - 273.15).assign_attrs(units='degC') #da.pipe(func).plot(center=False, vmin=0, vmax=30, levels=31, cmap='Spectral_r') #func = lambda da: da.pipe(whereland).assign_attrs(units='mm/day') func = lambda da: da.assign_attrs(units='mm/day') vmin, vmax = None, None da.pipe(func).plot(center=False, vmin=vmin, vmax=vmax, levels=21, cmap='YlGnBu')#, extend='max') mapplot() plot_subregion(color='k', lw=1) #plot_subregion('IndusBasin', color='C1') ax.set_xlabel('') ax.set_ylabel('') #ax.legend(loc='upper left') ax.set_title(f'{da.name} {tag.replace("_", " ")}') #savefig if 'savefig' in sys.argv or 's' in sys.argv: #figname = __file__.replace('.py', f'.png') figname = ofile.replace('.nc', f'.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()