Ejemplo n.º 1
0
def aggregate(dd, state, period, epsilon=1. / 86400.):
    dd = state.get('dd', []) + dd
    state['dd'] = []

    if len(dd) == 0 or dd[0] is None:
        return dd

    def merge(dd, t1, t2):
        if len(ddb) > 0:
            dx = ds.merge(ddb, 'time')
            dx['time_bnds'][0, 0] = max(t1, dx['time_bnds'][0, 0])
            dx['time_bnds'][-1, 1] = min(t2, dx['time_bnds'][-1, 1])
            if dx['time_bnds'][-1, 1] > dx['time_bnds'][0, 0]:
                return [dx]
        return []

    ddo = []
    ddb = []
    t = dd[0]['time_bnds'][0, 0]
    r = (t + 0.5) % period
    t1 = state.get('t1', t - r)
    t2 = state.get('t2', t1 + period)
    for d in dd:
        if d is None:
            ddo += merge(ddb, t1, t2) + [None]
            break
        i1 = 0
        i = 0
        while i < len(d['time']):
            if not (d['time_bnds'][i, 1] >= t2):
                i += 1
                continue
            ii = np.arange(i1, i + (t2 - d['time_bnds'][i, 0] > epsilon))
            if len(ii) > 0:
                dx = copy.copy(d)
                ds.select(dx, {'time': ii})
                ddb += [dx]
            ddo += merge(ddb, t1, t2)
            i1 = i
            t = d['time_bnds'][i, 0]
            r = (t + 0.5) % period
            t1 = max(t2, t - r)
            t2 = t1 + period
            ddb = []
        ii = np.arange(i1, len(d['time']))
        if len(ii) > 0:
            dx = copy.copy(d)
            ds.select(dx, {'time': ii})
            ddb += [dx]
    state['dd'] = ddb
    state['t1'] = t1
    state['t2'] = t2
    return ddo
Ejemplo n.º 2
0
def aggregate(dd, state, period):
	dd = state.get('dd', []) + dd
	state['dd'] = []
	if len(dd) == 0 or dd[0] is None:
		return dd
	dd0 = []
	dd1 = []
	t1 = dd[0]['time'][0] - ((dd[0]['time'][0] + 0.5) % 1.0)
	t2 = t1 + period
	for i, d in enumerate(dd):
		if d is None:
			d1 = ds.merge(dd1, 'time')
			dd0.append(d1)
			dd0.append(None)
			break
		j0 = 0
		j = 0
		while j < len(d['time']):
			t = d['time'][j]
			if t >= t2:
				idx = np.arange(j0, j)
				if len(idx) > 0:
					d_copy = copy.copy(d)
					ds.select(d_copy, {'time': idx})
					dd1.append(d_copy)
				if len(dd1) > 0:
					d1 = ds.merge(dd1, 'time')
					dd0.append(d1)
				j0 = j
				t2 = t + period
				dd1 = []
			j += 1
		idx = np.arange(j0, len(d['time']))
		if len(idx) > 0:
			d_copy = copy.copy(d)
			ds.select(d_copy, {'time': idx})
			dd1.append(d_copy)
	state['dd'] = dd1
	return dd0
Ejemplo n.º 3
0
def read(dirname, track, warnings=[], step=6. / 24.):
    dd_index = ds.readdir(
        dirname,
        variables=['time', 'latitude', 'longitude', 'level_height'],
        jd=True,
        full=True,
        warnings=warnings,
    )
    start_time = track['time'][0]
    end_time = track['time'][-1]
    d_var = {}
    for var in VARIABLES:
        dd = []
        for d_index in dd_index:
            if var not in d_index['.']:
                continue
            time = d_index['time']
            time_half = misc.half(time)
            lat = d_index['latitude']
            lon = d_index['longitude']
            level_height = d_index['level_height']
            filename = d_index['filename']
            ii = np.nonzero((time_half[1:] >= start_time)
                            & (time_half[:-1] < end_time))[0]
            for i in ii:
                t = time[i]
                i2 = np.argmin(np.abs(track['time'] - time[i]))
                lat0 = track['lat'][i2]
                lon0 = track['lon'][i2]
                j = np.argmin(np.abs(lat - lat0))
                k = np.argmin(np.abs(lon - lon0))
                d = ds.read(filename,
                            variables=[var],
                            sel={
                                'time': i,
                                'latitude': j,
                                'longitude': k
                            })
                d_new = {
                    'lat': np.array([lat[j]]),
                    'lon': np.array([lon[k]]),
                    'time': np.array([t]),
                    'level_height': np.array([level_height]),
                    '.': META,
                }
                d_new['.']['level_height'] = {'.dims': ['level']}
                d_new[TRANS[var]] = d[var].reshape([1] + list(d[var].shape))
                if TRANS[var] == 'cl':
                    d_new[TRANS[var]] *= 100.
                dd.append(d_new)
        if len(dd) > 0:
            d_var[TRANS[var]] = ds.op.merge(dd, 'time')
    time_list = [set(d_var[var]['time']) for var in d_var.keys()]
    time = time_list[0].intersection(*time_list[1:]) \
     if len(time_list) > 0 \
     else set()
    d = {}
    d['.'] = {}
    if len(time) == 0:
        return None
    for var in d_var.keys():
        idx = [i for i, t in enumerate(d_var[var]['time']) if t in time]
        ds.select(d_var[var], {'time': idx})
        d[var] = d_var[var][var]
        d['lat'] = d_var[var]['lat']
        d['lon'] = d_var[var]['lon']
        d['time'] = d_var[var]['time']
        d['level_height'] = d_var[var]['level_height']
    if 'ps' not in d:
        n, m = d['pfull'].shape
        d['ps'] = np.full(n, np.nan, dtype=np.float64)
        for i in range(n):
            d['ps'][i] = 2 * d['pfull'][i, 0] - d['pfull'][i, 1]
    if 'zfull' not in d:
        n, m = d['pfull'].shape
        d['zfull'] = np.full((n, m), np.nan, dtype=np.float64)
        for i in range(n):
            d['zfull'][i, :] = d['level_height']
    del d['level_height']
    if 'orog' not in d:
        n, m = d['zfull'].shape
        d['orog'] = np.full(n, np.nan, dtype=np.float64)
        for i in range(n):
            d['orog'][i] = 2 * d['zfull'][i, 0] - d['zfull'][i, 1]
    if 'time' in d:
        d['time_bnds'] = misc.time_bnds(d['time'], step)
    d['.'] = META
    return d
Ejemplo n.º 4
0
def read(dirname, track, warnings=[], step=6. / 24.):
    d_ll = ds.read(os.path.join(dirname, 'LL125.nc'),
                   ['latitude', 'longitude', 'z'])
    lat_ll = d_ll['latitude']
    lon_ll = d_ll['longitude']
    orog_ll = d_ll['z'][0, :, :] / 9.80665

    dd_idx = ds.readdir(
        dirname,
        variables=['time', 'latitude', 'longitude'],
        jd=True,
        full=True,
        warnings=warnings,
    )
    start_time = track['time'][0]
    end_time = track['time'][-1]
    d_out = {}
    for var in VARS:
        dd = []
        var2 = TRANS[var]
        for d_idx in dd_idx:
            if var not in d_idx['.']:
                continue
            time = d_idx['time']
            lat = d_idx['latitude']
            lon = d_idx['longitude']
            filename = d_idx['filename']
            ii = np.nonzero((time >= start_time - step * 0.5)
                            & (time < end_time + step * 0.5))[0]
            for i in ii:
                t = time[i]
                i2 = np.argmin(np.abs(track['time'] - time[i]))
                lat0 = track['lat'][i2]
                lon0 = track['lon'][i2]
                j = np.argmin(np.abs(lat - lat0))
                k = np.argmin(np.abs(lon - lon0))
                j_ll = np.argmin(np.abs(lat_ll - lat0))
                k_ll = np.argmin(np.abs(lon_ll - lon0))
                d = ds.read(
                    filename,
                    VARS_AUX + [var],
                    sel={
                        'time': [i],
                        'latitude': j,
                        'longitude': k,
                    },
                    jd=True,
                )
                for a, b in TRANS.items():
                    if a in d.keys():
                        ds.rename(d, a, b)
                d['lat'] = np.array([d['lat']])
                d['lon'] = np.array([d['lon']])
                d['orog'] = np.array([orog_ll[j_ll, k_ll]])
                d['.']['lat']['.dims'] = ['time']
                d['.']['lon']['.dims'] = ['time']
                d['.']['orog'] = {'.dims': ['time']}
                if 'pfull' in ds.get_vars(d):
                    d['pfull'] = d['pfull'].reshape([1, len(d['pfull'])])
                    d['.']['pfull']['.dims'] = ['time', 'pfull']
                    d['pfull'] = d['pfull'][:, ::-1]
                    d[var2] = d[var2][:, ::-1]
                    ds.select(d, {'pfull': np.arange(27)})
                dd.append(d)
        d = ds.op.merge(dd, 'time')
        for var_aux in VARS_AUX:
            if TRANS[var_aux] in ds.get_vars(d_out) \
             and TRANS[var_aux] in ds.get_vars(d) \
             and not np.all(d_out[TRANS[var_aux]] == d[TRANS[var_aux]]):
                raise ValueError('%s: Field differs between input files' %
                                 TRANS[var_aux])
        d_out.update(d)
    d_out['pfull'] = d_out['pfull'] * 1e2
    if 'time' in d_out:
        d_out['time_bnds'] = misc.time_bnds(d_out['time'], step, start_time,
                                            end_time)
        d_out['time'] = np.mean(d_out['time_bnds'], axis=1)
    d_out['.'] = META
    return d_out