def var_calcs(var, jday=0, latlon=(-90, 90, 40, 120), plevs=(850, 200), dp_vars=['U', 'OMEGA'], sector_lons=(60, 100)): """Process a single variable from a single day.""" lat1, lat2, lon1, lon2 = latlon opts = merra.url_opts(var.name) vertical = opts['vertical'] if vertical == 'X': plevs = [None] if dp_vars is not None and var.name in dp_vars: dp = True else: dp = False data = xray.Dataset() # Lat-lon data print('Lat-lon data') for plev in plevs: print('plev', plev) var_out = latlon_data(var, lat1, lat2, lon1, lon2, plev) data[var_out.name] = var_out if dp: print('Computing d/dp') var_out = pgradient(var, lat1, lat2, lon1, lon2, plev) data[var_out.name] = var_out # Sector and zonal mean data print('Computing zonal mean') var_out = sector_mean(var, 0, 360) data[var_out.name] = var_out if vertical == 'P': print('Computing sector mean') var_out = sector_mean(var, sector_lons[0], sector_lons[1]) data[var_out.name] = var_out # Compute daily data from subdaily data nperday = len(atm.get_coord(data, 'time')) data = atm.daily_from_subdaily(data, nperday, dayname='day', dayvals=[jday]) # Make sure output is in a Dataset if isinstance(data, xray.DataArray): data = data.to_dataset() return data
season = 'jja' lon1, lon2 = 0, 100 lat1, lat2 = -20, 50 u = load_daily_season(ustr, year, season, 'U', lat1, lat2, lon1, lon2) plt.figure() atm.pcolor_latlon(u.mean(dim='TIME')) ds = load_daily_season(ustr, year, season, None, lat1, lat2, lon1, lon2) u2 = ds['U'] print((u == u2).any()) season = 'ann' lon1, lon2 = 20, 120 lat1, lat2 = -60, 60 n = 8 # Number of time points per day days = np.arange(1, 366) u = load_daily_season(ustr, year, season, 'U', lat1, lat2, lon1, lon2) udaily = atm.daily_from_subdaily(u, n, dayvals=days) plt.figure() atm.pcolor_latlon(udaily.mean(axis=0), axlims=(lat1,lat2,lon1,lon2)) lat1, lat2 = 10, 30 lon1, lon2 = 60, 100 ubar = atm.mean_over_geobox(u, lat1, lat2, lon1, lon2) ubar_daily = atm.mean_over_geobox(udaily, lat1, lat2, lon1, lon2) plt.figure(figsize=(7,8)) plt.subplot(211) plt.plot(ubar) plt.subplot(212) plt.plot(ubar_daily)
#datadir = '/home/jennifer/datastore/' # ---------------------------------------------------------------------- # MERRA Daily filename = datadir + 'merra/daily/merra_u200_198601.nc' ds = atm.ncload(filename) u = ds['U'] lat = atm.get_coord(u, 'lat') lon = atm.get_coord(u, 'lon') # Number of time points per day n = 8 # Daily mean u_split = atm.split_timedim(u, n, time0_name='day') u_new = daily_from_subdaily(u, n, dayvals=np.arange(1,32)) print(np.array_equal(u_new, u_split.mean(axis=1))) # ndarray version u_new2 = daily_from_subdaily(u.values, n) print(np.array_equal(u_new, u_new2)) # Sub-sample version i = 2 u_new3 = daily_from_subdaily(u, n, method=i) print(np.array_equal(u_split[:,i], u_new3)) # Plot data to check d = 5 plt.figure()
lon1, lon2 = 40, 100 lat1, lat2 = -15, 35 varlist = ['T'] pmin, pmax = 200e2, 600e2 years = range(1979, 2015) months = [4, 5, 6, 7, 8, 9] g = atm.constants.g.values nperday = 8 subset_dict = {'lon' : (lon1, lon2), 'lat' : (lat1, lat2)} for year in years: for mon in months: dayvals = atm.season_days(atm.month_str(mon), atm.isleap(year)) T = merra.read_daily(varlist, year, mon, subset_dict=subset_dict) # Daily means of 3-hourly data T = atm.daily_from_subdaily(T, nperday, dayvals=dayvals) # Vertical integral Tbar = atm.int_pres(T, pmin=pmin, pmax=pmax) Tbar = Tbar * g / (pmax - pmin) Tbar.name='Tbar' Tbar.attrs['long_name'] = 'Vertical mean atmospheric temperature' Tbar.attrs['pmin'] = pmin Tbar.attrs['pmax'] = pmax # Save to file atm.save_nc(savefile(year, mon, pmin, pmax), T, Tbar)
#datadir = '/home/jennifer/datastore/' # ---------------------------------------------------------------------- # MERRA Daily filename = datadir + 'merra/daily/merra_u200_198601.nc' ds = atm.ncload(filename) u = ds['U'] lat = atm.get_coord(u, 'lat') lon = atm.get_coord(u, 'lon') # Number of time points per day n = 8 # Daily mean u_split = atm.split_timedim(u, n, time0_name='day') u_new = daily_from_subdaily(u, n, dayvals=np.arange(1, 32)) print(np.array_equal(u_new, u_split.mean(axis=1))) # ndarray version u_new2 = daily_from_subdaily(u.values, n) print(np.array_equal(u_new, u_new2)) # Sub-sample version i = 2 u_new3 = daily_from_subdaily(u, n, method=i) print(np.array_equal(u_split[:, i], u_new3)) # Plot data to check d = 5 plt.figure() plt.subplot(211)
lat1, lat2 = -20, 30 varlist = ['u', 'v', 'q'] pmin = 300e2 years = range(1979, 2015) #months = [5, 6, 7, 8] months = [4] subset_dict = {'lon' : (lon1, lon2), 'lat' : (lat1, lat2)} for year in years: for mon in months: dayvals = atm.season_days(atm.month_str(mon), atm.isleap(year)) ds = merra.read_daily(varlist, year, mon, subset_dict=subset_dict) uq = ds['U'] * ds['QV'] vq = ds['V'] * ds['QV'] # Daily means of 3-hourly data nperday = 8 uq = atm.daily_from_subdaily(uq, nperday, dayvals=dayvals) vq = atm.daily_from_subdaily(vq, nperday, dayvals=dayvals) # Vertical integral uq_int = atm.int_pres(uq, pmin=pmin) vq_int = atm.int_pres(vq, pmin=pmin) uq_int.name='uq_int' uq_int.attrs['pmin'] = pmin vq_int.name='vq_int' vq_int.attrs['pmin'] = pmin # Save to file atm.save_nc(savefile(year, mon), uq_int, vq_int)