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()
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()
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()
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()
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!
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!
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()
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()
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()
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()
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()
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()
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()
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()
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()
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()