def plotter(pdata, colormax=1, colormin=-999, title=''): lon = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') #lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/Plus15-Future_LCO2/day/ua/item15201_daily_mean_a00b_2090-01_2100-12.nc', 'latitude1') if colormin == -999: colormin = -colormax pdata, lon = shiftgrid(180., pdata, lon, start=False) pdata, lon = addcyclic(pdata, lon) meshlon, meshlat = np.meshgrid(lon, lat) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawmapboundary() x, y = m(meshlon, meshlat) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) my_cmap[230:282, :] = 1 if precip == 'yes': my_cmap = my_cmap[::-1] newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", my_cmap) ctrs = np.linspace(colormin, colormax, 17) plot = m.contourf(x, y, pdata, ctrs, cmap=newcmap, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') plt.title(title, y=1) plt.show() return plot
def stat_rossC(u): ''' This treatment makes the regions of reflection (beta<0 and u_m>0) and regions of absorption (beta>0 and u_m<0) indistinguishable. These regions of absorption can be identified separately by plotting the easterlies. ''' from netcdfread import ncread lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/CAM4-2degree/All-Hist/mon/va/va_Amon_CAM4-2degree_All-Hist_est1_v1-0_ens0000_200601-201512.nc', 'lon') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/CAM4-2degree/All-Hist/mon/va/va_Amon_CAM4-2degree_All-Hist_est1_v1-0_ens0000_200601-201512.nc', 'lat') meshlon, meshlat = np.meshgrid(lon, lat) phi = meshlat * np.pi / 180 cs_phi = np.cos(phi) dphi = 1.25 * np.pi / 180 omega = 7.29e-5 a = 6.371e6 u_m = u / (a * cs_phi) u_1opp = np.gradient(u_m * cs_phi**2, dphi, axis=0) / cs_phi u_2opp = np.gradient(u_1opp, dphi, axis=0) / cs_phi beta = (2 * omega - u_2opp) * cs_phi**2 / a ks = np.sqrt(a * beta / u_m) return ks
def maplot(pdata, colormax=1, colormin=-999, mask='no', title='', precip='no'): """ Plots input grid with map of world overlaid Parameters ---------- plotdata: array data being plotted title: str optional title """ from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from netcdfread import ncread if colormin == -999: colormin = -colormax lon = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') #lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/Plus15-Future_LCO2/day/ua/item15201_daily_mean_a00b_2090-01_2100-12.nc', 'latitude1') plt.figure() if mask == 'yes': lsm = ncread('/home/bakerh/Documents/DPhil/CPDN/\ Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] pdata = np.ma.masked_array(pdata, mask=np.logical_not(lsm)) pdata, lon = shiftgrid(180., pdata, lon, start=False) pdata, lon = addcyclic(pdata, lon) meshlon, meshlat = np.meshgrid(lon, lat) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawmapboundary() x, y = m(meshlon, meshlat) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) my_cmap[230:282, :] = 1 if precip == 'yes': my_cmap = my_cmap[::-1] newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", my_cmap) ctrs = np.linspace(colormin, colormax, 17) plot = m.contourf(x, y, pdata, ctrs, cmap=newcmap, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') b = plt.colorbar(plot, orientation='horizontal', aspect=50, shrink=0.75, spacing='proportional') b.set_label(label=r'pr (mm day$^{-1}$)') parallels = m.drawparallels(np.arange(-90., 91., 15.)) meridians = m.drawmeridians(np.arange(-180., 181., 30)) m.drawparallels(parallels, labels=[True, True, True, True]) m.drawmeridians(meridians, labels=[True, True, True, True]) plt.title(title, y=1.08) plt.show()
def regressnao(eof): from scipy import stats lat = np.arange(80, 18.75, -1.25) lon = np.linspace(-90, 39.375, 70) both = compare('item16222_monthly_mean') lst = dbase() anom = np.zeros((len(both), 145, 192)) NAOinds = np.zeros((2, len(both))) for i, item in enumerate(both): anom[i, :] = ncread( '/network/aopp/hera/mad/bakerh/RPM/SSTpatches/sst_HadOIBl_bc_N96_clim_pert' + lst[item] + '_c040926.nc', 'SST' )[0, :] - ncread( '/home/bakerh/Documents/DPhil/CPDN/RPM/SSTfiles/sst_HadOIBl_bc_N96_clim_c040926_25months.nc', 'SST_cpl')[0, :] mslp_control = ncread( '/network/aopp/hera/mad/bakerh/RPM/cpdn_extract_scripts-master/extracted_data/batch_577/atmos/item16222_monthly_mean/item16222_monthly_mean_' + both[i] + '_1999-01_2000-12.nc', 'item16222_monthly_mean')[:, 0, :] / 100 mslp = ncread( '/network/aopp/hera/mad/bakerh/RPM/cpdn_extract_scripts-master/extracted_data/batch_578/atmos/item16222_monthly_mean/item16222_monthly_mean_' + both[i] + '_1999-01_2000-12.nc', 'item16222_monthly_mean')[:, 0, :] / 100 mslp_cw, mslp_cs = nao_region_hadam3p(mslp_control) mslp_w, mslp_s = nao_region_hadam3p(mslp) nao_cw = eof_response(np.expand_dims(mslp_cw, axis=0), eof[0], lat, lon) nao_cs = eof_response(np.expand_dims(mslp_cs, axis=0), eof[1], lat, lon) nao_w = eof_response(np.expand_dims(mslp_w, axis=0), eof[0], lat, lon) nao_s = eof_response(np.expand_dims(mslp_s, axis=0), eof[1], lat, lon) NAOinds[0, i] = nao_w - nao_cw NAOinds[1, i] = nao_s - nao_cs print('Done: ' + str(i + 1) + ' out of ' + str(len(both))) anom = anom[:, ::-1, :] regmap_smoothed = np.zeros((2, 145, 192)) regmap_smoothed_sig = np.zeros((2, 145, 192)) regmap_smoothed_sig[:] = np.NAN for i in range(99): for j in range(192): for a in range(2): regmap_smoothed[a, i + 23, j] = np.cov( anom[:, i + 23, j], NAOinds[a, :])[0, 1] * 3 / (4 * 6371**2 * 1.25 * 1.875 * (np.pi / 180)**2) r = np.cov(anom[:, i + 23, j], NAOinds[a, :])[0, 1] / np.sqrt( np.cov(anom[:, i + 23, j], NAOinds[a, :])[1, 1] * np.cov(anom[:, i + 23, j], NAOinds[a, :])[0, 0]) t = r * np.sqrt((len(both) - 2) / (1 - r**2)) p = 1 - stats.norm.cdf(np.abs(t)) sig = np.greater_equal(5, p * 100 * 2).astype(int) if sig == 1: regmap_smoothed_sig[a, i + 23, j] = regmap_smoothed[a, i + 23, j] return regmap_smoothed, regmap_smoothed_sig
def maplotM(pdata, colormax=1, mask='no', title='', precip='no'): """ Plots input grid with map of world overlaid Parameters ---------- plotdata: array data being plotted title: str optional title """ from mpl_toolkits.basemap import Basemap, shiftgrid import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from netcdfread import ncread lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/MIROC5/All-Hist/day/tas/tas_Aday_MIROC5_All-Hist_est1_v2-0_run001_20060101-20161231.nc','lat') lon = np.arange(0, 360, 360/256) plt.figure() if mask == 'yes': lsm = ncread('/home/bakerh/Documents/DPhil/Python/lsm_n72.nc', 'lsm') pdata = np.ma.masked_array(pdata, mask=np.logical_not(lsm)) pdata, lon = shiftgrid(180., pdata, lon, start=False) meshlon, meshlat = np.meshgrid(lon, lat) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawmapboundary() x, y = m(meshlon, meshlat) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) my_cmap[230:282, :] = 1 if precip == 'yes': my_cmap = my_cmap[::-1] newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", my_cmap) ctrs = np.linspace(-colormax, colormax, 17) plot = m.contourf(x, y, pdata, ctrs, cmap=newcmap, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') b = plt.colorbar(plot, orientation='horizontal', aspect=50, shrink=0.75, spacing='proportional') b.set_label(label=r'-$\mathbf{v}_\chi\cdot\nabla\zeta$ (10$^{-12}$ s$^{-2}$)') parallels = m.drawparallels(np.arange(-90., 91., 15.)) meridians = m.drawmeridians(np.arange(-180., 181., 30)) m.drawparallels(parallels, labels=[True, True, True, True]) m.drawmeridians(meridians, labels=[True, True, True, True]) plt.title(title, y=1.08) plt.show()
def sphr2cart(grid): from scipy import interpolate import numpy as np from netcdfread import ncread r = 6.371e6 x_tot = 2*np.pi * r * np.cos(60*np.pi/180) lon = ncread('/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') lon_r = np.radians(lon) lat_r = np.radians(lat) meshlon, meshlat = np.meshgrid(lon_r, lat_r) meshx = r * meshlon / 2 meshy = r * meshlat f = interpolate.interp2d(lon_r, lat_r, grid) x = meshx[0, :] y = meshy[:, 0] grid_cart = f(x*lon_r.max()/x.max(), y*lat_r.max()/y.max()) return x, y, grid_cart
def sens(): import numpy as np from netcdfread import ncread import glob a = sorted( glob.glob('/network/aopp/hera/mad/bakerh/BTmodel_COR/main/sens/*')) v = np.zeros((36, 26, 64, 128)) for i in range(36): v[i] = ncread(a[i], 'V') return v
def jet_clim_indices(): import glob from netcdfread import ncread a = glob.glob( '/network/aopp/hera/mad/bakerh/RPM/cpdn_extract_scripts-master/extracted_data/batch_577/atmos/item15201_daily_mean/*' ) lat = ncread( '/network/aopp/hera/mad/bakerh/RPM/cpdn_extract_scripts-master/extracted_data/batch_577/atmos/item15201_daily_mean/item15201_daily_mean_b01f_1999-01_2000-12.nc', 'latitude0') lon = ncread( '/network/aopp/hera/mad/bakerh/RPM/cpdn_extract_scripts-master/extracted_data/batch_577/atmos/item15201_daily_mean/item15201_daily_mean_b01f_1999-01_2000-12.nc', 'longitude0') ji = np.zeros((2, 2, len(a))) for i in range(len(a)): ucontrol = ncread(a[i], 'item15201_daily_mean')[:, 0, :] u_djf = ucontrol[300:450] u_jja = ucontrol[480:630] ji[0, 0, i], ji[0, 1, i] = jetind(u_djf, lat, lon) ji[1, 0, i], ji[1, 1, i] = jetind(u_jja, lat, lon) print(str(i)) return ji
def lsc(tbar, r1, r2): from netcdfread import ncread import numpy as np lsm = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] lsm1 = np.ones((145, 192)) for i in range(145): for j in range(192): if lsm[i, j] == 0: lsm1[i, j] = 0 t_nat = np.mean(tbar['All-Nat'], axis=0) t_sst = np.mean(tbar['GHG-Nat'], axis=0) t_ghg = np.mean(tbar['SST-Nat'], axis=0) lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') meshlat = np.zeros([np.ma.size(lon), np.ma.size(lat)]) meshlat[:, :] = lat meshlatweight = np.transpose(np.cos(meshlat * np.pi / 180)) t_nat_w = t_nat * meshlatweight t_sst_w = t_sst * meshlatweight t_ghg_w = t_ghg * meshlatweight def lscalc(t_w, lsm1, meshlatweight, r1=56, r2=89): lsm1 = lsm1[r1:r2, :] t_w = t_w[r1:r2, :] meshlatweight = meshlatweight[r1:r2, :] t_l = np.mean(t_w[lsm1 > 0.5]) / np.mean(meshlatweight[lsm1 > 0.5]) t_o = np.mean(t_w[lsm1 < 0.5]) / np.mean(meshlatweight[lsm1 < 0.5]) return t_l, t_o t_nat_l, t_nat_o = lscalc(t_nat_w, lsm1, meshlatweight, r1, r2) t_sst_l, t_sst_o = lscalc(t_sst_w, lsm1, meshlatweight, r1, r2) t_ghg_l, t_ghg_o = lscalc(t_ghg_w, lsm1, meshlatweight, r1, r2) return t_nat_l, t_nat_o, t_sst_l, t_sst_o, t_ghg_l, t_ghg_o
def maplot_c(pdata, pdata1, title='', precip='no'): """ Plots input grid with map of world overlaid Parameters ---------- plotdata: array data being plotted title: str optional title """ from mpl_toolkits.basemap import Basemap, shiftgrid import numpy as np import matplotlib.pyplot as plt from netcdfread import ncread lon = ncread('/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') plt.figure() pdata, lon1 = shiftgrid(180., pdata, lon, start=False) pdata1, lon = shiftgrid(180., pdata1, lon, start=False) meshlon, meshlat = np.meshgrid(lon, lat) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawmapboundary() x, y = m(meshlon, meshlat) plot = m.contour(x, y, pdata, [4, 5, 6], colors='k') plt.clabel(plot, inline=1, fontsize=10) plot1 = m.contour(x, y, pdata1, [4, 5, 6], colors='r', linestyles='--') plt.clabel(plot, inline=1, fontsize=10) parallels = m.drawparallels(np.arange(-90., 91., 15.)) meridians = m.drawmeridians(np.arange(-180., 181., 30)) m.drawparallels(parallels, labels=[True, True, True, True]) m.drawmeridians(meridians, labels=[True, True, True, True]) plt.title(title, y=1.08) plt.show()
def mean_4xco2(var='va'): from scipy import interpolate from netcdfread import ncread import glob import numpy as np from btmodel import maplot_ll lat_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'latitude') lon_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'longitude') a = sorted( glob.glob('/network/aopp/hera/mad/bakerh/HAPPI/CMIP5/AMIP/' + var + '/*')) b = sorted( glob.glob('/network/aopp/hera/mad/bakerh/HAPPI/CMIP5/AMIP4xCO2/' + var + '/*')) sindices = np.zeros((30 * 3)) for i in range(30): sindices[3 * i:3 * (i + 1)] = [5 + 12 * i, 6 + 12 * i, 7 + 12 * i] sindices = sindices.astype(int) v_means = np.zeros((9, 145, 192)) for i in range(9): st = 0 if i == 3: st = 4 if i == 1: st = 348 if var == 'pr': v_c = ncread(a[i], var)[st + sindices] v_f = ncread(b[i], var)[st + sindices] else: v_c = ncread(a[i], var)[st + sindices, 9] v_f = ncread(b[i], var)[st + sindices, 9] dv = np.mean(v_f - v_c, axis=0) lat = ncread(a[i], 'lat') lon = ncread(b[i], 'lon') maplot_ll(dv, lat, lon, 3) f = interpolate.interp2d(lon, lat[::-1], dv) v_res = f(lon_n96, lat_n96) v_means[i] = v_res return v_means
def stat_rossM(u): ''' This treatment makes the regions of reflection (beta<0 and u_m>0) and regions of absorption (beta>0 and u_m<0) indistinguishable. These regions of absorption can be identified separately by plotting the easterlies. ''' from netcdfread import ncread lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/MIROC5/All-Hist/day/tas/tas_Aday_MIROC5_All-Hist_est1_v2-0_run001_20060101-20161231.nc','lat') lon = np.arange(0, 360, 360/256) meshlon, meshlat = np.meshgrid(lon, lat) phi = meshlat*np.pi/180 cs_phi = np.cos(phi) dphi = 1.25*np.pi/180 omega = 7.29e-5 a = 6.371e6 u_m = u / (a*cs_phi) u_1opp = np.gradient(u_m*cs_phi**2, dphi, axis=0) / cs_phi u_2opp = np.gradient(u_1opp, dphi, axis=0) / cs_phi beta = (2*omega - u_2opp)*cs_phi**2/a ks = np.sqrt(a*beta/u_m) return ks
def trop(): from netCDF4 import Dataset from netcdfread import ncread import glob def lapserate(t, z17): """ Produces plot of lapse rate of T data """ import numpy as np k = 287.058 / 0.718 L = np.zeros((17, 145)) for i in range(16): L[i, :] = k * 9.81 * ((t[i+1, :] - t[i, :]) * (z17[i+1] + z17[i])) / (287.058*(t[i+1, :] + t[i, :]) * (z17[i+1] - z17[i])) return L sindices = np.zeros((11*3)) windices = np.zeros((11*3)) for i in range(11): sindices[3*i:3*(i+1)] = [5+12*i, 6+12*i, 7+12*i] for i in range(11): windices[3*i:3*(i+1)] = [12*i, 1+12*i, 11+12*i] sindices = sindices.astype(int) windices = windices.astype(int) z = ncread('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/ta/item16203_monthly_mean_a011_2006-01_2016-12.nc', 'z9') a = glob.glob('/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/' + 'All-Hist/mon/ta/*') tbar = np.zeros((np.ma.size(z), 145)) for e, d in enumerate(a): nc_fid = Dataset(d, 'r') tbar += np.mean(nc_fid.variables['item16203_monthly_mean'][sindices, :], axis=(0, 3)) print('Done ' + str(e+1)) tbar /= np.ma.size(a) L = lapserate(tbar, z) return tbar, L
def circ_patternM(d_v, v_anom, f_anom, r=[0, 128, 0, 256]): from statsmodels.api import OLS lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/MIROC5/present/tas/tas_Aday_MIROC5_All-Hist_est1_v2-0_run001_20060101-20161231.nc','lat') lon = np.arange(0, 360, 360/256) meshlat = np.zeros((256, 128)) meshlat[:, :] = lat meshlat = np.transpose(meshlat) mlw = (np.cos(meshlat * np.pi/180)) v_coef = np.zeros((np.ma.size(v_anom, axis=0))) v_anom_w = v_anom * mlw dv = d_v * mlw dv_sub = np.ndarray.flatten(dv[r[0]:r[1], r[2]:r[3]]) v_anom_sub = np.transpose(np.reshape(v_anom_w[:, r[0]:r[1], r[2]:r[3]], (np.ma.size(v_anom, axis=0), (r[1]-r[0])*(r[3]-r[2])))) model = OLS(dv_sub, v_anom_sub).fit() v_coef = model._results.params field_circ = np.zeros((np.ma.size(v_anom, axis=0), 128, 256)) for a in range(np.ma.size(v_anom, axis=0)): field_circ[a, :] = v_coef[a] * f_anom[a, :] field_circ = np.sum(field_circ, axis=0) return field_circ
def rws_fprime(ua200, va200): from windspharm.standard import VectorWind from netcdfread import ncread, ncsave from scipy import interpolate lon42 = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lon') lat42 = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/Plus15-Future_LCO2/day/ua/item15201_daily_mean_a00b_2090-01_2100-12.nc', 'latitude1') u = ua200['All-Nat'] #[1] v = va200['All-Nat'] #[1] u_sst = ua200['GHG-Nat'] #[1] v_sst = va200['GHG-Nat'] #[1] u_ghg = ua200['SST-Nat'] #[1] v_ghg = va200['SST-Nat'] #[1] v = w5rem(v) u = w5rem(u) uwnd = np.zeros((64, 128, len(u))) vwnd = np.zeros((64, 128, len(v))) uwnd_sst = np.zeros((64, 128, len(u_sst))) vwnd_sst = np.zeros((64, 128, len(u_sst))) uwnd_ghg = np.zeros((64, 128, len(u_ghg))) vwnd_ghg = np.zeros((64, 128, len(u_ghg))) u = np.transpose(u, (1, 2, 0)) v = np.transpose(v, (1, 2, 0)) u_sst = np.transpose(u_sst, (1, 2, 0)) v_sst = np.transpose(v_sst, (1, 2, 0)) u_ghg = np.transpose(u_ghg, (1, 2, 0)) v_ghg = np.transpose(v_ghg, (1, 2, 0)) for i in range(np.ma.size(uwnd, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u[:, :, i]) uwnd[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v[:, :, i]) vwnd[:, :, i] = g(lon42, lat42[::-1]) for i in range(np.ma.size(uwnd_sst, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u_sst[:, :, i]) uwnd_sst[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v_sst[:, :, i]) vwnd_sst[:, :, i] = g(lon42, lat42[::-1]) for i in range(np.ma.size(uwnd_ghg, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u_ghg[:, :, i]) uwnd_ghg[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v_ghg[:, :, i]) vwnd_ghg[:, :, i] = g(lon42, lat42[::-1]) w = VectorWind(uwnd, vwnd) w_sst = VectorWind(uwnd_sst, vwnd_sst) w_ghg = VectorWind(uwnd_ghg, vwnd_ghg) eta = w.absolutevorticity() eta_sst = w_sst.absolutevorticity() eta_ghg = w_ghg.absolutevorticity() div = w.divergence() div_sst = w_sst.divergence() div_ghg = w_ghg.divergence() uchi, vchi = w.irrotationalcomponent() uchi_sst, vchi_sst = w_sst.irrotationalcomponent() uchi_ghg, vchi_ghg = w_ghg.irrotationalcomponent() etax, etay = w.gradient(eta) # etax_sst, etay_sst = w_sst.gradient(eta_sst) # etax_ghg, etay_ghg = w_ghg.gradient(eta_ghg) eta = np.transpose(eta, (2, 0, 1)) eta_sst = np.transpose(eta_sst, (2, 0, 1)) eta_ghg = np.transpose(eta_ghg, (2, 0, 1)) div = np.transpose(div, (2, 0, 1)) div_sst = np.transpose(div_sst, (2, 0, 1)) div_ghg = np.transpose(div_ghg, (2, 0, 1)) etax = np.transpose(etax, (2, 0, 1)) etay = np.transpose(etay, (2, 0, 1)) uchi = np.transpose(uchi, (2, 0, 1)) uchi_sst = np.transpose(uchi_sst, (2, 0, 1)) uchi_ghg = np.transpose(uchi_ghg, (2, 0, 1)) vchi = np.transpose(vchi, (2, 0, 1)) vchi_sst = np.transpose(vchi_sst, (2, 0, 1)) vchi_ghg = np.transpose(vchi_ghg, (2, 0, 1)) #f_ghg = -eta.mean(axis=0)*(div_ghg-div.mean(axis=0))-(uchi_ghg-uchi.mean(axis=0))*etax.mean(axis=0)-(vchi_ghg-vchi.mean(axis=0))*etay.mean(axis=0) #f_sst = -eta.mean(axis=0)*(div_sst-div.mean(axis=0))-(uchi_sst-uchi.mean(axis=0))*etax.mean(axis=0)-(vchi_sst-vchi.mean(axis=0))*etay.mean(axis=0) f_ghg = -eta * (div_ghg - div) - ((uchi_ghg - uchi) * etax + (vchi_ghg - vchi) * etay) f_sst = -eta * (div_sst - div) - ((uchi_sst - uchi) * etax + (vchi_sst - vchi) * etay) meshlon, meshlat = np.meshgrid(lon42, lat42) ''' ncsave('/home/bakerh/Downloads/vort200_control', lat42, lon42, eta.mean(axis=0)-2*np.sin(meshlat*np.pi/180)*7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/vort200_sst', lat42, lon42, eta_sst.mean(axis=0)-2*np.sin(meshlat*np.pi/180)*7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/vort200_ghg', lat42, lon42, eta_ghg.mean(axis=0)-2*np.sin(meshlat*np.pi/180)*7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/forcing_ghg', lat42, lon42, f_ghg.mean(axis=0), 'forcing') ncsave('/home/bakerh/Downloads/forcing_sst', lat42, lon42, f_sst.mean(axis=0), 'forcing') ''' month = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) ncsave('/home/bakerh/Downloads/vort200_control', month, lat42, lon42, eta - 2 * np.sin(meshlat * np.pi / 180) * 7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/vort200_sst', month, lat42, lon42, eta_sst - 2 * np.sin(meshlat * np.pi / 180) * 7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/vort200_ghg', month, lat42, lon42, eta_ghg - 2 * np.sin(meshlat * np.pi / 180) * 7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/forcing_ghg', month, lat42, lon42, f_ghg, 'forcing') ncsave('/home/bakerh/Downloads/forcing_sst', month, lat42, lon42, f_sst, 'forcing')
def main(var, global_tas): from scipy import interpolate from netcdfread import ncread import glob sindices = np.zeros((95 * 3)) for i in range(95): sindices[3 * i:3 * (i + 1)] = [5 + 12 * i, 6 + 12 * i, 7 + 12 * i] sindices = sindices.astype(int) lat_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'latitude') lon_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'longitude') concs = {} concs['inmcm4'] = 1084.44 concs['MIROC-ESM'] = 533.57 concs['CanESM2'] = 532.45 concs['MPI-ESM-LR'] = 555.37 concs['GFDL-ESM2M'] = 778.35 concs['HadGEM2-CC'] = 759.01 concs['bcc-csm1-1'] = 675.27 concs['IPSL-CM5A-MR'] = 656.68 concs['GFDL-ESM2G'] = 770.60 concs['IPSL-CM5B-LR'] = 666.95 concs['MIROC-ESM-CHEM'] = 537.12 concs['IPSL-CM5A-LR'] = 604.38 concs['HadGEM2-ES'] = 740.65 yrs = {} # yrs['CESM1-BGC'] = 2019.6038556835267 yrs['CanESM2'] = 2015.6501388153354 yrs['GFDL-ESM2G'] = 2040.2726255644302 yrs['GFDL-ESM2M'] = 2038.4461621682028 yrs['HadGEM2-CC'] = 2030.5237032804 yrs['HadGEM2-ES'] = 2028.1144760733512 yrs['IPSL-CM5A-LR'] = 2013.7490131087695 yrs['IPSL-CM5A-MR'] = 2018.568003728501 yrs['IPSL-CM5B-LR'] = 2025.1511344273508 yrs['MIROC-ESM'] = 2021.3187712711444 yrs['MIROC-ESM-CHEM'] = 2018.89262095655 yrs['MPI-ESM-LR'] = 2020.0421238126532 # yrs['NorESM1-ME'] = 2034.3684277126238 yrs['bcc-csm1-1'] = 2022.8345355891056 yrs['inmcm4'] = 2045.194355545509 yrs2 = {} # yrs2['CESM1-BGC'] = 2034.7262797142157, yrs2['CanESM2'] = 2028.6584559023813, yrs2['GFDL-ESM2G'] = 2056.5526316368, yrs2['GFDL-ESM2M'] = 2053.6514333101513, yrs2['HadGEM2-CC'] = 2043.093047747961, yrs2['HadGEM2-ES'] = 2039.480727397444, yrs2['IPSL-CM5A-LR'] = 2029.344424079118, yrs2['IPSL-CM5A-MR'] = 2032.351689422151, yrs2['IPSL-CM5B-LR'] = 2039.2780954952768, yrs2['MIROC-ESM'] = 2031.144339409215, yrs2['MIROC-ESM-CHEM'] = 2030.7223697396423, yrs2['MPI-ESM-LR'] = 2039.3393134034848, # yrs2['NorESM1-ME'] = 2047.8103280489413, yrs2['bcc-csm1-1'] = 2038.2589979997997, yrs2['inmcm4'] = 2058.6460082149406 tcr = {} # tcr['CESM1-BGC'] = 1.7 tcr['CanESM2'] = 2.4 tcr['GFDL-ESM2G'] = 1.1 tcr['GFDL-ESM2M'] = 1.3 tcr['HadGEM2-CC'] = np.nan tcr['HadGEM2-ES'] = 2.5 tcr['IPSL-CM5A-LR'] = 2 tcr['IPSL-CM5A-MR'] = 2 tcr['IPSL-CM5B-LR'] = 1.5 tcr['MIROC-ESM'] = 2.2 tcr['MIROC-ESM-CHEM'] = np.nan tcr['MPI-ESM-LR'] = 2.0 # tcr['NorESM1-ME'] = 1.6 tcr['bcc-csm1-1'] = 1.7 tcr['inmcm4'] = 1.3 tcre = {} # tcre['CESM1-BGC'] = 1.7 tcre['CanESM2'] = 2.375 tcre['GFDL-ESM2G'] = 0.825 tcre['GFDL-ESM2M'] = 1.075 tcre['HadGEM2-CC'] = np.nan tcre['HadGEM2-ES'] = 2.1 tcre['IPSL-CM5A-LR'] = 1.6 tcre['IPSL-CM5A-MR'] = 1.575 tcre['IPSL-CM5B-LR'] = 1.2 tcre['MIROC-ESM'] = 2.15 tcre['MIROC-ESM-CHEM'] = np.nan tcre['MPI-ESM-LR'] = 1.6 # tcre['NorESM1-ME'] = 1.6 tcre['bcc-csm1-1'] = 1.4 tcre['inmcm4'] = 1 tx90p_n96 = {} tx90p_n96_2 = {} items = [] tx90p_MID = [] tx90p_TROP = [] ts_tx90p_MID = [] ts_tx90p_TROP = [] emissions = [] years = [] tcrs = [] tcres = [] global_tass = [] a = glob.glob('/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/*') #a1 = a[0] #a[0] = a[1] #a[1] = a1 for i in a: items.append(i[78 + 2 * len(var) - 10:-30]) for i in items: print(i) if i == 'HadGEM2-CC': tx90p = np.array( ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-210012.nc', var + 'ETCCDI')[12:, :]) lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-210012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-210012.nc', 'lon') elif i == 'HadGEM2-ES': tx90p = np.array( ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-229912.nc', var + 'ETCCDI')[12:1152, :]) lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-229912.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-229912.nc', 'lon') elif i == 'bcc-csm1-1': tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lon') elif i == 'IPSL-CM5A-LR': tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lon') elif i == 'MPI-ESM-LR': tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lon') else: tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-210012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-210012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-210012.nc', 'lon') tx90p = tx90p[sindices] tx90p2 = np.copy(tx90p) ts_tx90p = np.copy(tx90p) # idx = (np.abs(conversion_0[:, 2]-concs[i])).argmin() # yr = conversion_0[idx, 0] yr = int(np.round(yrs[i])) yr2 = int(np.round(yrs2[i])) tx90p = np.mean(tx90p[3 * (yr - 2010):3 * (yr - 2000), :], axis=0) tx90p2 = np.mean(tx90p2[3 * (yr2 - 2010):3 * (yr2 - 2000), :], axis=0) f = interpolate.interp2d(lon, lat[::-1], tx90p) f2 = interpolate.interp2d(lon, lat[::-1], tx90p2) ts_tx90p = np.reshape(ts_tx90p, (95, 3, len(lat), len(lon))) ts_tx90p = np.mean(ts_tx90p, axis=1) ts_tx90p_mid = np.zeros((95)) ts_tx90p_trop = np.zeros((95)) ''' for j in range(95): g = interpolate.interp2d(lon, lat[::-1], ts_tx90p[j]) ts_tx90p_mid[j] = latweightmean(g(lon_n96, lat_n96), msk='MID') ts_tx90p_trop[j] = latweightmean(g(lon_n96, lat_n96), msk='TROP') ts_tx90p_MID.append(ts_tx90p_mid) ts_tx90p_TROP.append(ts_tx90p_trop) ''' tx90p_n96[i] = f(lon_n96, lat_n96) tx90p_n96_2[i] = f2(lon_n96, lat_n96) emissions.append(concs[i]) tcres.append(tcre[i]) tcrs.append(tcr[i]) years.append(yrs[i]) global_tass.append(global_tas[i + '_r1i1p1']) tx90p_MID.append(latweightmean(f(lon_n96, lat_n96), msk='MID')) tx90p_TROP.append(latweightmean(f(lon_n96, lat_n96), msk='TROP')) if var == 'tx90p': d = 0.9 else: d = 1 t_l = (tx90p_n96['CanESM2'] + tx90p_n96['MIROC-ESM-CHEM'] + tx90p_n96['IPSL-CM5A-LR']) * d / 3 t_h = (tx90p_n96['GFDL-ESM2G'] + tx90p_n96['inmcm4'] + tx90p_n96['HadGEM2-CC']) * d / 3 t2 = (tx90p_n96_2['CanESM2'] + tx90p_n96_2['MIROC-ESM-CHEM'] + tx90p_n96_2['IPSL-CM5A-LR'] + tx90p_n96_2['GFDL-ESM2G'] + tx90p_n96_2['inmcm4'] + tx90p_n96_2['HadGEM2-CC']) * d / 6 t15 = (tx90p_n96['CanESM2'] + tx90p_n96['MIROC-ESM-CHEM'] + tx90p_n96['IPSL-CM5A-LR'] + tx90p_n96['GFDL-ESM2G'] + tx90p_n96['inmcm4'] + tx90p_n96['HadGEM2-CC']) * d / 6 ''' for i in range(len(years)): ts_tx90p_MID[i] *= d ts_tx90p_TROP[i] *= d tx90p_MID[i] *= d tx90p_TROP[i] *= d ''' return t_l, t_h, t15, t2, tcrs, tcres, emissions, years, global_tass #, ts_tx90p_MID, ts_tx90p_TROP
def cmiptas(): from scipy import interpolate from netcdfread import ncread import glob import numpy as np def lscalc(t_w, lsm1, meshlatweight, r1=56, r2=89): lsm1 = lsm1[r1:r2, :] t_w = t_w[r1:r2, :] meshlatweight = meshlatweight[r1:r2, :] t_l = np.mean(t_w[lsm1 > 0.5]) / np.mean(meshlatweight[lsm1 > 0.5]) t_o = np.mean(t_w[lsm1 < 0.5]) / np.mean(meshlatweight[lsm1 < 0.5]) return t_l, t_o lsm = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] lsm1 = np.ones((145, 192)) for i in range(145): for j in range(192): if lsm[i, j] == 0: lsm1[i, j] = 0 lat_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'latitude') lon_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'longitude') meshlat = np.zeros([np.ma.size(lon_n96), np.ma.size(lat_n96)]) meshlat[:, :] = lat_n96 meshlatweight = np.transpose(np.cos(meshlat * np.pi / 180)) models = [ 'ACCESS1-0_', 'ACCESS1-3_', 'bcc-csm1-1_', 'bcc-csm1-1-m_', 'BNU-ESM_', 'CanESM2_', 'CCSM4_', 'CNRM-CM5_', 'CSIRO-Mk3-6-0_', 'EC-EARTH_', 'FGOALS-g2_', 'FGOALS-s2_', 'GFDL-CM3_', 'GFDL-ESM2G_', 'GFDL-ESM2M_', 'GISS-E2-H_', 'GISS-E2-R_', 'HadGEM2-ES', 'inmcm4_', 'IPSL-CM5A-LR_', 'IPSL-CM5A-MR_', 'IPSL-CM5B-LR_', 'MPI-ESM-LR_', 'MPI-ESM-MR_', 'MPI-ESM-P_', 'NorESM1-M_' ] dT = np.zeros(26) aT = np.zeros(26) aTt = np.zeros(26) for j, model in enumerate(models): a = glob.glob( '/network/aopp/hera/mad/bakerh/HAPPI/CMIP5/abrupt4xco2/tas_Amon_' + model + '*') b = glob.glob( '/network/aopp/hera/mad/bakerh/HAPPI/CMIP5/piControl/tas_Amon_' + model + '*') data4 = ncread(a[0], 'tas') datac = ncread(b[0], 'tas') if len(a) > 1: for i in range(len(a) - 1): data4 = np.concatenate((data4, ncread(a[i + 1], 'tas')), axis=0) if len(b) > 1: for i in range(len(b) - 1): datac = np.concatenate((datac, ncread(b[i + 1], 'tas')), axis=0) data4 = np.squeeze(np.mean(data4[1200:1800], axis=0)) datac = np.squeeze(np.mean(datac[1200:], axis=0)) lat = ncread(a[0], 'lat') lon = ncread(a[0], 'lon') f = interpolate.interp2d(lon, lat[::-1], data4) g = interpolate.interp2d(lon, lat[::-1], datac) data4_n96_w = f(lon_n96, lat_n96) * meshlatweight datac_n96_w = g(lon_n96, lat_n96) * meshlatweight t4 = np.mean(data4_n96_w) / np.mean(meshlatweight) tc = np.mean(datac_n96_w) / np.mean(meshlatweight) dt = t4 - tc t4_l, t4_o = lscalc(data4_n96_w, lsm1, meshlatweight, 0, 145) tc_l, tc_o = lscalc(datac_n96_w, lsm1, meshlatweight, 0, 145) t4t_l, t4t_o = lscalc(data4_n96_w, lsm1, meshlatweight, 56, 89) tct_l, tct_o = lscalc(datac_n96_w, lsm1, meshlatweight, 56, 89) ta = (t4_l - tc_l) - (t4_o - tc_o) tat = (t4t_l - tct_l) - (t4t_o - tct_o) dT[j] = dt aT[j] = ta aTt[j] = tat print(model) return dT, aT, aTt
def plotall(data_l, data_h, colorlimit, mask='yes', precip='no', pltlbl='RCP8.5 TX90p'): from netcdfread import ncread import matplotlib as mpl from matplotlib import pyplot as plt from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') summer = data_h - data_l fig = plt.figure(facecolor='w', edgecolor='k', linewidth=2) if mask == 'yes': lsm = ncread( '/home/bakerh/Documents/DPhil/CPDN/\ Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] summer = np.ma.masked_array(summer, mask=np.logical_not(lsm)) summer, lon3 = shiftgrid(180., summer, lon, start=False) summer, lon3 = addcyclic(summer, lon3) meshlon, meshlat = np.meshgrid(lon3, lat) ctrs = np.linspace(-colorlimit, colorlimit, 17) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) if precip == 'yes': my_cmap = my_cmap[::-1] my_cmap[230:282, :] = 1 newcmap = mpl.colors.LinearSegmentedColormap.from_list("nj", my_cmap) cmp = newcmap ax1 = fig.add_subplot(1, 1, 1) m = Basemap(projection='moll', lon_0=0, resolution='c') m.drawcoastlines() m.drawcountries() m.drawmapboundary(linewidth=2) x, y = m(meshlon, meshlat) plot = m.contourf(x, y, summer, ctrs, cmap=cmp, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') hfont = {'fontname': 'Arial'} c = fig.colorbar(plot, ax=ax1, orientation='horizontal', spacing='proportional', aspect=50) c.set_label(label='Difference (days season$\mathregular{^{-1}}$)', size=20) #cl = ax1.getp(c, 'xmajorticklabels') c.ax.tick_params(labelsize=20) pad = 15 # in points ax1.annotate(pltlbl, xy=(0, 0.5), xytext=(-ax1.yaxis.labelpad - pad, 0), fontsize=32, fontname='Arial', xycoords=ax1.yaxis.label, textcoords='offset points', ha='right', va='center', rotation=90) plt.show() plt.subplots_adjust(hspace=0, wspace=0.05, top=.97, bottom=0.15, left=.05, right=.95)
def latweightmean(data, msk='no'): from netcdfread import ncread lsm = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] lsm1 = np.ones((145, 192)) for i in range(145): for j in range(192): if lsm[i, j] == 0: lsm1[i, j] = 0 lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/batch_518/atmos/item3236_monthly_mean/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') meshlat = np.zeros([np.ma.size(lon), np.ma.size(lat)]) meshlat[:, :] = lat meshlatweight = np.transpose(np.cos(meshlat * np.pi / 180)) weighted = data * meshlatweight if msk == 'yes': mask = np.zeros((145, 192)) mask[:] = lsm1 meaned = np.mean(weighted[mask > 0.5]) / np.mean( meshlatweight[lsm1 > 0.5]) elif msk == 'NH': mask = np.zeros((73, 192)) lsm1 = lsm1[:73, :] mask[:] = lsm1 weighted = weighted[:73, :] meshlatweight = meshlatweight[:73, :] meaned = np.mean(weighted[mask > 0.5]) / np.mean( meshlatweight[lsm1 > 0.5]) elif msk == 'TROP': mask = np.zeros((49, 192)) lsm1 = lsm1[48:97, :] mask[:] = lsm1 weighted = weighted[48:97, :] meshlatweight = meshlatweight[48:97, :] meaned = np.mean(weighted[mask > 0.5]) / np.mean( meshlatweight[lsm1 > 0.5]) elif msk == 'MID': mask = np.zeros((48, 192)) lsm1 = lsm1[:48, :] mask[:] = lsm1 weighted = weighted[:48, :] meshlatweight = meshlatweight[:48, :] meaned = np.mean(weighted[mask > 0.5]) / np.mean( meshlatweight[lsm1 > 0.5]) elif msk == 'no': meaned = np.mean(weighted) / np.mean(meshlatweight) elif np.ma.size(msk) == 5: mask = np.zeros((msk[2] - msk[1], 192 + msk[4] - msk[3])) lsm1 = np.concatenate( (lsm1[msk[1]:msk[2], msk[3]:], lsm1[msk[1]:msk[2], :msk[4]]), axis=1) mask[:] = lsm1 weighted = np.concatenate( (weighted[msk[1]:msk[2], msk[3]:], weighted[:, msk[1]:msk[2], :msk[4]]), axis=2) meshlatweight = np.concatenate( (meshlatweight[msk[1]:msk[2], msk[3]:], meshlatweight[msk[1]:msk[2], :msk[4]]), axis=1) meaned = np.mean(weighted[mask > 0.5]) / np.mean( meshlatweight[lsm1 > 0.5]) else: mask = np.zeros((msk[1] - msk[0], msk[3] - msk[2])) lsm1 = lsm1[msk[0]:msk[1], msk[2]:msk[3]] mask[:] = lsm1 weighted = weighted[msk[0]:msk[1], msk[2]:msk[3]] meshlatweight = meshlatweight[msk[0]:msk[1], msk[2]:msk[3]] meaned = np.mean(weighted[mask > 0.5]) / np.mean( meshlatweight[lsm1 > 0.5]) return meaned
def animate_rw( data, colorlimit=0.5, ts=6, title='', save='no', location='/home/bakerh/Documents/DPhil/Figures/Python/BTmodel/animations/new.mp4' ): """ Plots animation of input grid of quantity at sigma and lat coords Parameters ---------- data: array data being plotted sigma: array sigma levels of data lat: array latitudes of data title: str optional title """ import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.animation as animation from netcdfread import ncread from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic lon = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lon') lat = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lat') summer = np.copy(data[::ts]) fig = plt.figure(facecolor='w', edgecolor='k', linewidth=2) summer, lon = shiftgrid(180., summer, lon, start=False) summer, lon = addcyclic(summer, lon) meshlon, meshlat = np.meshgrid(lon, lat) ctrs = np.linspace(-colorlimit, colorlimit, 17) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) my_cmap[230:282, :] = 1 newcmap = mpl.colors.LinearSegmentedColormap.from_list("nj", my_cmap) cmp = newcmap def updatefig(i): fig.clear() ax1 = fig.add_subplot(1, 1, 1) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawcountries() m.drawmapboundary(linewidth=2) x, y = m(meshlon, meshlat) plot = m.contourf(x, y, summer[i] - summer[0], ctrs, cmap=cmp, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') # parallels = m.drawparallels(np.arange(-90., 91., 15.)) # meridians = m.drawmeridians(np.arange(-180., 181., 30.)) # m.drawparallels(parallels, labels=[True, True, True, True]) # m.drawmeridians(meridians, labels=[True, True, True, True]) b = fig.colorbar(plot, aspect=50, shrink=0.75, spacing='proportional', orientation='horizontal', extend='max', pad=0.05) b.set_label(label=r'V200 (1x10$^{-6}$ ms$^{-1}$)') j = i / (24 / ts) ax1.set_title(' t=' + str('%02.3f' % j), loc='left', y=.9) plt.subplots_adjust(top=.99, bottom=0.01, left=.05, right=.95) plt.suptitle(title, y=.85) plt.draw() anim = animation.FuncAnimation(fig, updatefig, len(summer)) if save == 'yes': anim.save(location, codec='mpeg4', bitrate=8000, dpi=300) return anim
def comp(model, var='tx90p'): from scipy import interpolate from netcdfread import ncread sindices = np.zeros((95 * 3)) for i in range(95): sindices[3 * i:3 * (i + 1)] = [5 + 12 * i, 6 + 12 * i, 7 + 12 * i] sindices = sindices.astype(int) lat_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'latitude') lon_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'longitude') yrs = {} # yrs['CESM1-BGC'] = 2019.6038556835267 yrs['CanESM2'] = 2015.6501388153354 yrs['GFDL-ESM2G'] = 2040.2726255644302 yrs['GFDL-ESM2M'] = 2038.4461621682028 yrs['HadGEM2-CC'] = 2030.5237032804 yrs['HadGEM2-ES'] = 2028.1144760733512 yrs['IPSL-CM5A-LR'] = 2013.7490131087695 yrs['IPSL-CM5A-MR'] = 2018.568003728501 yrs['IPSL-CM5B-LR'] = 2025.1511344273508 yrs['MIROC-ESM'] = 2021.3187712711444 yrs['MIROC-ESM-CHEM'] = 2018.89262095655 yrs['MPI-ESM-LR'] = 2020.0421238126532 # yrs['NorESM1-ME'] = 2034.3684277126238 yrs['bcc-csm1-1'] = 2022.8345355891056 yrs['inmcm4'] = 2045.194355545509 yrs26 = {} yrs26['CanESM2'] = 2015.9168461250079 yrs26['HadGEM2-ES'] = 2031.2511570532158 yrs26['IPSL-CM5A-LR'] = 2013.6504936554309 yrs26['IPSL-CM5A-MR'] = 2019.6423318791442 yrs26['MIROC-ESM'] = 2022.8139042931136 yrs26['MIROC-ESM-CHEM'] = 2016.8634829024122 yrs26['MPI-ESM-LR'] = 2025.4963052174598 # yrs['NorESM1-ME'] = 2044.9730257768917 yrs26['bcc-csm1-1'] = 2025.1860768601402 i = model if i == 'HadGEM2-CC': tx90p = np.array( ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-210012.nc', var + 'ETCCDI')[12:, :]) tx90p26 = np.array( ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp26/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp26_r1i1p1_200501-210012.nc', var + 'ETCCDI')[12:, :]) lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-210012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-210012.nc', 'lon') elif i == 'HadGEM2-ES': tx90p = np.array( ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-229912.nc', var + 'ETCCDI')[12:1152, :]) tx90p26 = np.array( ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp26/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp26_r1i1p1_200501-229912.nc', var + 'ETCCDI')[12:1152, :]) lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-229912.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200501-229912.nc', 'lon') elif i == 'bcc-csm1-1': tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] tx90p26 = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp26/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp26_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lon') elif i == 'IPSL-CM5A-LR': tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] tx90p26 = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp26/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp26_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lon') elif i == 'MPI-ESM-LR': tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] tx90p26 = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp26/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp26_r1i1p1_200601-230012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-230012.nc', 'lon') else: tx90p = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-210012.nc', var + 'ETCCDI')[:1140, :] tx90p26 = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp26/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp26_r1i1p1_200601-210012.nc', var + 'ETCCDI')[:1140, :] lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-210012.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/climdex/CMIP5/rcp85/' + var + '/' + var + 'ETCCDI_mon_' + str(i) + '_rcp85_r1i1p1_200601-210012.nc', 'lon') tx90p = tx90p[sindices] tx90p26 = tx90p26[sindices] # idx = (np.abs(conversion_0[:, 2]-concs[i])).argmin() # yr = conversion_0[idx, 0] yr = np.round(yrs[i]) yr26 = np.round(yrs26[i]) tx90p = np.mean(tx90p[3 * (yr - 2010):3 * (yr - 2000), :], axis=0) tx90p26 = np.mean(tx90p26[3 * (yr26 - 2010):3 * (yr26 - 2000), :], axis=0) f = interpolate.interp2d(lon, lat[::-1], tx90p) f26 = interpolate.interp2d(lon, lat[::-1], tx90p26) tx90p_n96 = f(lon_n96, lat_n96) * .9 tx90p26_n96 = f26(lon_n96, lat_n96) * .9 plotall(tx90p26_n96, tx90p_n96, 20, pltlbl=model + ' RCP8.5 - RCP2.6 TX90p')
def maplotr(pdata, model, colormax=1, colormin=-999, title='', precip='no'): """ Plots input grid with map of world overlaid Parameters ---------- plotdata: array data being plotted title: str optional title """ from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from netcdfread import ncread if colormin == -999: colormin = -colormax if model == 'had': lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') if model == 'mir': lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/MIROC5/All-Hist/day/tas/tas_Aday_MIROC5_All-Hist_est1_v2-0_run001_20060101-20161231.nc', 'lat') lon = np.arange(0, 360, 360 / 256) if model == 'cam': lat = np.linspace(-90, 90, 96) lon = np.linspace(0, 357.5, 144) plt.figure() pdata, lon = shiftgrid(180., pdata, lon, start=False) pdata, lon = addcyclic(pdata, lon) meshlon, meshlat = np.meshgrid(lon, lat) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawmapboundary() x, y = m(meshlon, meshlat) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) my_cmap[230:282, :] = 1 if precip == 'yes': my_cmap = my_cmap[::-1] newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", my_cmap) ctrs = np.linspace(colormin, colormax, 17) plot = m.contourf(x, y, pdata, ctrs, cmap=newcmap, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') b = plt.colorbar(plot, orientation='horizontal', aspect=50, shrink=0.75, spacing='proportional') b.set_label(label=r'pr (mm day$^{-1}$)') parallels = m.drawparallels(np.arange(-90., 91., 15.)) meridians = m.drawmeridians(np.arange(-180., 181., 30)) m.drawparallels(parallels, labels=[True, True, True, True]) m.drawmeridians(meridians, labels=[True, True, True, True]) plt.title(title, y=1.08) plt.show()
def mapplot60(plotdata_sig, plotdata, mask='yes', title=''): """ Plots input grid with map of world overlaid Parameters ---------- plotdata: array data being plotted title: str optional title """ from mpl_toolkits.basemap import Basemap import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from netcdfread import ncread lat = np.linspace(90, -90, 145) lon = np.arange(0, 360, 1.875) long = np.concatenate((lon, [360])) fig, axs = plt.subplots(2, 2, facecolor='w', edgecolor='k', linewidth=2) # fig.suptitle('North Atlantic Jet Sensitivity', fontsize=20, y=0.96) for a in range(2): for b in range(2): if b == 0: mx = 1.2 else: mx = .8 plotdata1 = np.concatenate((plotdata_sig[a, 1-b, :], np.expand_dims(plotdata_sig[a, 1-b, :, 0], axis=1)), axis=1) * 1e5 plotdata3 = np.concatenate((plotdata[a, 1-b, :], np.expand_dims(plotdata[a, 1-b, :, 0], axis=1)), axis=1) * 1e5 if mask == 'yes': lsm = ncread('/home/bakerh/Documents/DPhil/CPDN/\ Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] lsm = np.concatenate((lsm, np.expand_dims(lsm[:, 0], axis=1)), axis=1) plotdata1 = np.ma.masked_array(plotdata1, lsm) plotdata3 = np.ma.masked_array(plotdata3, lsm) meshlon, meshlat = np.meshgrid(long, lat) ax1 = axs[a, b] m = Basemap(projection='cyl', llcrnrlat=-60, urcrnrlat=60, llcrnrlon=0, urcrnrlon=360, resolution='c', ax=ax1) m.drawcoastlines() m.drawmapboundary(linewidth=2) x, y = m(meshlon, meshlat) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) #my_cmap[239:274, :] = 1 newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", my_cmap) caxismin, caxismax, ctrs = -mx, mx, np.linspace(-mx, mx, 17) plot = m.contourf(x, y, plotdata1, ctrs, cmap=newcmap, vmin=caxismin, vmax=caxismax, extend='both') m.contour(x, y, plotdata3, ctrs, colors='k') ax1.set_ylim(-60, 60) m.drawparallels(np.arange(-60, 90, 30), labels=[True, False, False, True], linewidth=0) m.drawmeridians(np.arange(0, 390, 30), labels=[True, False, False, True], linewidth=0) ax1.set_yticks(np.arange(-60., 90., 30.)) ax1.set_xticks(np.arange(0., 390., 30.)) ax1.tick_params(labelleft='off', labelbottom='off', which='major', direction='out', length=5, width=2) ax1.set_yticks(np.arange(-60., 70., 10.), minor=True) ax1.set_xticks(np.arange(0., 370., 10.), minor=True) ax1.tick_params(labelleft='off', labelbottom='off', which='minor', direction='out', length=4, width=1) if a == 0 and b == 0: ax1.set_ylabel('DJF', fontsize=16, labelpad=25) ax1.set_title('Latitude', fontsize=16, y=1.08) if a == 1 and b == 0: c = fig.colorbar(plot, ax=ax1, orientation='horizontal', spacing='proportional', aspect=50) ax1.set_ylabel('JJA', fontsize=16, labelpad=25) c.set_label(label='Poleward jet latitude shift ($^\circ$ [$\mathregular{1x10^5km^2}$K]$\mathregular{^{-1}}$)', size=16) if a == 0 and b == 1: ax1.set_title('Speed', fontsize=16, y=1.08) if a == 1 and b == 1: c = fig.colorbar(plot, ax=ax1, orientation='horizontal', spacing='proportional', aspect=50) c.set_label(label='Jet speed increase (ms$\mathregular{^{-1}}$ [$\mathregular{1x10^5km^2}$K]$\mathregular{^{-1}}$)', size=16) plt.subplots_adjust(hspace=0, wspace=0.1, top=.95, bottom=0.05, left=.05, right=.95) plt.show()
def cmipw5(v_had): import glob from netcdfread import ncread from scipy import interpolate lat_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'latitude') lon_n96 = ncread( '/home/bakerh/Documents/DPhil/CPDN/Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'longitude') models = [ 'ACCESS1-0_', 'ACCESS1-3_', 'bcc-csm1-1_', 'bcc-csm1-1-m_', 'BNU-ESM_', 'CanESM2_', 'CCSM4_', 'CESM1-BGC_', 'CESM1-CAM5_', 'CMCC-CESM_', 'CMCC-CM_', 'CMCC-CMS_', 'CNRM-CM5_', 'CSIRO-Mk3-6-0_', 'EC-EARTH_', 'FGOALS-g2_', 'FIO-ESM_', 'GFDL-CM3_', 'GFDL-ESM2G_', 'GFDL-ESM2M_', 'GISS-E2-H-CC_', 'GISS-E2-H_', 'GISS-E2-R-CC_', 'GISS-E2-R_', 'HadGEM2-AO_', 'HadGEM2-CC_', 'HadGEM2-ES_', 'inmcm4_', 'IPSL-CM5A-LR_', 'IPSL-CM5A-MR_', 'IPSL-CM5B-LR_', 'MPI-ESM-LR_', 'MPI-ESM-MR_', 'NorESM1-ME_', 'NorESM1-M_' ] indices = {} for k, model in enumerate(models): a = glob.glob( '/network/aopp/hera/mad/bakerh/HAPPI/CMIP5/historical/va/va_Amon_' + model + '*') b = glob.glob( '/network/aopp/hera/mad/bakerh/HAPPI/CMIP5/rcp85/va/va_Amon_' + model + '*') m = 6 e = 156 time = np.arange(1850, 2101) if model == 'bcc-csm1-1_': time = np.arange(1850, 2301) elif model == 'IPSL-CM5A-LR_': time = np.arange(1850, 2301) elif model == 'CCSM4_': time = np.arange(1850, 2301) elif model == 'CNRM-CM5_': time = np.arange(1850, 2301) elif model == 'CSIRO-Mk3-6-0_': time = np.arange(1850, 2301) elif model == 'GISS-E2-R_': time = np.arange(1850, 2301) elif model == 'GISS-E2-H_': time = np.arange(1850, 2301) elif model == 'MPI-ESM-LR_': time = np.arange(1850, 2301) elif model == 'GFDL-CM3_': e = 146 time = np.arange(1860, 2101) elif model == 'GFDL-ESM2G_': e = 145 time = np.arange(1861, 2101) elif model == 'GFDL-ESM2M_': e = 145 time = np.arange(1861, 2101) elif model == 'HadGEM2-CC_': m = 5 e = 146 time = np.arange(1860, 2100) elif model == 'HadGEM2-AO_': e = 146 time = np.arange(1860, 2100) elif model == 'HadGEM2-ES_': m = 5 e = 146 time = np.arange(1860, 2300) elif model == 'FGOALS-g2_': m = 6 e = 106 time = np.arange(1900, 2102) va = ncread(a[0], 'va')[m::12, 9] va1 = ncread(b[0], 'va')[m::12, 9] if len(a) > 1: for i in range(len(a) - 1): va = np.concatenate((va, ncread(a[i + 1], 'va')[m::12, 9]), axis=0) if len(b) > 1: for i in range(len(b) - 1): va1 = np.concatenate((va1, ncread(b[i + 1], 'va')[m::12, 9]), axis=0) lat = ncread(a[0], 'lat') lon = ncread(a[0], 'lon') va = va[:e] va_j2 = np.concatenate((va, va1), axis=0) va_j2_96 = np.zeros((len(va_j2), 145, 192)) for j in range(len(va_j2)): f = interpolate.interp2d(lon, lat[::-1], va_j2[j]) va_j2_96[j] = f(lon_n96, lat_n96) meshlat = np.zeros([np.ma.size(lon_n96), np.ma.size(lat_n96)]) meshlat[:, :] = lat_n96 meshlatweight = np.cos(meshlat.transpose() * np.pi / 180) index_j2 = np.zeros(len(va_j2)) for i in range(len(va_j2)): index_j2[i] = np.sum( v_had[12:49] * va_j2_96[i, 12:49] * meshlatweight[12:49]) / (np.sqrt( np.sum(v_had[12:49] * v_had[12:49] * meshlatweight[12:49])) * np.sqrt( np.sum(va_j2_96[i, 12:49] * va_j2_96[i, 12:49] * meshlatweight[12:49]))) indices[model] = time, index_j2 print(model) return indices
def rws_fprime_co2(ua200, va200): from windspharm.standard import VectorWind from netcdfread import ncread, ncsave from scipy import interpolate lon42 = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lon') lat42 = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lat') # HadAM3P lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/Plus15-Future_LCO2/day/ua/item15201_daily_mean_a00b_2090-01_2100-12.nc', 'latitude1') # MIROC5 # lat = ncread('/network/aopp/hera/mad/bakerh/HAPPI/MIROC5/All-Hist/day/tas/tas_Aday_MIROC5_All-Hist_est1_v2-0_run001_20060101-20161231.nc','lat') # lon = np.arange(0, 360, 360/256) # CAM4 #lat = np.linspace(-90, 90, 96) #lon = np.linspace(0, 357.5, 144) u = ua200['Plus15-Future_LCO2'] v = va200['Plus15-Future_LCO2'] u_ghg = ua200['Plus15-Future_HCO2'] v_ghg = va200['Plus15-Future_HCO2'] uwnd = np.zeros((64, 128, len(u))) vwnd = np.zeros((64, 128, len(v))) uwnd_ghg = np.zeros((64, 128, len(u_ghg))) vwnd_ghg = np.zeros((64, 128, len(u_ghg))) u = np.transpose(u, (1, 2, 0)) v = np.transpose(v, (1, 2, 0)) u_ghg = np.transpose(u_ghg, (1, 2, 0)) v_ghg = np.transpose(v_ghg, (1, 2, 0)) for i in range(np.ma.size(uwnd, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u[:, :, i]) uwnd[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v[:, :, i]) vwnd[:, :, i] = g(lon42, lat42[::-1]) for i in range(np.ma.size(uwnd_ghg, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u_ghg[:, :, i]) uwnd_ghg[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v_ghg[:, :, i]) vwnd_ghg[:, :, i] = g(lon42, lat42[::-1]) w = VectorWind(uwnd, vwnd) w_ghg = VectorWind(uwnd_ghg, vwnd_ghg) eta = w.absolutevorticity() eta_ghg = w_ghg.absolutevorticity() div = w.divergence() div_ghg = w_ghg.divergence() uchi, vchi = w.irrotationalcomponent() uchi_ghg, vchi_ghg = w_ghg.irrotationalcomponent() etax, etay = w.gradient(eta) # etax_ghg, etay_ghg = w_ghg.gradient(eta_ghg) eta = np.transpose(eta, (2, 0, 1)) eta_ghg = np.transpose(eta_ghg, (2, 0, 1)) div = np.transpose(div, (2, 0, 1)) div_ghg = np.transpose(div_ghg, (2, 0, 1)) etax = np.transpose(etax, (2, 0, 1)) etay = np.transpose(etay, (2, 0, 1)) uchi = np.transpose(uchi, (2, 0, 1)) uchi_ghg = np.transpose(uchi_ghg, (2, 0, 1)) vchi = np.transpose(vchi, (2, 0, 1)) vchi_ghg = np.transpose(vchi_ghg, (2, 0, 1)) f_ghg = -eta * (div_ghg - div) - ((uchi_ghg - uchi) * etax + (vchi_ghg - vchi) * etay) meshlon, meshlat = np.meshgrid(lon42, lat42) ''' ncsave('/home/bakerh/Downloads/vort200_control', lat42, lon42, eta.mean(axis=0)-2*np.sin(meshlat*np.pi/180)*7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/forcing_ghg', lat42, lon42, f_ghg.mean(axis=0), 'forcing') ''' month = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) ncsave('/home/bakerh/Downloads/vort200_control', month, lat42, lon42, eta - 2 * np.sin(meshlat * np.pi / 180) * 7.2921e-5, 'vorticity') ncsave('/home/bakerh/Downloads/forcing_ghg', month, lat42, lon42, f_ghg, 'forcing')
def ming_forcing(ua, va, psl): from windspharm.standard import VectorWind from netcdfread import ncread, ncsave from scipy import interpolate lon42 = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lon') lat42 = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lat') lon = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'longitude0') lat = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/Plus15-Future_LCO2/day/ua/item15201_daily_mean_a00b_2090-01_2100-12.nc', 'latitude1') lat145 = ncread( '/network/aopp/hera/mad/bakerh/HAPPI/HadAM3P-N96/All-Hist/mon/tas/item3236_monthly_mean_a011_2006-01_2016-12.nc', 'latitude0') u = ua['All-Nat'][1] v = va['All-Nat'][1] u_sst = ua['GHG-Nat'][1] v_sst = va['GHG-Nat'][1] u_ghg = ua['SST-Nat'][1] v_ghg = va['SST-Nat'][1] p = psl['All-Nat'][1] p_sst = psl['GHG-Nat'][1] p_ghg = psl['SST-Nat'][1] uwnd = np.zeros((64, 128, len(u))) vwnd = np.zeros((64, 128, len(v))) uwnd_sst = np.zeros((64, 128, len(u_sst))) vwnd_sst = np.zeros((64, 128, len(u_sst))) uwnd_ghg = np.zeros((64, 128, len(u_ghg))) vwnd_ghg = np.zeros((64, 128, len(u_ghg))) ps = np.zeros((64, 128, len(p))) ps_sst = np.zeros((64, 128, len(p_sst))) ps_ghg = np.zeros((64, 128, len(p_ghg))) u = np.transpose(u, (1, 2, 0)) v = np.transpose(v, (1, 2, 0)) u_sst = np.transpose(u_sst, (1, 2, 0)) v_sst = np.transpose(v_sst, (1, 2, 0)) u_ghg = np.transpose(u_ghg, (1, 2, 0)) v_ghg = np.transpose(v_ghg, (1, 2, 0)) p = np.transpose(p, (1, 2, 0)) p_sst = np.transpose(p_sst, (1, 2, 0)) p_ghg = np.transpose(p_ghg, (1, 2, 0)) for i in range(np.ma.size(uwnd, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u[:, :, i]) uwnd[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v[:, :, i]) vwnd[:, :, i] = g(lon42, lat42[::-1]) j = interpolate.interp2d(lon, lat145[::-1], p[:, :, i]) ps[:, :, i] = j(lon42, lat42[::-1]) for i in range(np.ma.size(uwnd_sst, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u_sst[:, :, i]) uwnd_sst[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v_sst[:, :, i]) vwnd_sst[:, :, i] = g(lon42, lat42[::-1]) j = interpolate.interp2d(lon, lat145[::-1], p_sst[:, :, i]) ps_sst[:, :, i] = j(lon42, lat42[::-1]) for i in range(np.ma.size(uwnd_ghg, axis=2)): h = interpolate.interp2d(lon, lat[::-1], u_ghg[:, :, i]) uwnd_ghg[:, :, i] = h(lon42, lat42[::-1]) g = interpolate.interp2d(lon, lat[::-1], v_ghg[:, :, i]) vwnd_ghg[:, :, i] = g(lon42, lat42[::-1]) j = interpolate.interp2d(lon, lat145[::-1], p_ghg[:, :, i]) ps_ghg[:, :, i] = j(lon42, lat42[::-1]) w = VectorWind(uwnd, vwnd) w_sst = VectorWind(uwnd_sst, vwnd_sst) w_ghg = VectorWind(uwnd_ghg, vwnd_ghg) psx, psy = w.gradient(ps) psx_sst, psy_sst = w_sst.gradient(ps_sst) psx_ghg, psy_ghg = w_ghg.gradient(ps_ghg) omega = np.mean(uwnd * psx + vwnd * psy, axis=2) omega_sst = uwnd_sst * psx_sst + vwnd_sst * psy_sst omega_ghg = uwnd_ghg * psx_ghg + vwnd_ghg * psy_ghg omega_sst = np.transpose(omega_sst, (2, 0, 1)) omega_ghg = np.transpose(omega_ghg, (2, 0, 1)) oforc_sst = np.mean(omega_sst - omega, axis=0) oforc_ghg = np.mean(omega_ghg - omega, axis=0) return omega, oforc_sst, oforc_ghg
def main(dataset='ncep2'): def nao_region_ncep2(field): sindices = np.zeros((3 * (np.shape(field)[0] // 12 - 1))) windices = np.zeros((3 * (np.shape(field)[0] // 12 - 1))) for i in range((np.shape(field)[0] // 12 - 1)): sindices[3 * i:3 * (i + 1)] = [17 + 12 * i, 18 + 12 * i, 19 + 12 * i] windices[3 * i:3 * (i + 1)] = [11 + 12 * i, 12 + 12 * i, 13 + 12 * i] sindices = sindices.astype(int) windices = windices.astype(int) field1 = field[:, 4:29, 108:] field2 = field[:, 4:29, :17] field_r = np.concatenate((field1, field2), axis=2) field_w = field_r[windices] field_s = field_r[sindices] field_w = np.add.reduceat(field_w, range(0, len(field_w), 3)) / 3 field_s = np.add.reduceat(field_s, range(0, len(field_s), 3)) / 3 lat_r = np.arange(80, 17.5, -2.5) lon_r = np.arange(-90, 42.5, 2.5) return field_w, field_s, lat_r, lon_r def nao_region_ncar20c(field): sindices = np.zeros((3 * (np.shape(field)[0] // 12 - 1))) windices = np.zeros((3 * (np.shape(field)[0] // 12 - 1))) for i in range((np.shape(field)[0] // 12 - 1)): sindices[3 * i:3 * (i + 1)] = [17 + 12 * i, 18 + 12 * i, 19 + 12 * i] windices[3 * i:3 * (i + 1)] = [11 + 12 * i, 12 + 12 * i, 13 + 12 * i] sindices = sindices.astype(int) windices = windices.astype(int) field1 = field[:, 5:36, 135:] field2 = field[:, 5:36, :21] field_r = np.concatenate((field1, field2), axis=2) field_w = field_r[windices] field_s = field_r[sindices] field_w = np.add.reduceat(field_w, range(0, len(field_w), 3)) / 3 field_s = np.add.reduceat(field_s, range(0, len(field_s), 3)) / 3 lat_r = np.arange(80, 18, -2) lon_r = np.arange(-90, 42, 2) return field_w, field_s, lat_r, lon_r def nao_region_era20c(field): sindices = np.zeros((3 * (np.shape(field)[0] // 12 - 1))) windices = np.zeros((3 * (np.shape(field)[0] // 12 - 1))) for i in range((np.shape(field)[0] // 12 - 1)): sindices[3 * i:3 * (i + 1)] = [17 + 12 * i, 18 + 12 * i, 19 + 12 * i] windices[3 * i:3 * (i + 1)] = [11 + 12 * i, 12 + 12 * i, 13 + 12 * i] sindices = sindices.astype(int) windices = windices.astype(int) field1 = field[:, 10:71, 270:] field2 = field[:, 10:71, :41] field_r = np.concatenate((field1, field2), axis=2) field_w = field_r[windices] field_s = field_r[sindices] field_w = np.add.reduceat(field_w, range(0, len(field_w), 3)) / 3 field_s = np.add.reduceat(field_s, range(0, len(field_s), 3)) / 3 lat_r = np.arange(80, 19, -1) lon_r = np.arange(-90, 41, 1) return field_w, field_s, lat_r, lon_r from scipy import interpolate lat_n96 = np.arange(80, 18.75, -1.25) lon_n96 = np.linspace(-90, 39.375, 70) if dataset == 'ncep2': # NCEP2 MSLP 1979-2017 inclusive mslp = ncread( '/network/aopp/hera/mad/bakerh/Reanalyses/NCEP-DOE/mslp.mon.mean.nc', 'mslp')[:468] / 100 mslp_w, mslp_s, lat_r, lon_r = nao_region_ncep2(mslp) mslp_w96 = np.zeros((np.shape(mslp_w)[0], 49, 70)) mslp_s96 = np.zeros((np.shape(mslp_w)[0], 49, 70)) for i in range(np.shape(mslp_w)[0]): f = interpolate.interp2d(lon_r, lat_r[::-1], mslp_w[i]) mslp_w96[i] = f(lon_n96, lat_n96) f = interpolate.interp2d(lon_r, lat_r[::-1], mslp_s[i]) mslp_s96[i] = f(lon_n96, lat_n96) eofs = np.zeros((2, 49, 70)) var = np.zeros((2, 3)) nao = np.zeros((2, len(mslp_w96))) eofs[0], var[0] = eof_clim(mslp_w96, lat_n96, lon_n96, 1) nao[0] = nao_indivyear(eofs[0], mslp_w96, lat_n96, lon_n96) eofs[1], var[1] = eof_clim(mslp_s96, lat_n96, lon_n96, 1) nao[1] = nao_indivyear(eofs[1], mslp_s96, lat_n96, lon_n96) if dataset == 'ncar20c': # NCAR-20thC MSLP 1871-2012 inclusive mslp = ncread( '/network/aopp/hera/mad/bakerh/Reanalyses/NCAR-20thC/mslp/prmsl.mon.mean.nc', 'prmsl') / 100 mslp_w, mslp_s, lat_r, lon_r = nao_region_ncar20c(mslp) mslp_w96 = np.zeros((np.shape(mslp_w)[0], 49, 70)) mslp_s96 = np.zeros((np.shape(mslp_w)[0], 49, 70)) for i in range(np.shape(mslp_w)[0]): f = interpolate.interp2d(lon_r, lat_r[::-1], mslp_w[i]) mslp_w96[i] = f(lon_n96, lat_n96) f = interpolate.interp2d(lon_r, lat_r[::-1], mslp_s[i]) mslp_s96[i] = f(lon_n96, lat_n96) eofs = np.zeros((2, 49, 70)) var = np.zeros((2, 3)) nao = np.zeros((2, len(mslp_w96))) eofs[0], var[0] = eof_clim(mslp_w96, lat_n96, lon_n96, 1) nao[0] = nao_indivyear(eofs[0], mslp_w96, lat_n96, lon_n96) eofs[1], var[1] = eof_clim(mslp_s96, lat_n96, lon_n96, 1) nao[1] = nao_indivyear(eofs[1], mslp_s96, lat_n96, lon_n96) if dataset == 'era20c': # ERA20C MSLP 1900-2010 inclusive mslp = ncread( '/network/aopp/hera/mad/bakerh/Reanalyses/ERA20C/ERA20C_mslp_daily_1900_2010.nc', 'msl') / 100 mslp_w, mslp_s, lat_r, lon_r = nao_region_era20c(mslp) mslp_w96 = np.zeros((np.shape(mslp_w)[0], 49, 70)) mslp_s96 = np.zeros((np.shape(mslp_w)[0], 49, 70)) for i in range(np.shape(mslp_w)[0]): f = interpolate.interp2d(lon_r, lat_r[::-1], mslp_w[i]) mslp_w96[i] = f(lon_n96, lat_n96) f = interpolate.interp2d(lon_r, lat_r[::-1], mslp_s[i]) mslp_s96[i] = f(lon_n96, lat_n96) eofs = np.zeros((2, 49, 70)) var = np.zeros((2, 3)) nao = np.zeros((2, len(mslp_w96))) eofs[0], var[0] = eof_clim(mslp_w96, lat_n96, lon_n96, 1) nao[0] = nao_indivyear(eofs[0], mslp_w96, lat_n96, lon_n96) eofs[1], var[1] = eof_clim(mslp_s96, lat_n96, lon_n96, 1) nao[1] = nao_indivyear(eofs[1], mslp_s96, lat_n96, lon_n96) if dataset == 'hadam3p': import glob a = glob.glob( '/network/aopp/hera/mad/bakerh/RPM/cpdn_extract_scripts-master/extracted_data/batch_577/atmos/item16222_monthly_mean/*' ) mslp_w96 = np.zeros((len(a), 49, 70)) mslp_s96 = np.zeros((len(a), 49, 70)) for i, item in enumerate(a): mslp = ncread(item, 'item16222_monthly_mean')[:, 0, :] / 100 mslp_w96[i], mslp_s96[i] = nao_region_hadam3p(mslp) print(str(i)) eofs = np.zeros((2, 49, 70)) var = np.zeros((2, 3)) nao = np.zeros((2, len(mslp_w96))) eofs[0], var[0] = eof_clim(mslp_w96, lat_n96, lon_n96, 1) nao[0] = nao_indivyear(eofs[0], mslp_w96, lat_n96, lon_n96) eofs[1], var[1] = eof_clim(mslp_s96, lat_n96, lon_n96, 1) nao[1] = nao_indivyear(eofs[1], mslp_s96, lat_n96, lon_n96) return eofs, var, nao
def response_1(v_model, model='ghg', month='J', r=[0, 90, 0, 360]): def eofweight(unweighted, lat, lon): ''' Outputs weighted data for projections (i.e. sqrt cos lat) Parameters ---------- unweighted: array unweighted data lat: array latitudes lon: array lon values Outputs ------- weighted: array weighted data ''' meshlat = np.zeros([np.ma.size(lon), np.ma.size(lat)]) meshlat[:, :] = lat meshlatweight = np.sqrt(np.cos(meshlat.transpose() * np.pi / 180)) weighted = unweighted * meshlatweight return weighted def eof_response(response, eofn, lati, long, region=[-90, 90, 0, 360], weigh='yes'): ''' Projects response onto eofn Parameters ---------- response: array data to project on to eofn eofn: array nth eof lat: array latitude of data lon: array longitude of data Returns ------- projection: array response projected on eofn ''' lat = lati[(region[0] <= lati) & (lati <= region[1])] lon = long[(region[2] <= long) & (long <= region[3])] eof_region = eofn.copy()[(region[0] <= lati) & (lati <= region[1]), :] eof_region = eof_region[:, (region[2] <= long) & (long <= region[3])] r_region = response.copy()[:, (region[0] <= lati) & (lati <= region[1]), :] r_region = r_region[:, :, (region[2] <= long) & (long <= region[3])] responsew = eofweight(r_region, lat, lon) eofn_w = eofweight(eof_region.copy(), lat, lon) projection = np.zeros(len(response)) if weigh == 'yes': for i in range(len(response)): projection[i] = (np.sum(responsew[i] * eofn_w) / (np.sum(eofn_w * eofn_w))) else: for i in range(len(response)): projection[i] = (np.sum(responsew[i] * eofn_w) / ((np.sum(responsew[i] * responsew[i])))) return projection import numpy as np from netcdfread import ncread import glob lon = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lon') lati = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lat') lat = np.copy(lati[::-1]) a = glob.glob( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/outputs/single/' + model + '/' + month + '/*') v_f = np.zeros((64, 21, 64, 128)) for i in range(64): v_f[i] = ncread(a[i], 'V') v_f = (np.mean(v_f[:, 16:], axis=1) - v_f[:, 0]) * 1e6 w = eof_response(v_f, v_model, lati, lon, region=r, weigh='yes') f_per = eof_response(v_f, v_model, lati, lon, region=r, weigh='no') weights = np.zeros((64, 128)) forcing_p = np.zeros((64, 128)) for LONraster in range(1, 65): w1 = w[LONraster - 1] f1 = f_per[LONraster - 1] if LONraster == 1: for ii in range(int(LONraster * 2 - 2), int(LONraster * 2 - 2 + 3)): for jj in range(34 - 2, 34 + 3): weights[jj, ii] += w1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - lon[int(LONraster * 2 - 2)]) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) forcing_p[jj, ii] += f1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - lon[int(LONraster * 2 - 2)]) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) for ii in range(126, 128): for jj in range(34 - 2, 34 + 3): weights[jj, ii] += w1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - 360) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) forcing_p[jj, ii] += f1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - 360) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) elif LONraster == 64: for ii in range(int(LONraster * 2 - 2 - 2), int(LONraster * 2 - 2 + 2)): for jj in range(34 - 2, 34 + 3): weights[jj, ii] += w1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - lon[int(LONraster * 2 - 2)]) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) forcing_p[jj, ii] += f1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - lon[int(LONraster * 2 - 2)]) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) else: for ii in range(int(LONraster * 2 - 2 - 2), int(LONraster * 2 - 2 + 3)): for jj in range(34 - 2, 34 + 3): weights[jj, ii] += w1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - lon[int(LONraster * 2 - 2)]) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) forcing_p[jj, ii] += f1 * ( (np.cos(0.5 * np.pi * (lon[int(ii)] - lon[int(LONraster * 2 - 2)]) / (lon[3] - lon[1])))**2) * ( (np.cos(0.5 * np.pi * (lat[jj] - lat[34]) / (lat[31] - lat[33])))**2) weights = weights[::-1, :] forcing_p = forcing_p[::-1, :] * 2.5e-11 v_perfect = np.sum(v_f.transpose(1, 2, 0) * f_per, axis=2) return weights, forcing_p, v_perfect, w, f_per
def reconstruct_nao(gto, season='djf', rmask=np.ones((145, 192))): from scipy import interpolate from mpl_toolkits.basemap import shiftgrid lat_n96 = np.linspace(90, -90, 145) lon_n96 = np.linspace(0, 358.125, 192) lat_sst = np.linspace(89.5, -89.5, 180) lon_sst = np.linspace(-179.5, 179.5, 360) lon_sst_shift = np.linspace(.5, 359.5, 360) sindices = np.zeros((147 * 3)) windices = np.zeros((147 * 3)) if season == 'djf': months = 3 sindices = np.zeros((147 * 3)) windices = np.zeros((147 * 3)) for i in range(147): sindices[3 * i:3 * (i + 1)] = [17 + 12 * i, 18 + 12 * i, 19 + 12 * i] windices[3 * i:3 * (i + 1)] = [11 + 12 * i, 12 + 12 * i, 13 + 12 * i] if season == 'ndj': months = 3 sindices = np.zeros((147 * 3)) windices = np.zeros((147 * 3)) for i in range(147): sindices[3 * i:3 * (i + 1)] = [16 + 12 * i, 17 + 12 * i, 18 + 12 * i] windices[3 * i:3 * (i + 1)] = [10 + 12 * i, 11 + 12 * i, 12 + 12 * i] if season == 'son': months = 3 sindices = np.zeros((147 * 3)) windices = np.zeros((147 * 3)) for i in range(147): sindices[3 * i:3 * (i + 1)] = [14 + 12 * i, 15 + 12 * i, 16 + 12 * i] windices[3 * i:3 * (i + 1)] = [8 + 12 * i, 9 + 12 * i, 10 + 12 * i] if season == 'nd': months = 2 sindices = np.zeros((147 * 2)) windices = np.zeros((147 * 2)) for i in range(147): sindices[2 * i:2 * (i + 1)] = [16 + 12 * i, 17 + 12 * i] windices[2 * i:2 * (i + 1)] = [10 + 12 * i, 11 + 12 * i] if season == 'dj': months = 2 sindices = np.zeros((147 * 2)) windices = np.zeros((147 * 2)) for i in range(147): sindices[2 * i:2 * (i + 1)] = [17 + 12 * i, 18 + 12 * i] windices[2 * i:2 * (i + 1)] = [11 + 12 * i, 12 + 12 * i] if season == 'n': months = 1 sindices = np.zeros((147)) windices = np.zeros((147)) for i in range(147): sindices[i] = 16 + 12 * i windices[i] = 10 + 12 * i if season == 'd': months = 1 sindices = np.zeros((147)) windices = np.zeros((147)) for i in range(147): sindices[i] = 17 + 12 * i windices[i] = 11 + 12 * i if season == 'on': months = 2 sindices = np.zeros((147 * 2)) windices = np.zeros((147 * 2)) for i in range(147): sindices[2 * i:2 * (i + 1)] = [15 + 12 * i, 16 + 12 * i] windices[2 * i:2 * (i + 1)] = [9 + 12 * i, 11 + 12 * i] sindices = sindices.astype(int) windices = windices.astype(int) gto_interp = np.zeros((2, 180, 360)) sst = ncread( '/network/aopp/hera/mad/bakerh/Reanalyses/HadISST/HadISST_sst.nc', 'sst') sst_0 = np.where(sst < -999, 0, sst) for i in range(2): f = interpolate.interp2d(lon_n96, lat_n96[::-1], gto[i, :]) gto_interp[i, :] = f(lon_sst_shift, lat_sst) gto_interp[i], lon1 = shiftgrid(181., gto_interp[i], lon_sst_shift, start=False) meshlat = np.zeros([180, 360]) meshlat[:, :] = np.expand_dims(lat_sst, axis=1) meshlatweight = np.cos( meshlat * np.pi / 180) * 6371**2 * 1.25 * 1.875 * (np.pi / 180)**2 nao_recon_monthly = np.zeros((2, months * 147)) nao_recon = np.zeros((2, 147)) sst_w = sst_0[windices] sst_s = sst_0[sindices] sst_w = sst_w * meshlatweight sst_s = sst_s * meshlatweight ''' OLD Rmask code lsm = ncread('/home/bakerh/Documents/DPhil/CPDN/\ Weather-at-Home_ancilmaker-master/lsm_n96_add.nc', 'lsm')[0, 0, :] lsm1 = np.ones((145, 192)) for i in range(145): for j in range(192): if lsm[i, j] == 0: lsm1[i, j] = 0 for y in range(36): nao_anom[0, y] = np.nansum(wdataSST[y]*gto[0]*(1-lsm1)*rmask)/20 # 2beta nao_anom[1, y] = np.nansum(sdataSST[y]*gto[1]*(1-lsm1)*rmask)/20 ''' for y in range(147 * months): nao_recon_monthly[0, y] = np.nansum( sst_w[y] * gto_interp[0]) / 20 # 2beta nao_recon_monthly[1, y] = np.nansum(sst_s[y] * gto_interp[1]) / 20 if months == 1: for y in range(147): nao_recon[0, y] = nao_recon_monthly[0, months * y] nao_recon[1, y] = nao_recon_monthly[1, months * y] else: for y in range(147): nao_recon[0, y] = np.mean(nao_recon_monthly[0, months * y:months * (y + 1)]) nao_recon[1, y] = np.mean(nao_recon_monthly[1, months * y:months * (y + 1)]) return nao_recon
def maplotter(pdata, colormax=1, colormin=-999, title='', output='yes'): """ Plots input grid with map of world overlaid Parameters ---------- plotdata: array data being plotted title: str optional title """ from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from netcdfread import ncread if colormin == -999: colormin = -colormax lon = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lon') lat = ncread( '/network/aopp/hera/mad/bakerh/BTmodel_COR/main/inputs/forcing_ghg.nc', 'lat') pdata, lon = shiftgrid(180., pdata, lon, start=False) pdata, lon = addcyclic(pdata, lon) plt.figure() meshlon, meshlat = np.meshgrid(lon, lat) m = Basemap(projection='cyl', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c') m.drawcoastlines() m.drawmapboundary() x, y = m(meshlon, meshlat) mycmap2 = plt.cm.YlOrRd(np.arange(256)) mycmap1 = plt.cm.Blues_r(np.arange(256)) my_cmap = np.concatenate((mycmap1, mycmap2), axis=0) my_cmap[230:282, :] = 1 newcmap = mpl.colors.LinearSegmentedColormap.from_list("newjet", my_cmap) ctrs = np.linspace(colormin, colormax, 17) plot = m.contourf(x, y, pdata, ctrs, cmap=newcmap, vmin=np.min(ctrs), vmax=np.max(ctrs), extend='both') b = plt.colorbar(plot, orientation='horizontal', aspect=50, shrink=0.75, spacing='proportional') b.set_label(label=r'V200 (1x10$^{-6}$ ms$^{-1}$)') #b.set_label(label=r'Forcing (1x10$^{-11}$ s$^{-2}$)') #b.set_label(label=r'Weights') parallels = m.drawparallels(np.arange(-90., 91., 15.)) meridians = m.drawmeridians(np.arange(-180., 181., 30)) m.drawparallels(parallels, labels=[True, True, True, True]) m.drawmeridians(meridians, labels=[True, True, True, True]) plt.title(title, y=1.08) plt.show()