123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569 |
- #!/usr/bin/env python
- # B a r a K u d a
- #
- # Generate misc. spatial plots of potential temperature and salinity out of
- # NEMO output and climatology (from initial condition and surface restoring
- # NEMO files)
- #
- # L. Brodeau, november 2013
- import sys
- import os
- import numpy as nmp
- from netCDF4 import Dataset
- import barakuda_tool as bt
- import barakuda_orca as bo
- import barakuda_plot as bp
- lfig0 = True
- lfig1 = True
- lfig2 = True
- venv_needed = {'ORCA','EXP','DIAG_D','COMP2D','i_do_sect','MM_FILE','ANNUAL_3D',
- 'NN_SST','NN_T','NN_SSS','NN_S','F_T_OBS_3D_12','F_S_OBS_3D_12',
- 'F_SST_OBS_12','NN_SST_OBS','NN_T_OBS','NN_S_OBS','NM_TS_OBS'}
- vdic = bt.check_env_var(sys.argv[0], venv_needed)
- CONFEXP = vdic['ORCA']+'-'+vdic['EXP']
- CC = vdic['COMP2D']
- i_do_sect = int(vdic['i_do_sect'])
- l_3df_are_annual = False ; # we expect 3D fields (T & S) to be in monthly 'grid_T' mclim file
- if len(vdic['ANNUAL_3D']) != 0:
- l_3df_are_annual = True ; # 3D fields (T & S) are in annual 'grid_T' aclim file
- # Bounds and increment for comparison maps:
- if CC == 'OBS':
- cname_obs = vdic['NM_TS_OBS']
- tmin=-5. ; tmax=5. ; dtemp = 0.5
- smin=-2.5 ; smax=2.5 ; dsali = 0.25
- else:
- cname_obs = CC
- tmin=-1. ; tmax=1. ; dtemp = 0.05
- smin=-0.5 ; smax=.5 ; dsali = 0.025
- path_fig='./'
- fig_type='png'
- narg = len(sys.argv)
- if narg < 3: print 'Usage: '+sys.argv[0]+' <year1> <year2>'; sys.exit(0)
- cy1 = sys.argv[1] ; cy2=sys.argv[2]; jy1=int(cy1); jy2=int(cy2)
- #
- if not ( jy1 >= 1984 and jy2 <= 2006 ):
- jy1_clim = 1984 ; jy2_clim = 2006
- else:
- jy1_clim = jy1 ; jy2_clim = jy2
- print ' First and last year to treat:', jy1, jy2
- print ' => mean on the clim : ', jy1_clim, jy2_clim, '\n'
- # 3D climatology :
- # ------------
- # Temperature
- bt.chck4f(vdic['F_T_OBS_3D_12'])
- id_obs = Dataset(vdic['F_T_OBS_3D_12'])
- Tobs = id_obs.variables[vdic['NN_T_OBS']][:,:,:,:]; print '(has ',Tobs.shape[0],' time snapshots)\n'
- id_obs.close()
- [ nmn , nk0 , nj0 , ni0 ] = Tobs.shape
- # Salinity
- bt.chck4f(vdic['F_S_OBS_3D_12'])
- id_obs = Dataset(vdic['F_S_OBS_3D_12'])
- Sobs = id_obs.variables[vdic['NN_S_OBS']][:,:,:,:]; print '(has ',Sobs.shape[0],' time snapshots)\n'
- id_obs.close()
- # 2D SST obs :
- print 'We use the following SST climatology:'; print vdic['F_SST_OBS_12']
- cv_sst_obs = vdic['NN_SST_OBS']
- bt.chck4f(vdic['F_SST_OBS_12'])
- id_obs_sst = Dataset(vdic['F_SST_OBS_12'])
- nb_dim = len(id_obs_sst.variables[cv_sst_obs].dimensions)
- if nb_dim == 3:
- SSTobs = id_obs_sst.variables[cv_sst_obs][:,:,:]; print '(has ',SSTobs.shape[0],' time snapshots)\n'
- elif nb_dim == 4:
- # reading the first level
- SSTobs = id_obs_sst.variables[cv_sst_obs][:,0,:,:]; print '(has ',SSTobs.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_obs_sst.close()
- # Table to host 1 zonal profile per EXP:
- vzc = nmp.zeros(nj0) ; # a zonal profile...
- # 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,:,:,:]
- id_mask.close()
- # Getting NEMO mean monthly climatology of temperature and salinity:
- # ------------------------------------------------------------------
- cvT3d = vdic['NN_T']
- cvS3d = vdic['NN_S']
- cf_nemo_mn = vdic['DIAG_D']+'/clim/mclim_'+CONFEXP+'_'+cy1+'-'+cy2+'_grid_T.nc4'
- cf_nemo_an = vdic['DIAG_D']+'/clim/aclim_'+CONFEXP+'_'+cy1+'-'+cy2+'_grid_T.nc4'
- bt.chck4f(cf_nemo_mn)
- id_nemo_mn = Dataset(cf_nemo_mn)
- list_var = id_nemo_mn.variables.keys()
- if vdic['NN_SST'] == cvT3d:
- SSTnemo = id_nemo_mn.variables[cvT3d][:,0,:,:]
- else:
- SSTnemo = id_nemo_mn.variables[vdic['NN_SST']][:,:,:]
- if vdic['NN_SSS'] == cvS3d:
- SSSnemo = id_nemo_mn.variables[cvS3d][:,0,:,:]
- else:
- SSSnemo = id_nemo_mn.variables[vdic['NN_SSS']][:,:,:]
- l_do_monthly_3d=True
- if 'deptht' in list_var:
- try:
- vdepth = id_nemo_mn.variables['deptht'][:]
- except KeyError as e:
- vdepth = id_nemo_mn.variables['olevel'][:]
- else:
- print 'WARNING: depth vector "deptht" not present in '+cf_nemo_mn+'!\n'
- l_do_monthly_3d=False
- if cvT3d in list_var:
- Tnemo = id_nemo_mn.variables[cvT3d][:,:,:,:]
- print '(has ',Tnemo.shape[0],' time snapshots)\n'
- else:
- print 'WARNING: 3D NEMO T '+cvT3d+' not present in '+cf_nemo_mn+'!\n'
- l_do_monthly_3d=False
- if cvS3d in list_var:
- Snemo = id_nemo_mn.variables[cvS3d][:,:,:,:]
- else:
- print 'WARNING: 3D NEMO S '+cvS3d+' not present in '+cf_nemo_mn+'!\n'
- l_do_monthly_3d=False
- id_nemo_mn.close()
- if (not l_3df_are_annual) and (not l_do_monthly_3d):
- print 'ERROR (temp_sal.py) (temp_sal.py): something is wrong, where are 3D fields!?'
- sys.exit(0)
- # Reading annual 3D fields if relevant:
- if l_3df_are_annual:
- bt.chck4f(cf_nemo_an)
- id_nemo_an = Dataset(cf_nemo_an)
- list_var = id_nemo_an.variables.keys()
- if 'deptht' in list_var:
- vdepth = id_nemo_an.variables['deptht'][:]
- else:
- print 'ERROR (temp_sal.py): depth vector "deptht" not present in '+cf_nemo_an+'!\n'; sys.exit(0)
- if cvT3d in list_var:
- Tnemo = id_nemo_an.variables[cvT3d][:,:,:,:]
- print '(has ',Tnemo.shape[0],' time snapshots)\n'
- else:
- print 'ERROR (temp_sal.py): 3D NEMO T '+cvT3d+' not present in '+cf_nemo_an+'!\n'; sys.exit(0)
- if cvS3d in list_var:
- Snemo = id_nemo_an.variables[cvS3d][:,:,:,:]
- else:
- print 'ERROR (temp_sal.py): 3D NEMO S '+cvS3d+' not present in '+cf_nemo_an+'!\n'; sys.exit(0)
- id_nemo_an.close()
- if l_do_monthly_3d or l_3df_are_annual:
- ( nt, nk, nj, ni ) = Tnemo.shape
- if (nk,nj,ni) != (nk0,nj0,ni0):
- print 'ERROR (temp_sal.py): 3D clim and NEMO file do no agree in shape!'
- print ' clim => '+str(ni0)+', '+str(nj0)+', '+str(nk0),' ('+vdic['F_T_OBS_3D_12']+')'
- print ' NEMO => '+str(ni)+', '+str(nj)+', '+str(nk)
- sys.exit(0)
- else:
- ( nt, nj, ni ) = SSTnemo.shape
- if (nj,ni) != (nj0,ni0):
- print 'ERROR (temp_sal.py): 3D clim and NEMO file do no agree in shape!'
- print ' clim => '+str(ni0)+', '+str(nj0),' ('+vdic['F_T_OBS_3D_12']+')'
- print ' NEMO => '+str(ni)+', '+str(nj)
- sys.exit(0)
- if nt not in [1,12]:
- print 'ERROR (temp_sal.py): 3D fields are either monthly or annual! nt =>', nt
- sys.exit(0)
- # Saving some array to avoid to call 'nmp.mean' all the time:
- #Annual (temperature):
- if l_do_monthly_3d or l_3df_are_annual:
- Tnemo_annual = nmp.zeros((nk,nj,ni))
- Tobs_annual = nmp.zeros((nk,nj,ni))
- Tobs_annual[:,:,:] = nmp.mean(Tobs[:,:,:,:], axis=0)
- if l_do_monthly_3d:
- Tnemo_annual[:,:,:] = nmp.mean(Tnemo[:,:,:,:], axis=0)
- if l_3df_are_annual:
- Tnemo_annual[:,:,:] = Tnemo[0,:,:,:]
- SSTnemo_annual = nmp.zeros((nj,ni))
- SSTnemo_annual[:,:] = nmp.mean(SSTnemo[:,:,:], axis=0)
- SSTobs_annual = nmp.zeros((nj,ni))
- SSTobs_annual[:,:] = nmp.mean(SSTobs[:,:,:], axis=0)
- #JFM (temperature):
- if l_do_monthly_3d:
- Tnemo_JFM = nmp.zeros((nk,nj,ni))
- Tnemo_JFM[:,:,:] = nmp.mean(Tnemo[:3,:,:,:], axis=0)
- Tobs_JFM = nmp.zeros((nk,nj,ni))
- Tobs_JFM[:,:,:] = nmp.mean(Tobs[:3,:,:,:], axis=0)
- SSTnemo_JFM = nmp.zeros((nj,ni))
- SSTnemo_JFM[:,:] = nmp.mean(SSTnemo[:3,:,:], axis=0)
- SSTobs_JFM = nmp.zeros((nj,ni))
- SSTobs_JFM[:,:] = nmp.mean(SSTobs[:3,:,:], axis=0)
- #JAS (temperature):
- if l_do_monthly_3d:
- Tnemo_JAS = nmp.zeros((nk,nj,ni))
- Tnemo_JAS[:,:,:] = nmp.mean(Tnemo[6:9,:,:,:], axis=0)
- Tobs_JAS = nmp.zeros((nk,nj,ni))
- Tobs_JAS[:,:,:] = nmp.mean(Tobs[6:9,:,:,:], axis=0)
- SSTnemo_JAS = nmp.zeros((nj,ni))
- SSTnemo_JAS[:,:] = nmp.mean(SSTnemo[6:9,:,:], axis=0)
- SSTobs_JAS = nmp.zeros((nj,ni))
- SSTobs_JAS[:,:] = nmp.mean(SSTobs[6:9,:,:], axis=0)
- # Can release some memory!
- del Tnemo, Tobs, SSTnemo, SSTobs
- #Annual (salinity):
- if l_do_monthly_3d or l_3df_are_annual:
- Snemo_annual = nmp.zeros((nk,nj,ni))
- if l_do_monthly_3d:
- Snemo_annual[:,:,:] = nmp.mean(Snemo[:,:,:,:], axis=0)
- if l_3df_are_annual:
- Snemo_annual[:,:,:] = Snemo[0,:,:,:]
- Sobs_annual = nmp.zeros((nk0,nj,ni))
- Sobs_annual[:,:,:] = nmp.mean(Sobs[:,:,:,:], axis=0)
- SSSnemo_annual = nmp.zeros((nj,ni))
- SSSnemo_annual[:,:] = nmp.mean(SSSnemo[:,:,:], axis=0)
- #JFM (salinity):
- if l_do_monthly_3d:
- Snemo_JFM = nmp.zeros((nk,nj,ni))
- Snemo_JFM[:,:,:] = nmp.mean(Snemo[:3,:,:,:], axis=0)
- Sobs_JFM = nmp.zeros((nk0,nj,ni))
- Sobs_JFM[:,:,:] = nmp.mean(Sobs[:3,:,:,:], axis=0)
- SSSnemo_JFM = nmp.zeros((nj,ni))
- SSSnemo_JFM[:,:] = nmp.mean(SSSnemo[:3,:,:], axis=0)
- #JAS (salinity):
- if l_do_monthly_3d:
- Snemo_JAS = nmp.zeros((nk,nj,ni))
- Snemo_JAS[:,:,:] = nmp.mean(Snemo[6:9,:,:,:], axis=0)
- Sobs_JAS = nmp.zeros((nk0,nj,ni))
- Sobs_JAS[:,:,:] = nmp.mean(Sobs[6:9,:,:,:], axis=0)
- SSSnemo_JAS = nmp.zeros((nj,ni))
- SSSnemo_JAS[:,:] = nmp.mean(SSSnemo[6:9,:,:], axis=0)
- # Can release some memory!
- del Snemo, Sobs, SSSnemo
- if l_do_monthly_3d or l_3df_are_annual:
- jk100 = bt.find_index_from_value(100. , vdepth) ; print 'jk100 = ', jk100, '=> ', vdepth[jk100]
- jk1000 = bt.find_index_from_value(1000. , vdepth) ; print 'jk1000 = ', jk1000, '=> ', vdepth[jk1000]
- jk3000 = bt.find_index_from_value(3000. , vdepth) ; print 'jk3000 = ', jk3000, '=> ', vdepth[jk3000]
- tdj = [ jk100, jk1000, jk3000 ]
- tdd_true = [ str(int(round(vdepth[jk100])))+'m' , str(int(round(vdepth[jk1000])))+'m' , str(int(round(vdepth[jk3000])))+'m' ]
- tdd = [ '100m', '1000m', '3000m' ]
- print '\n', tdd_true[:], '\n'
- # Creating 1D long. and lat.:
- vlon = nmp.zeros(ni) ; vlon[:] = xlon[0,:]
- ji_lat0 = nmp.argmax(xlat[nj-1,:])
- vlat = nmp.zeros(nj) ; vlat[:] = xlat[:,ji_lat0]
- # Time for figures:
- # -----------------
- if lfig0:
- ctt = CONFEXP+': Mean Annual Zonal Anomaly of SST / "'+cname_obs+'", ('+cy1+'-'+cy2+')'
- vzc[:] = bt.mk_zonal(SSTnemo_annual[:,:] - SSTobs_annual[:,:], XMSK=imask[0,:,:])
- # Only at the end of all the experiments we do 2d plotting:
- bp.plot("zonal")(vlat, vzc, cfignm=path_fig+'1d_zonal_temp_anom_vs_'+CC, zmin=-5., zmax=5., dz=1.,
- xmin=-75., xmax=65., czunit=r'$^{\circ}$C', cfig_type=fig_type,
- ctitle=ctt)
- ctt = CONFEXP+': Mean Annual Zonal Anomaly of SSS / "'+cname_obs+'", ('+cy1+'-'+cy2+')'
- vzc[:] = bt.mk_zonal(SSSnemo_annual[:,:] - Sobs_annual[0,:,:], XMSK=imask[0,:,:])
- # Only at the end of all the experiments we do 2d plotting:
- bp.plot("zonal")(vlat, vzc, cfignm=path_fig+'1d_zonal_sali_anom_vs_'+CC , zmin=-2.5, zmax=2.5, dz=0.5,
- xmin=-75., xmax=65., czunit='PSU', cfig_type=fig_type,
- ctitle=ctt)
- if lfig1:
- # SST / Reynolds
- # JFM
- bp.plot("2d")(vlon, vlat, SSTnemo_JFM[:,:] - SSTobs_JFM[:,:],
- imask[0,:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dsst_JFM_'+CONFEXP+'_-_'+CC,
- cbunit='K', cfig_type=fig_type,
- ctitle='SST difference to "'+cname_obs+'", JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # JAS
- bp.plot("2d")(vlon, vlat, SSTnemo_JAS[:,:] - SSTobs_JAS[:,:],
- imask[0,:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dsst_JAS_'+CONFEXP+'_-_'+CC,
- cbunit='K', cfig_type=fig_type,
- ctitle='SST difference to "'+cname_obs+'", JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # Annual
- bp.plot("2d")(vlon, vlat, SSTnemo_annual[:,:] - SSTobs_annual[:,:],
- imask[0,:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dsst_annual_'+CONFEXP+'_-_'+CC,
- cbunit='K', cfig_type=fig_type,
- ctitle='SST difference to "'+cname_obs+'", '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # Temperature 100m, 1000m... / climatology
- if l_do_monthly_3d or l_3df_are_annual:
- for jd in range(nmp.size(tdj)):
- jdepth = tdj[jd] ; cdepth = tdd[jd] ; cdepth_true = tdd_true[jd]
- print '\n Treating depth '+str(vdepth[jdepth])+' !!!'
- if jd < 1 and (not l_3df_are_annual):
- # JFM
- bp.plot("2d")(vlon, vlat, Tnemo_JFM[jdepth,:,:] - Tobs_JFM[jdepth,:,:],
- imask[jdepth,:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dT_JFM_'+cdepth+'_'+CONFEXP+'_-_'+CC,
- cbunit='K', cfig_type=fig_type,
- ctitle='Temperature diff. to "'+cname_obs+'" at '+cdepth_true+', JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # JAS
- bp.plot("2d")(vlon, vlat, Tnemo_JAS[jdepth,:,:] - Tobs_JAS[jdepth,:,:],
- imask[jdepth,:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dT_JAS_'+cdepth+'_'+CONFEXP+'_-_'+CC,
- cbunit='K', cfig_type=fig_type,
- ctitle='Temperature diff. to "'+cname_obs+'" at '+cdepth_true+', JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # Annual
- bp.plot("2d")(vlon, vlat, Tnemo_annual[jdepth,:,:] - Tobs_annual[jdepth,:,:],
- imask[jdepth,:,:], tmin, tmax, dtemp,
- corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dT_annual_'+cdepth+'_'+CONFEXP+'_-_'+CC,
- cbunit='K', cfig_type=fig_type,
- ctitle='Temperature diff. to "'+cname_obs+'" at '+cdepth_true+', '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # S S S
- # JFM
- bp.plot("2d")(vlon, vlat, SSSnemo_JFM[:,:] - Sobs_JFM[0,:,:],
- imask[0,:,:], smin, smax, dsali, cpal='PiYG_r',
- corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dsss_JFM_'+CONFEXP+'_-_'+CC,
- cbunit='PSU', cfig_type=fig_type,
- ctitle='SSS difference to "'+cname_obs+'", JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # JAS
- bp.plot("2d")(vlon, vlat, SSSnemo_JAS[:,:] - Sobs_JAS[0,:,:],
- imask[0,:,:], smin, smax, dsali, cpal='PiYG_r',
- corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dsss_JAS_'+CONFEXP+'_-_'+CC,
- cbunit='PSU', cfig_type=fig_type,
- ctitle='SSS difference to "'+cname_obs+'", JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # Annual
- bp.plot("2d")(vlon, vlat, SSSnemo_annual[:,:] - Sobs_annual[0,:,:],
- imask[0,:,:], smin, smax, dsali, cpal='PiYG_r',
- corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dsss_annual_'+CONFEXP+'_-_'+CC,
- cbunit='PSU', cfig_type=fig_type,
- ctitle='SSS difference to "'+cname_obs+'", '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # Salinity 100m, 1000m... / climatology
- if l_do_monthly_3d or l_3df_are_annual:
- for jd in range(nmp.size(tdj)):
- jdepth = tdj[jd] ; cdepth = tdd[jd] ; cdepth_true = tdd_true[jd]
- print '\n Treating depth '+str(vdepth[jdepth])+' !!!'
- if jd < 1 and (not l_3df_are_annual):
- # JFM
- bp.plot("2d")(vlon, vlat, Snemo_JFM[jdepth,:,:] - Sobs_JFM[jdepth,:,:],
- imask[jdepth,:,:], smin, smax, dsali, cpal='PiYG_r',
- corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dS_JFM_'+cdepth+'_'+CONFEXP+'_-_'+CC,
- cbunit='PSU', cfig_type=fig_type,
- ctitle='Salinity diff. to "'+cname_obs+'" at '+cdepth_true+', JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # JAS
- bp.plot("2d")(vlon, vlat, Snemo_JAS[jdepth,:,:] - Sobs_JAS[jdepth,:,:],
- imask[jdepth,:,:], smin, smax, dsali, cpal='PiYG_r',
- corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dS_JAS_'+cdepth+'_'+CONFEXP+'_-_'+CC,
- cbunit='PSU', cfig_type=fig_type,
- ctitle='Salinity diff. to "'+cname_obs+'" at '+cdepth_true+', JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- # Annual
- bp.plot("2d")(vlon, vlat, Snemo_annual[jdepth,:,:] - Sobs_annual[jdepth,:,:],
- imask[jdepth,:,:], smin, smax, dsali, cpal='PiYG_r',
- corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dS_annual_'+cdepth+'_'+CONFEXP+'_-_'+CC,
- cbunit='PSU', cfig_type=fig_type,
- ctitle='Salinity diff. to "'+cname_obs+'" at '+cdepth_true+', '+CONFEXP+' ('+cy1+'-'+cy2+')',
- lforce_lim=True)
- del Sobs_JFM, Sobs_JAS
- if l_do_monthly_3d: del Tnemo_JFM, Tnemo_JAS, Snemo_JFM, Snemo_JAS, Tobs_JFM, Tobs_JAS
- # Temperature and salinity for vertical sections
- if lfig2 and i_do_sect==1 and (l_do_monthly_3d or l_3df_are_annual):
- vdico = bt.check_env_var(sys.argv[0], {'TS_SECTION_FILE'})
- vboxes, vlon1, vlat1, vlon2, vlat2, vTmin, vTmax, vSmin, vSmax = bt.read_coor(vdico['TS_SECTION_FILE'], ctype='float', lTS_bounds=True)
- js = 0
- for csname in vboxes:
- [ i1, i2, j1, j2 ] = bo.transect_zon_or_med(vlon1[js], vlon2[js], vlat1[js], vlat2[js], xlon, xlat)
- if i2>i1 and i2 < ni0-1: i2 = i2+1
- if j2>j1 and j2 < nj0-1: j2 = j2+1
- print '\n *** Section: '+csname+':'
- print ' lon1, lon2, lat1, lat2 =', vlon1[js], vlon2[js], vlat1[js], vlat2[js]
- print ' => i1, i2, j1, j2 =', i1, i2, j1, j2
- #print ' xlon[j1,i1], xlon[j1,i2] =', xlon[j1,i1]-360., xlon[j1,i2]
- print ''
- if i1 > i2: print 'ERROR (temp_sal.py) => i1 > i2 !'; sys.exit(0)
- if j1 > j2: print 'ERROR (temp_sal.py) => j1 > j2 !'; sys.exit(0)
- lzonal = False
- if i1 == i2:
- print ' ==> Meridional section!'
- vaxis = xlat[j1:j2+1,i1]
- ZT = Tnemo_annual[:,j1:j2+1,i1] ; ZS = Snemo_annual[:,j1:j2+1,i1]
- OT = Tobs_annual[:,j1:j2+1,i1] ; OS = Sobs_annual[:,j1:j2+1,i1]
- imsk = imask[:,j1:j2+1,i1]
- cinfo = ', lon='+str(vlon1[js])
- xmn=vlat1[js]; xmx=vlat2[js]
- if j1 == j2:
- print ' ==> Zonal section!'
- lzonal = True
- xmn=vlon1[js]; xmx=vlon2[js]
- vx = xlon[j1,i1:i2+1] ; vaxis = nmp.zeros(len(vx)) ; vaxis[:] = vx[:]
- if xmx<0. and xmn>0.:
- xmx = 360. + xmx
- else:
- ivf = nmp.where(vx>180.); vaxis[ivf] = vx[ivf] - 360.
- ZT = Tnemo_annual[:,j1,i1:i2+1] ; ZS = Snemo_annual[:,j1,i1:i2+1]
- OT = Tobs_annual[:,j1,i1:i2+1] ; OS = Sobs_annual[:,j1,i1:i2+1]
- imsk = imask[:,j1,i1:i2+1]
- cinfo = ', lat='+str(vlat1[js])
- Ta = vTmax[js] - vTmin[js]
- if Ta < 1. : print 'ERROR (temp_sal.py) => Problem with your min and max for T for section "'+csname+'" !'; sys.exit(0)
- if Ta >= 25.: dT = 1.
- if Ta >= 10. and Ta < 25.: dT = 0.5
- if Ta >= 5. and Ta < 10.: dT = 0.25
- if Ta > 0. and Ta < 5.: dT = 0.1
- Sa = vSmax[js] - vSmin[js]
- if Sa < 0.001 : print 'ERROR (temp_sal.py) => Problem with your min and max for S for section "'+csname+'" !'; sys.exit(0)
- if Sa >= 3. : dS = 0.1
- if Sa >= 1.5 and Sa < 3. : dS = 0.05
- if Sa >= 0.5 and Sa < 1.5: dS = 0.025
- if Sa >= 0. and Sa < 0.5: dS = 0.01
- bp.plot("vert_section")(vaxis, vdepth, ZT, imsk, vTmin[js], vTmax[js], dT,
- cpal='ncview_nrl', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
- cfignm=path_fig+'section_T_'+csname+'_'+CONFEXP, cbunit=r'$^{\circ}$C', cxunit=r'Latitude ($^{\circ}$N)',
- czunit='Depth (m)', ctitle='Temperature, ('+cy1+'-'+cy2+'), '+csname+', '+CONFEXP+cinfo,
- cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
- bp.plot("vert_section")(vaxis, vdepth, ZS, imsk, vSmin[js], vSmax[js], dS,
- cpal='ncview_jaisnb', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
- cfignm=path_fig+'section_S_'+csname+'_'+CONFEXP, cbunit='PSU', cxunit=r'Latitude ($^{\circ}$N)',
- czunit='Depth (m)', ctitle='Salinity, ('+cy1+'-'+cy2+'), '+csname+', '+CONFEXP+cinfo,
- cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
- # OBS:
- bp.plot("vert_section")(vaxis, vdepth, OT, imsk, vTmin[js], vTmax[js], dT,
- cpal='ncview_nrl', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
- cfignm=path_fig+'section_T_'+csname+'_'+CC, cbunit=r'$^{\circ}$C',
- cxunit=r'Latitude ($^{\circ}$N)',
- czunit='Depth (m)', ctitle='Temperature, '+csname+', "'+cname_obs+'"'+cinfo,
- cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
- #
- bp.plot("vert_section")(vaxis, vdepth, OS, imsk, vSmin[js], vSmax[js], dS,
- cpal='ncview_jaisnb', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
- cfignm=path_fig+'section_S_'+csname+'_'+CC, cbunit='PSU',
- cxunit=r'Latitude ($^{\circ}$N)',
- czunit='Depth (m)', ctitle='Salinity, '+csname+', "'+cname_obs+'"'+cinfo,
- cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
- js=js+1
- print '\n Bye!'
|