123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #!/usr/bin/env python
- # B a r a K u d a
- #
- # Prepare 2D maps (monthly) that will later become a GIF animation!
- # NEMO output and observations needed
- #
- # L. Brodeau, november 2016
- import sys
- import os
- import numpy as nmp
- from netCDF4 import Dataset
- import matplotlib as mpl
- mpl.use('Agg')
- import matplotlib.pyplot as plt
- import matplotlib.colors as colors
- import datetime
- import barakuda_colmap as bcm
- import barakuda_tool as bt
- year_ref_ini = 1990
- #CTATM = 'T255'
- CTATM = 'T1279'
- if CTATM == 'T255':
- # South Greenland:
- #i1 = 412; i2 =486
- #j1 = 22 ; j2 = 56
- # NAtl:
- i1 = 385 ; i2= 540
- j1 = 6 ; j2 = 84
- #Global T255:
- #i1 = 0 ; i2 =511
- #j1 = 0 ; j2 = 255
- elif CTATM == 'T1279':
- #
- #Global:
- i1 = 0 ; i2 = 2559+1
- j1 = 0 ; j2 = 1279+1
- # Natl:
- ##i1 = 1849 ; i2 = 2525
- ##j1 = 97 ; j2 = 508
- ##i1 = 1960 ; i2 = 2550; #2680
- ##i1 = 1849 ; i2 = 2525
- ##j1 = 97 ; j2 = 508
- #i1 = 2000 ; i2 = 2590
- #j1 = 0 ; j2 = 519
- else:
- print 'UNKNOW ATMOSPHERE RESOLUTION!'; sys.exit(0)
- fig_type='png'
- narg = len(sys.argv)
- if narg < 4: print 'Usage: '+sys.argv[0]+' <file> <variable> <LSM_file>'; sys.exit(0)
- cf_in = sys.argv[1] ; cv_in=sys.argv[2] ; cf_lsm=sys.argv[3]
- lsst = False ; lshf = False
- if cv_in == 'T2M': lt2m = True
- if cv_in == 'SSTK': lsst = True
- if cv_in == 'SNHF': lshf = True
- if lt2m:
- #tmin=-16. ; tmax=28. ; dt = 1.
- tmin=-2. ; tmax=28. ; dt = 1.
- cpal = 'ncview_nrl'
- #cpal = 'jaisnd'
- #cpal = '3gauss'
- #cpal = 'rainbow2_cmyk'
- #cpal = 'rainbow'
- #cpal = 'rnb2'
- #cpal = 'jaisnc'
- #cpal = 'jaisnb'
- cfield = 'T2M'
- cunit = r'$^{\circ}C$'
- cb_jump = 2
-
- if lsst:
- tmin=-20. ; tmax=12. ; dt = 1.
- cpal = 'sstnw'
- cfield = 'SST'
- cunit = r'$Boo$'
- cb_jump = 2
-
- if lshf:
- tmin=-1200. ; tmax=400. ; dt = 25.
- #cpal = 'rainbow'
- cpal = 'ncview_nrl'
- cfield = 'Net Heat Flux'
- cunit = r'$W/m^2$'
- cb_jump = 4
- clsm = 'LSM'
- # Need to know dimension:
- bt.chck4f(cf_lsm)
- id_lsm = Dataset(cf_lsm)
- vlon = id_lsm.variables['lon'][:]
- vlat = id_lsm.variables['lat'][:]
- id_lsm.close()
- Ni0 = len(vlon)
- Nj0 = len(vlat)
- print '\n Dimension of global domain:', Ni0, Nj0
- imax=Ni0+1
- Ni = i2-i1
- Nj = j2-j1
- LSM = nmp.zeros((Nj,Ni), dtype=nmp.float)
- XIN = nmp.zeros((Nj,Ni))
- id_lsm = Dataset(cf_lsm)
- if i2 >= imax:
- print ' i2 > imax !!! => ', i2, '>', imax
- Xall = id_lsm.variables[clsm][0,j1:j2,:]
- LSM[:,0:imax-i1] = Xall[:,i1-1:imax]
- ii=imax-i1
- LSM[:,ii:Ni] = Xall[:,0:i2-imax]
- del Xall
- else:
- LSM[:,:] = id_lsm.variables[clsm][0,j1:j2,i1:i2]
- id_lsm.close()
- [ nj , ni ] = nmp.shape(LSM)
- idx_ocean = nmp.where(LSM[:,:] < 0.5)
- LSM[idx_ocean] = nmp.nan
- LSM = nmp.flipud(LSM)
- params = { 'font.family':'Ubuntu',
- 'font.size': int(12),
- 'legend.fontsize': int(12),
- 'xtick.labelsize': int(12),
- 'ytick.labelsize': int(12),
- 'axes.labelsize': int(12) }
- mpl.rcParams.update(params)
- cfont_clb = { 'fontname':'Arial', 'fontweight':'normal', 'fontsize':13 }
- cfont_title = { 'fontname':'Ubuntu Mono', 'fontweight':'normal', 'fontsize':18 }
- cfont_mail = { 'fontname':'Times New Roman', 'fontweight':'normal', 'fontstyle':'italic', 'fontsize':9, 'color':'0.5' }
- # Pal_Sst:
- pal_fld = bcm.chose_colmap(cpal)
- norm_fld = colors.Normalize(vmin = tmin, vmax = tmax, clip = False)
- pal_lsm = bcm.chose_colmap('blk')
- norm_lsm = colors.Normalize(vmin = 0, vmax = 1, clip = False)
- vc_fld = nmp.arange(tmin, tmax + dt, dt)
- pfin = nmp.zeros((nj,ni))
-
- bt.chck4f(cf_in)
- id_in = Dataset(cf_in)
- vtime = id_in.variables['time'][:]
- id_in.close()
- del id_in
- Nt = len(vtime)
- # Size of the figure:
- rat_Nj_Ni = float(Nj)/float(Ni) + 0.12
- rh = 7.5
- rw = rh/rat_Nj_Ni
- FSZ = ( rw , rh )
- rcorr = rat_Nj_Ni/(float(Nj0)/float(Ni0))
- print ' rcorr => ', rcorr
- for jt in range(Nt):
- print '\n *** Reading record # '+str(jt+1)+' of '+cv_in+' in '+cf_in
- id_in = Dataset(cf_in)
- if i2 >= imax:
- print ' i2 = ', i2
- Xall = id_in.variables[cv_in][jt,j1:j2,:]
- XIN[:,0:imax-i1] = Xall[:,i1-1:imax]
- ii=imax-i1
- XIN[:,ii:Ni] = Xall[:,0:i2-imax]
- del Xall
- else:
- XIN[:,:] = id_in.variables[cv_in][jt,j1:j2,i1:i2]
- id_in.close()
- del id_in
- if lsst or lt2m: XIN[:,:] = XIN[:,:] - 273.15
- ct = '%3.3i'%(jt+1)
- cd = str(datetime.datetime.strptime(str(year_ref_ini)+' '+ct, '%Y %j'))
- cdate = cd[:10] ; print ' *** cdate :', cdate
- cfig = 'figs/'+cv_in+'_IFS'+'_d'+ct+'.'+fig_type
-
- fig = plt.figure(num = 1, figsize=FSZ, dpi=None, facecolor='w', edgecolor='k')
- ax = plt.axes([0.055, 0.05, 0.9, 1.], axisbg = 'k')
- cf = plt.imshow(nmp.flipud(XIN), cmap = pal_fld, norm = norm_fld)
- plt.axis([ 0, ni, 0, nj])
- # Mask
- print ' LSM stuff...'
- cm = plt.imshow(LSM, cmap = pal_lsm, norm = norm_lsm)
- plt.title('IFS: '+cfield+', coupled ORCA12-'+CTATM+', '+cdate, **cfont_title)
- ax2 = plt.axes([0.04, 0.08, 0.93, 0.025])
- clb = mpl.colorbar.ColorbarBase(ax2, ticks=vc_fld, cmap=pal_fld, norm=norm_fld, orientation='horizontal', extend='both')
- #clb = plt.colorbar(cf, ticks=vc_fld, orientation='horizontal', drawedges=False, pad=0.07, shrink=1., aspect=40)
- cb_labs = [] ; cpt = 0
- for rr in vc_fld:
- if cpt % cb_jump == 0:
- cb_labs.append(str(int(rr)))
- else:
- cb_labs.append(' ')
- cpt = cpt + 1
- clb.ax.set_xticklabels(cb_labs)
- clb.set_label(cunit, **cfont_clb)
- del cf
- ax.annotate('laurent.brodeau@bsc.es', xy=(1, 4), xytext=(480, -85), **cfont_mail)
-
- plt.savefig(cfig, dpi=160, orientation='portrait', transparent=False)
- print cfig+' created!\n'
- plt.close(1)
-
- del fig, ax, clb, cm
-
|