source: trunk/MESOSCALE/PLOT/PYTHON/scripts/winds.py @ 194

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

MESOSCALE: corrected graphics script to display Ls. and added a figure in the first page of the user manual.

  • Property svn:executable set to *
File size: 13.9 KB
Line 
1#!/usr/bin/env python
2
3### A. Spiga -- LMD -- 30/06/2011 to 04/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=4,\
17           var=None,\
18           colorb=None,\
19           winds=True):
20
21    ####################################################################################################################
22    ### Colorbars http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps?action=AttachFile&do=get&target=colormaps3.png
23
24    #################################
25    ### Load librairies and functions
26    from netCDF4 import Dataset
27    from myplot import getcoord2d,define_proj,makeplotpng,simplinterv,vectorfield,ptitle,latinterv,getproj,wrfinterv,dumpbdy
28    from mymath import deg
29    from matplotlib.pyplot import contourf, subplot, figure, rcParams, savefig, colorbar
30    from matplotlib.cm import get_cmap
31    from timestuff import sol2ls
32    import numpy as np
33
34    ######################
35    ### Load NETCDF object
36    nc  = Dataset(namefile)
37
38    ###################################
39    ### Recognize predefined file types
40    if 'controle' in nc.variables:   typefile = 'gcm'
41    elif 'vert' in nc.variables:     typefile = 'mesoapi'
42    elif 'U' in nc.variables:        typefile = 'meso'
43    else:                           
44        print "typefile not supported."
45        print nc.variables
46        exit()
47
48    ##############################################################
49    ### Try to guess the projection from wrfout if not set by user
50    if typefile in ['mesoapi','meso']:
51        if proj == None:       proj = getproj(nc)
52                                    ### (il faudrait passer CEN_LON dans la projection ?)
53    elif typefile in ['gcm']:
54        if proj == None:       proj = "cyl"   
55                                    ## pb avec les autres (de trace derriere la sphere ?)
56
57    ############################################
58    #### Choose underlying topography by default
59    if not back:
60        if not var:                                        back = "mola"    ## if no var:         draw mola
61        elif typefile in ['mesoapi','meso'] \
62             and proj not in ['merc','lcc']:               back = "molabw"  ## if var but meso:   draw molabw
63        else:                                              pass             ## else:              draw None
64
65    ####################################################
66    ### Get geographical coordinates and plot boundaries
67    if typefile in ['mesoapi','meso']:
68        [lon2d,lat2d] = getcoord2d(nc)
69        lon2d = dumpbdy(lon2d)
70        lat2d = dumpbdy(lat2d)
71    elif typefile in ['gcm']:
72        [lon2d,lat2d] = getcoord2d(nc,nlat="latitude",nlon="longitude",is1d=True)
73    if proj == "npstere":    [wlon,wlat] = latinterv("North_Pole")
74    elif proj == "lcc":      [wlon,wlat] = wrfinterv(lon2d,lat2d)
75    else:                    [wlon,wlat] = simplinterv(lon2d,lat2d)
76
77    #########################
78    ### Get local time and Ls
79    if typefile in ['mesoapi','meso']: 
80        ltst = int(getattr(nc, 'GMT') + 0.5*(wlon[0]+wlon[1])/15.)
81        zetime = nc.variables['Times'][0]
82        zetimestart = getattr(nc, 'START_DATE')
83        zeday = int(zetime[8]+zetime[9]) - int(zetimestart[8]+zetimestart[9])
84        if zeday < 0:    lschar=""  ## might have crossed a month... fix soon
85        else:            lschar="_Ls"+str( int( sol2ls ( getattr( nc, 'JULDAY' ) + zeday ) ) )
86    elif typefile in ['gcm']:           
87        ltst = 0
88        lschar = ""
89
90    ##############################################################################
91    ### Get winds and know if those are meteorological winds (ie. zon, mer) or not
92    if winds:
93        if typefile is 'mesoapi': 
94            [u,v] = getwinds(nc)
95            metwind = True  ## meteorological (zon/mer)
96        elif typefile is 'gcm':
97            [u,v] = getwinds(nc,charu='u',charv='v')
98            metwind = True  ## meteorological (zon/mer)
99        elif typefile is 'meso':
100            [u,v] = getwinds(nc,charu='U',charv='V')
101            metwind = False ## geometrical (wrt grid)
102            print "Beware ! Not using meteorological winds. You trust numerical grid as being (x,y)."
103
104    #####################################################
105    ### Load the chosen variables, whether it is 2D or 3D
106    if var:
107        if var not in nc.variables: 
108            print "not found in file:",var
109            exit()
110        else:   
111            dimension = np.array(nc.variables[var]).ndim
112            if dimension == 2:     field = nc.variables[var][:,:]
113            elif dimension == 3:   field = nc.variables[var][:,:,:]
114            elif dimension == 4:   field = nc.variables[var][:,nvert,:,:] 
115
116    ###########################
117    ### Get length of time axis
118    if winds:               nt = len(u[:,0,0,0])
119    elif var: 
120        if dimension == 2:  nt = 1
121        else             :  nt = len(field[:,0,0])
122
123    #########################################
124    ### Name for title and graphics save file
125    if winds:   basename = "WINDS_"
126    else:       basename = ""
127    if var:
128        basename = basename + var
129    if   typefile is 'meso':                    stralt = "_lvl" + str(nvert)
130    elif typefile is 'mesoapi': 
131        zelevel = int(nc.variables['vert'][nvert])
132        if 'altitude_abg'   in nc.dimensions:   stralt = "_"+str(zelevel)+"m-ALS"
133        elif 'bottom_top'   in nc.dimensions:   stralt = "_"+str(zelevel)+"m-AMR"
134        elif 'pressure'     in nc.dimensions:   stralt = "_"+str(zelevel)+"Pa" 
135    else:                                       stralt = ""         
136    basename = basename + stralt
137
138    ##################################
139    ### Open a figure and set subplots
140    fig = figure()
141    if   numplot > 0:   
142        if   numplot == 4: 
143            sub = 221
144            fig.subplots_adjust(wspace = 0.1, hspace = 0.3)
145            rcParams['font.size'] = int( rcParams['font.size'] * 2. / 3. )
146        elif numplot == 2: 
147            sub = 121
148            fig.subplots_adjust(wspace = 0.3)
149            rcParams['font.size'] = int( rcParams['font.size'] * 3. / 4. )
150        elif numplot == 3: 
151            sub = 131
152            fig.subplots_adjust(wspace = 0.3)
153            rcParams['font.size'] = int( rcParams['font.size'] * 2. / 3. )
154        elif numplot == 6: 
155            sub = 231
156            fig.subplots_adjust(wspace = 0.4, hspace = 0.0)
157            rcParams['font.size'] = int( rcParams['font.size'] * 2. / 3. )
158        elif numplot == 8: 
159            sub = 331 #241
160            fig.subplots_adjust(wspace = 0.1, hspace = 0.3)
161            rcParams['font.size'] = int( rcParams['font.size'] * 1. / 2. )
162        elif numplot == 9:
163            sub = 331 
164            fig.subplots_adjust(wspace = 0.1, hspace = 0.3)
165            rcParams['font.size'] = int( rcParams['font.size'] * 1. / 2. )
166        elif numplot == 1:
167            sub = 99999
168        else:
169            print "supported: 1,2,3,4,6,8"
170            exit()
171        ### Prepare time loop
172        if nt <= numplot or numplot == 1: 
173            tabrange = [0]
174            numplot = 1
175        else:                         
176            tabrange = range(0,nt,int(nt/numplot))  #nt-1
177            tabrange = tabrange[0:numplot]
178    else: 
179        tabrange = range(0,nt,1)
180        sub = 99999
181    print tabrange
182
183    #################################
184    ### Time loop for plotting device
185    found_lct = False
186    for i in tabrange:
187
188       ### General plot settings
189       if numplot > 1: 
190           subplot(sub)
191           found_lct = True
192       elif numplot == 1:
193           found_lct = True 
194            ### If only one local time is requested (numplot < 0)
195       elif numplot <= 0: 
196           if (ltst+i)%24 + numplot != 0:   continue
197           else:                            found_lct = True
198
199       ### Map projection
200       m = define_proj(proj,wlon,wlat,back=back)
201       x, y = m(lon2d, lat2d)
202
203       #### Contour plot
204       if var:
205           if typefile in ['mesoapi','meso']:    what_I_plot = dumpbdy(field[i,:,:])
206           elif typefile in ['gcm']:             
207               if dimension == 2:                what_I_plot = field[:,:]
208               elif dimension == 3:              what_I_plot = field[i,:,:]
209           contourf( x, y, what_I_plot, 30, cmap = get_cmap(name=colorb) )
210           if colorb:     colorbar(fraction=0.05,pad=0.1)
211
212       ### Vector plot
213       if winds:
214           if   typefile in ['mesoapi','meso']:   
215               [vecx,vecy] = [dumpbdy(u[i,nvert,:,:]), dumpbdy(v[i,nvert,:,:])]
216               key = True
217           elif typefile in ['gcm']:               
218               [vecx,vecy] = [        u[i,nvert,:,:] ,         v[i,nvert,:,:] ]
219               key = False
220           if metwind:  [vecx,vecy] = m.rotate_vector(vecx, vecy, lon2d, lat2d)
221           if var == None and back == "vishires":  colorvec = 'w'
222           else:                                   colorvec = 'k'
223           vectorfield(vecx, vecy,\
224                      x, y, stride=stride, csmooth=stride,\
225                      scale=15., factor=300., color=colorvec, key=key)
226                                        #200.         ## or csmooth=2
227       
228       ### Next subplot
229       ptitle( basename + "_LT"+str((ltst+i)%24) + lschar )
230       sub += 1
231
232    ##########################################################################
233    ### Save the figure in a file in the data folder or an user-defined folder
234    if not target:    zeplot = namefile+"_"+basename
235    else:             zeplot = target+"/"+basename
236    if numplot <= 0:  zeplot = zeplot + "_LT"+str(abs(numplot))
237    if found_lct:     makeplotpng(zeplot,pad_inches_value=0.35)   
238    else:             print "Local time not found"
239    return zeplot
240
241
242####################################################
243####################################################
244### A simple program to get wind vectors' components
245def getwinds (nc,charu='Um',charv='Vm'):
246    import numpy as np
247    u = nc.variables[charu]
248    v = nc.variables[charv]
249    if charu == 'U': u = u[:, :, :, 0:len(u[0,0,0,:])-1]
250    if charv == 'V': v = v[:, :, 0:len(v[0,0,:,0])-1, :]
251                     ### ou alors prendre les coordonnees speciales
252    return u,v
253
254
255
256###########################################################################################
257###########################################################################################
258### What is below relate to running the file as a command line executable (very convenient)
259if __name__ == "__main__":
260    import sys
261    from optparse import OptionParser    ### to be replaced by argparse
262    from api_wrapper import api_onelevel
263
264    #############################
265    ### Get options and variables
266    parser = OptionParser()
267    parser.add_option('-f', action='store', dest='namefile',    type="string",  default=None,  help='[NEEDED] name of WRF file')
268    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)')
269    parser.add_option('-p', action='store', dest='proj',        type="string",  default=None,  help='projection')
270    parser.add_option('-b', action='store', dest='back',        type="string",  default=None,  help='background')
271    parser.add_option('-t', action='store', dest='target',      type="string",  default=None,  help='destination folder')
272    parser.add_option('-s', action='store', dest='stride',      type="int",     default=3,     help='stride vectors (def=3)')
273    parser.add_option('-v', action='store', dest='var',         type="string",  default=None,  help='variable contoured')
274    parser.add_option('-n', action='store', dest='numplot',     type="int",     default=4,     help='number of plots (def=1)(<0: 1 plot of LT -*numplot*)')
275    parser.add_option('-i', action='store', dest='interp',      type="int",     default=None,  help='interpolation method (2: press, 3: z-amr, 4:z-als)')
276    parser.add_option('-c', action='store', dest='colorb',      type="string",  default=None,  help='change colormap (and draw a colorbar)')
277    parser.add_option('-x', action='store_false', dest='winds',                 default=True,  help='flag: no wind vectors')
278    (opt,args) = parser.parse_args()
279    if opt.namefile is None: 
280        print "I want to eat one file at least ! Use winds.py -f name_of_my_file. Or type winds.py -h"
281        exit()
282    print "Options:", opt
283    zefile = opt.namefile   
284    zelevel = opt.nvert   
285    stralt = None
286
287    #####################################################
288    ### Call Fortran routines for vertical interpolations
289    if opt.interp is not None:
290        if opt.nvert is 0 and opt.interp is 4:  zelevel = 0.010
291        ### winds or no winds
292        if opt.winds            :  zefields = 'uvmet'
293        else                    :  zefields = ''
294        ### var or no var
295        if opt.var is None      :  pass
296        elif zefields == ''     :  zefields = opt.var
297        else                    :  zefields = zefields + "," + opt.var
298        print zefields
299        zefile = api_onelevel (  path_to_input   = '', \
300                                 input_name      = zefile, \
301                                 path_to_output  = opt.target, \
302                                 fields          = zefields, \
303                                 interp_method   = opt.interp, \
304                                 onelevel        = zelevel )
305        zelevel = 0 ## so that zelevel could play again the role of nvert
306
307    #############
308    ### Main call
309    name = winds (zefile,int(zelevel),\
310           proj=opt.proj,back=opt.back,target=opt.target,stride=opt.stride,var=opt.var,numplot=opt.numplot,colorb=opt.colorb,winds=opt.winds)
311
312    #########################################################
313    ### Generate a .sh file with the used command saved in it
314    command = ""
315    for arg in sys.argv: command = command + arg + ' '
316    f = open(name+'.sh', 'w')
317    f.write(command)
Note: See TracBrowser for help on using the repository browser.