示例#1
0
  def fill(self,data,tind='next',quiet=1):
    '''
    Fills model netcdf climatology file (data can be provided by
    prognostic.data2roms

    '''
    nc=netcdf.Pync(self.filename,'w')
    if tind=='next': tind=nc.dims['time']


    if not quiet: print('filling clm file %s' % self.filename)

    # about time:
    try:
      date=dts.parse_date(data['date'])
      time=netcdf.date2num(date,self.tunits)
    except:
      time=data['date'] # date as number!

    for i in nc.varnames:
      if i.endswith('time'):
        if not quiet: print('  -- %s tind=%d %f' % (i,tind,time))
        nc.vars[i][tind]=time


    names='temp','salt','u','v','ubar','vbar','zeta'
    for i in names:
      if not quiet: print('  %s' % i)
      nc.vars[i][tind,...]=data[i]

    nc.close()
示例#2
0
    def fill(self, data, tind='next', quiet=1):
        '''
    Fills model netcdf climatology file (data can be provided by
    prognostic.data2roms

    '''
        nc = netcdf.Pync(self.filename, 'w')
        if tind == 'next': tind = nc.dims['time']

        if not quiet: print('filling clm file %s' % self.filename)

        # about time:
        try:
            date = dts.parse_date(data['date'])
            time = netcdf.date2num(date, self.tunits)
        except:
            time = data['date']  # date as number!

        for i in nc.varnames:
            if i.endswith('time'):
                if not quiet: print('  -- %s tind=%d %f' % (i, tind, time))
                nc.vars[i][tind] = time

        names = 'temp', 'salt', 'u', 'v', 'ubar', 'vbar', 'zeta'
        for i in names:
            if not quiet: print('  %s' % i)
            nc.vars[i][tind, ...] = data[i]

        nc.close()
示例#3
0
def fill_frc(fname, time, u, v):
    nc = netcdf.Pync(fname, 'w')

    tunits = netcdf.vatt(nc, 'wind_time', 'units')
    time = netcdf.date2num(time, tunits)
    tind = nc.dims['wind_time']

    nc.vars['wind_time'][tind] = time
    nc.vars['Uwind_ascat24'][tind, ...] = u
    nc.vars['Vwind_ascat24'][tind, ...] = v

    nc.close()
示例#4
0
文件: ascat.py 项目: jcmt/okean
def fill_frc(fname,time,u,v):
  nc=netcdf.Pync(fname,'w')

  tunits=netcdf.vatt(nc,'wind_time','units')
  time=netcdf.date2num(time,tunits)
  tind=nc.dims['wind_time']

  nc.vars['wind_time'][tind]=time
  nc.vars['Uwind_ascat24'][tind,...]=u
  nc.vars['Vwind_ascat24'][tind,...]=v

  nc.close()
示例#5
0
    def __init__(self, filename, grid, sparams, **kargs):
        if not 'type' in kargs.keys(): kargs['type'] = 'ROMS Initial file'
        if not 'title' in kargs.keys(): kargs['title'] = 'ROMS Initial file'

        GenCommon.__init__(self, filename, grid, sparams, **kargs)

        self.date = kargs.get('date', 0)

        # about time:
        try:
            self.date = dts.parse_date(self.date)
            self.time = netcdf.date2num(self.date, self.tunits)
        except:
            self.time = self.date  # date as number!
示例#6
0
  def __init__(self,filename,grid,sparams,**kargs):
    if not 'type'  in kargs.keys(): kargs['type']  = 'ROMS Initial file'
    if not 'title' in kargs.keys(): kargs['title'] = 'ROMS Initial file'

    GenCommon.__init__(self,filename,grid,sparams,**kargs)

    date = 0
    if 'date'   in kargs.keys(): date   = kargs['date']
    self.date   = date

    # about time:
    try:
      self.date=dts.parse_date(self.date)
      self.time=netcdf.date2num(self.date,self.tunits)
    except:
      self.time=self.date # date as number!
示例#7
0
文件: rivers.py 项目: eduedix/okean
    def fill(self, data, quiet=1):
        '''
    Fills model netcdf river forcing file

    The input data shoud have as keys the river names
    (with river runoff, temp, salt, vshape, xi,eta and direction)
    and time (datetime)

    Example:
      data['amazonas']=q,temp,salt,vshape,Xi,Eta,Dir
      data['time']=np.arange(20)
    '''

        # convert time to tunits:
        time = data['time']
        for i in range(len(time)):
            time[i] = netcdf.date2num(time[i], self.tunits)

        nc = netcdf.Pync(self.fname, 'a')

        if not quiet: print ' -- filling time...'
        for i in range(len(time)):
            nc.vars['river_time'][i] = time[i]

        # better sync here:
        nc._nc.sync()

        cont = -1
        for k in data.keys():
            if k == 'time': continue
            cont += 1

            q, temp, salt, vshape, Xi, Eta, Dir = data[k]
            if not quiet: print ' -- filling river', cont
            nc.vars['river'][cont] = cont
            nc.vars['river_Xposition'][cont] = Xi
            nc.vars['river_Eposition'][cont] = Eta
            nc.vars['river_direction'][cont] = Dir
            nc.vars['river_Vshape'][:, cont] = vshape
            nc.vars['river_transport'][:, cont] = q
            nc.vars['river_temp'][:, :, cont] = temp
            nc.vars['river_salt'][:, :, cont] = salt

        nc.close()
示例#8
0
    def fill(self, data, tind='next', quiet=1):
        '''
    Fills model netcdf boundary conditions (data can be provided by
    prognostic.data2romsbry

    '''
        nc = netcdf.Pync(self.filename, 'w')
        if tind == 'next': tind = nc.dims['time']

        if not quiet: print('filling bry file %s' % self.filename)

        # about time:
        try:
            date = dts.parse_date(data['date'])
            time = netcdf.date2num(date, self.tunits)
        except:
            time = data['date']  # date as number!

        for i in nc.varnames:
            if i.endswith('time'):
                if not quiet: print('  -- %s tind=%d %f' % (i, tind, time))
                nc.vars[i][tind] = time

        names = 'temp', 'salt', 'u', 'v', 'ubar', 'vbar', 'zeta'
        if self.addxz:
            names = list(names) + [
                'dist', 'distu', 'distv', 'depth', 'depthu', 'depthv'
            ]

        for i in names:
            for j in 'north', 'south', 'east', 'west':
                vname = i + '_' + j
                if vname in nc.varnames:
                    if vname.startswith('dist'):
                        if tind == 0:
                            if not quiet: print('  %s' % vname)
                            nc.vars[vname][:] = data[
                                vname]  # not time dependent
                    else:
                        if not quiet: print('  %s' % vname)
                        nc.vars[vname][tind, ...] = data[vname]

        nc.close()
示例#9
0
  def fill(self,data,quiet=1):
    '''
    Fills model netcdf river forcing file

    The input data shoud have as keys the river names
    (with river runoff, temp, salt, vshape, xi,eta and direction)
    and time (datetime)

    Example:
      data['amazonas']=q,temp,salt,vshape,Xi,Eta,Dir
      data['time']=np.arange(20)
    '''

    # convert time to tunits:
    time=data['time']
    for i in range(len(time)): time[i]=netcdf.date2num(time[i],self.tunits)

    nc=netcdf.Pync(self.fname,'a')

    if not quiet: print(' -- filling time...')
    for i in range(len(time)): nc.vars['river_time'][i]=time[i]

    # better sync here:
    nc._nc.sync()

    cont=-1
    for k in data.keys():
      if k=='time': continue
      cont+=1

      q,temp,salt,vshape,Xi,Eta,Dir=data[k]
      if not quiet: print(' -- filling river',cont)
      nc.vars['river'][cont]        = cont
      nc.vars['river_Xposition'][cont]   = Xi
      nc.vars['river_Eposition'][cont]   = Eta
      nc.vars['river_direction'][cont]   = Dir
      nc.vars['river_Vshape'][:,cont]    = vshape
      nc.vars['river_transport'][:,cont] = q
      nc.vars['river_temp'][:,:,cont]    = temp
      nc.vars['river_salt'][:,:,cont]    = salt

    nc.close()
示例#10
0
  def fill(self,data,tind='next',quiet=1):
    '''
    Fills model netcdf boundary conditions (data can be provided by
    prognostic.data2romsbry

    '''
    nc=netcdf.Pync(self.filename,'w')
    if tind=='next': tind=nc.dims['time']


    if not quiet: print('filling bry file %s' % self.filename)

    # about time:
    try:
      date=dts.parse_date(data['date'])
      time=netcdf.date2num(date,self.tunits)
    except:
      time=data['date'] # date as number!

    for i in nc.varnames:
      if i.endswith('time'):
        if not quiet: print('  -- %s tind=%d %f' % (i,tind,time))
        nc.vars[i][tind]=time

    names='temp','salt','u','v','ubar','vbar','zeta'
    if self.addxz:
      names=list(names)+['dist','distu','distv','depth','depthu','depthv']

    for i in names:
      for j in 'north','south','east','west':
        vname=i+'_'+j
        if vname in nc.varnames:
          if vname.startswith('dist'):
            if tind==0:
              if not quiet: print('  %s' % vname)
              nc.vars[vname][:]=data[vname] # not time dependent
          else:
            if not quiet: print('  %s' % vname)
            nc.vars[vname][tind,...]=data[vname]

    nc.close()
示例#11
0
  def fill(self,data,tind='next',quiet=1):
    '''
    Fills model netcdf bulk forcing file

    '''
    nc=netcdf.Pync(self.filename,'w')
    if tind=='next': tind=nc.dims['time']


    if not quiet: print('filling blk file %s' % self.filename)

    # about time:
    try:
      date=dts.parse_date(data['date'])
      time=netcdf.date2num(date,self.tunits)
    except:
      time=data['date'] # date as number!

    for i in nc.varnames:
      if i.endswith('time'):
        if not quiet: print('  -- %s tind=%d %f' % (i,tind,time))
        nc.vars[i][tind]=time


    if 'Tair' in nc.varnames: # roms
      names=('Tair','tair'),('Pair','pres'),('Qair','rhum'),('rain','prate'),\
            ('swrad','radsw'),('lwrad','radlw'),('Uwind','uwnd'),('Vwind','vwnd'),\
            'sustr','svstr','wspd','cloud',('lwrad_down','dlwrf')
      if not 'tair' in data.keys(): # assuming data has roms (not agrif) varnames:
        names='Tair','Pair','Qair','rain','swrad','lwrad','Uwind','Vwind','sustr','svstr','wspd','cloud','lwrad_down'

    elif 'tair' in nc.varnames: # roms-agrif
      names='tair','pres','rhum','prate','radlw','radsw','dlwrf','uwnd',\
            'vwnd','wspd','sustr','svstr',\
            'cloud' # not used, but add it anyway

    for i in names:
      if isinstance(i,basestring): filev,datav=i,i
      else:  filev,datav=i

      if datav not in data.keys():
        if not quiet: print('  Warning: data key %s not present' % datav)
      else:
        if not quiet: print('  %s (%s) min=%8.3f max=%8.3f' % (filev.ljust(7),datav.ljust(7),
                                                               data[datav].min(),data[datav].max()))
        nc.vars[filev][tind,...]=data[datav]

      # fill original data:
      orig=datav+'_original'
      if orig in data.keys() and not orig in nc.varnames:
        if not quiet: print('  Warning: original data will not be written %s' % orig)
      elif not orig in data.keys() and orig in nc.varnames:
        if not quiet: print('  Warning: original data not present %s' % orig)
      elif orig in data.keys() and orig in nc.varnames:
        if not quiet: print('  %s  min=%8.3f max=%8.3f' % (orig.ljust(7+9),
                                                          data[orig].min(),data[orig].max()))
        nc.vars[orig][tind,...]=data[orig]

    # fill original x,y:
    if tind==0 and 'x_original' in data.keys() and 'x_original' in nc.varnames:
      if not quiet: print('  filling x,y original')
      nc.vars['x_original'][:]=data['x_original']
      nc.vars['y_original'][:]=data['y_original']

    nc.close()
示例#12
0
def frc2gnome(fname, frc, grd, xylim=False, dates=False, ij=(1, 1), **kargs):
    '''
  Creates GNOME wind file
  kargs:
    t[u,v]var
    t[u,v]dim
    x[y,ang]var

  Ex:
    .frc2gnome(out,frc,grd,ij=(10,10),dates=dates,**{'tdim':'Time'})
  '''

    deta, dxi = ij

    tvar = 'time'
    uvar = 'Uwind'
    vvar = 'Vwind'
    #tvar='bulk_time'
    #uvar='uwnd'
    #vvar='vwnd'

    tdim = 'time'
    #tdim='bulk_time'
    xdim = 'xi_rho'
    ydim = 'eta_rho'

    xvar = 'lon_rho'
    yvar = 'lat_rho'
    angvar = 'angle'

    if 'tvar' in kargs.keys(): tvar = kargs['tvar']
    if 'uvar' in kargs.keys(): uvar = kargs['uvar']
    if 'vvar' in kargs.keys(): vvar = kargs['vvar']

    if 'tdim' in kargs.keys(): tdim = kargs['tdim']
    if 'xdim' in kargs.keys(): xdim = kargs['xdim']
    if 'ydim' in kargs.keys(): ydim = kargs['ydim']

    if 'xvar' in kargs.keys(): xvar = kargs['xvar']
    if 'yvar' in kargs.keys(): yvar = kargs['yvar']
    if 'angvar' in kargs.keys(): angvar = kargs['angvar']

    dims = netcdf.fdim(grd)
    xi, eta = dims[xdim], dims[ydim]
    xi0, eta0 = xi, eta

    ncg = netcdf.ncopen(grd)

    nc0 = netcdf.ncopen(frc)
    try:
        t = netcdf.nctime(nc0, tvar)
    except:
        t = netcdf.use(nc0, tvar)
        t = netcdf.num2date(t, 'days since %d-01-01' % year0)

    time = netcdf.date2num(t, tunits)

    x0 = netcdf.use(grd, xvar)
    y0 = netcdf.use(grd, yvar)
    if x0.ndim == 1: x0, y0 = np.meshgrid(x0, y0)

    if angvar:
        ang = netcdf.use(grd, angvar)

    if not xylim is False:
        xlim = xylim[:2]
        ylim = xylim[2:]
        i1, i2, j1, j2 = calc.ij_limits(x0, y0, xlim, ylim)
        xi = i2 - i1
        eta = j2 - j1
    else:
        i1, i2 = 0, xi
        j1, j2 = 0, eta

    XI = '%d:%d:%d' % (i1, i2, dxi)
    ETA = '%d:%d:%d' % (j1, j2, deta)

    xi = len(range(i1, i2, dxi))
    eta = len(range(j1, j2, deta))

    # create file:
    create_wind(fname, xi, eta)

    nc = netcdf.ncopen(fname, 'a')

    x = x0[j1:j2:deta, i1:i2:dxi]
    y = y0[j1:j2:deta, i1:i2:dxi]

    nc.vars['lon'][:] = x
    nc.vars['lat'][:] = y
    if angvar: ang = ang[j1:j2:deta, i1:i2:dxi]

    n = -1
    for it in range(len(time)):

        if not dates is False:
            d0, d1 = dates
            if t[it] < d0 or t[it] >= d1: continue

        n += 1
        u = netcdf.use(nc0, uvar, **{xdim: XI, ydim: ETA, tdim: it})
        v = netcdf.use(nc0, vvar, **{xdim: XI, ydim: ETA, tdim: it})

        # rotate uv:
        if angvar:
            print('rotating ...')
            u, v = calc.rot2d(u, v, -ang)

        nc.vars['time'][n] = time[it]
        print('filling uv', n, t[it])
        nc.vars['air_u'][n, ...] = u
        nc.vars['air_v'][n, ...] = v

    nc.close()
    nc0.close()
    ncg.close()
示例#13
0
def his2gnome(fname,
              his,
              grd=False,
              nomask=False,
              gshhsMask=True,
              xylim=False,
              dates=False,
              ij=(1, 1)):
    '''
  Creates GNOME wind file
  Ex:
    his2gnome(out,his,grd,dates=dates,ij=(2,2))

  if gshhsMask, the high res mask file mask_gshhs.npy will be created at 1st usage.
  Mask is based on high (h) resolution gshhs data which must be available (env variable
  GSHHS_MASK must be set). 
  '''

    if not grd: grd = his
    deta, dxi = ij

    dims = netcdf.fdim(his)
    xi, eta = dims['xi_rho'], dims['eta_rho']
    xi0, eta0 = xi, eta

    nc0 = netcdf.ncopen(his)
    time = netcdf.nctime(nc0, 'ocean_time')
    # for roms agrif:
    #t=netcdf.use(nc0,'scrum_time')
    #time=netcdf.num2date(t,'seconds since %d-01-01' % year0)

    x0 = netcdf.use(grd, 'lon_rho')
    y0 = netcdf.use(grd, 'lat_rho')
    ang = netcdf.use(grd, 'angle')

    if not xylim is False:
        xlim = xylim[:2]
        ylim = xylim[2:]
        i1, i2, j1, j2 = calc.ij_limits(x0, y0, xlim, ylim)
        print(i1, i2, j1, j2)
        xi = i2 - i1
        eta = j2 - j1
    else:
        i1, i2 = 0, xi
        j1, j2 = 0, eta

    XI = '%d:%d:%d' % (i1, i2, dxi)
    ETA = '%d:%d:%d' % (j1, j2, deta)

    xi = len(range(i1, i2, dxi))
    eta = len(range(j1, j2, deta))
    # create file:
    create_uv(fname, xi, eta)

    nc = netcdf.ncopen(fname, 'a')
    for v0, v in ('lon_rho', 'lon'), ('lat_rho', 'lat'), ('mask_rho',
                                                          'mask'), ('h',
                                                                    'depth'):
        print('filling %s with %s' % (v, v0))
        nc.vars[v][:] = netcdf.use(grd, v0, xi_rho=XI, eta_rho=ETA)

    if nomask:
        print('NO MASK !!!')
        nc.vars['mask'][:] = 1

    if gshhsMask:
        try:
            mask = np.load('mask_gshhs.npy')
        except:
            mask = 1 + 0 * netcdf.use(nc0, 'mask_rho', xi_rho=XI, eta_rho=ETA)
            mask = mask.astype('bool')
            x = netcdf.use(grd, 'lon_rho', xi_rho=XI, eta_rho=ETA)
            y = netcdf.use(grd, 'lat_rho', xi_rho=XI, eta_rho=ETA)

            from okean import gshhs
            axis = x.min(), x.max(), y.min(), y.max()
            g = gshhs.gshhs(axis,
                            resolution='h',
                            area_thresh=0.,
                            max_level=2,
                            clip=True)
            for lon, lat, level in zip(g.lon, g.lat, g.level):
                if level == 1:  # land
                    print('mask ', lon.shape)
                    i = calc.inpolygon(x, y, lon, lat)
                    mask = mask & ~i

            mask.dump('mask_gshhs.npy')

        nc.vars['mask'][:] = mask

    x = x0[j1:j2:deta, i1:i2:dxi]
    y = y0[j1:j2:deta, i1:i2:dxi]
    ang = ang[j1:j2:deta, i1:i2:dxi]

    n = -1
    for it in range(len(time)):
        if not dates is False:
            d0, d1 = dates
            if time[it] < d0 or time[it] >= d1: continue

        n += 1
        U = np.zeros((eta0, xi0), 'f')
        V = np.zeros((eta0, xi0), 'f')

        nc.vars['time'][n] = netcdf.date2num(time[it], tunits)

        # for roms agrif:
        #u=netcdf.use(nc0,'u',time=it,s_rho=-1)
        #v=netcdf.use(nc0,'v',time=it,s_rho=-1)
        u = netcdf.use(nc0, 'u', ocean_time=it, s_rho=-1)
        v = netcdf.use(nc0, 'v', ocean_time=it, s_rho=-1)

        # mask extrap:
        print('mask extrap...')

        u = calc.mask_extrap(x0, y0, np.ma.masked_where(u == 0, u))
        v = calc.mask_extrap(x0, y0, np.ma.masked_where(v == 0, v))

        U[:, 1:-1] = 0.5 * (u[:, :-1] + u[:, 1:])
        U[:, 0] = u[:, 0]
        U[:, -1] = u[:, -1]

        V[1:-1, :] = 0.5 * (v[:-1.:] + v[1:, :])
        V[0, :] = v[0, :]
        V[-1, :] = v[-1, :]

        U = U[j1:j2, i1:i2]
        V = V[j1:j2, i1:i2]

        U = U[j1:j2:deta, i1:i2:dxi]
        V = V[j1:j2:deta, i1:i2:dxi]

        # rotate uv:
        print('rotating ...')
        U, V = calc.rot2d(U, V, -ang)

        print('filling uv', n, time[it])
        nc.vars['u'][n, ...] = U
        nc.vars['v'][n, ...] = V

    nc.close()
    nc0.close()
示例#14
0
    def fill(self, data, tind='next', quiet=1):
        '''
    Fills model netcdf bulk forcing file

    '''
        nc = netcdf.Pync(self.filename, 'w')
        if tind == 'next': tind = nc.dims['time']

        if not quiet: print('filling blk file %s' % self.filename)

        # about time:
        try:
            date = dts.parse_date(data['date'])
            time = netcdf.date2num(date, self.tunits)
        except:
            time = data['date']  # date as number!

        for i in nc.varnames:
            if i.endswith('time'):
                if not quiet: print('  -- %s tind=%d %f' % (i, tind, time))
                nc.vars[i][tind] = time

        if 'Tair' in nc.varnames:  # roms
            names=('Tair','tair'),('Pair','pres'),('Qair','rhum'),('rain','prate'),\
                  ('swrad','radsw'),('lwrad','radlw'),('Uwind','uwnd'),('Vwind','vwnd'),\
                  'sustr','svstr','wspd','cloud',('lwrad_down','dlwrf')
            if not 'tair' in data.keys(
            ):  # assuming data has roms (not agrif) varnames:
                names = 'Tair', 'Pair', 'Qair', 'rain', 'swrad', 'lwrad', 'Uwind', 'Vwind', 'sustr', 'svstr', 'wspd', 'cloud', 'lwrad_down'

        elif 'tair' in nc.varnames:  # roms-agrif
            names='tair','pres','rhum','prate','radlw','radsw','dlwrf','uwnd',\
                  'vwnd','wspd','sustr','svstr',\
                  'cloud' # not used, but add it anyway

        for i in names:
            if isinstance(i, basestring): filev, datav = i, i
            else: filev, datav = i

            if datav not in data.keys():
                if not quiet:
                    print('  Warning: data key %s not present' % datav)
            else:
                if not quiet:
                    print('  %s (%s) min=%8.3f max=%8.3f' %
                          (filev.ljust(7), datav.ljust(7), data[datav].min(),
                           data[datav].max()))
                nc.vars[filev][tind, ...] = data[datav]

            # fill original data:
            orig = datav + '_original'
            if orig in data.keys() and not orig in nc.varnames:
                if not quiet:
                    print('  Warning: original data will not be written %s' %
                          orig)
            elif not orig in data.keys() and orig in nc.varnames:
                if not quiet:
                    print('  Warning: original data not present %s' % orig)
            elif orig in data.keys() and orig in nc.varnames:
                if not quiet:
                    print('  %s  min=%8.3f max=%8.3f' %
                          (orig.ljust(7 + 9), data[orig].min(),
                           data[orig].max()))
                nc.vars[orig][tind, ...] = data[orig]

        # fill original x,y:
        if tind == 0 and 'x_original' in data.keys(
        ) and 'x_original' in nc.varnames:
            if not quiet: print('  filling x,y original')
            nc.vars['x_original'][:] = data['x_original']
            nc.vars['y_original'][:] = data['y_original']

        nc.close()
示例#15
0
文件: gnome.py 项目: jcmt/okean
def frc2gnome(fname,frc,grd,xylim=False,dates=False,ij=(1,1),**kargs):
  '''
  Creates GNOME wind file
  kargs:
    t[u,v]var
    t[u,v]dim
    x[y,ang]var

  Ex:
    .frc2gnome(out,frc,grd,ij=(10,10),dates=dates,**{'tdim':'Time'})
  '''

  deta,dxi=ij

  tvar='time'
  uvar='Uwind'
  vvar='Vwind'
  #tvar='bulk_time'
  #uvar='uwnd'
  #vvar='vwnd'

  tdim='time'
  #tdim='bulk_time'
  xdim='xi_rho'
  ydim='eta_rho'

  xvar='lon_rho'
  yvar='lat_rho'
  angvar='angle'

  if 'tvar' in kargs.keys(): tvar=kargs['tvar']
  if 'uvar' in kargs.keys(): uvar=kargs['uvar']
  if 'vvar' in kargs.keys(): vvar=kargs['vvar']

  if 'tdim' in kargs.keys(): tdim=kargs['tdim']
  if 'xdim' in kargs.keys(): xdim=kargs['xdim']
  if 'ydim' in kargs.keys(): ydim=kargs['ydim']

  if 'xvar' in kargs.keys(): xvar=kargs['xvar']
  if 'yvar' in kargs.keys(): yvar=kargs['yvar']
  if 'angvar' in kargs.keys(): angvar=kargs['angvar']


  dims=netcdf.fdim(grd)
  xi,eta=dims[xdim],dims[ydim]
  xi0,eta0=xi,eta

  ncg=netcdf.ncopen(grd)

  nc0=netcdf.ncopen(frc)
  try:
   t=netcdf.nctime(nc0,tvar)
  except:
    t=netcdf.use(nc0,tvar)
    t=netcdf.num2date(t,'days since %d-01-01' % year0)

  time=netcdf.date2num(t,tunits)

  x0=netcdf.use(grd,xvar)
  y0=netcdf.use(grd,yvar)
  if x0.ndim==1: x0,y0=np.meshgrid(x0,y0)

  if angvar:
    ang=netcdf.use(grd,angvar)

  if not xylim is False:
    xlim=xylim[:2]
    ylim=xylim[2:]
    i1,i2,j1,j2=calc.ij_limits(x0,y0,xlim,ylim)
    xi=i2-i1
    eta=j2-j1
  else:
    i1,i2=0,xi
    j1,j2=0,eta

  XI  ='%d:%d:%d' %(i1,i2,dxi)
  ETA ='%d:%d:%d' %(j1,j2,deta)

  xi=len(range(i1,i2,dxi))
  eta=len(range(j1,j2,deta))

  # create file:
  create_wind(fname,xi,eta)

  nc=netcdf.ncopen(fname,'a')

  x=x0[j1:j2:deta,i1:i2:dxi]
  y=y0[j1:j2:deta,i1:i2:dxi]

  nc.vars['lon'][:]=x
  nc.vars['lat'][:]=y
  if angvar: ang=ang[j1:j2:deta,i1:i2:dxi]

  n=-1
  for it in range(len(time)):

    if not dates is False:
      d0,d1=dates
      if t[it]<d0 or t[it]>=d1: continue

    n+=1
    u=netcdf.use(nc0,uvar,**{xdim:XI,ydim:ETA,tdim:it})
    v=netcdf.use(nc0,vvar,**{xdim:XI,ydim:ETA,tdim:it})

    # rotate uv:
    if angvar:
      print 'rotating ...'
      u,v=calc.rot2d(u,v,-ang)


    nc.vars['time'][n]=time[it]
    print 'filling uv',n,t[it]
    nc.vars['air_u'][n,...]=u
    nc.vars['air_v'][n,...]=v


  nc.close()
  nc0.close()
  ncg.close()
示例#16
0
文件: gnome.py 项目: jcmt/okean
def his2gnome(fname,his,grd=False,nomask=False,gshhsMask=True,xylim=False,dates=False,ij=(1,1)):
  '''
  Creates GNOME wind file
  Ex:
    his2gnome(out,his,grd,dates=dates,ij=(2,2))

  if gshhsMask, the high res mask file mask_gshhs.npy will be created at 1st usage.
  Mask is based on high (h) resolution gshhs data which must be available (env variable
  GSHHS_MASK must be set). 
  '''

  if not grd: grd=his
  deta,dxi=ij

  dims=netcdf.fdim(his)
  xi,eta=dims['xi_rho'],dims['eta_rho']
  xi0,eta0=xi,eta

  nc0=netcdf.ncopen(his)
  time=netcdf.nctime(nc0,'ocean_time')
  # for roms agrif:
  #t=netcdf.use(nc0,'scrum_time')
  #time=netcdf.num2date(t,'seconds since %d-01-01' % year0)

  x0=netcdf.use(grd,'lon_rho')
  y0=netcdf.use(grd,'lat_rho')
  ang=netcdf.use(grd,'angle')

  if not xylim is False:
    xlim=xylim[:2]
    ylim=xylim[2:]
    i1,i2,j1,j2=calc.ij_limits(x0,y0,xlim,ylim)
    print i1,i2,j1,j2
    xi=i2-i1
    eta=j2-j1
  else:
    i1,i2=0,xi
    j1,j2=0,eta

  XI  ='%d:%d:%d' %(i1,i2,dxi)
  ETA ='%d:%d:%d' %(j1,j2,deta)

  xi=len(range(i1,i2,dxi))
  eta=len(range(j1,j2,deta))
  # create file:
  create_uv(fname,xi,eta)

  nc=netcdf.ncopen(fname,'a')
  for v0,v in ('lon_rho','lon'),('lat_rho','lat'),('mask_rho','mask'),('h','depth'):
    print 'filling %s with %s' % (v,v0)
    nc.vars[v][:]=netcdf.use(grd,v0,xi_rho=XI,eta_rho=ETA)

  if nomask:
    print 'NO MASK !!!'
    nc.vars['mask'][:]=1

  if gshhsMask:
    try:
     mask=np.load('mask_gshhs.npy')
    except:
      mask=1+0*netcdf.use(nc0,'mask_rho',xi_rho=XI,eta_rho=ETA)
      mask=mask.astype('bool')
      x=netcdf.use(grd,'lon_rho',xi_rho=XI,eta_rho=ETA)
      y=netcdf.use(grd,'lat_rho',xi_rho=XI,eta_rho=ETA)

      from okean import gshhs
      axis=x.min(),x.max(),y.min(),y.max()
      g=gshhs.gshhs(axis, resolution='h',area_thresh=0., max_level=2,clip=True)
      for lon, lat, level in zip(g.lon, g.lat, g.level):
        if level == 1: # land
          print 'mask ',lon.shape
          i=calc.inpolygon(x,y,lon,lat)
          mask=mask & ~i

      mask.dump('mask_gshhs.npy')


    nc.vars['mask'][:]=mask


  x=x0[j1:j2:deta,i1:i2:dxi]
  y=y0[j1:j2:deta,i1:i2:dxi]
  ang=ang[j1:j2:deta,i1:i2:dxi]

  n=-1
  for it in range(len(time)):
    if not dates is False:
      d0,d1=dates
      if time[it]<d0 or time[it]>=d1: continue

    n+=1
    U=np.zeros((eta0,xi0),'f')
    V=np.zeros((eta0,xi0),'f')

    nc.vars['time'][n]=netcdf.date2num(time[it],tunits)

    # for roms agrif:
    #u=netcdf.use(nc0,'u',time=it,s_rho=-1)
    #v=netcdf.use(nc0,'v',time=it,s_rho=-1)
    u=netcdf.use(nc0,'u',ocean_time=it,s_rho=-1)
    v=netcdf.use(nc0,'v',ocean_time=it,s_rho=-1)

    # mask extrap:
    print 'mask extrap...'

    u=calc.mask_extrap(x0,y0,np.ma.masked_where(u==0,u))
    v=calc.mask_extrap(x0,y0,np.ma.masked_where(v==0,v))

    U[:,1:-1]=0.5*(u[:,:-1]+u[:,1:])
    U[:,0]=u[:,0]
    U[:,-1]=u[:,-1]

    V[1:-1,:]=0.5*(v[:-1.:]+v[1:,:])
    V[0,:]=v[0,:]
    V[-1,:]=v[-1,:]

    U=U[j1:j2,i1:i2]
    V=V[j1:j2,i1:i2]
  
    U=U[j1:j2:deta,i1:i2:dxi]
    V=V[j1:j2:deta,i1:i2:dxi]

    # rotate uv:
    print 'rotating ...'
    U,V=calc.rot2d(U,V,-ang)

    print 'filling uv', n, time[it]
    nc.vars['u'][n,...]=U
    nc.vars['v'][n,...]=V

  nc.close()
  nc0.close()