コード例 #1
0
ファイル: surface.py プロジェクト: mnkmishra02/okean
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)
コード例 #2
0
ファイル: surface.py プロジェクト: mnkmishra02/okean
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)
コード例 #3
0
ファイル: surface.py プロジェクト: mnkmishra02/okean
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)
コード例 #4
0
ファイル: surface.py プロジェクト: mnkmishra02/okean
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)
コード例 #5
0
ファイル: surface.py プロジェクト: mnkmishra02/okean
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('')