Skip to content

Commit

Permalink
- many bug fixes, mainly related with vis module
Browse files Browse the repository at this point in the history
- added some documentation... still under development
  • Loading branch information
Martinho MA committed Sep 30, 2015
1 parent 84c0057 commit e1d3c4a
Show file tree
Hide file tree
Showing 20 changed files with 4,247 additions and 679 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ dist/
build/
*TODO*
TMP/
.ipynb_checkpoints/
45 changes: 44 additions & 1 deletion okean/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,47 @@

__authors__ = 'Martinho Marta-Almeida <m.martalmeida@gmail.com> \
<Couto de Esteves, 3740-037, Portugal>',
__version__='2015-07-07 00:08:29.528770'
__version__='2015-09-30 06:45:18.935178'


def doc(action='web',tag=''):
url='https://github.com/martalmeida/okean'
urldoc=url+'/tree/master/okean/documentation/'
urldoc0=url+'/blob/master/'

import os
import glob
pdoc=os.path.join(__path__[0],'documentation')
fdoc=os.path.join(pdoc,'*.ipynb')
files=glob.glob(fdoc)
F={}
for f in files:
name=os.path.splitext(os.path.basename(f))[0]
name=name.split('_')[1:].join('_')
F['name']=f

if action=='local':
if not F:
print ':: no doc files found'
print ':: (folder=%s)'%pdoc
print ':: visit %s'%urldoc
else:
print ':: available doc files:'
for k in F.keys():
print ' - %-10s %s'%(k,F[k])

elif action=='web':
import webbrowser
pdoc=os.path.join(__path__[0],'documentation')
if tag=='':
dest=urldoc
elif tag=='index':
dest=urldoc0+'okean_documentation.ipynb'
else:
dest=urldoc+'okean_%s.ipynb'%tag

webbrowser.open(dest)




6 changes: 2 additions & 4 deletions okean/bin/show
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,12 @@ if len(argv)>=4:
nc.close()

elif len(argv)==3:
netcdf.showvar(argv[1],argv[2])
netcdf.show(argv[1],argv[2])
elif len(argv)==2:
netcdf.show(argv[1])
else:
print 'wrong arguments'
print 'usage: show filename [varname [<action>] [<scale> <offset>]]'
print 'where action can be: lims, list, last or range'
print ''
print 'mma dec 2009'

print ''
# print 'mma dec 2009\n'
8 changes: 5 additions & 3 deletions okean/bin/show_nctime
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def find_tvar(fname):
tvar=''
vars=netcdf.varnames(fname)
for v in vars:
if v.endswith('time'):
if v.lower().endswith('time') or v.lower()=='t':
return v

return tvar
Expand All @@ -28,7 +28,10 @@ def show(fname,tvar=False,tind=False):
T0=netcdf.nctime(fname,tvar,**{'0':0})
T1=netcdf.nctime(fname,tvar,**{'0':-1})
nrec=netcdf.vdim(fname,tvar).values()[0]
print '%d reccords, from %s to %s' % (nrec,T0.isoformat(' '),T1.isoformat(' '))
if nrec==1:
print 'One reccord = %s' % T0.isoformat(' ')
else:
print '%d reccords, from %s to %s' % (nrec,T0.isoformat(' '),T1.isoformat(' '))
else:
T=netcdf.nctime(fname,tvar,**{'0':tind})
print T,'('+tvar+')'
Expand Down Expand Up @@ -59,4 +62,3 @@ if __name__=='__main__':
if tind!='all' and not tind is False: tind=int(tind)

show(filename,varname,tind)

301 changes: 301 additions & 0 deletions okean/documentation/okean_gribu.ipynb

Large diffs are not rendered by default.

169 changes: 169 additions & 0 deletions okean/documentation/okean_hull.ipynb

Large diffs are not rendered by default.

528 changes: 528 additions & 0 deletions okean/documentation/okean_netcdf.ipynb

Large diffs are not rendered by default.

246 changes: 246 additions & 0 deletions okean/documentation/okean_roms_glider.ipynb

Large diffs are not rendered by default.

1,774 changes: 1,774 additions & 0 deletions okean/documentation/okean_roms_slice.ipynb

Large diffs are not rendered by default.

378 changes: 378 additions & 0 deletions okean/documentation/okean_vis.ipynb

Large diffs are not rendered by default.

141 changes: 92 additions & 49 deletions okean/gribu.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from okean import calc


def show(fname):
def show_all(fname):
'''
Lists variables inside grib file
'''
Expand All @@ -39,14 +39,38 @@ def show(fname):
vlevel = g.vertical_level
units = g.parameter_units

print '%10s %30s %40s %10s %20s' % (abb.ljust(10),name.ljust(30)[:30],level.ljust(40)[:40],vlevel.ljust(10)[:10],units.ljust(20)[:20])
# print '%10s %30s %40s %10s %20s' % (abb.ljust(10),name.ljust(30)[:30],level.ljust(40)[:40],vlevel.ljust(10)[:10],units.ljust(20)[:20])
print '%-10s %-20s %-20s %-10s %-10s' % (abb,name[:20],level[:20],vlevel[:10],units[:10])


def show(fname):
# organize variables with same short name:
G=Grib2Decode(fname)
from collections import OrderedDict
vars=OrderedDict()
varsn={}
for g in G:
abb = g['shortName']
if abb in vars.keys():
varsn[abb]+=1
else:
vars[abb]=g['parameterName'],str(g['level']),g['parameterUnits']
varsn[abb]=1


print '%-10s %-25s %5s %-10s' % ('','name','n vel','units')
for abb in vars.keys():
name,vlevel,units=vars[abb]
vlevel=str(varsn[abb])
print '%-10s %-25s %5s %-10s' % (abb,name[:25],vlevel[:10],units[:10])



def findvar(fname,name,*args):
'''
Locates variable inside grib file
Inputs:
name, part of variable parameter
name, part of variable short name (parameter abbv)
args, any string inside variable string representation
Example:
Expand All @@ -57,10 +81,12 @@ def findvar(fname,name,*args):
out=[]
for g in G:
if isPygrib:
if g['parameterName'].lower().find(name.lower())>=0:
#if g['parameterName'].lower().find(name.lower())>=0:
if g['shortName'].lower()==name:
if all([str(g).lower().find(i.lower())>=0 for i in args]): out+=[g]
else:
if g.parameter.lower().find(name.lower())>=0:
#if g.parameter.lower().find(name.lower())>=0:
if g.parameter_abbrev.lower()==name:
if all([str(g).lower().find(i.lower())>=0 for i in args]): out+=[g]

return out
Expand All @@ -71,16 +97,28 @@ def cross_lon0(x,y,v):
cross longitude 0
used by getvar
'''
i=np.where(x[0]==180.)[0]
#i=np.where(x[0]==180.)[0]
i=np.where(x[0]>180.)[0]
L=len(i)
# print x[0].min(),x[0].max()
i=i[0]
X=x.copy()
Y=y.copy()
V=v.copy()
X[:,i-1:]=x[:,:i+1]
X[:,:i-1]=x[:,i+1:]
Y[:,i-1:]=y[:,:i+1]
Y[:,:i-1]=y[:,i+1:]
V[:,i-1:]=v[:,:i+1]
V[:,:i-1]=v[:,i+1:]
#X[:,i-1:]=x[:,:i+1]
#X[:,:i-1]=x[:,i+1:]
#Y[:,i-1:]=y[:,:i+1]
#Y[:,:i-1]=y[:,i+1:]
#V[:,i-1:]=v[:,:i+1]
#V[:,:i-1]=v[:,i+1:]
# print X.shape, L
X[:,:L]=x[:,i:]
X[:,L:]=x[:,:i]
Y[:,:L]=y[:,i:]
Y[:,L:]=y[:,:i]
V[:,:L]=v[:,i:]
V[:,L:]=v[:,:i]
X=np.where(X>180.,X-360.,X)
return X,Y,V


Expand All @@ -95,61 +133,66 @@ def extract_region(lon,lat,data,lons,lats):
return lon[j1:j2,i1:i2],lat[j1:j2,i1:i2],data[j1:j2,i1:i2]


def getvar(fname,name,quiet=1,**kargs):
def getvar(*args,**kargs):
'''
Returns data from GFS grib file
Returns data from grib file
Inputs:
Name, grib filename
quiet, print info flag
kargs:
lons, x limits
lats, y limits
tags: string or list of string used by findvar
neglon, if true west is negative (True)
Example:
gfs_getvar('file.grib2','temperature',tags='2 m')
gfs_getvar('file.grib2','temperature',tags='2 m',lons=(-60,-30),lats=(-50,0))
getvar('file.grib2','temperature',tags='2 m')
getvar('file.grib2','temperature',tags='2 m',lons=(-60,-30),lats=(-50,0))
or:
var=findvar('file.grib2','temperature','2 m')
getvar(var)
'''

if not isinstance(fname,basestring): fname=fname['name']
lons=False
lats=False
neglon=True
tags=[]
for k in kargs.keys():
if k=='lons': lons = kargs[k]
if k=='lats': lats = kargs[k]
if k=='neglon': neglon = kargs[k]
if k=='tags': tags = kargs[k]

if isinstance(tags,str): tags=[tags]
var=findvar(fname,name,*tags)

if len(var)==1:
var=var[0]
lons = kargs.get('lons',False)
lats = kargs.get('lats',False)
neglon = kargs.get('neglon',True)
tags = kargs.get('tags',[])
quiet = kargs.get('quiet',False)

if isPygrib:
lat,lon=var.latlons()
data=var.values
else:
lat,lon=var.grid()
data=var.data()

if neglon:
lon=np.where(lon>180.,lon-360.,lon)
lon,lat,data=cross_lon0(lon,lat,data)
if len(args)==2:
fname,name=args
# if not isinstance(fname,basestring): fname=fname['name'] # what for is this?
if isinstance(tags,str): tags=[tags]
var=findvar(fname,name,*tags)
elif len(args)==1:
var=args[0]

if lons or lats:
lon,lat,data=extract_region(lon,lat,data,lons,lats)
try: len(var)
except: var=[var] # an iterable is expected, like the output of findvar

return lon,lat,data

elif len(var)>1:
if len(var)>1:
if not quiet: print 'more than one var found !! found', len(var)
return False,False,False
elif len(var)==0:
if not quiet: print "no variable found"
return False,False,False
else: var=var[0]

if isPygrib:
lat,lon=var.latlons()
data=var.values
else:
if not quiet: print "not found"
return False,False,False
lat,lon=var.grid()
data=var.data()

if neglon:
#lon=np.where(lon>180.,lon-360.,lon)
lon,lat,data=cross_lon0(lon,lat,data)

if lons or lats:
lon,lat,data=extract_region(lon,lat,data,lons,lats)

return lon,lat,data


Loading

0 comments on commit e1d3c4a

Please sign in to comment.