def single_WLH(cmap_file, yrmin, yrmax, lat0, lon0, loc_nm, kmax, kann, onset_min=20): # Single grid point and single year/climatology precip = precipdat.read_cmap(cmap_file, yrmin, yrmax) if yrmax > yrmin: precip = precip.mean(axis=0) titlestr = 'CMAP %d-%d' % (yrmin, yrmax) else: precip = precip[0] titlestr = 'CMAP %d' % yrmin latval, ilat0 = atm.find_closest(precip.lat, lat0) lonval, ilon0 = atm.find_closest(precip.lon, lon0) d = 1.25 latstr = atm.latlon_labels(latval+d, 'lat', '%.1f', deg_symbol=False) lonstr = atm.latlon_labels(lonval+d, 'lon', '%.1f', deg_symbol=False) titlestr = '%s %s (%s, %s)' % (titlestr, loc_nm, latstr, lonstr) pcp = precip[:, ilat0, ilon0] pcp_sm, Rsq = atm.fourier_smooth(pcp, kmax) pcp_ann, Rsq_ann = atm.fourier_smooth(pcp, kann) i_onset, i_retreat, i_peak = onset_WLH_1D(pcp_sm, threshold, onset_min) plot_single_WLH(pcp, pcp_sm, pcp_ann, Rsq, Rsq_ann, i_onset, i_retreat, i_peak, kmax, kann, titlestr) return pcp, pcp_sm, pcp_ann, Rsq, Rsq_ann, i_onset, i_retreat, i_peak
def all_WLH(cmap_file, yearmin=None, yearmax=None, climatology=False, kmax=12, threshold=5.0, onset_min=20): precip = precipdat.read_cmap(cmap_file, yearmin, yearmax) lat = atm.get_coord(precip, 'lat') lon = atm.get_coord(precip, 'lon') years = precip.year if climatology: precip = precip.mean(dim='year') axis = 0 else: axis = 1 wlh = onset_WLH(precip, axis, kmax, threshold, onset_min) wlh['precip'] = precip wlh['lat'] = lat wlh['lon'] = lon wlh['years'] = years wlh['climatology'] = climatology return wlh
years = xray.DataArray(years, {'year' : years}) index['tseries'] = xray.DataArray(pcp_sm, dims=['year', 'day'], coords={'year' : years, 'day': days}) index['onset'] = xray.DataArray(d_onset, coords={'year' : years}) index['retreat'] = xray.DataArray(d_retreat, coords={'year' : years}) index.attrs['title'] = titlestr return index # Threshold and smoothing parameters threshold = 5.0 kmax = 12 nroll = {'CMAP' : 3, 'MERRA_MFC' : 7, 'MERRA_PRECIP' : 7} # Read CMAP pentad precip cmap = precipdat.read_cmap(cmapfile) cmapbar = atm.mean_over_geobox(cmap, lat1, lat2, lon1, lon2) cmapdays = [atm.pentad_to_jday(p, pmin=1) for p in cmap.pentad.values] # MERRA moisture flux convergence mfc = atm.combine_daily_years('MFC', mfcfiles, years, yearname='year') mfcbar = atm.mean_over_geobox(mfc, lat1, lat2, lon1, lon2) # MERRA precip subset_dict = {'lon' : (lon1, lon2), 'lat' : (lat1, lat2)} precip = atm.combine_daily_years('PRECTOT', precipfiles, years, yearname='year', subset_dict=subset_dict) precip = atm.precip_convert(precip, precip.attrs['units'], 'mm/day') precipbar = atm.mean_over_geobox(precip, lat1, lat2, lon1, lon2) # Compute indices for each dataset
for nm in varnms: if nm == 'PSI': nm0 = 'V_sector_%dE-%dE' % (lon1, lon2) elif nm == 'VFLXLQV': nm0 = 'VFLXQV' elif nm == dtheta_nm: nm0 = theta_nm else: nm0 = nm relfiles[nm] = filestr % (nm0, onset_nm, yearstr) # ---------------------------------------------------------------------- # Read data and calculate indices # Precipitation precip = precipdat.read_cmap(pcpfile, yearmin=min(years), yearmax=max(years)) pcp_box = atm.mean_over_geobox(precip, lat1, lat2, lon1, lon2) # -- Interpolate to daily resolution days = np.arange(1, 367) pcp_i = np.nan * np.ones((len(years), len(days))) for y, year in enumerate(years): pcp_i[y] = np.interp(days, pcp_box['day'], pcp_box[y]) coords = {'day' : days, 'year' : years} pcp = xray.DataArray(pcp_i, dims=['year', 'day'], coords=coords) # Monsoon onset, retreat indices index = utils.get_onset_indices(onset_nm, indfiles, years) mfc = atm.rolling_mean(index['ts_daily'], nroll, center=True) onset = index['onset'] ssn_length=index['length'].mean(dim='year')
pcp_ann[y], label_ann[y]) else: plot_single_WLH(pcp[y], pcp_sm[y], label_sm[y], i_onset[y], i_retreat[y], i_peak[y], titlestr + str(years[y])) if iplot < 4: plt.xticks(np.arange(0, 74, 4), []) else: plt.xticks(np.arange(0, 74, 4)) plt.xlabel('Pentad') # Read data and average over box lon1, lon2 = 60, 100 lat1, lat2 = 10, 30 titlestr = 'CMAP %d-%dE, %d-%dN ' % (lon1, lon2, lat1, lat2) precip = precipdat.read_cmap(cmap_file) precipbar = atm.mean_over_geobox(precip, lat1, lat2, lon1, lon2) nyears, npentad = precipbar.shape years = precipbar.year.values nyears = len(years) pentads = precipbar.pentad onset = {} # Threshold for onset criteria threshold = 5.0 # Smooth with truncated Fourier series kmax = 12 kann = 4 pcp_sm, Rsq = atm.fourier_smooth(precipbar, kmax) pcp_ann, Rsq_ann = atm.fourier_smooth(precipbar, kann)