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
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
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
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