123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- #!/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 string import replace
- from netCDF4 import Dataset
- import barakuda_tool as bt
- import barakuda_plot as bp
- venv_needed = {'ORCA','EXP','DIAG_D','MM_FILE','NN_SST','NN_T','NN_SSS','NN_S','NN_MLD',
- 'FILE_ICE_SUFFIX','NN_ICEF',
- 'NM_TS_OBS','F_T_OBS_3D_12','F_S_OBS_3D_12','F_SST_OBS_12','NN_SST_OBS','NN_T_OBS','NN_S_OBS'}
- # 'NM_IC_OBS'
- vdic = bt.check_env_var(sys.argv[0], venv_needed)
- CONFEXP = vdic['ORCA']+'-'+vdic['EXP']
- tmin=-4. ; tmax=-tmin ; dtemp = 0.25
- smin=-1.4 ; smax=-smin ; dsali = 0.1
- mmin=0. ; mmax=1500. ; dmld = 50.
- fig_type='png'
- cn_obs_ts = vdic['NM_TS_OBS']
- #cn_obs_ic = vdic['NM_TS_OBS']
- narg = len(sys.argv)
- if narg < 4:
- print 'Usage: '+sys.argv[0]+' <NEMO file (1 year, monthyly)> <year> <var>'
- print ' with var one of "sst", "sss", "ice", "mld"'
- sys.exit(0)
- cf_T = sys.argv[1]
- cy = sys.argv[2] ; jy=int(cy)
- cvar = sys.argv[3]
- cf_ice = replace(cf_T, 'grid_T', vdic['FILE_ICE_SUFFIX'])
- print ' *** file to read '+vdic['NN_ICEF']+' from: '+cf_ice+'\n'
- if not cvar in ['sst','sss','ice','mld']:
- print 'ERROR (prepare_movies.py): variable '+cvar+' not supported yet!'
- sys.exit(0)
- path_fig = 'movies'
- os.system("mkdir -p "+path_fig)
- # 3D climatology :
- # ------------
- # Salinity
- if cvar == 'sss':
- bt.chck4f(vdic['F_S_OBS_3D_12'])
- id_clim = Dataset(vdic['F_S_OBS_3D_12'])
- Vclim = id_clim.variables[vdic['NN_S_OBS']][:,0,:,:]; print '(has ',Vclim.shape[0],' time snapshots)\n'
- id_clim.close()
- # 2D SST obs :
- if cvar == 'sst':
- cv_sst_obs = vdic['NN_SST_OBS']
- bt.chck4f(vdic['F_SST_OBS_12'])
- id_clim_sst = Dataset(vdic['F_SST_OBS_12'])
- nb_dim = len(id_clim_sst.variables[cv_sst_obs].dimensions)
- if nb_dim == 3:
- Vclim = id_clim_sst.variables[cv_sst_obs][:,:,:]; print '(has ',Vclim.shape[0],' time snapshots)\n'
- elif nb_dim == 4:
- Vclim = id_clim_sst.variables[cv_sst_obs][:,0,:,:]; print '(has ',Vclim.shape[0],' time snapshots)\n'
- else:
- print 'ERROR (prepare_movies.py): shape of '+cv_sst_obs+' in '+vdic['F_SST_OBS_12']+' is problematic!'
- sys.exit(0)
- id_clim_sst.close()
- # Sea-ice concentration :
- # => no clim used!
- if cvar in ['sss','sst']: ( nmn , nj0 , ni0 ) = Vclim.shape
- # Getting land-sea mask and coordinates:
- bt.chck4f(vdic['MM_FILE'])
- id_mask = Dataset(vdic['MM_FILE'])
- xlon = id_mask.variables['nav_lon'][:,:]
- xlat = id_mask.variables['nav_lat'][:,:]
- imask = id_mask.variables['tmask'][0,0,:,:]
- id_mask.close()
- # Getting NEMO variables:
- # -----------------------
- cf_in = cf_T
- if cvar == 'ice' and cf_ice != cf_T:
- cf_in = cf_ice
- bt.chck4f(cf_in)
- id_in = Dataset(cf_in)
- #list_var = id_in.variables.keys()
- if cvar == 'sst':
- if vdic['NN_SST'] == 'thetao' or vdic['NN_SST'] == 'votemper' : #lolo:bad !!! should check shape!!!
- Vnemo = id_in.variables[vdic['NN_SST']][:,0,:,:]
- else:
- Vnemo = id_in.variables[vdic['NN_SST']][:,:,:]
- cv = 'dsst'
- if cvar == 'sss':
- if vdic['NN_SSS'] == 'so' or vdic['NN_SSS'] == 'vosaline' : #lolo:bad !!! should check shape!!!
- Vnemo = id_in.variables[vdic['NN_SSS']][:,0,:,:]
- else:
- Vnemo = id_in.variables[vdic['NN_SSS']][:,:,:]
- cv = 'dsss'
- if cvar == 'ice':
- if vdic['NN_ICEF'] == 'X':
- print 'ERROR (prepare_movies.py): you set "X" (missing) as the name for ice concentration in your conf file!'; sys.exit(0)
- Vnemo = id_in.variables[vdic['NN_ICEF']][:,:,:]
- Vnemo = nmp.multiply(Vnemo,100)
- if cvar == 'mld':
- if vdic['NN_MLD'] == 'X':
- print 'ERROR (prepare_movies.py): you set "X" (missing) as the name for MLD in your conf file!'; sys.exit(0)
- Vnemo = id_in.variables[vdic['NN_MLD']][:,:,:]
- id_in.close()
- [ nt, nj, ni ] = Vnemo.shape
- if nt != 12:
- print 'ERROR (prepare_movies.py): we expect 12 montly records in NEMO grid_T file!'
- sys.exit(0)
-
- if (cvar in ['sss','sst']) and (nj != nj0 or ni != ni0):
- print 'ERROR (prepare_movies.py): NEMO file and clim do no agree in shape for '+cvar+'!'
- print ' clim => '+str(ni0)+', '+str(nj0)+', ('+vdic['F_T_OBS_3D_12']+')'
- print ' NEMO => '+str(ni)+', '+str(nj)
- sys.exit(0)
- if cvar in ['sss','sst','mld']:
- # Creating 1D long. and lat.:
- ji_lat0 = nmp.argmax(xlat[nj-1,:])
- vlon = nmp.zeros(ni) ; vlon[:] = xlon[20,:]
- vlat = nmp.zeros(nj) ; vlat[:] = xlat[:,ji_lat0]
- if cvar == 'ice':
- # Extraoplating sea values over continents:
- bt.drown(Vnemo[:,:,:], imask, k_ew=2, nb_max_inc=10, nb_smooth=10)
- lpix = False
- if vdic['ORCA'][:5] == 'ORCA0': lpix = True
- for jt in range(nt):
- cm = "%02d" % (jt+1)
- cdate = cy+cm
- cdatet = cy+'/'+cm
- if cvar == 'sst':
- bp.plot("2d")(vlon, vlat, Vnemo[jt,:,:] - Vclim[jt,:,:],
- imask[:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r',
- cfignm=path_fig+'/'+cv+'_'+cdate,
- cbunit='K', cfig_type=fig_type, lat_min=-77., lat_max=75.,
- ctitle='SST (NEMO - "'+cn_obs_ts+'"), '+CONFEXP+' ('+cdatet+')',
- lforce_lim=True, i_cb_subsamp=2, lpix=lpix)
- if cvar == 'sss':
- bp.plot("2d")(vlon, vlat, Vnemo[jt,:,:] - Vclim[jt,:,:],
- imask[:,:], smin, smax, dsali,
- corca=vdic['ORCA'], lkcont=False, cpal='PiYG_r',
- cfignm=path_fig+'/'+cv+'_'+cdate,
- cbunit='PSU', cfig_type=fig_type, lat_min=-77., lat_max=75.,
- ctitle='SSS (NEMO - "'+cn_obs_ts+'"), '+CONFEXP+' ('+cdatet+')',
- lforce_lim=True, i_cb_subsamp=2, lpix=lpix)
- if cvar == 'mld':
- bp.plot("2d")(vlon, vlat, Vnemo[jt,:,:], imask[:,:], mmin, mmax, dmld,
- corca=vdic['ORCA'], lkcont=False, cpal='ncview_nrl',
- cfignm=path_fig+'/'+cvar+'_'+cdate,
- cbunit='m', cfig_type=fig_type, lat_min=-77., lat_max=75.,
- ctitle='Mixed-Layer depth, '+CONFEXP+' ('+cdatet+')',
- lforce_lim=True, i_cb_subsamp=2, lpix=lpix)
-
- if cvar == 'ice':
- # Extraoplating sea values on continents:
- bt.drown(Vnemo[jt,:,:], imask, k_ew=2, nb_max_inc=10, nb_smooth=10)
- # ICE north:
- cv = "icen"
- bp.plot("nproj")('npol2', 0., 100., 10., xlon, xlat, Vnemo[jt,:,:],
- cfignm=path_fig+'/'+cv+'_'+cdate, cpal='ice', cbunit='(%)',
- ctitle='Ice concentration, '+CONFEXP+' ('+cdatet+')',
- lkcont=True, cfig_type=fig_type, lforce_lim=True)
- cv = "ices"
- bp.plot("nproj")('spstere', 0., 100., 10., xlon, xlat, Vnemo[jt,:,:],
- cfignm=path_fig+'/'+cv+'_'+cdate, cpal='ice', cbunit='(%)',
- ctitle='Ice concentration, '+CONFEXP+' ('+cdatet+')',
- lkcont=True, cfig_type=fig_type, lforce_lim=True)
- print '\n *** EXITING prepare_movies.py for year '+cy+', var ='+cvar+' !\n'
|