def slicez(self,varname,ind,time=0,**opts): if not self.hasz(varname): return self.slicek(varname,ind,time,**opts) surf_nans=opts.get('surf_nans',True) spline=opts.get('spline',True) coords=opts.get('coords',self._default_coords('slicez')).split(',') out=Data() out.msg=self.check_slice(varname,t=time) if out.msg: return out##None,au v=self.use(varname,SEARCHtime=time) x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)[0]) zeta=self.use('zeta',SEARCHtime=time) zeta=rt.rho2uvp(zeta,varname) out.v=rt.slicez(v,m,h,zeta,self.s_params,ind,surf_nans,spline) out.info['v']['name']=varname if calc.isarray(ind): out.info['v']['slice']='z= array %.2f to %.2f'%(ind.min(),ind.max()) else: out.info['v']['slice']='z=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.nc,varname,'units') except: pass # coords: if 'x' in coords: if self.grid.is_spherical: out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') else: out.x=x/1000. out.info['x']=dict(name='Distance',units='km') if 'y' in coords: if self.grid.is_spherical: out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') else: out.y=y/1000. out.info['y']=dict(name='Distance',units='km') if 'z' in coords: out.z=ind+np.zeros(out.v.shape) out.info['z']=dict(name='Depth',units='m') if 't' in coords and self.hast(varname): out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'x' in coords: out.extra[0].x=out.x if 'y' in coords: out.extra[0].y=out.y out.extra[0].v=h if h.max()>1000: cvals=200.,1000. elif h.max()>200: cvals=50.,100.,200. else: cvals=3 out.extra[0].config['field.plot']='contour' out.extra[0].config['field.cvals']=cvals out.extra[0].config['field.linecolors']='k' out.extra[0].alias='bathy' out.coordsReq=','.join(sorted(coords)) return out
def slicej(self,varname,ind,time=0,**opts): coords=opts.get('coords',self._default_coords('slicej')).split(',') out=Data() out.msg=self.check_slice(varname,t=time,j=ind) if out.msg: return out v=self.use(varname,SEARCHtime=time,eta_SEARCH=ind) # add mask if not masked: if not np.ma.isMA(v): m=self.grid.vars(ruvp=self.var_at(varname)[0],j=ind)[-1] if v.ndim==2: m=np.tile(m,(v.shape[0],1)) v=np.ma.masked_where(m==0,v) out.v=v out.info['v']['name']=varname out.info['v']['slice']='j=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.name,varname,'units') except: pass # coords: if 'z' in coords and v.ndim==2: ###### out.z=self.s_levels(time=time,ruvpw=self.var_at(varname),j=ind) out.z=self.s_levels(time=time,loc=self.var_at(varname),j=ind) out.info['z']=dict(name='Depth',units='m') if any([i in coords for i in 'xyd']): x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)[0],j=ind) if 'd' in coords: d=calc.distance(x,y) if d[-1]-d[0]>1e4: d=d/1000. dunits='km' else: dunits='m' if v.ndim==2: d=np.tile(d,(v.shape[0],1)) out.d=d out.info['d']=dict(name='Distance',units=dunits) if 'x' in coords: if v.ndim==2: x=np.tile(x,(v.shape[0],1)) out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') if 'y' in coords: if v.ndim==2: y=np.tile(y,(v.shape[0],1)) out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') if 't' in coords and self.hast(varname): out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'd' in coords: out.extra[0].x=out.d[0] if 'x' in coords: out.extra[0].y=out.x[0] if 'y' in coords: out.extra[0].x=out.y[0] out.extra[0].v=-h out.extra[0].config['d1.plot']='fill_between' out.extra[0].config['d1.y0']=-h.max()-(h.max()-h.min())/20. out.extra[0].alias='bottom' out.coordsReq=','.join(sorted(coords)) return out
def slicek(self,varname,ind,time=0,**opts): coords=opts.get('coords',self._default_coords('slicek')).split(',') out=Data() out.msg=self.check_slice(varname,t=time,k=ind) if out.msg: out v=self.use(varname,SEARCHtime=time,s_SEARCH=ind) # add mask if not masked: if not np.ma.isMA(v): m=self.grid.vars(ruvp=self.var_at(varname)[0])[-1] v=np.ma.masked_where(m==0,v) out.v=v out.info['v']['name']=varname if self.hasz(varname): out.info['v']['slice']='k=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.nc,varname,'units') except: pass # coords: if 'z' in coords and self.hasz(varname): ##### out.z=self.s_levels(time,k=ind,ruvpw=self.var_at(varname)) out.z=self.s_levels(time,k=ind,loc=self.var_at(varname)) out.info['z']=dict(name='Depth',units='m') if any([i in coords for i in 'xy']): x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)[0]) if 'x' in coords: if self.grid.is_spherical: out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') else: out.x=x/1000. out.info['x']=dict(name='Distance',units='km') if 'y' in coords: if self.grid.is_spherical: out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') else: out.y=y/1000. out.info['y']=dict(name='Distance',units='km') if 't' in coords and self.hast(varname): out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'x' in coords: out.extra[0].x=out.x if 'y' in coords: out.extra[0].y=out.y out.extra[0].v=h if h.max()>1000: cvals=200.,1000. elif h.max()>200: cvals=50.,100.,200. else: cvals=3 out.extra[0].config['field.plot']='contour' out.extra[0].config['field.cvals']=cvals out.extra[0].config['field.linecolors']='k' out.extra[0].alias='bathy' out.coordsReq=','.join(sorted(coords)) return out
def sliceiso(self,varname,iso,time,**opts): ''' Depths where variable, increasing/dec with depth, has some value. Output is masked where surface is higher/lower than value or where all water column is lower/higher than value. ''' coords=opts.get('coords',self._default_coords('sliceiso')).split(',') out=Data() out.msg=self.check_slice(varname,t=time) if out.msg: return out if not self.hasz(varname): out.msg='a depth dependent variable is needed for sliceiso!' return out v=self.use(varname,SEARCHtime=time) #### z=self.s_levels(time=time,ruvpw=self.var_at(varname)) z=self.s_levels(time=time,loc=self.var_at(varname)) v=rt.depthof(v,z,iso) out.v=v #out.info['v']['name']=varname out.info['v']['name']='depth' if isinstance(iso,np.ndarray) and iso.ndim==2: siso='2d' else: siso=str(iso) try: out.info['v']['slice']='%s (%s) iso=%s'%(varname,netcdf.vatt(self.nc,varname,'units'),siso) except: out.info['v']['slice']='%s iso=%s'%(varname,siso) out.info['v']['units']='metre' # coords: if any([i in coords for i in 'xy']): x,y,h=self.grid.vars(ruvp=self.var_at(varname))[:3] if 'x' in coords: if self.grid.is_spherical: out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') else: out.x=x/1000. out.info['x']=dict(name='Distance',units='km') if 'y' in coords: if self.grid.is_spherical: out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') else: out.y=y/1000. out.info['y']=dict(name='Distance',units='km') if 'z' in coords: # makes no sense... v is the depth! coords.remove('z') if 't' in coords and self.hast(varname): out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'x' in coords: out.extra[0].x=out.x if 'y' in coords: out.extra[0].y=out.y out.extra[0].v=h if h.max()>1000: cvals=200.,1000. elif h.max()>200: cvals=50.,100.,200. else: cvals=3 out.extra[0].config['field.plot']='contour' out.extra[0].config['field.cvals']=cvals out.extra[0].config['field.linecolors']='k' out.extra[0].alias='bathy' out.coordsReq=','.join(sorted(coords)) return out
def slicez(self,varname,ind,time=0,**opts): if not self.hasz(varname): return self.slicek(varname,ind,time,**opts) surf_nans=opts.get('surf_nans',True) spline=opts.get('spline',True) coords=opts.get('coords',self._default_coords('slicez')).split(',') out=Data() out.msg=self.check_slice(varname,t=time) if out.msg: return out##None,au v=self.use(varname,SEARCHtime=time) x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)) zeta=self.use('zeta',SEARCHtime=time) zeta=rt.rho2uvp(zeta,varname) v,mask=rt.slicez(v,m,h,zeta,self.s_params,ind,surf_nans,spline) v=np.ma.masked_where(mask,v) out.v=v out.info['v']['name']=varname out.info['v']['slice']='z=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.nc,varname,'units') except: pass # coords: if 'x' in coords: if self.grid.is_spherical: out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') else: out.x=x/1000. out.info['x']=dict(name='Distance',units='km') if 'y' in coords: if self.grid.is_spherical: out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') else: out.y=y/1000. out.info['y']=dict(name='Distance',units='km') if 'z' in coords: out.z=ind+np.zeros(v.shape) out.info['z']=dict(name='Depth',units='m') if 't' in coords: out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'x' in coords: out.extra[0].x=out.x if 'y' in coords: out.extra[0].y=out.y out.extra[0].v=h if h.max()>1000: cvals=200.,1000. elif h.max()>200: cvals=50.,100.,200. else: cvals=3 out.extra[0].config['field.plot']='contour' out.extra[0].config['field.cvals']=cvals out.extra[0].config['field.linecolors']='k' out.extra[0].alias='bathy' out.coordsReq=','.join(sorted(coords)) return out
def slicek(self,varname,ind,time=0,**opts): coords=opts.get('coords',self._default_coords('slicek')).split(',') out=Data() out.msg=self.check_slice(varname,t=time,k=ind) if out.msg: out v=self.use(varname,SEARCHtime=time,s_SEARCH=ind) # add mask if not masked: if not np.ma.isMA(v): m=self.grid.vars(ruvp=self.var_at(varname))[-1] v=np.ma.masked_where(m==0,v) out.v=v out.info['v']['name']=varname out.info['v']['slice']='k=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.nc,varname,'units') except: pass # coords: if 'z' in coords and self.hasz(varname): out.z=self.s_levels(time,k=ind,ruvpw=self.var_at(varname)) out.info['z']=dict(name='Depth',units='m') if any([i in coords for i in 'xy']): x,y,h,m=self.grid.vars(ruvp=self.var_at(varname)) if 'x' in coords: if self.grid.is_spherical: out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') else: out.x=x/1000. out.info['x']=dict(name='Distance',units='km') if 'y' in coords: if self.grid.is_spherical: out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') else: out.y=y/1000. out.info['y']=dict(name='Distance',units='km') if 't' in coords: out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'x' in coords: out.extra[0].x=out.x if 'y' in coords: out.extra[0].y=out.y out.extra[0].v=h if h.max()>1000: cvals=200.,1000. elif h.max()>200: cvals=50.,100.,200. else: cvals=3 out.extra[0].config['field.plot']='contour' out.extra[0].config['field.cvals']=cvals out.extra[0].config['field.linecolors']='k' out.extra[0].alias='bathy' out.coordsReq=','.join(sorted(coords)) return out
def slicej(self,varname,ind,time=0,**opts): coords=opts.get('coords',self._default_coords('slicej')).split(',') out=Data() out.msg=self.check_slice(varname,t=time,j=ind) if out.msg: return out v=self.use(varname,SEARCHtime=time,eta_SEARCH=ind) # add mask if not masked: if not np.ma.isMA(v): m=self.grid.vars(ruvp=self.var_at(varname),j=ind)[-1] if v.ndim==2: m=np.tile(m,(v.shape[0],1)) v=np.ma.masked_where(m==0,v) out.v=v out.info['v']['name']=varname out.info['v']['slice']='j=%d'%ind try: out.info['v']['units']=netcdf.vatt(self.name,varname,'units') except: pass # coords: if 'z' in coords and v.ndim==2: out.z=self.s_levels(time=time,ruvpw=self.var_at(varname),j=ind) out.info['z']=dict(name='Depth',units='m') if any([i in coords for i in 'xyd']): x,y,h,m=self.grid.vars(ruvp=self.var_at(varname),j=ind) if 'd' in coords: d=calc.distance(x,y) if d[-1]-d[0]>1e4: d=d/1000. dunits='km' else: dunits='m' if v.ndim==2: d=np.tile(d,(v.shape[0],1)) out.d=d out.info['d']=dict(name='Distance',units=dunits) if 'x' in coords: if v.ndim==2: x=np.tile(x,(v.shape[0],1)) out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') if 'y' in coords: if v.ndim==2: y=np.tile(y,(v.shape[0],1)) out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') if 't' in coords: out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'd' in coords: out.extra[0].x=out.d[0] if 'x' in coords: out.extra[0].y=out.x[0] if 'y' in coords: out.extra[0].x=out.y[0] out.extra[0].v=-h out.extra[0].config['1d.plot']='fill_between' out.extra[0].config['1d.y0']=-h.max()-(h.max()-h.min())/20. out.extra[0].alias='bottom' out.coordsReq=','.join(sorted(coords)) return out
def sliceiso(self,varname,iso,time,**opts): ''' Depths where variable, increasing/dec with depth, has some value. Output is masked where surface is higher/lower than value or where all water column is lower/higher than value. ''' coords=opts.get('coords',self._default_coords('sliceiso')).split(',') out=Data() out.msg=self.check_slice(varname,t=time) if out.msg: return out if not self.hasz(varname): out.msg='a depth dependent variable is needed for sliceiso!' return out v=self.use(varname,SEARCHtime=time) z=self.s_levels(time=time,ruvpw=self.var_at(varname)) v=rt.depthof(v,z,iso) out.v=v out.info['v']['name']=varname if isinstance(iso,np.ndarray) and iso.ndim==2: siso='2d' else: siso=str(iso) out.info['v']['slice']='iso=%s'%siso try: out.info['v']['units']=netcdf.vatt(self.nc,varname,'units') except: pass # coords: if any([i in coords for i in 'xy']): x,y,h=self.grid.vars(ruvp=self.var_at(varname))[:3] if 'x' in coords: if self.grid.is_spherical: out.x=x out.info['x']=dict(name='Longitude',units=r'$\^o$E') else: out.x=x/1000. out.info['x']=dict(name='Distance',units='km') if 'y' in coords: if self.grid.is_spherical: out.y=y out.info['y']=dict(name='Latitude',units=r'$\^o$N') else: out.y=y/1000. out.info['y']=dict(name='Distance',units='km') if 'z' in coords: # makes no sense... v is the depth! coords.remove('z') if 't' in coords: out.t=self.time[time] if v.ndim==2: out.extra=[Data()] if 'x' in coords: out.extra[0].x=out.x if 'y' in coords: out.extra[0].y=out.y out.extra[0].v=h if h.max()>1000: cvals=200.,1000. elif h.max()>200: cvals=50.,100.,200. else: cvals=3 out.extra[0].config['field.plot']='contour' out.extra[0].config['field.cvals']=cvals out.extra[0].config['field.linecolors']='k' out.extra[0].alias='bathy' out.coordsReq=','.join(sorted(coords)) return out