source: BOL/Multi_atlas/atlas/atlas_none.py @ 4531

Last change on this file since 4531 was 4345, checked in by musat, 21 months ago

Plusieurs appels climaf et tracers moyennes
zonales par climaf commentes
IonelaMusat?

File size: 18.4 KB
RevLine 
[3684]1# -*- coding: iso-8859-1 -*-
2# Created : S.Sénési - nov 2015
3
4#
5desc="\nCreation d'un atlas pour une simu, une grille et une liste de variables et de saisons \n"+\
6"  Exemples : \n"+\
7"  >>> python ./atlas.py -v tas,hfls -s NPv3.1ada_1982_1991\n"+\
8""
9# Avec CliMAF, cette etape est loin d'etre necessaire; on la réalise pour 'exposer' ces fichiers
10# dans une arborescence à laquelle sont habitues certains utilisateurs
11
12
13# Répertoire de base pour les entrées et les résultats
[4309]14dir_default='/thredds/ipsl/fabric/lmdz/SE/ORIG'
[3684]15
16# Gestion des options et arguments d'appel
17from optparse import OptionParser
18parser = OptionParser(desc) ; parser.set_usage("%%prog [-h]\n%s" % desc)
19#parser.add_option("-i", "--input", help="repertoire des donnes d'entree(defaut : %s)"%dir_default,
20#                  action="store",default=dir_default)
21parser.add_option("-i", "--input", help="repertoire des donnes d'entree(defaut : %s)",
22                  action="store",default=None)
[4309]23#parser.add_option("-g", "--grid", help="nom de grille (default: VLR)", action="store",default='VLR')
24parser.add_option("-g", "--grid", help="nom de grille (default: VLR)", action="store",default='')
25
26parser.add_option("-r", "--region", help="nom de zone (GLOB, ATLTN, etc; default: GLOB)", action="store",default='GLOB')
[3684]27parser.add_option("-p", "--season", help="saison a traiter " "(eg : JJA, DJF, YEAR, defaut=%YEAR)", 
[4309]28#parser.add_option("--season", help="saison a traiter " "(eg : JJA, DJF, YEAR, defaut=%YEAR)",
29#parser.add_option("-r", "--region", help="région a traiter " "(eg : GLOB, ATLTN, defaut=%GLOB)",
[3684]30                  action="store", default='YEAR')
31parser.add_option("-s", "--simulation", help="simulation+annees a traiter (sim_YYY1_YYY2) - laisser vide pour lister",
32                  action="store",default=None)
33parser.add_option("-t", "--reference", help="simulation de reference (sim_YYY1_YYY2, default=OBS) ",
34                  action="store",default='OBS')
35parser.add_option("-v", "--variables", help="liste des variables (separees par des virgules)", action="store",default=None)
36#parser.add_option("--root", help="Path to the root directory", action="store",default=None)
37parser.add_option("--root", help="Path to the root directory", action="store",default=None)
38parser.add_option("-f", "--force", help="force le recalcul de champs existants", 
39                  action="store_true",default=None)
[3915]40parser.add_option("--dirpng",help="Path of the simulation directory", action="store",default=None)
[3684]41parser.add_option("-o", "--pdf", help="nom du pdf de sortie (default: atlas_<SIMU>_<SAISON>.pdf)", action="store")
[4309]42parser.add_option("--lonmin", help="longitude minimale",action="store",default='0')
43parser.add_option("--lonmax", help="longitude maximale",action="store",default='360')
44parser.add_option("--latmin", help="latitude minimale",action="store",default='-90')
45parser.add_option("--latmax", help="latitude maximale",action="store",default='90')
46parser.add_option("--pmin", help="pression minimale",action="store",default='1')
[3684]47(opts, args) = parser.parse_args()
48
[4320]49print('pmin = ',opts.pmin)
[4309]50centerlon=float(opts.lonmax)-180
[4320]51print('centerlon = ',centerlon)
52
[3684]53#---------------------------------------------------------------------------------
54import math
55from climaf.api import *
56from climaf.html import * 
57# La description de l'organisation des données SE et des alias et rescalings
58# est partagée dans une micro-librairie :
59from lmdz_SE import * # svsg, all_SE_simulations
60from plot_params import plot_params
61#---------------------------------------------------------------------------------
62#
63clog('debug')
[4309]64#crm(pattern='pme')
65#crm(pattern='hflsevap')
[3684]66#crm(pattern='tasmax')
67#crm(pattern='tasmin')
68def apply_scale_offset(dat,scale,offset):
69    return ccdo(ccdo(dat,operator='mulc,'+str(float(scale))),operator='addc,'+str(float(offset)))
70#
71#craz()
72if opts.simulation is None:
[4320]73    print("Available simulations at %s are : "%opts.input,)
74    for s in all_SE_simulations() : print(s,)
[3684]75    exit(0)
76#
77lvars=opts.variables
78if lvars is not None : lvars=lvars.split(',')
79else : lvars=variables_list
80#
81# Preparons une commande pour assembler les sorties Pdf
82if opts.pdf : pdffile=opts.pdf
83else: pdffile="atlas_"+opts.simulation+"_"+opts.season+".pdf"
84pdfargs=["pdfjam","--landscape","-o ",pdffile]
85#
86# Initialisation de l'index html
87index= header("LMDZ Atlas for "+opts.simulation+ " versus "+opts.reference+" ("+opts.season+")") 
88index += cell('PDF',pdffile)
89index += section("2d vars", level=4)
90index += open_table()
91#
92# Titres de colonnes
93ref=opts.reference ; 
94if (ref == 'OBS' ) : text_diff='bias'
95else:                text_diff='diff'
96index+=open_line('VARIABLE')+cell('bias')+cell('rmse')+cell('mean')+cell(ref)+cell(text_diff)+\
97        cell('zonal')+cell('all')+cell('pdf')+close_line()
98#
99# -- Declare the script ml2pl for vertical interpolation
[4309]100cscript("ml2pl", "/home/fabric/LMDZ/atlas/ml2pl.sh -p ${var_2} -m ${var_1} ${in_1} ${out} ${in_2}",
[3684]101    commuteWithTimeConcatenation=True, commuteWithSpaceConcatenation=True)
102# -- Vertical levels for the vertical interpolation
103fixed_fields("ml2pl",("press_levels.txt","/home/fabric/LMDZ/atlas/press_levels.txt"))
104#
105for variable  in lvars :
106    # Get the model and the reference
107    if opts.root:
108       simu=svsg(opts.simulation,variable,opts.season,opts.grid, root=opts.root)
109    else:
110       simu=svsg(opts.simulation,variable,opts.season,opts.grid)
[4320]111    print('variable = ',variable)
[3684]112    reff=svsg(opts.reference,variable,opts.season,opts.grid)
113    #
114    # If the variable is a 3D field:
115    #  - interpolate the variable on the standard pressure levels with ml2pl (L. Guez)
116    #  - Compute the difference model-ref with diff_zonmean (computes the zonal mean lat/pressure fields,
117    #    interpolates the model on the ref, both vertically and horizontally, and returns the difference)
118    if is3d(variable) :
[4309]119#cas1 sim2 != sim1 ; sim1 != OBS ; sim2 != OBS
120       if (opts.simulation != 'OBS' and opts.reference != 'OBS' and opts.simulation != opts.reference ) : 
[4320]121           print('simu = ',opts.simulation)
122           print('reff = ',opts.reference)
[4309]123           simu_pres = svsg(opts.simulation,'pres',opts.season,opts.grid)
124           simu = ml2pl(simu,simu_pres)
125           simu = zonmean(simu)
[4320]126           print('simu = ',simu)
[3885]127           reff_pres = svsg(opts.reference,'pres',opts.season,opts.grid)
128           reff = ml2pl(reff,reff_pres)
[4309]129           reff = zonmean(reff)
[4320]130           print('reff = ',reff)
[4309]131### IM250821 : projection grille horizontale
132#          reff=regrid(reff,simu)
133           simu=regrid(simu,reff)
134           diff=minus(simu,reff)
[4320]135           print('diff_zonmean simu = ',diff)
136           print(' cas1 sim ref on pressure levels w/ zonmean ')
[4309]137#cas2 sim !=$ OBS ; ref = OBS
138       elif (opts.simulation != 'OBS' and opts.reference == 'OBS' ) : 
[4320]139           print('cas2')
[4309]140### interpolation sur des niveaux de pression
141           simu_pres = svsg(opts.simulation,'pres',opts.season,opts.grid)
142           simu = ml2pl(simu,simu_pres)
143### moyenne zonale
[4320]144           simu = zonmean(simu)
[4309]145### moyenne zonale
146           reff = zonmean(reff)
147### projection grille simu
148           reff=regrid(reff,simu)
149### differences moyennes zonales
150           diff=minus(simu,reff)
[4320]151           print(' cas2 sim ref on pressure levels w/ zonmean ')
[4309]152#cas3 sim1 = sim2
153       elif ( opts.simulation == opts.reference and opts.simulation != 'OBS') : 
154           simu_pres = svsg(opts.simulation,'pres',opts.season,opts.grid)
155           simu = ml2pl(simu,simu_pres)
156           simu = zonmean(simu)
157           reff = simu
158           diff=minus(simu,reff)
[4320]159           print(' cas3 sim ref on pressure levels w/ zonmean ')
[4309]160       else :
[4320]161           print(' Cas non prevu !! ')
162           print(' Modifier l appel de atlas_none.py et relancer ')
[4309]163           exit(0)
[3684]164    else:
[4309]165#27.11.21 if (opts.grid == '' ) : reff=regrid(reff,simu)
[4320]166       if ( opts.simulation != opts.reference ) : reff=regrid(reff,simu)
167    diff=minus(simu,reff)
[3684]168
169    pparams = plot_params(variable,'full_field')
170    vertical_interval = 'trYMaxF=1000|trYMinF=1'
[4309]171    #vertical_interval = 'trYMaxF=1000|trYMinF=100'
172    #vertical_interval = 'trYMaxF=1000|trYMinF='+opts.pmin
173    vertical_interval = 'trYMaxF=1000|trYMinF=1'
[3684]174    stringFontHeight=0.018
175    if is3d(variable):
[4309]176        #pparams.update({'options':vertical_interval, 'y':'lin'})
177        pparams.update({'options':vertical_interval+'|gsnYAxisIrregular2Linear=True'})
[3684]178        stringFontHeight=0.03
179    # Map for simulation
[4309]180    simu_fig=plot(llbox(simu,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
181                  title="",
[3684]182                  gsnLeftString=variable,
183                  gsnCenterString=opts.simulation,
184                  gsnRightString=opts.season,
185                  gsnStringFontHeightF=stringFontHeight,
[4309]186                  mpCenterLonF=centerlon,
[3684]187                  **pparams)
[4309]188#                 mpCenterLonF=0,
189    # Single figures
[3915]190    page=cpage([[simu_fig]],orientation='landscape', page_trim=True, fig_trim=True)
191    pdf_page=cpage([[simu_fig]],orientation='landscape',
[4309]192    page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
[4320]193    print('PB = ',opts.dirpng,opts.season,opts.simulation,'MAP',opts.region,variable)
194    print('DIRpng/im.pdf=',opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/MAP/"+opts.region+"/"+variable+".pdf")
[4309]195    pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/MAP/"+opts.region+"/"+variable+".pdf"))
[3684]196    simu_avg=cvalue(space_average(simu))
197    #
198    # Map for reference
[4309]199    ref_fig=plot(llbox(reff,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
200                 title="",
[3684]201                 gsnLeftString=variable,
202                 gsnCenterString=ref,
203                 gsnRightString=opts.season,
204                 gsnStringFontHeightF=stringFontHeight,
[4309]205                 mpCenterLonF=centerlon,
[3684]206                 **pparams)
[4309]207#                mpCenterLonF=0,
[3915]208    #    # Single figures ref_fig
209    page=cpage([[ref_fig]],orientation='landscape', page_trim=True, fig_trim=True)
210    pdf_page=cpage([[ref_fig]],orientation='landscape',
211        page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
[4309]212    pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.reference+"/MAP/"+opts.region+"/"+variable+".pdf"))
[3684]213    ref_avg=cvalue(space_average(reff))
214    #
215    # Bias (or difference between simulations) map
216    if (ref == 'OBS' ) : p=plot_params(variable,'bias')
217    else:                p=plot_params(variable,'model_model')
218    tmp_aux_params = plot_params(variable,'full_field')
219    scale = 1.0 ; offset = 0.0
220    if 'offset' in tmp_aux_params or 'scale' in tmp_aux_params:
221       if 'offset' in tmp_aux_params:
222          offset = tmp_aux_params['offset']
223       else:
[4320]224          offset=0.0
[3684]225       if 'scale' in tmp_aux_params:
226          scale = tmp_aux_params['scale']
227       else:
228          scale=1.0
229       wreff = apply_scale_offset(reff,scale,offset)
230       wsimu = apply_scale_offset(simu,scale,offset)
231    else:
232       wreff = reff
233       wsimu = simu
234    #
235    if is3d(variable):
[4309]236        #p.update({'options':vertical_interval, 'y':'lin'})
237        p.update({'options':vertical_interval+'|gsnYAxisIrregular2Linear=True'})
[3684]238    if variable in ['ua','va','ta','hus','hur']:
239        tmp_levs = tmp_aux_params['colors']
240        p.update({'contours':tmp_levs})
[4309]241        diff_fig=plot(llbox(diff,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
242                  llbox(wreff,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
243                  title="", format='png',
[3684]244                  gsnLeftString=variable,
245                  gsnCenterString=opts.simulation+' - '+ref,
246                  gsnRightString=opts.season,
247                  gsnStringFontHeightF=stringFontHeight,
248                  aux_options='cnLineThicknessF=2|cnLineLabelsOn=True', **p)
[3915]249    #    # Single figures diff_fig
250        page=cpage([[diff_fig]],orientation='landscape', page_trim=True, fig_trim=True)
251        pdf_page=cpage([[diff_fig]],orientation='landscape',
252                page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
[4309]253        pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/DMAP_"+opts.reference+"/"+opts.region+"/"+variable+".pdf"))
[3684]254    else:
255        p.update({'contours':1})
[4309]256        diff_fig=plot(llbox(diff,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
257                  title="", format='png',
[3684]258                  gsnLeftString=variable,
259                  gsnCenterString=opts.simulation+' - '+ref,
260                  gsnRightString=opts.season,
261                  gsnStringFontHeightF=stringFontHeight,
[4309]262                  mpCenterLonF=centerlon,
[3684]263                  **p)
[4309]264#                 mpCenterLonF=0,
[3684]265
266    #
267    # Bias mean value, and RMSD/RMSE
268    diff_avg=cvalue(space_average(diff))
[4330]269    rmsd=math.sqrt(cvalue(space_average(ccdo(diff,operator='b F64 sqr'))))
[3684]270    #
271    # Zonal means
272    if not is3d(variable):
273        # -- apply a mask corresponding to the reference
[4345]274        #IMorig mask = div(reff,reff)
275        #IMorig msimu = mul(wsimu,mask)
[4320]276        # -- Compute the zonal mean
[4345]277        #IMorig zmean=ccdo(msimu, operator='zonmean')
278        #IMorig ref_zmean=ccdo(wreff, operator='zonmean')
[3684]279        #
[4345]280        #IMorig sim=opts.simulation
[4320]281        #if variable in ['zg500']:
282        #   ref_zmean = ccdo(ref_zmean,operator='-b F32 mulc,1')
[3684]283        #   zmean = ccdo(zmean,operator='-b F32 mulc,1')
[4345]284        #IMorig zmean_fig=curves(cens([sim,ref],zmean,ref_zmean),
285        #IMorig                  title="",
286        #IMorig                  lgcols=3,
287               #IMorig           options=#'tiYAxisString=""|'+\
288                #IMorig                  #'+\'+\
289                #IMorig                  'tmYROn=True|'+\
290        #IMorig                          'tmYRBorderOn=True|'+\
291        #IMorig                          'tmYLOn=False|'+\
292        #IMorig                          'tmYUseRight=True|'+\
293        #IMorig                          'vpXF=0|'+\
294        #IMorig                          'vpWidthF=0.66|'+\
295        #IMorig                          'vpHeightF=0.33|'+\
296        #IMorig                          'tmYRLabelsOn=True|'+\
297        #IMorig                          'tmXBLabelFontHeightF=0.018|'+\
298        #IMorig                          'tmYLLabelFontHeightF=0.016|'+\
299        #IMorig                          'lgLabelFontHeightF=0.018|'+\
300        #IMorig                          #'pmLegendSide=Bottom|'+\
301        #IMorig                          'pmLegendOrthogonalPosF=-0.32|'+\
302        #IMorig                          'pmLegendParallelPosF=1.0|'+\
303        #IMorig                          'tmXMajorGrid=True|'+\
304        #IMorig                          'tmYMajorGrid=True|'+\
305        #IMorig                          'tmXMajorGridLineDashPattern=2|'+\
306        #IMorig                          'tmYMajorGridLineDashPattern=2|'+\
307        #IMorig                          'xyLineThicknessF=8|'+\
308        #IMorig                          'gsnLeftString='+variable+'|'+\
309        #IMorig                          'gsnCenterString='+opts.simulation+' vs '+ref+'|'+\
310        #IMorig                          'gsnRightString='+opts.season+'|'+\
311        #IMorig                          'gsnStringFontHeightF='+str(stringFontHeight))
[3915]312    #    # Single figures
[4309]313        page=cpage([[simu_fig]],orientation='landscape', page_trim=True, fig_trim=True)
314        pdf_page=cpage([[simu_fig]],orientation='landscape', 
315                page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
316        pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/MAP/"+opts.region+"/"+variable+".pdf"))
[3915]317    #    # Single figures ref_fig
[4309]318        page=cpage([[ref_fig]],orientation='landscape', page_trim=True, fig_trim=True)
319        pdf_page=cpage([[ref_fig]],orientation='landscape', 
320                page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
321        pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.reference+"/MAP/"+opts.region+"/"+variable+".pdf"))
[3915]322    #    # Single figures diff_fig
[4309]323        page=cpage([[diff_fig]],orientation='landscape', page_trim=True, fig_trim=True)
324        pdf_page=cpage([[diff_fig]],orientation='landscape', 
325                page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
326        pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/DMAP_"+opts.reference+"/"+opts.region+"/"+variable+".pdf"))
[3915]327# Creation du Pdf multi-pages
[4309]328        comm=subprocess.Popen(pdfargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
[3684]329    #    # Composite figure
330    if is3d(variable):
[4320]331        page=cpage([[simu_fig,ref_fig],[diff_fig,None]],orientation='landscape', page_trim=True, fig_trim=True)
332        pdf_page=cpage([[simu_fig,ref_fig],[diff_fig,None]],orientation='landscape',
[3684]333                   page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
334    else:
[4345]335        #IMorig page=cpage([[simu_fig,ref_fig],[diff_fig,zmean_fig]],orientation='landscape', page_trim=True, fig_trim=True)
336        page=cpage([[simu_fig,ref_fig],[diff_fig,diff_fig]],orientation='landscape', page_trim=True, fig_trim=True)
337        #IMorig pdf_page=cpage([[simu_fig,ref_fig],[diff_fig,zmean_fig]],orientation='landscape',
338        pdf_page=cpage([[simu_fig,ref_fig],[diff_fig,diff_fig]],orientation='landscape', 
[3684]339                   page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
[4309]340    pdfargs.append(cfile(pdf_page))
[3684]341    #
342    thumbnail_size = 200
343    if is3d(variable):
[4320]344            index+=open_line(varlongname(variable)+' ('+variable+')')+\
345                    cell("%.2g"%diff_avg,cfile(diff_fig))+\
346                    cell("%.2g"%rmsd,cfile(diff_fig))+\
347                    cell(simu,cfile(simu_fig),thumbnail=thumbnail_size,hover=False)+\
348                    cell(ref,cfile(ref_fig),thumbnail=thumbnail_size,hover=False)+\
349                    cell(text_diff,cfile(diff_fig),thumbnail=thumbnail_size,hover=False)+\
350                    ' '+\
351                    cell('page',cfile(page),thumbnail=thumbnail_size,hover=False)+\
352                    cell('Pdf',cfile(pdf_page))
353            close_line()
[3684]354    else:
[4320]355            index+=open_line(varlongname(variable)+' ('+variable+')')+\
356                    cell("%.2g"%diff_avg,cfile(diff_fig))+\
357                    cell("%.2g"%rmsd,cfile(diff_fig))+\
358                    cell(simu,cfile(simu_fig),thumbnail=thumbnail_size,hover=False)+\
359                    cell(ref,cfile(ref_fig),thumbnail=thumbnail_size,hover=False)+\
360                    cell(text_diff,cfile(diff_fig),thumbnail=thumbnail_size,hover=False)+\
[4345]361                    cell('zonal mean',cfile(diff_fig),thumbnail=thumbnail_size,hover=False)+\
[4320]362                    cell('page',cfile(page),thumbnail=thumbnail_size,hover=False)+\
363                    cell('Pdf',cfile(pdf_page))
364            close_line()
[4345]365#IMorig: au-dessus cell('zonal mean',cfile(zmean_fig),thumbnail=thumbnail_size,hover=False)+\
366
[3684]367# Finalisons l'index html
368index += close_table()
369index += trailer()
[3885]370out="index_"+opts.region+"_"+opts.season+"_"+opts.simulation+".html"
[3684]371with open(out,"w") as filout : filout.write(index)
372#
373# Creation du Pdf multi-pages
374comm=subprocess.Popen(pdfargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
375#
376import os,os.path ; 
377# print("Attendez un bon peu : lancemement de firefox sur Ciclad....")
378# os.system("firefox file://"+os.path.abspath(os.path.curdir)+"/"+out+"&")
Note: See TracBrowser for help on using the repository browser.