예제 #1
0
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()
예제 #4
0
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)
예제 #6
0
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)