# Python script to generate the files and the plots for a sensitivity study with multiple modle configurations and models # L. Fita # LMD, Jussieu/Palaisseau, France # Script configuration get from ASCII file 'model_graphics.dat' import numpy as np import nc_var_tools as ncvar import generic_tools as gen import time as tim # To avoid errors like: '/bin/sh: 1: Syntax error: Bad fd number' # Make sure that /bin/sh directs to bash and not to dash: # http://stackoverflow.com/questions/15809060/sh-syntax-error-bad-fd-number import subprocess as sub import os main = 'model_graphics.py' errmsg = ncvar.errormsg warnmsg = ncvar.warnmsg def scratches(config): """ Function to set-up if it is needed to start from the scratch config: dictionary with the configuration """ fname = 'scratches' if config['scratch'] == 'true': scr = True print warnmsg print " " + main + ": starting from the SCRATCH !!" print " 10 seconds left!!" filescr = True figscr = True # tim.sleep(10) else: scr = False if config['filescratch'] == 'true': filescr = True print warnmsg print " " + main + ": files starting from the SCRATCH !!" print " 5 seconds left!!" tim.sleep(5) else: filescr = False if config['figscratch'] == 'true': figscr = True print warnmsg print " " + main + ": figures starting from the SCRATCH !!" print " 5 seconds left!!" tim.sleep(5) else: figscr = False if config['addfiles'] == 'true': addfils = True else: addfils = False if config['addfigures'] == 'true': addfigs = True else: addfigs = False if config['debug'] == 'true': debug = True else: debug = False return scr, filescr, figscr, addfils, addfigs, debug def exp_headers(mod,config): """ Function to provide the headers and the experiments of a given model model= model config= configuration of the experiment """ fname = 'exp_headers' # No CASE in python! # case ${mod} in ... if mod == 'WRF': expers = config['WRFexps'].split(':') fhs = config['WRFheaders'].split(':') elif mod == 'LMDZ': expers = config['LMDZexps'].split(':') fhs = config['LMDZheaders'].split(':') elif mod == 'WRF_LMDZ': expers = config['WRF_LMDZexps'].split(':') fhs = config['WRF_LMDZheaders'].split(':') else: print errmsg print " " + fname + ": model '" + mod + "' not ready!!" quit(-1) return expers, fhs # Files with information about the configuration of the script inffiles = ['varcompute.inf', 'all_computevars.inf', 'all_statsvars.inf'] ####### ####### ## MAIN ####### # Getting configuration from external ASCII file 'model_graphics.dat' cnf = gen.get_configuration('model_graphics.dat', False) # scratches scratch, filescratch, figscratch, addfiles, addfigures, dbg = scratches(cnf) # Getting models mods = cnf['models'].split(':') # Getting kinds of variables varks = cnf['varkinds'].split(':') # Models loop ## for mod in mods: print mod # Get experiments and headers of model exps, fheaders = exp_headers(mod,cnf) # Characteristics of the model modinf = ncvar.model_characteristics(mod,'None','False') dnx = modinf.dimxn dny = modinf.dimyn dnz = modinf.dimzn dnt = modinf.dimtn vdnx = modinf.vardxn vdny = modinf.vardyn vdnz = modinf.vardzn vdnt = modinf.vardtn if dbg: print ' model characteristics _______' print " dims:", dnx, dny, dnz, dnt print " var dims:", vdnx, vdny, vdnz, vdnt moddims = dnx + ',' + dny + ',' + dnz + ',' + dnt modvdims = vdnx + ',' + vdny + ',' + vdnz + ',' + vdnt for exp in exps: print ' ' + exp + '...' # input folder iwdir = cnf['ifold'] + '/' + mod + '/' + exp # Does input folder exist? if not os.path.isdir(iwdir): print errmsg print " " + main + ": folder '" + iwdir + "' does not exist !!" quit(-1) owdir = cnf['ofold'] + '/' + mod + '/' + exp sout = sub.call('mkdir -p ' + owdir, shell=True) # Need to pass to analyze all the data? if filescratch: for inff in inffiles: if dbg: print " removing information file '" + inff + "' ..." ins = 'rm ' + owdir + '/' + inff + ' >& /dev/null' sout = sub.call(ins, shell=True) objf = open(owdir+'/all_computevars.inf','w') objf.write("## Computation of variables \n") objf.close() objf = open(owdir+'/all_statsvars.inf','w') objf.write("## Computation of statistics \n") objf.close() if addfiles: sub.call('rm ' + owdir +'/varcompute.inf >& /dev/null', shell=True) varcompf = owdir + '/varcompute.inf' if not os.path.isfile(varcompf): # Does input folder has header files? ih=1 # Dictionary with the list of files for each headers files = {} # Dictionary with a file fromor each headers testfiles = {} for fh in fheaders: if filescratch: ins = 'rm '+ owdir+'/*_' + fh + '*.nc >& /dev/null' sout = sub.call(ins, shell=True) files1h = gen.files_folder(iwdir,fh) if len(files1h) < 1: print errmsg print ' ' + main + ": folder '" + iwdir + "' does not " + \ "contain files '" + fh + "*' !!" quit(-1) files[fh] = files1h testfiles[fh] = files1h[0] if dbg: print ' Dictionary of files _______' gen.printing_dictionary(files) print ' Dictionary of test-files _______' gen.printing_dictionary(testfiles) # end of experiments loop # end of mods loop