temp_sal.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. #!/usr/bin/env python
  2. # B a r a K u d a
  3. #
  4. # Generate misc. spatial plots of potential temperature and salinity out of
  5. # NEMO output and climatology (from initial condition and surface restoring
  6. # NEMO files)
  7. #
  8. # L. Brodeau, november 2013
  9. import sys
  10. import os
  11. import numpy as nmp
  12. from netCDF4 import Dataset
  13. import barakuda_tool as bt
  14. import barakuda_orca as bo
  15. import barakuda_plot as bp
  16. lfig0 = True
  17. lfig1 = True
  18. lfig2 = True
  19. venv_needed = {'ORCA','EXP','DIAG_D','COMP2D','i_do_sect','MM_FILE','ANNUAL_3D',
  20. 'NN_SST','NN_T','NN_SSS','NN_S','F_T_OBS_3D_12','F_S_OBS_3D_12',
  21. 'F_SST_OBS_12','NN_SST_OBS','NN_T_OBS','NN_S_OBS','NM_TS_OBS'}
  22. vdic = bt.check_env_var(sys.argv[0], venv_needed)
  23. CONFEXP = vdic['ORCA']+'-'+vdic['EXP']
  24. CC = vdic['COMP2D']
  25. i_do_sect = int(vdic['i_do_sect'])
  26. l_3df_are_annual = False ; # we expect 3D fields (T & S) to be in monthly 'grid_T' mclim file
  27. if len(vdic['ANNUAL_3D']) != 0:
  28. l_3df_are_annual = True ; # 3D fields (T & S) are in annual 'grid_T' aclim file
  29. # Bounds and increment for comparison maps:
  30. if CC == 'OBS':
  31. cname_obs = vdic['NM_TS_OBS']
  32. tmin=-5. ; tmax=5. ; dtemp = 0.5
  33. smin=-2.5 ; smax=2.5 ; dsali = 0.25
  34. else:
  35. cname_obs = CC
  36. tmin=-1. ; tmax=1. ; dtemp = 0.05
  37. smin=-0.5 ; smax=.5 ; dsali = 0.025
  38. path_fig='./'
  39. fig_type='png'
  40. narg = len(sys.argv)
  41. if narg < 3: print 'Usage: '+sys.argv[0]+' <year1> <year2>'; sys.exit(0)
  42. cy1 = sys.argv[1] ; cy2=sys.argv[2]; jy1=int(cy1); jy2=int(cy2)
  43. #
  44. if not ( jy1 >= 1984 and jy2 <= 2006 ):
  45. jy1_clim = 1984 ; jy2_clim = 2006
  46. else:
  47. jy1_clim = jy1 ; jy2_clim = jy2
  48. print ' First and last year to treat:', jy1, jy2
  49. print ' => mean on the clim : ', jy1_clim, jy2_clim, '\n'
  50. # 3D climatology :
  51. # ------------
  52. # Temperature
  53. bt.chck4f(vdic['F_T_OBS_3D_12'])
  54. id_obs = Dataset(vdic['F_T_OBS_3D_12'])
  55. Tobs = id_obs.variables[vdic['NN_T_OBS']][:,:,:,:]; print '(has ',Tobs.shape[0],' time snapshots)\n'
  56. id_obs.close()
  57. [ nmn , nk0 , nj0 , ni0 ] = Tobs.shape
  58. # Salinity
  59. bt.chck4f(vdic['F_S_OBS_3D_12'])
  60. id_obs = Dataset(vdic['F_S_OBS_3D_12'])
  61. Sobs = id_obs.variables[vdic['NN_S_OBS']][:,:,:,:]; print '(has ',Sobs.shape[0],' time snapshots)\n'
  62. id_obs.close()
  63. # 2D SST obs :
  64. print 'We use the following SST climatology:'; print vdic['F_SST_OBS_12']
  65. cv_sst_obs = vdic['NN_SST_OBS']
  66. bt.chck4f(vdic['F_SST_OBS_12'])
  67. id_obs_sst = Dataset(vdic['F_SST_OBS_12'])
  68. nb_dim = len(id_obs_sst.variables[cv_sst_obs].dimensions)
  69. if nb_dim == 3:
  70. SSTobs = id_obs_sst.variables[cv_sst_obs][:,:,:]; print '(has ',SSTobs.shape[0],' time snapshots)\n'
  71. elif nb_dim == 4:
  72. # reading the first level
  73. SSTobs = id_obs_sst.variables[cv_sst_obs][:,0,:,:]; print '(has ',SSTobs.shape[0],' time snapshots)\n'
  74. else:
  75. print 'ERROR (prepare_movies.py): shape of '+cv_sst_obs+' in '+vdic['F_SST_OBS_12']+' is problematic!'
  76. sys.exit(0)
  77. id_obs_sst.close()
  78. # Table to host 1 zonal profile per EXP:
  79. vzc = nmp.zeros(nj0) ; # a zonal profile...
  80. # Getting land-sea mask and coordinates:
  81. bt.chck4f(vdic['MM_FILE'])
  82. id_mask = Dataset(vdic['MM_FILE'])
  83. xlon = id_mask.variables['nav_lon'][:,:]
  84. xlat = id_mask.variables['nav_lat'][:,:]
  85. imask = id_mask.variables['tmask'][0,:,:,:]
  86. id_mask.close()
  87. # Getting NEMO mean monthly climatology of temperature and salinity:
  88. # ------------------------------------------------------------------
  89. cvT3d = vdic['NN_T']
  90. cvS3d = vdic['NN_S']
  91. cf_nemo_mn = vdic['DIAG_D']+'/clim/mclim_'+CONFEXP+'_'+cy1+'-'+cy2+'_grid_T.nc4'
  92. cf_nemo_an = vdic['DIAG_D']+'/clim/aclim_'+CONFEXP+'_'+cy1+'-'+cy2+'_grid_T.nc4'
  93. bt.chck4f(cf_nemo_mn)
  94. id_nemo_mn = Dataset(cf_nemo_mn)
  95. list_var = id_nemo_mn.variables.keys()
  96. if vdic['NN_SST'] == cvT3d:
  97. SSTnemo = id_nemo_mn.variables[cvT3d][:,0,:,:]
  98. else:
  99. SSTnemo = id_nemo_mn.variables[vdic['NN_SST']][:,:,:]
  100. if vdic['NN_SSS'] == cvS3d:
  101. SSSnemo = id_nemo_mn.variables[cvS3d][:,0,:,:]
  102. else:
  103. SSSnemo = id_nemo_mn.variables[vdic['NN_SSS']][:,:,:]
  104. l_do_monthly_3d=True
  105. if 'deptht' in list_var:
  106. vdepth = id_nemo_mn.variables['deptht'][:]
  107. else:
  108. print 'WARNING: depth vector "deptht" not present in '+cf_nemo_mn+'!\n'
  109. l_do_monthly_3d=False
  110. if cvT3d in list_var:
  111. Tnemo = id_nemo_mn.variables[cvT3d][:,:,:,:]
  112. print '(has ',Tnemo.shape[0],' time snapshots)\n'
  113. else:
  114. print 'WARNING: 3D NEMO T '+cvT3d+' not present in '+cf_nemo_mn+'!\n'
  115. l_do_monthly_3d=False
  116. if cvS3d in list_var:
  117. Snemo = id_nemo_mn.variables[cvS3d][:,:,:,:]
  118. else:
  119. print 'WARNING: 3D NEMO S '+cvS3d+' not present in '+cf_nemo_mn+'!\n'
  120. l_do_monthly_3d=False
  121. id_nemo_mn.close()
  122. if (not l_3df_are_annual) and (not l_do_monthly_3d):
  123. print 'ERROR (temp_sal.py) (temp_sal.py): something is wrong, where are 3D fields!?'
  124. sys.exit(0)
  125. # Reading annual 3D fields if relevant:
  126. if l_3df_are_annual:
  127. bt.chck4f(cf_nemo_an)
  128. id_nemo_an = Dataset(cf_nemo_an)
  129. list_var = id_nemo_an.variables.keys()
  130. if 'deptht' in list_var:
  131. vdepth = id_nemo_an.variables['deptht'][:]
  132. else:
  133. print 'ERROR (temp_sal.py): depth vector "deptht" not present in '+cf_nemo_an+'!\n'; sys.exit(0)
  134. if cvT3d in list_var:
  135. Tnemo = id_nemo_an.variables[cvT3d][:,:,:,:]
  136. print '(has ',Tnemo.shape[0],' time snapshots)\n'
  137. else:
  138. print 'ERROR (temp_sal.py): 3D NEMO T '+cvT3d+' not present in '+cf_nemo_an+'!\n'; sys.exit(0)
  139. if cvS3d in list_var:
  140. Snemo = id_nemo_an.variables[cvS3d][:,:,:,:]
  141. else:
  142. print 'ERROR (temp_sal.py): 3D NEMO S '+cvS3d+' not present in '+cf_nemo_an+'!\n'; sys.exit(0)
  143. id_nemo_an.close()
  144. if l_do_monthly_3d or l_3df_are_annual:
  145. ( nt, nk, nj, ni ) = Tnemo.shape
  146. if (nk,nj,ni) != (nk0,nj0,ni0):
  147. print 'ERROR (temp_sal.py): 3D clim and NEMO file do no agree in shape!'
  148. print ' clim => '+str(ni0)+', '+str(nj0)+', '+str(nk0),' ('+vdic['F_T_OBS_3D_12']+')'
  149. print ' NEMO => '+str(ni)+', '+str(nj)+', '+str(nk)
  150. sys.exit(0)
  151. else:
  152. ( nt, nj, ni ) = SSTnemo.shape
  153. if (nj,ni) != (nj0,ni0):
  154. print 'ERROR (temp_sal.py): 3D clim and NEMO file do no agree in shape!'
  155. print ' clim => '+str(ni0)+', '+str(nj0),' ('+vdic['F_T_OBS_3D_12']+')'
  156. print ' NEMO => '+str(ni)+', '+str(nj)
  157. sys.exit(0)
  158. if nt not in [1,12]:
  159. print 'ERROR (temp_sal.py): 3D fields are either monthly or annual! nt =>', nt
  160. sys.exit(0)
  161. # Saving some array to avoid to call 'nmp.mean' all the time:
  162. #Annual (temperature):
  163. if l_do_monthly_3d or l_3df_are_annual:
  164. Tnemo_annual = nmp.zeros((nk,nj,ni))
  165. Tobs_annual = nmp.zeros((nk,nj,ni))
  166. Tobs_annual[:,:,:] = nmp.mean(Tobs[:,:,:,:], axis=0)
  167. if l_do_monthly_3d:
  168. Tnemo_annual[:,:,:] = nmp.mean(Tnemo[:,:,:,:], axis=0)
  169. if l_3df_are_annual:
  170. Tnemo_annual[:,:,:] = Tnemo[0,:,:,:]
  171. SSTnemo_annual = nmp.zeros((nj,ni))
  172. SSTnemo_annual[:,:] = nmp.mean(SSTnemo[:,:,:], axis=0)
  173. SSTobs_annual = nmp.zeros((nj,ni))
  174. SSTobs_annual[:,:] = nmp.mean(SSTobs[:,:,:], axis=0)
  175. #JFM (temperature):
  176. if l_do_monthly_3d:
  177. Tnemo_JFM = nmp.zeros((nk,nj,ni))
  178. Tnemo_JFM[:,:,:] = nmp.mean(Tnemo[:3,:,:,:], axis=0)
  179. Tobs_JFM = nmp.zeros((nk,nj,ni))
  180. Tobs_JFM[:,:,:] = nmp.mean(Tobs[:3,:,:,:], axis=0)
  181. SSTnemo_JFM = nmp.zeros((nj,ni))
  182. SSTnemo_JFM[:,:] = nmp.mean(SSTnemo[:3,:,:], axis=0)
  183. SSTobs_JFM = nmp.zeros((nj,ni))
  184. SSTobs_JFM[:,:] = nmp.mean(SSTobs[:3,:,:], axis=0)
  185. #JAS (temperature):
  186. if l_do_monthly_3d:
  187. Tnemo_JAS = nmp.zeros((nk,nj,ni))
  188. Tnemo_JAS[:,:,:] = nmp.mean(Tnemo[6:9,:,:,:], axis=0)
  189. Tobs_JAS = nmp.zeros((nk,nj,ni))
  190. Tobs_JAS[:,:,:] = nmp.mean(Tobs[6:9,:,:,:], axis=0)
  191. SSTnemo_JAS = nmp.zeros((nj,ni))
  192. SSTnemo_JAS[:,:] = nmp.mean(SSTnemo[6:9,:,:], axis=0)
  193. SSTobs_JAS = nmp.zeros((nj,ni))
  194. SSTobs_JAS[:,:] = nmp.mean(SSTobs[6:9,:,:], axis=0)
  195. # Can release some memory!
  196. del Tnemo, Tobs, SSTnemo, SSTobs
  197. #Annual (salinity):
  198. if l_do_monthly_3d or l_3df_are_annual:
  199. Snemo_annual = nmp.zeros((nk,nj,ni))
  200. if l_do_monthly_3d:
  201. Snemo_annual[:,:,:] = nmp.mean(Snemo[:,:,:,:], axis=0)
  202. if l_3df_are_annual:
  203. Snemo_annual[:,:,:] = Snemo[0,:,:,:]
  204. Sobs_annual = nmp.zeros((nk0,nj,ni))
  205. Sobs_annual[:,:,:] = nmp.mean(Sobs[:,:,:,:], axis=0)
  206. SSSnemo_annual = nmp.zeros((nj,ni))
  207. SSSnemo_annual[:,:] = nmp.mean(SSSnemo[:,:,:], axis=0)
  208. #JFM (salinity):
  209. if l_do_monthly_3d:
  210. Snemo_JFM = nmp.zeros((nk,nj,ni))
  211. Snemo_JFM[:,:,:] = nmp.mean(Snemo[:3,:,:,:], axis=0)
  212. Sobs_JFM = nmp.zeros((nk0,nj,ni))
  213. Sobs_JFM[:,:,:] = nmp.mean(Sobs[:3,:,:,:], axis=0)
  214. SSSnemo_JFM = nmp.zeros((nj,ni))
  215. SSSnemo_JFM[:,:] = nmp.mean(SSSnemo[:3,:,:], axis=0)
  216. #JAS (salinity):
  217. if l_do_monthly_3d:
  218. Snemo_JAS = nmp.zeros((nk,nj,ni))
  219. Snemo_JAS[:,:,:] = nmp.mean(Snemo[6:9,:,:,:], axis=0)
  220. Sobs_JAS = nmp.zeros((nk0,nj,ni))
  221. Sobs_JAS[:,:,:] = nmp.mean(Sobs[6:9,:,:,:], axis=0)
  222. SSSnemo_JAS = nmp.zeros((nj,ni))
  223. SSSnemo_JAS[:,:] = nmp.mean(SSSnemo[6:9,:,:], axis=0)
  224. # Can release some memory!
  225. del Snemo, Sobs, SSSnemo
  226. if l_do_monthly_3d or l_3df_are_annual:
  227. jk100 = bt.find_index_from_value(100. , vdepth) ; print 'jk100 = ', jk100, '=> ', vdepth[jk100]
  228. jk1000 = bt.find_index_from_value(1000. , vdepth) ; print 'jk1000 = ', jk1000, '=> ', vdepth[jk1000]
  229. jk3000 = bt.find_index_from_value(3000. , vdepth) ; print 'jk3000 = ', jk3000, '=> ', vdepth[jk3000]
  230. tdj = [ jk100, jk1000, jk3000 ]
  231. tdd_true = [ str(int(round(vdepth[jk100])))+'m' , str(int(round(vdepth[jk1000])))+'m' , str(int(round(vdepth[jk3000])))+'m' ]
  232. tdd = [ '100m', '1000m', '3000m' ]
  233. print '\n', tdd_true[:], '\n'
  234. # Creating 1D long. and lat.:
  235. vlon = nmp.zeros(ni) ; vlon[:] = xlon[0,:]
  236. ji_lat0 = nmp.argmax(xlat[nj-1,:])
  237. vlat = nmp.zeros(nj) ; vlat[:] = xlat[:,ji_lat0]
  238. # Time for figures:
  239. # -----------------
  240. if lfig0:
  241. ctt = CONFEXP+': Mean Annual Zonal Anomaly of SST / "'+cname_obs+'", ('+cy1+'-'+cy2+')'
  242. vzc[:] = bt.mk_zonal(SSTnemo_annual[:,:] - SSTobs_annual[:,:], XMSK=imask[0,:,:])
  243. # Only at the end of all the experiments we do 2d plotting:
  244. bp.plot("zonal")(vlat, vzc, cfignm=path_fig+'1d_zonal_temp_anom_vs_'+CC, zmin=-5., zmax=5., dz=1.,
  245. xmin=-75., xmax=65., czunit=r'$^{\circ}$C', cfig_type=fig_type,
  246. ctitle=ctt)
  247. ctt = CONFEXP+': Mean Annual Zonal Anomaly of SSS / "'+cname_obs+'", ('+cy1+'-'+cy2+')'
  248. vzc[:] = bt.mk_zonal(SSSnemo_annual[:,:] - Sobs_annual[0,:,:], XMSK=imask[0,:,:])
  249. # Only at the end of all the experiments we do 2d plotting:
  250. bp.plot("zonal")(vlat, vzc, cfignm=path_fig+'1d_zonal_sali_anom_vs_'+CC , zmin=-2.5, zmax=2.5, dz=0.5,
  251. xmin=-75., xmax=65., czunit='PSU', cfig_type=fig_type,
  252. ctitle=ctt)
  253. if lfig1:
  254. # SST / Reynolds
  255. # JFM
  256. bp.plot("2d")(vlon, vlat, SSTnemo_JFM[:,:] - SSTobs_JFM[:,:],
  257. imask[0,:,:], tmin, tmax, dtemp,
  258. corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dsst_JFM_'+CONFEXP+'_-_'+CC,
  259. cbunit='K', cfig_type=fig_type,
  260. ctitle='SST difference to "'+cname_obs+'", JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  261. lforce_lim=True)
  262. # JAS
  263. bp.plot("2d")(vlon, vlat, SSTnemo_JAS[:,:] - SSTobs_JAS[:,:],
  264. imask[0,:,:], tmin, tmax, dtemp,
  265. corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dsst_JAS_'+CONFEXP+'_-_'+CC,
  266. cbunit='K', cfig_type=fig_type,
  267. ctitle='SST difference to "'+cname_obs+'", JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  268. lforce_lim=True)
  269. # Annual
  270. bp.plot("2d")(vlon, vlat, SSTnemo_annual[:,:] - SSTobs_annual[:,:],
  271. imask[0,:,:], tmin, tmax, dtemp,
  272. corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dsst_annual_'+CONFEXP+'_-_'+CC,
  273. cbunit='K', cfig_type=fig_type,
  274. ctitle='SST difference to "'+cname_obs+'", '+CONFEXP+' ('+cy1+'-'+cy2+')',
  275. lforce_lim=True)
  276. # Temperature 100m, 1000m... / climatology
  277. if l_do_monthly_3d or l_3df_are_annual:
  278. for jd in range(nmp.size(tdj)):
  279. jdepth = tdj[jd] ; cdepth = tdd[jd] ; cdepth_true = tdd_true[jd]
  280. print '\n Treating depth '+str(vdepth[jdepth])+' !!!'
  281. if jd < 1 and (not l_3df_are_annual):
  282. # JFM
  283. bp.plot("2d")(vlon, vlat, Tnemo_JFM[jdepth,:,:] - Tobs_JFM[jdepth,:,:],
  284. imask[jdepth,:,:], tmin, tmax, dtemp,
  285. corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dT_JFM_'+cdepth+'_'+CONFEXP+'_-_'+CC,
  286. cbunit='K', cfig_type=fig_type,
  287. ctitle='Temperature diff. to "'+cname_obs+'" at '+cdepth_true+', JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  288. lforce_lim=True)
  289. # JAS
  290. bp.plot("2d")(vlon, vlat, Tnemo_JAS[jdepth,:,:] - Tobs_JAS[jdepth,:,:],
  291. imask[jdepth,:,:], tmin, tmax, dtemp,
  292. corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dT_JAS_'+cdepth+'_'+CONFEXP+'_-_'+CC,
  293. cbunit='K', cfig_type=fig_type,
  294. ctitle='Temperature diff. to "'+cname_obs+'" at '+cdepth_true+', JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  295. lforce_lim=True)
  296. # Annual
  297. bp.plot("2d")(vlon, vlat, Tnemo_annual[jdepth,:,:] - Tobs_annual[jdepth,:,:],
  298. imask[jdepth,:,:], tmin, tmax, dtemp,
  299. corca=vdic['ORCA'], lkcont=False, cpal='RdBu_r', cfignm=path_fig+'dT_annual_'+cdepth+'_'+CONFEXP+'_-_'+CC,
  300. cbunit='K', cfig_type=fig_type,
  301. ctitle='Temperature diff. to "'+cname_obs+'" at '+cdepth_true+', '+CONFEXP+' ('+cy1+'-'+cy2+')',
  302. lforce_lim=True)
  303. # S S S
  304. # JFM
  305. bp.plot("2d")(vlon, vlat, SSSnemo_JFM[:,:] - Sobs_JFM[0,:,:],
  306. imask[0,:,:], smin, smax, dsali, cpal='PiYG_r',
  307. corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dsss_JFM_'+CONFEXP+'_-_'+CC,
  308. cbunit='PSU', cfig_type=fig_type,
  309. ctitle='SSS difference to "'+cname_obs+'", JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  310. lforce_lim=True)
  311. # JAS
  312. bp.plot("2d")(vlon, vlat, SSSnemo_JAS[:,:] - Sobs_JAS[0,:,:],
  313. imask[0,:,:], smin, smax, dsali, cpal='PiYG_r',
  314. corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dsss_JAS_'+CONFEXP+'_-_'+CC,
  315. cbunit='PSU', cfig_type=fig_type,
  316. ctitle='SSS difference to "'+cname_obs+'", JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  317. lforce_lim=True)
  318. # Annual
  319. bp.plot("2d")(vlon, vlat, SSSnemo_annual[:,:] - Sobs_annual[0,:,:],
  320. imask[0,:,:], smin, smax, dsali, cpal='PiYG_r',
  321. corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dsss_annual_'+CONFEXP+'_-_'+CC,
  322. cbunit='PSU', cfig_type=fig_type,
  323. ctitle='SSS difference to "'+cname_obs+'", '+CONFEXP+' ('+cy1+'-'+cy2+')',
  324. lforce_lim=True)
  325. # Salinity 100m, 1000m... / climatology
  326. if l_do_monthly_3d or l_3df_are_annual:
  327. for jd in range(nmp.size(tdj)):
  328. jdepth = tdj[jd] ; cdepth = tdd[jd] ; cdepth_true = tdd_true[jd]
  329. print '\n Treating depth '+str(vdepth[jdepth])+' !!!'
  330. if jd < 1 and (not l_3df_are_annual):
  331. # JFM
  332. bp.plot("2d")(vlon, vlat, Snemo_JFM[jdepth,:,:] - Sobs_JFM[jdepth,:,:],
  333. imask[jdepth,:,:], smin, smax, dsali, cpal='PiYG_r',
  334. corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dS_JFM_'+cdepth+'_'+CONFEXP+'_-_'+CC,
  335. cbunit='PSU', cfig_type=fig_type,
  336. ctitle='Salinity diff. to "'+cname_obs+'" at '+cdepth_true+', JFM, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  337. lforce_lim=True)
  338. # JAS
  339. bp.plot("2d")(vlon, vlat, Snemo_JAS[jdepth,:,:] - Sobs_JAS[jdepth,:,:],
  340. imask[jdepth,:,:], smin, smax, dsali, cpal='PiYG_r',
  341. corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dS_JAS_'+cdepth+'_'+CONFEXP+'_-_'+CC,
  342. cbunit='PSU', cfig_type=fig_type,
  343. ctitle='Salinity diff. to "'+cname_obs+'" at '+cdepth_true+', JAS, '+CONFEXP+' ('+cy1+'-'+cy2+')',
  344. lforce_lim=True)
  345. # Annual
  346. bp.plot("2d")(vlon, vlat, Snemo_annual[jdepth,:,:] - Sobs_annual[jdepth,:,:],
  347. imask[jdepth,:,:], smin, smax, dsali, cpal='PiYG_r',
  348. corca=vdic['ORCA'], lkcont=False, cfignm=path_fig+'dS_annual_'+cdepth+'_'+CONFEXP+'_-_'+CC,
  349. cbunit='PSU', cfig_type=fig_type,
  350. ctitle='Salinity diff. to "'+cname_obs+'" at '+cdepth_true+', '+CONFEXP+' ('+cy1+'-'+cy2+')',
  351. lforce_lim=True)
  352. del Sobs_JFM, Sobs_JAS
  353. if l_do_monthly_3d: del Tnemo_JFM, Tnemo_JAS, Snemo_JFM, Snemo_JAS, Tobs_JFM, Tobs_JAS
  354. # Temperature and salinity for vertical sections
  355. if lfig2 and i_do_sect==1 and (l_do_monthly_3d or l_3df_are_annual):
  356. vdico = bt.check_env_var(sys.argv[0], {'TS_SECTION_FILE'})
  357. vboxes, vlon1, vlat1, vlon2, vlat2, vTmin, vTmax, vSmin, vSmax = bt.read_coor(vdico['TS_SECTION_FILE'], ctype='float', lTS_bounds=True)
  358. js = 0
  359. for csname in vboxes:
  360. [ i1, i2, j1, j2 ] = bo.transect_zon_or_med(vlon1[js], vlon2[js], vlat1[js], vlat2[js], xlon, xlat)
  361. if i2>i1 and i2 < ni0-1: i2 = i2+1
  362. if j2>j1 and j2 < nj0-1: j2 = j2+1
  363. print '\n *** Section: '+csname+':'
  364. print ' lon1, lon2, lat1, lat2 =', vlon1[js], vlon2[js], vlat1[js], vlat2[js]
  365. print ' => i1, i2, j1, j2 =', i1, i2, j1, j2
  366. #print ' xlon[j1,i1], xlon[j1,i2] =', xlon[j1,i1]-360., xlon[j1,i2]
  367. print ''
  368. if i1 > i2: print 'ERROR (temp_sal.py) => i1 > i2 !'; sys.exit(0)
  369. if j1 > j2: print 'ERROR (temp_sal.py) => j1 > j2 !'; sys.exit(0)
  370. lzonal = False
  371. if i1 == i2:
  372. print ' ==> Meridional section!'
  373. vaxis = xlat[j1:j2+1,i1]
  374. ZT = Tnemo_annual[:,j1:j2+1,i1] ; ZS = Snemo_annual[:,j1:j2+1,i1]
  375. OT = Tobs_annual[:,j1:j2+1,i1] ; OS = Sobs_annual[:,j1:j2+1,i1]
  376. imsk = imask[:,j1:j2+1,i1]
  377. cinfo = ', lon='+str(vlon1[js])
  378. xmn=vlat1[js]; xmx=vlat2[js]
  379. if j1 == j2:
  380. print ' ==> Zonal section!'
  381. lzonal = True
  382. xmn=vlon1[js]; xmx=vlon2[js]
  383. vx = xlon[j1,i1:i2+1] ; vaxis = nmp.zeros(len(vx)) ; vaxis[:] = vx[:]
  384. if xmx<0. and xmn>0.:
  385. xmx = 360. + xmx
  386. else:
  387. ivf = nmp.where(vx>180.); vaxis[ivf] = vx[ivf] - 360.
  388. ZT = Tnemo_annual[:,j1,i1:i2+1] ; ZS = Snemo_annual[:,j1,i1:i2+1]
  389. OT = Tobs_annual[:,j1,i1:i2+1] ; OS = Sobs_annual[:,j1,i1:i2+1]
  390. imsk = imask[:,j1,i1:i2+1]
  391. cinfo = ', lat='+str(vlat1[js])
  392. Ta = vTmax[js] - vTmin[js]
  393. if Ta < 1. : print 'ERROR (temp_sal.py) => Problem with your min and max for T for section "'+csname+'" !'; sys.exit(0)
  394. if Ta >= 25.: dT = 1.
  395. if Ta >= 10. and Ta < 25.: dT = 0.5
  396. if Ta >= 5. and Ta < 10.: dT = 0.25
  397. if Ta > 0. and Ta < 5.: dT = 0.1
  398. Sa = vSmax[js] - vSmin[js]
  399. if Sa < 0.001 : print 'ERROR (temp_sal.py) => Problem with your min and max for S for section "'+csname+'" !'; sys.exit(0)
  400. if Sa >= 3. : dS = 0.1
  401. if Sa >= 1.5 and Sa < 3. : dS = 0.05
  402. if Sa >= 0.5 and Sa < 1.5: dS = 0.025
  403. if Sa >= 0. and Sa < 0.5: dS = 0.01
  404. bp.plot("vert_section")(vaxis, vdepth, ZT, imsk, vTmin[js], vTmax[js], dT,
  405. cpal='ncview_nrl', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
  406. cfignm=path_fig+'section_T_'+csname+'_'+CONFEXP, cbunit=r'$^{\circ}$C', cxunit=r'Latitude ($^{\circ}$N)',
  407. czunit='Depth (m)', ctitle='Temperature, ('+cy1+'-'+cy2+'), '+csname+', '+CONFEXP+cinfo,
  408. cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
  409. bp.plot("vert_section")(vaxis, vdepth, ZS, imsk, vSmin[js], vSmax[js], dS,
  410. cpal='ncview_jaisnb', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
  411. cfignm=path_fig+'section_S_'+csname+'_'+CONFEXP, cbunit='PSU', cxunit=r'Latitude ($^{\circ}$N)',
  412. czunit='Depth (m)', ctitle='Salinity, ('+cy1+'-'+cy2+'), '+csname+', '+CONFEXP+cinfo,
  413. cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
  414. # OBS:
  415. bp.plot("vert_section")(vaxis, vdepth, OT, imsk, vTmin[js], vTmax[js], dT,
  416. cpal='ncview_nrl', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
  417. cfignm=path_fig+'section_T_'+csname+'_'+CC, cbunit=r'$^{\circ}$C',
  418. cxunit=r'Latitude ($^{\circ}$N)',
  419. czunit='Depth (m)', ctitle='Temperature, '+csname+', "'+cname_obs+'"'+cinfo,
  420. cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
  421. #
  422. bp.plot("vert_section")(vaxis, vdepth, OS, imsk, vSmin[js], vSmax[js], dS,
  423. cpal='ncview_jaisnb', lzonal=lzonal, xmin=xmn, xmax=xmx, dx=5.,
  424. cfignm=path_fig+'section_S_'+csname+'_'+CC, cbunit='PSU',
  425. cxunit=r'Latitude ($^{\circ}$N)',
  426. czunit='Depth (m)', ctitle='Salinity, '+csname+', "'+cname_obs+'"'+cinfo,
  427. cfig_type=fig_type, lforce_lim=False, i_cb_subsamp=2)
  428. js=js+1
  429. print '\n Bye!'