def make_blk_cfsr(cfsrpath, grd, bulk, date0=False, date1=False, **kargs): ''' see make_blk_interim ps: to not include original data in file, use kargg keepor=False ''' quiet = kargs.get('quiet', 0) create = kargs.get('create', 1) model = kargs.get('model', 'roms') # or roms-agrif data = load_blkdata_cfsr(cfsrpath, date0, date1, quiet) # unique diff from make_blk_interim !! # about original data, run data2romsblk once to test for x_original: tmp = data2romsblk(data[data.keys()[0]], grd, **kargs) if 'x_original' in tmp.keys(): original = tmp['x_original'].shape else: original = False q = gennc.GenBlk(bulk, grd, **kargs) if create: q.create(model, original) for d in data.keys(): if model == 'roms': if not quiet: print(' converting units:'), conv_units(data[d], model, quiet) D = data2romsblk(data[d], grd, **kargs) D['date'] = d if not quiet: print(' =>filling date=%s' % d.isoformat(' ')) q.fill(D, quiet=quiet)
def make_blk_wrf(wrfpath, grd, bulk, date0=False, date1=False, **kargs): ''' see make_blk_interim ''' quiet = kargs.get('quiet', 0) create = kargs.get('create', 1) model = kargs.get('model', 'roms') # or roms-agrif wrffiles = kargs.get('wrffiles', 'wrfout*') dt = kargs.get('dt', 6) data = load_blkdata_wrf(wrfpath, wrffiles, date0, date1, quiet) if not len(data): return q = gennc.GenBlk(bulk, grd, **kargs) if create: # about original data, run data2romsblk once to test for x_original: tmp = data2romsblk(data[data.keys()[0]], grd, **kargs) if 'x_original' in tmp.keys(): original = tmp['x_original'].shape else: original = False q.create(model, original) for d in data.keys(): # be sure time increases. Note that in load_blkdata_wrf # we checked if time increases in the dataset... not if dates are higher # then previous dates in file ntimes = netcdf.fdim(bulk, 'time') if ntimes: tin = netcdf.nctime(bulk, 'time') if tin.size and (d - tin[-1]) < datetime.timedelta(hours=dt - 0.1): print('-> not including %s' % d.isoformat()) continue if model == 'roms': if not quiet: print(' converting units:'), conv_units(data[d], model, quiet) D = data2romsblk(data[d], grd, **kargs) D['date'] = d if not quiet: print(' =>filling date=%s' % d.isoformat(' ')) q.fill(D, quiet=quiet)
def make_blk_interim(interimpath, grd, bulk, date0=False, date1=False, **kargs): ''' kargs: tunits, ex: 'seconds since yyyy-mm-dd' quiet create model, 'roms' or 'roms-agrif' title keeporiginal, save original data in nc file margin, for original data to be saved) attr, additional global arguments, ex: attr={'some_info': 'abc','what': 123} past, use True for old data server data, default False ... ''' quiet = kargs.get('quiet', 0) create = kargs.get('create', 1) model = kargs.get('model', 'roms') # or roms-agrif past = kargs.get('past', False) # use True for old data server data data = load_blkdata_interim(interimpath, date0, date1, quiet, past) # about original data, run data2romsblk once to test for x_original: tmp = data2romsblk(data[data.keys()[0]], grd, **kargs) if 'x_original' in tmp.keys(): original = tmp['x_original'].shape else: original = False q = gennc.GenBlk(bulk, grd, **kargs) if create: q.create(model, original) for d in data.keys(): if model == 'roms': if not quiet: print(' converting units:'), conv_units(data[d], model, quiet) D = data2romsblk(data[d], grd, **kargs) D['date'] = d if not quiet: print(' =>filling date=%s' % d.isoformat(' ')) q.fill(D, quiet=quiet)
def make_blk_narr(grd, bulk, date0, date1=False, **kargs): ''' see make_blk_interim ps: to not include original data in file, use kargg keepor=False ''' quiet = kargs.get('quiet', 0) create = kargs.get('create', 1) model = kargs.get('model', 'roms') # or roms-agrif data, miss = load_blkdata_narr(date0, date1, quiet=quiet) # about original data, run data2romsblk once to test for x_original: tmp = data2romsblk(data[data.keys()[0]], grd, **kargs) if 'x_original' in tmp.keys(): original = tmp['x_original'].shape else: original = False # add narr INFO to file global attributes: if not 'attr' in kargs.keys(): kargs['attr'] = {} try: s = '' for k in data.keys(): s += ' # ' + k.isoformat( ' ') + ' ' + data[k]['INFO_file'] + ' isbest ' + str( data[k]['INFO_isbest']) kargs['attr']['sources'] = s except: pass # common to interim---------------------- q = gennc.GenBlk(bulk, grd, **kargs) if create: q.create(model, original) for d in data.keys(): if model == 'roms': if not quiet: print(' converting units:'), conv_units(data[d], model, quiet) D = data2romsblk(data[d], grd, **kargs) D['date'] = d if not quiet: print(' =>filling date=%s' % d.isoformat(' ')) q.fill(D, quiet=quiet)
def update_wind(fname, data, new_wind_info, **kargs): ''' new_wind_info will be added to fname as global attribute (ex: 'new wind from database xxx') ''' quiet = False Margin = 4 # for griddata and for original data to keep grd = False keepOriginal = 2 for k in kargs.keys(): if k == 'quiet': quiet = kargs[k] elif k == 'margin': Margin = kargs[k] elif k == 'grid': grd = kargs[k] elif k.lower().startswith('keepor'): keepOriginal = kargs[k] if not grd: grd = netcdf.fatt(fname, 'grd_file') g = roms.Grid(grd) x0 = data['x'] y0 = data['y'] if x0.ndim == 1: x0, y0 = np.meshgrid(x0, y0) dates = data.keys()[:] dates.remove('x') dates.remove('y') dates = np.array(dates) # interp in time: time = netcdf.nctime(fname, 'time') cond = False tind = -1 fob = gennc.GenBlk(fname, grd) for t in time: newWind = {} tind += 1 I, = np.where(dates == t) if I.size: I = I[0] uv = data[dates[I]] if not quiet: print(t, dates[I]) else: i1, = np.where(dates > t) i0, = np.where(dates < t) if i0.size and i1.size: i1 = i1[0] i0 = i0[-1] d0 = t - dates[i0] d1 = dates[i1] - t d0 = d0.days + d0.seconds / 86400. d1 = d1.days + d1.seconds / 86400. uv = (data[dates[i0]] * d1 + data[dates[i1]] * d0) / (d0 + d1) if not quiet: print(t, dates[i0], dates[i1], d0, d1) elif not i1.size: uv = data[dates[-1]] if not quiet: print(t, dates[-1]) elif not i0.size: uv = data[dates[0]] if not quiet: print(t, dates[0]) # interp to grid: if cond is False: cond, inds = rt.grid_vicinity(grd, x0, y0, margin=Margin, rect=True, retinds=True) i1, i2, j1, j2 = inds if not quiet: print(' --> inter uv %s' % t.isoformat(' ')) u = calc.griddata(x0[cond], y0[cond], uv.real[cond], g.lon, g.lat, extrap=True) v = calc.griddata(x0[cond], y0[cond], uv.imag[cond], g.lon, g.lat, extrap=True) # rotate wind, calc stress: if not quiet: print(' --> rot U,V wind and U,V wind stress') wspd = np.sqrt(u**2 + v**2) sustr, svstr = air_sea.wind_stress(u, v) angle = g.use('angle') uwnd, vwnd = calc.rot2d(u, v, angle) sustr, svstr = calc.rot2d(sustr, svstr, angle) sustr = rt.rho2uvp(sustr, 'u') svstr = rt.rho2uvp(svstr, 'v') # update wind data: newWind['date'] = t newWind['uwnd'] = uwnd newWind['vwnd'] = vwnd newWind['sustr'] = sustr newWind['svstr'] = svstr newWind['wspd'] = wspd # original xy: if tind == 0: newWind['attr'] = {'new_wind_info': new_wind_info} if not quiet: print(' --> original xy') if keepOriginal == 1: newWind['x_wind'] = x0 newWind['y_wind'] = y0 elif keepOriginal == 2: newWind['x_wind'] = x0[j1:j2, i1:i2] newWind['y_wind'] = y0[j1:j2, i1:i2] # add to file: if not quiet: print(' --> adding to file') fob.update_wind(newWind, quiet=quiet) if not quiet: print('')