123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- #!/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, May 2018
- import sys
- import os
- from string import replace
- 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 warnings
- warnings.filterwarnings("ignore")
- import datetime
- import barakuda_colmap as bcm
- import barakuda_tool as bt
- vmn = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
- CNEMO = 'eNATL60'
- #CNEMO = 'NATL60'
- #CNEMO = 'NANUK025'
- color_top = 'white'
- #color_top = 'k'
- #jt0 = 248
- jt0 = 0
- i2=0
- j2=0
- l_show_lsm = True
- l_do_ice = True
- l_show_cb = True
- l_show_dt = True
- l_log_field = False
- l_pow_field = False
- l_annotate_name = False
- l_apply_lap = False
- if CNEMO == 'eNATL60':
- Ni0 = 8354-1
- Nj0 = 4729-1
- l_do_ice = False
- l_show_cb = False
- l_show_dt = False
- #cdt = '1h'; cbox = 'zoom1' ; i1=Ni0-2560 ; j1=Nj0/2-1440 ; i2=Ni0 ; j2=Nj0/2 ; rfact_zoom = 1. ; vcb = [0.5, 0.875, 0.485, 0.02] ; font_rat = 0.5*rfact_zoom
- cdt = '1h'; cbox = 'ALL' ; i1=0 ; j1=0 ; i2=Ni0 ; j2=Nj0 ; rfact_zoom = 0.3047 ; vcb = [0.5, 0.875, 0.485, 0.02] ; font_rat = 0.5*rfact_zoom
- x_date = 350 ; y_date = 7 ; # where to put the date
- if CNEMO == 'NATL60':
- #l_pow_field = True ; pow_field = 1.5
- l_do_ice = False
- l_show_cb = False
- l_show_dt = False
- #cdt = '1h'; cbox = 'zoom1' ; i1 = 1800 ; j1 = 950 ; i2 = i1+1920 ; j2 = j1+1080 ; rfact_zoom = 1. ; vcb = [0.5, 0.875, 0.485, 0.02] ; font_rat = 0.5*rfact_zoom ; l_show_lsm = False
- cdt = '1h'; cbox = 'zoom1' ; i1 = 1800 ; j1 = 950 ; i2 = i1+2560 ; j2 = j1+1440 ; rfact_zoom = 1. ; vcb = [0.5, 0.875, 0.485, 0.02] ; font_rat = 0.5*rfact_zoom
- x_date = 350 ; y_date = 7 ; # where to put the date
- if CNEMO == 'NANUK025':
- l_do_ice = True
- cdt = '3h'; cbox = 'ALL' ; i1 = 0 ; j1 = 0 ; i2 = 492 ; j2 = 614 ; rfact_zoom = 2. ; vcb = [0.5, 0.875, 0.485, 0.02] ; font_rat = 0.5*rfact_zoom
- x_date = 350 ; y_date = 7 ; # where to put the date
- nx_res = i2-i1
- ny_res = j2-j1
- print ' i1,i2,j1,j2 =>', i1,i2,j1,j2
- yx_ratio = float(ny_res)/float(nx_res)
- nxr = int(rfact_zoom*nx_res) ; # widt image (in pixels)
- nyr = int(rfact_zoom*ny_res) ; # height image (in pixels)
- dpi = 110
- rh = round(float(nxr)/float(dpi),3) ; # width of figure as for figure...
- fig_type='png'
- narg = len(sys.argv)
- if narg < 5: print 'Usage: '+sys.argv[0]+' <file> <variable> <LSM_file> <YYYYMMDD (start)>'; sys.exit(0)
- cf_in = sys.argv[1] ; cv_in=sys.argv[2] ; cf_lsm=sys.argv[3] ; cf_date0=sys.argv[4]
- cyr0=cf_date0[0:4]
- cmn0=cf_date0[4:6]
- cdd0=cf_date0[6:8]
- # Ice:
- if l_do_ice:
- cv_ice = 'siconc'
- cf_ice = replace(cf_in, 'grid_T', 'icemod')
- rmin_ice = 0.5
- cpal_ice = 'ncview_bw'
- vcont_ice = nmp.arange(rmin_ice, 1.05, 0.05)
- if cv_in in ['sosstsst','tos']:
- cfield = 'SST'
- #tmin=0. ; tmax=25. ; df = 1. ; cpal_fld = 'ncview_nrl'
- tmin=4. ; tmax=20. ; df = 1. ; cpal_fld = 'PuBu'
- cunit = r'SST ($^{\circ}$C)'
- cb_jump = 2
- if cv_in == 'sossheig':
- cfield = 'SSH'
- #tmin=-0.5 ; tmax=0.5 ; df = 0.05
- tmin=-1.2 ; tmax=2.3 ; df = 0.05 ; l_apply_lap = True
- #cpal_fld = 'ncview_jaisnc'
- #cpal_fld = 'PuBu'
- #cpal_fld = 'RdBu'
- #cpal_fld = 'BrBG'
- #
- #cpal_fld = 'on3' ; tmin=-1.2 ; tmax=2.3 ; df = 0.05 ; l_apply_lap = True
- cpal_fld = 'on2' ; tmin=-1.2 ; tmax=1.2 ; df = 0.05 ; l_apply_lap = True
- cunit = r'SSH (m)'
- cb_jump = 1
- elif cv_in == 'somxl010':
- cfield == 'MLD'
- tmin=50. ; tmax=1500. ; df = 50.
- cpal_fld = 'viridis_r'
- if l_do_ice: bt.chck4f(cf_ice)
- bt.chck4f(cf_in)
- id_fld = Dataset(cf_in)
- vtime = id_fld.variables['time_counter'][:]
- id_fld.close()
- Nt = len(vtime)
- if l_show_lsm or l_apply_lap:
- bt.chck4f(cf_lsm)
- id_lsm = Dataset(cf_lsm)
- nb_dim = len(id_lsm.variables['tmask'].dimensions)
- if l_show_lsm:
- if nb_dim==4: XMSK = id_lsm.variables['tmask'][0,0,j1:j2,i1:i2]
- if nb_dim==3: XMSK = id_lsm.variables['tmask'][0,j1:j2,i1:i2]
- if nb_dim==2: XMSK = id_lsm.variables['tmask'][j1:j2,i1:i2]
- (nj,ni) = nmp.shape(XMSK)
- if l_apply_lap:
- XE1T2 = id_lsm.variables['e1t'][0,j1:j2,i1:i2]
- XE2T2 = id_lsm.variables['e2t'][0,j1:j2,i1:i2]
- (nj,ni) = nmp.shape(XE1T2)
- XE1T2 = XE1T2*XE1T2
- XE2T2 = XE2T2*XE2T2
- id_lsm.close()
- if l_show_lsm: pmsk = nmp.ma.masked_where(XMSK[:,:] > 0.2, XMSK[:,:]*0.+40.)
- #font_rat
- #params = { 'font.family':'Ubuntu',
- params = { 'font.family':'Helvetica Neue',
- 'font.weight': 'normal',
- 'font.size': int(12.*font_rat),
- 'legend.fontsize': int(12.*font_rat),
- 'xtick.labelsize': int(12.*font_rat),
- 'ytick.labelsize': int(12.*font_rat),
- 'axes.labelsize': int(12.*font_rat) }
- mpl.rcParams.update(params)
- cfont_clb = { 'fontname':'Helvetica Neue', 'fontweight':'medium', 'fontsize':int(12.*font_rat), 'color':color_top }
- cfont_date = { 'fontname':'Ubuntu Mono', 'fontweight':'normal', 'fontsize':int(14.*font_rat), 'color':'w' }
- cfont_mail = { 'fontname':'Times New Roman', 'fontweight':'normal', 'fontstyle':'italic', 'fontsize':int(14.*font_rat), 'color':'0.8'}
- cfont_titl = { 'fontname':'Helvetica Neue', 'fontweight':'light', 'fontsize':int(30.*font_rat), 'color':'w' }
- # Colormaps for fields:
- pal_fld = bcm.chose_colmap(cpal_fld)
- if l_log_field:
- norm_fld = colors.LogNorm( vmin = tmin, vmax = tmax, clip = False)
- if l_pow_field:
- norm_fld = colors.PowerNorm(gamma=pow_field, vmin = tmin, vmax = tmax, clip = False)
- else:
- norm_fld = colors.Normalize(vmin = tmin, vmax = tmax, clip = False)
- if l_show_lsm:
- pal_lsm = bcm.chose_colmap('land_dark')
- norm_lsm = colors.Normalize(vmin = 0., vmax = 1., clip = False)
- if l_do_ice:
- pal_ice = bcm.chose_colmap(cpal_ice)
- norm_ice = colors.Normalize(vmin = rmin_ice, vmax = 1, clip = False)
- if cdt == '3h':
- dt = 3
- elif cdt == '1h':
- dt = 1
- else:
- print 'ERROR: unknown dt!'
- print ' *** Dimension image:', rh*float(dpi), rh*yx_ratio*float(dpi),'\n'
- ntpd = 24/dt
- jd = int(cdd0) - 1
- jm = int(cmn0)
- for jt in range(jt0,Nt):
- jh = (jt*dt)%24
- jdc = (jt*dt)/24 + 1
- if jt%ntpd == 0: jd = jd + 1
- if jd == vmn[jm-1]+1 and (jt)%ntpd == 0 :
- jd = 1
- jm = jm + 1
- ch = '%2.2i'%(jh)
- #cdc= '%3.3i'%(jdc)
- cd = '%3.3i'%(jd)
- cm = '%2.2i'%(jm)
- #print '\n\n *** jt, ch, cd, cm =>', jt, ch, cd, cm
- ct = str(datetime.datetime.strptime(cyr0+'-'+cm+'-'+cd+' '+ch, '%Y-%m-%j %H'))
- ct=ct[:5]+cm+ct[7:] #lolo bug !!! need to do that to get the month and not "01"
- print ' ct = ', ct
- cday = ct[:10] ; print ' *** cday :', cday
- chour = ct[11:13] ; print ' *** chour :', chour
- cfig = 'figs/zoom_'+cv_in+'_NEMO'+'_'+cday+'_'+chour+'_'+cpal_fld+'.'+fig_type
- fig = plt.figure(num = 1, figsize=(rh,rh*yx_ratio), dpi=None, facecolor='w', edgecolor='0.5')
- #ax = plt.axes([0.065, 0.05, 0.9, 1.], axisbg = '0.5')
- ax = plt.axes([0., 0., 1., 1.], axisbg = '0.5')
- vc_fld = nmp.arange(tmin, tmax + df, df)
- print "Reading record #"+str(jt)+" of "+cv_in+" in "+cf_in
- id_fld = Dataset(cf_in)
- XFLD = id_fld.variables[cv_in][jt,j1:j2,i1:i2] ; # t, y, x
- id_fld.close()
- print "Done!"
- if l_apply_lap:
- lx = nmp.zeros((nj,ni))
- ly = nmp.zeros((nj,ni))
- lx[:,1:ni-1] = 1.E9*(XFLD[:,2:ni] -2.*XFLD[:,1:ni-1] + XFLD[:,0:ni-2])/XE1T2[:,1:ni-1]
- ly[1:nj-1,:] = 1.E9*(XFLD[2:nj,:] -2.*XFLD[1:nj-1,:] + XFLD[0:nj-2,:])/XE2T2[1:nj-1,:]
- XFLD[:,:] = lx[:,:] + ly[:,:]
- del lx, ly
- if not l_show_lsm and jt == jt0: ( nj , ni ) = nmp.shape(XFLD)
- print ' *** dimension of array => ', ni, nj
- print "Ploting"
- cf = plt.imshow(XFLD[:,:], cmap = pal_fld, norm = norm_fld, interpolation='none')
- del XFLD
- print "Done!"
- # Ice
- if not cfield == 'MLD' and l_do_ice:
- print "Reading record #"+str(jt)+" of "+cv_ice+" in "+cf_ice
- id_ice = Dataset(cf_ice)
- XICE = id_ice.variables[cv_ice][jt,:,:] ; # t, y, x
- id_ice.close()
- print "Done!"
- #XM[:,:] = XMSK[:,:]
- #bt.drown(XICE, XM, k_ew=2, nb_max_inc=10, nb_smooth=10)
- #ci = plt.contourf(XICE[:,:], vcont_ice, cmap = pal_ice, norm = norm_ice) #
- pice = nmp.ma.masked_where(XICE < rmin_ice, XICE)
- ci = plt.imshow(pice, cmap = pal_ice, norm = norm_ice, interpolation='none') ; del pice, ci
- del XICE
- if l_show_lsm: cm = plt.imshow(pmsk, cmap = pal_lsm, norm = norm_lsm, interpolation='none')
- plt.axis([ 0, ni, 0, nj])
- #plt.title('NEMO: '+cfield+', coupled '+CNEMO+', '+cday+' '+chour+':00', **cfont_title)
- if l_show_cb:
- ax2 = plt.axes(vcb)
- clb = mpl.colorbar.ColorbarBase(ax2, ticks=vc_fld, cmap=pal_fld, norm=norm_fld, orientation='horizontal', extend='both')
- if cb_jump > 1:
- cb_labs = [] ; cpt = 0
- for rr in vc_fld:
- if cpt % cb_jump == 0:
- if df >= 1.: cb_labs.append(str(int(rr)))
- if df < 1.: cb_labs.append(str(rr))
- else:
- cb_labs.append(' ')
- cpt = cpt + 1
- clb.ax.set_xticklabels(cb_labs)
- clb.set_label(cunit, **cfont_clb)
- clb.ax.yaxis.set_tick_params(color=color_top) ; # set colorbar tick color
- clb.outline.set_edgecolor(color_top) ; # set colorbar edgecolor
- plt.setp(plt.getp(clb.ax.axes, 'xticklabels'), color=color_top) ; # set colorbar ticklabels
- del cf
- if l_show_dt: ax.annotate('Date: '+cday+' '+chour+':00', xy=(1, 4), xytext=(x_date, y_date), **cfont_date)
- #ax.annotate('laurent.brodeau@ocean-next.fr', xy=(1, 4), xytext=(x_date+150, 20), **cfont_mail)
- xl = float(nxr)/20./rfact_zoom
- yl = float(nyr)/1.2/rfact_zoom
- if l_annotate_name:
- ax.annotate(CNEMO, xy=(1, 4), xytext=(xl, yl), **cfont_titl)
- plt.savefig(cfig, dpi=dpi, orientation='portrait', facecolor='k')
- print cfig+' created!\n'
- plt.close(1)
- del cm, fig, ax
- if l_show_cb: del clb
|