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

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

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

File size: 18.4 KB
Line 
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
14dir_default='/thredds/ipsl/fabric/lmdz/SE/ORIG'
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)
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')
27parser.add_option("-p", "--season", help="saison a traiter " "(eg : JJA, DJF, YEAR, defaut=%YEAR)", 
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)",
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)
40parser.add_option("--dirpng",help="Path of the simulation directory", action="store",default=None)
41parser.add_option("-o", "--pdf", help="nom du pdf de sortie (default: atlas_<SIMU>_<SAISON>.pdf)", action="store")
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')
47(opts, args) = parser.parse_args()
48
49print('pmin = ',opts.pmin)
50centerlon=float(opts.lonmax)-180
51print('centerlon = ',centerlon)
52
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')
64#crm(pattern='pme')
65#crm(pattern='hflsevap')
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:
73    print("Available simulations at %s are : "%opts.input,)
74    for s in all_SE_simulations() : print(s,)
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
100cscript("ml2pl", "/home/fabric/LMDZ/atlas/ml2pl.sh -p ${var_2} -m ${var_1} ${in_1} ${out} ${in_2}",
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)
111    print('variable = ',variable)
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) :
119#cas1 sim2 != sim1 ; sim1 != OBS ; sim2 != OBS
120       if (opts.simulation != 'OBS' and opts.reference != 'OBS' and opts.simulation != opts.reference ) : 
121           print('simu = ',opts.simulation)
122           print('reff = ',opts.reference)
123           simu_pres = svsg(opts.simulation,'pres',opts.season,opts.grid)
124           simu = ml2pl(simu,simu_pres)
125           simu = zonmean(simu)
126           print('simu = ',simu)
127           reff_pres = svsg(opts.reference,'pres',opts.season,opts.grid)
128           reff = ml2pl(reff,reff_pres)
129           reff = zonmean(reff)
130           print('reff = ',reff)
131### IM250821 : projection grille horizontale
132#          reff=regrid(reff,simu)
133           simu=regrid(simu,reff)
134           diff=minus(simu,reff)
135           print('diff_zonmean simu = ',diff)
136           print(' cas1 sim ref on pressure levels w/ zonmean ')
137#cas2 sim !=$ OBS ; ref = OBS
138       elif (opts.simulation != 'OBS' and opts.reference == 'OBS' ) : 
139           print('cas2')
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
144           simu = zonmean(simu)
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)
151           print(' cas2 sim ref on pressure levels w/ zonmean ')
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)
159           print(' cas3 sim ref on pressure levels w/ zonmean ')
160       else :
161           print(' Cas non prevu !! ')
162           print(' Modifier l appel de atlas_none.py et relancer ')
163           exit(0)
164    else:
165#27.11.21 if (opts.grid == '' ) : reff=regrid(reff,simu)
166       if ( opts.simulation != opts.reference ) : reff=regrid(reff,simu)
167    diff=minus(simu,reff)
168
169    pparams = plot_params(variable,'full_field')
170    vertical_interval = 'trYMaxF=1000|trYMinF=1'
171    #vertical_interval = 'trYMaxF=1000|trYMinF=100'
172    #vertical_interval = 'trYMaxF=1000|trYMinF='+opts.pmin
173    vertical_interval = 'trYMaxF=1000|trYMinF=1'
174    stringFontHeight=0.018
175    if is3d(variable):
176        #pparams.update({'options':vertical_interval, 'y':'lin'})
177        pparams.update({'options':vertical_interval+'|gsnYAxisIrregular2Linear=True'})
178        stringFontHeight=0.03
179    # Map for simulation
180    simu_fig=plot(llbox(simu,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
181                  title="",
182                  gsnLeftString=variable,
183                  gsnCenterString=opts.simulation,
184                  gsnRightString=opts.season,
185                  gsnStringFontHeightF=stringFontHeight,
186                  mpCenterLonF=centerlon,
187                  **pparams)
188#                 mpCenterLonF=0,
189    # Single figures
190    page=cpage([[simu_fig]],orientation='landscape', page_trim=True, fig_trim=True)
191    pdf_page=cpage([[simu_fig]],orientation='landscape',
192    page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
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")
195    pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/MAP/"+opts.region+"/"+variable+".pdf"))
196    simu_avg=cvalue(space_average(simu))
197    #
198    # Map for reference
199    ref_fig=plot(llbox(reff,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
200                 title="",
201                 gsnLeftString=variable,
202                 gsnCenterString=ref,
203                 gsnRightString=opts.season,
204                 gsnStringFontHeightF=stringFontHeight,
205                 mpCenterLonF=centerlon,
206                 **pparams)
207#                mpCenterLonF=0,
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)
212    pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.reference+"/MAP/"+opts.region+"/"+variable+".pdf"))
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:
224          offset=0.0
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):
236        #p.update({'options':vertical_interval, 'y':'lin'})
237        p.update({'options':vertical_interval+'|gsnYAxisIrregular2Linear=True'})
238    if variable in ['ua','va','ta','hus','hur']:
239        tmp_levs = tmp_aux_params['colors']
240        p.update({'contours':tmp_levs})
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',
244                  gsnLeftString=variable,
245                  gsnCenterString=opts.simulation+' - '+ref,
246                  gsnRightString=opts.season,
247                  gsnStringFontHeightF=stringFontHeight,
248                  aux_options='cnLineThicknessF=2|cnLineLabelsOn=True', **p)
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)
253        pdfargs.append(cfile(pdf_page,target=opts.dirpng+"/"+opts.season+"/"+opts.simulation+"/DMAP_"+opts.reference+"/"+opts.region+"/"+variable+".pdf"))
254    else:
255        p.update({'contours':1})
256        diff_fig=plot(llbox(diff,lonmin=opts.lonmin,lonmax=opts.lonmax,latmin=opts.latmin,latmax=opts.latmax),
257                  title="", format='png',
258                  gsnLeftString=variable,
259                  gsnCenterString=opts.simulation+' - '+ref,
260                  gsnRightString=opts.season,
261                  gsnStringFontHeightF=stringFontHeight,
262                  mpCenterLonF=centerlon,
263                  **p)
264#                 mpCenterLonF=0,
265
266    #
267    # Bias mean value, and RMSD/RMSE
268    diff_avg=cvalue(space_average(diff))
269    rmsd=math.sqrt(cvalue(space_average(ccdo(diff,operator='b F64 sqr'))))
270    #
271    # Zonal means
272    if not is3d(variable):
273        # -- apply a mask corresponding to the reference
274        #IMorig mask = div(reff,reff)
275        #IMorig msimu = mul(wsimu,mask)
276        # -- Compute the zonal mean
277        #IMorig zmean=ccdo(msimu, operator='zonmean')
278        #IMorig ref_zmean=ccdo(wreff, operator='zonmean')
279        #
280        #IMorig sim=opts.simulation
281        #if variable in ['zg500']:
282        #   ref_zmean = ccdo(ref_zmean,operator='-b F32 mulc,1')
283        #   zmean = ccdo(zmean,operator='-b F32 mulc,1')
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))
312    #    # Single figures
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"))
317    #    # Single figures ref_fig
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"))
322    #    # Single figures diff_fig
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"))
327# Creation du Pdf multi-pages
328        comm=subprocess.Popen(pdfargs, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
329    #    # Composite figure
330    if is3d(variable):
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',
333                   page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
334    else:
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', 
339                   page_trim=True, fig_trim=True, format='pdf', title=variable+" "+opts.simulation)
340    pdfargs.append(cfile(pdf_page))
341    #
342    thumbnail_size = 200
343    if is3d(variable):
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()
354    else:
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)+\
361                    cell('zonal mean',cfile(diff_fig),thumbnail=thumbnail_size,hover=False)+\
362                    cell('page',cfile(page),thumbnail=thumbnail_size,hover=False)+\
363                    cell('Pdf',cfile(pdf_page))
364            close_line()
365#IMorig: au-dessus cell('zonal mean',cfile(zmean_fig),thumbnail=thumbnail_size,hover=False)+\
366
367# Finalisons l'index html
368index += close_table()
369index += trailer()
370out="index_"+opts.region+"_"+opts.season+"_"+opts.simulation+".html"
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.