source: trunk/MESOSCALE_DEV/PLOT/PYTHON/scripts/winds.py @ 233

Last change on this file since 233 was 233, checked in by aslmd, 14 years ago

MESOSCALE: improved and clean winds.py script to make fast and powerful plots. preparing the routine to be easily adapted to sections. also: suppressed the old directory mars_lmd_new.bak [<< ancienne nouvelle physique >>]

  • Property svn:executable set to *
File size: 14.4 KB
Line 
1#!/usr/bin/env python
2
3### A. Spiga -- LMD -- 30/06/2011 to 10/07/2011
4### Thanks to A. Colaitis for the parser trick
5
6
7####################################
8####################################
9### The main program to plot vectors
10def winds (namefile,\
11           nvert,\
12           proj=None,\
13           back=None,\
14           target=None,
15           stride=3,\
16           numplot=2,\
17           var=None,\
18           colorb=True,\
19           winds=True,\
20           addchar=None,\
21           interv=[0,1],\
22           vmin=None,\
23           vmax=None,\
24           tile=False,\
25           zoom=None,\
26           display=True,\
27           itstep=None):
28
29    ####################################################################################################################
30    ### Colorbars http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps?action=AttachFile&do=get&target=colormaps3.png
31
32    #################################
33    ### Load librairies and functions
34    from netCDF4 import Dataset
35    from myplot import getcoord2d,define_proj,makeplotpng,simplinterv,vectorfield,ptitle,latinterv,getproj,wrfinterv,dumpbdy,\
36                       fmtvar,definecolorvec,defcolorb,getprefix,putpoints,calculate_bounds,errormess,definesubplot,\
37                       zoomset,getcoorddef,getwinddef,whatkindfile,reducefield,bounds,getstralt,getfield
38    from mymath import deg,max,min,mean
39    from matplotlib.pyplot import contour,contourf, subplot, figure, rcParams, savefig, colorbar, pcolor
40    from matplotlib.cm import get_cmap
41    import numpy as np
42    from numpy.core.defchararray import find
43
44    ######################
45    ### Load NETCDF object
46    nc  = Dataset(namefile)
47   
48    ##################################
49    ### Initial checks and definitions
50    typefile = whatkindfile(nc)                                  ## TYPEFILE
51    if var not in nc.variables: var = False                      ## VAR
52    if winds: [uchar,vchar,metwind] = getwinddef(nc)             ## WINDS
53    if uchar == 'not found': winds = False
54    [lon2d,lat2d] = getcoorddef(nc)                              ## COORDINATES, could be moved below
55    if proj == None:   proj = getproj(nc)                        ## PROJECTION
56
57    ##########################
58    ### Define plot boundaries
59    if proj == "npstere":             [wlon,wlat] = latinterv("North_Pole")
60    elif proj in ["lcc","laea"]:      [wlon,wlat] = wrfinterv(lon2d,lat2d)
61    else:                             [wlon,wlat] = simplinterv(lon2d,lat2d)
62    if zoom:                          [wlon,wlat] = zoomset(wlon,wlat,zoom) 
63
64    #########################################
65    ### Name for title and graphics save file
66    if var and winds:     basename = var + '_UV'
67    elif var:             basename = var
68    elif winds:           basename = 'UV'
69    else:
70        print nc.variables                 
71        errormess("please set at least winds or var")
72    basename = basename + getstralt(nc,nvert)  ## can be moved elsewhere for a more generic routine
73
74    ##################################
75    ### Open a figure and set subplots
76    fig = figure()
77    sub = definesubplot( numplot, fig ) 
78 
79    #################################
80    ### Time loop for plotting device
81    found_lct = False
82    itime = 0  ## could be an argument
83    nplot = 1
84    error = False
85    if itstep is None: itstep = int(24./numplot)
86    while error is False: 
87
88       ### Which local time ?
89       print interv[0], interv[1], itime
90       ltst = ( interv[0] + 0.5*(wlon[0]+wlon[1])/15.) + itime*interv[1]
91       ltst = int (ltst * 10) / 10.
92       ltst = ltst % 24
93
94       ### General plot settings
95       #print itime, int(ltst), numplot, nplot
96       if numplot >= 1: 
97           if nplot > numplot: break
98           if numplot > 1:     
99               if typefile not in ['geo']:  subplot(sub+nplot-1)
100
101           found_lct = True
102       ### If only one local time is requested (numplot < 0)
103       elif numplot <= 0: 
104           if int(ltst) + numplot != 0:         
105                 itime += 1 
106                 if found_lct is True: break     ## because it means LT was found at previous iteration
107                 else:                 continue  ## continue to iterate to find the correct LT
108           else: 
109                 found_lct = True
110
111       ### Map projection
112       m = define_proj(proj,wlon,wlat,back=back)
113       x, y = m(lon2d, lat2d)
114
115       #### Contour plot
116       if var:
117           what_I_plot, error = reducefield( getfield(nc,var), d4=itime, d3=nvert )
118           if not error: 
119               if typefile in ['mesoapi','meso']:    what_I_plot = dumpbdy(what_I_plot)
120               zevmin, zevmax = calculate_bounds(what_I_plot,vmin=vmin,vmax=vmax)
121               if colorb is True: colorb = defcolorb(var)
122               palette = get_cmap(name=colorb)
123               if not tile:
124                   hole = True
125                   hole = None
126                   if not hole:  what_I_plot = bounds(what_I_plot,zevmin,zevmax)
127                   zelevels = np.linspace(zevmin,zevmax)
128                   contourf( x, y, what_I_plot, zelevels, cmap = palette )
129               else:   
130                   pcolor( x, y, what_I_plot, cmap = palette, vmin=zevmin, vmax=zevmax )
131               #putpoints(m,fig)
132               if var in ['HGT']: pass
133               elif colorb:             
134                         ndiv = 10
135                         colorbar(fraction=0.05,pad=0.1,format=fmtvar(var),\
136                                           ticks=np.linspace(zevmin,zevmax,ndiv+1),\
137                                           extend='max',spacing='proportional')
138                                           # both min max neither
139                 
140       ### Vector plot
141       if winds:
142           vecx, error = reducefield( getfield(nc,uchar), d4=itime, d3=nvert )
143           vecy, error = reducefield( getfield(nc,vchar), d4=itime, d3=nvert )
144           if not error:
145               if typefile in ['mesoapi','meso']:   
146                   [vecx,vecy] = [dumpbdy(vecx,stag=uchar), dumpbdy(vecy,stag=vchar)]
147                   key = True
148               elif typefile in ['gcm']:           
149                   key = False
150               if metwind:  [vecx,vecy] = m.rotate_vector(vecx, vecy, lon2d, lat2d)
151               if var == False:       colorvec = definecolorvec(back)
152               else:                  colorvec = definecolorvec(colorb)
153               vectorfield(vecx, vecy,\
154                          x, y, stride=stride, csmooth=2,\
155                          scale=15., factor=300., color=colorvec, key=key)
156                                            #200.         ## or csmooth=stride
157               
158       ### Next subplot
159       plottitle = basename
160       if typefile in ['mesoapi','meso']:
161            if addchar:  plottitle = plottitle + addchar + "_LT"+str(ltst)
162            else:        plottitle = plottitle + "_LT"+str(ltst)
163       ptitle( plottitle )
164       itime += itstep
165       nplot += 1
166
167    ##########################################################################
168    ### Save the figure in a file in the data folder or an user-defined folder
169    if typefile in ['meso','mesoapi']:   prefix = getprefix(nc)   
170    elif typefile in ['gcm']:            prefix = 'LMD_GCM_'
171    else:                                prefix = ''
172    ###
173    zeplot = prefix + basename
174    if addchar:         zeplot = zeplot + addchar
175    if numplot <= 0:    zeplot = zeplot + "_LT"+str(abs(numplot))
176    ###
177    if not target:      zeplot = namefile[0:find(namefile,'wrfout')] + zeplot
178    else:               zeplot = target + "/" + zeplot 
179    ###
180    if found_lct:     makeplotpng(zeplot,pad_inches_value=0.35,disp=display)   
181    else:             print "Local time not found"
182
183    ###############
184    ### Now the end
185    return zeplot
186
187##############################
188### A specific stuff for below
189def adjust_length (tab, zelen):
190    from numpy import ones
191    if tab is None:
192        outtab = ones(zelen) * -999999
193    else:
194        print zelen, len(tab)
195        if zelen != len(tab):
196            print "not enough or too much values... setting same values all variables"
197            outtab = ones(zelen) * tab[0]
198        else:
199            outtab = tab
200    return outtab
201
202###########################################################################################
203###########################################################################################
204### What is below relate to running the file as a command line executable (very convenient)
205if __name__ == "__main__":
206    import sys
207    from optparse import OptionParser    ### to be replaced by argparse
208    from api_wrapper import api_onelevel
209    from netCDF4 import Dataset
210    from myplot import getlschar
211
212    #############################
213    ### Get options and variables
214    parser = OptionParser()
215    parser.add_option('-f', action='append',dest='namefile',    type="string",  default=None,  help='[NEEDED] name of WRF file (append)')
216    parser.add_option('-l', action='store',dest='nvert',        type="float",   default=0,     help='vertical level (def=0)(-i 2: p,mbar)(-i 3,4: z,km)')
217    parser.add_option('-p', action='store',dest='proj',         type="string",  default=None,  help='projection')
218    parser.add_option('-b', action='store',dest='back',         type="string",  default=None,  help='background image (def: None)')
219    parser.add_option('-t', action='store',dest='target',       type="string",  default=None,  help='destination folder')
220    parser.add_option('-s', action='store',dest='stride',       type="int",     default=3,     help='stride vectors (def=3)')
221    parser.add_option('-v', action='append',dest='var',         type="string",  default=None,  help='variable contoured (append)')
222    parser.add_option('-n', action='store',dest='numplot',      type="int",     default=2,     help='number of plots (def=1)(<0: 1 plot of LT -*numplot*)')
223    parser.add_option('-i', action='store',dest='interp',       type="int",     default=None,  help='interpolation method (2: press, 3: z-amr, 4:z-als)')
224    parser.add_option('-c', action='store',dest='colorb',       type="string",  default=True,  help='change colormap')
225    parser.add_option('-x', action='store_false',dest='winds',                  default=True,  help='no wind vectors')
226    parser.add_option('-m', action='append',dest='vmin',        type="float",   default=None,  help='bounding minimum value (append)')   
227    parser.add_option('-M', action='append',dest='vmax',        type="float",   default=None,  help='bounding maximum value (append)') 
228    parser.add_option('-T', action='store_true',dest='tile',                    default=False, help='draw a tiled plot (no blank zone)')
229    parser.add_option('-z', action='store',dest='zoom',         type="float",   default=None,  help='zoom factor in %')
230    parser.add_option('-N', action='store_true',dest='nocall',                  default=False, help='do not recreate api file')
231    parser.add_option('-d', action='store_false',dest='display',                default=True,  help='do not pop up created images')
232    parser.add_option('-e', action='store',dest='itstep',       type="int",     default=None,  help='stride time (def=4)')
233    #parser.add_option('-V', action='store', dest='comb',        type="float",   default=None,  help='a defined combination of variables')
234    (opt,args) = parser.parse_args()
235    if opt.namefile is None: 
236        print "I want to eat one file at least ! Use winds.py -f name_of_my_file. Or type winds.py -h"
237        exit()
238    print "Options:", opt
239
240    listvar = '' 
241    if opt.var is None:
242        zerange = [-999999]
243    else:
244        zelen = len(opt.var)
245        zerange = range(zelen)
246        #if zelen == 1: listvar = opt.var[0] + ','
247        #else         :
248        for jjj in zerange: listvar += opt.var[jjj] + ','
249        listvar = listvar[0:len(listvar)-1]
250        vmintab = adjust_length (opt.vmin, zelen) 
251        vmaxtab = adjust_length (opt.vmax, zelen)
252
253    for i in range(len(opt.namefile)):
254
255        zefile = opt.namefile[i]
256        print zefile   
257        zelevel = opt.nvert   
258        stralt = None
259        [lschar,zehour,zehourin] = getlschar ( zefile )  ## getlschar from wrfout (or simply return "" if another file)
260   
261        #####################################################
262        ### Call Fortran routines for vertical interpolations
263        if opt.interp is not None:
264            if opt.nvert is 0 and opt.interp is 4:  zelevel = 0.010
265            ### winds or no winds
266            if opt.winds            :  zefields = 'uvmet'
267            else                    :  zefields = ''
268            ### var or no var
269            #if opt.var is None      :  pass
270            if zefields == ''       :  zefields = listvar
271            else                    :  zefields = zefields + "," + listvar
272            print zefields
273            zefile = api_onelevel (  path_to_input   = '', \
274                                     input_name      = zefile, \
275                                     #path_to_output  = opt.target, \
276                                     fields          = zefields, \
277                                     interp_method   = opt.interp, \
278                                     onelevel        = zelevel, \
279                                     nocall          = opt.nocall )
280            print zefile
281            zelevel = 0 ## so that zelevel could play again the role of nvert
282
283        if opt.var is None: zerange = [-999999]
284        else:               zerange = range(zelen) 
285        for jjj in zerange:
286            if jjj == -999999: 
287                argvar  = None
288                argvmin = None
289                argvmax = None
290            else:
291                argvar = opt.var[jjj]
292                if vmintab[jjj] != -999999:  argvmin = vmintab[jjj]
293                else:                        argvmin = None
294                if vmaxtab[jjj] != -999999:  argvmax = vmaxtab[jjj] 
295                else:                        argvmax = None
296            #############
297            ### Main call
298            name = winds (zefile,int(zelevel),\
299                proj=opt.proj,back=opt.back,target=opt.target,stride=opt.stride,var=argvar,\
300                numplot=opt.numplot,colorb=opt.colorb,winds=opt.winds,\
301                addchar=lschar,interv=[zehour,zehourin],vmin=argvmin,vmax=argvmax,\
302                tile=opt.tile,zoom=opt.zoom,display=opt.display,\
303                itstep=opt.itstep)
304            print 'Done: '+name
305   
306        #########################################################
307        ### Generate a .sh file with the used command saved in it
308        command = ""
309        for arg in sys.argv: command = command + arg + ' '
310        f = open(name+'.sh', 'w')
311        f.write(command)
Note: See TracBrowser for help on using the repository browser.