source: lmdz_wrf/trunk/tools/TS_ASCII_netCDF.py @ 624

Last change on this file since 624 was 619, checked in by lfita, 10 years ago

Adding right names for the variables more CF like!

File size: 6.4 KB
RevLine 
[351]1# Python script to transfomr ASCII LIDAR outputs to netCDF
[352]2## g.e. # TS_ASCII_netCDF.py -f //media/ExtDiskD/bkup/ciclad/etudes/WL_HyMeX/iop15/wrf/run/control/stations_20121018000000-20121022000000/h0001.d01.TS -s 20121018000000
[351]3
4import os
5from optparse import OptionParser
6import numpy as np
7from netCDF4 import Dataset as NetCDFFile
8import nc_var_tools as ncvar
9
10main = 'TS_ASCII_netCDF.py'
11errormsg='ERROR -- error -- ERROR -- error'
12warnmsg='WARNING -- warning -- WARNING -- warning'
13
14fillValue = 1.e20
15
[566]16def ts_header(ln):
17    """ Function to get the values of the header of the *.TS files
18      line=ASCII lines with the header of the TS file
19      getting the line format from WRFV3.3 'EMCORE' in file 'share/wrf_timeseries.F'
20    """
21    fname = 'ts_header'
22
[569]23    fmts=['A26', 'I2', 'I3', 'A6', 'A2', 'F7.3', 'A1', 'F8.3', 'A3', 'I4', 'A1', 'I4',\
[566]24      'A3', 'F7.3', 'A1', 'F8.3', 'A2', 'F6.1', 'A7']
25
[569]26    headervalues = ncvar.values_fortran_fmt(ln,fmts)
[566]27
28    return headervalues
29
[351]30####### ###### ##### #### ### ## #
31
32parser = OptionParser()
33parser.add_option("-f", "--TS_file", dest="lfile",
[352]34  help="Time Series ASCII text file to use", metavar="FILE")
35parser.add_option("-s", "--SimulationStartTime", dest="stime",
36  help="Starting time of the simulation ([YYYY][MM][DD][HH][MI][SS] format)", metavar="DATE")
[351]37
38(opts, args) = parser.parse_args()
39
40
41tsvn = ['t', 'q', 'u', 'v', 'psfc', 'glw', 'gsw', 'hfx', 'lh', 'tsk', 'tslb1', 'rainc', 'rainnc', 'clw']
42
43tsvln = ['2 m Temperature', '2 m vapor mixing ratio', '10 m U wind (earth-relative)', '10 m V wind (earth-relative)', 'surface pressure', 'downward longwave radiation flux at the ground (downward is positive)', 'net shortwave radiation flux at the ground (downward is positive)', 'surface sensible heat flux (upward is positive)', 'surface latent heat flux (upward is positive)', 'skin temperature', 'top soil layer temperature', 'rainfall from a cumulus scheme', 'rainfall from an explicit scheme', 'total column-integrated water vapor and cloud variables']
44
[352]45tsvu = ['K', 'kg/kg', 'm/s', 'm/s', 'Pa', 'W/m2', 'W/m2', 'W/m2', 'W/m2', 'K', 'K', 'mm', 'mm', '1']
[351]46
47#######    #######
48## MAIN
49    #######
50
51ofile = 'ts.nc'
52Ntsvariables = len(tsvn)
53
54if not os.path.isfile(opts.lfile):
55    print errormsg
[352]56    print '  ' + main + ': Time-Series ASCII text file "' + opts.lfile +             \
57      '" does not exist !!'
[351]58    print errormsg
59    quit()
60
[352]61if opts.stime is None:
62    print errormsg
63    print '  ' + main + ': No initial date/time of the simulation is provided!'
64    quit(-1)
65else:
66    stime = opts.stime
67    refdate = stime[0:4] + '-' + stime[4:6] + '-' + stime[6:8] + ' ' + stime[8:10] + \
68      ':' + stime[10:12] + ':' + stime[12:14]
69
[351]70objlfile = open(opts.lfile, 'r')
71
72objofile = NetCDFFile(ofile, 'w')
73
74# Creation of dimensions
75##
76objofile.createDimension('time',None)
77
78ncvar.set_attribute(objofile, 'author', 'Lluis Fita Borrell')
79ncvar.set_attribute(objofile, 'institution', 'Laboratoire Meteorologique Dynamique')
80ncvar.set_attribute(objofile, 'university', 'University Pierre et Marie Curie')
81ncvar.set_attribute(objofile, 'center', 'Centre national de la recherche scientifique')
82ncvar.set_attribute(objofile, 'country', 'France')
83ncvar.set_attribute(objofile, 'city', 'Paris')
84ncvar.set_attribute(objofile, 'script', 'TS_ASCII_netCFD.py')
85ncvar.set_attribute(objofile, 'version', '1.0')
86
87time_step = []
88psfc = []
89rainc = []
90rainnc = []
91drydens = []
92
93tsvals = {}
94
95iline=0
96itz = 0
97for line in objlfile:
98    values = ncvar.reduce_spaces(line)
99#    print iline, values[0], dimz, Searchdimz
100# Writting general information
101    if iline == 0:
102        newvar = objofile.createVariable('station','c')
[566]103        valueshead = ts_header(line)
[459]104
[571]105        ncvar.set_attribute(newvar, 'name', ncvar.reduce_last_spaces(valueshead[0]))
[566]106        ncvar.set_attribute(newvar, 'acronym',valueshead[3].replace(' ',''))
[459]107
[566]108        ncvar.set_attribute(newvar, 'real_lon', valueshead[5])
109        ncvar.set_attribute(newvar, 'real_lat', valueshead[7])
[459]110
[566]111        ncvar.set_attribute(newvar, 'x_grid_point', valueshead[9])
112        ncvar.set_attribute(newvar, 'y_grid_point', valueshead[11])
[459]113
[566]114        ncvar.set_attribute(newvar, 'model_lon', valueshead[13])
115        ncvar.set_attribute(newvar, 'model_lat', valueshead[15])
116        ncvar.set_attribute(newvar, 'model_height', valueshead[17])
[352]117        simstarttime = refdate
[351]118    else:
119        tsvals[itz] = values
[352]120        time_step.append(np.float(values[1]))
121        itz = itz + 1
[351]122    iline = iline + 1
123
124dimt = len(time_step)
125
[352]126print '  Found:',dimt,'time steps'
[351]127objlfile.close()
128
129time_stepv = np.zeros((dimt), dtype=np.float)
[352]130tsvaluesv = np.zeros( (dimt,Ntsvariables), dtype= np.float)
[351]131
[353]132pracc = np.zeros((dimt), dtype=np.float)
133
[351]134itz = 0
135for it in range(dimt):
136    time_stepv[it] = np.float(time_step[it])
137
[352]138    for iv in range(Ntsvariables):
139        tsvaluesv[it,iv] = np.float(tsvals[itz][iv+5])
[351]140
[353]141    pracc[it] = np.float(tsvals[it][16]) + np.float(tsvals[it][17])
[352]142    itz = itz + 1
[353]143
144# time
[352]145newvar = objofile.createVariable('time','f8',('time'))
[504]146newvar[:] = time_stepv*3600.
147newattr = ncvar.basicvardef(newvar, 'time', 'time', 'seconds since ' +               \
[351]148  simstarttime.replace('_',' '))
[352]149ncvar.set_attribute(newvar, 'calendar', 'standard')
[351]150
[619]151dt = time_stepv[1] - time_stepv[0]
152
[352]153# time-series variables
[351]154for iv in range(Ntsvariables):
[619]155    if tsvn[iv] == 't' or tsvn[iv] == 'u' or tsvn[iv] == 'v' or tsvn[iv] == 'q': 
156      varname, stdname, minvar, maxvar, longname, unitsvar, cbarvar =                \
157      ncvar.variables_values('TS' + tsvn[iv])
158      tsu = unitsvar
159    else:
160      varname, stdname, minvar, maxvar, longname, unitsvar, cbarvar =                \
161      ncvar.variables_values(tsvn[iv])
162      tsu = tsvu[iv]
163
164    newvar = objofile.createVariable(varname, 'f4', ('time'))
[352]165    newvar[:] = tsvaluesv[:,iv]
[351]166
[619]167    newattr = ncvar.basicvardef(newvar, stdname, longname.replace('|',' '), tsu)
168    newattr = ncvar.set_attribute(newvar, 'wrfTSname', tsvn[iv])
169    newattr = ncvar.set_attribute(newvar, 'wrfTSdesc', tsvln[iv])
170
[353]171# Extra vars
172
173# pr
174varvals = np.zeros((dimt), dtype=np.float)
175varvals[1:dimt] = pracc[1:dimt] - pracc[0:dimt-1]
[619]176varname, stdname, minvar, maxvar, longname, unitsvar, cbarvar =                      \
177      ncvar.variables_values('RAINTOT')
[353]178
[619]179newvar = objofile.createVariable(varname, 'f4', ('time'))
180newvar[:] = varvals / dt
181newattr = ncvar.basicvardef(newvar, stdname, longname.replace('|',' '), unitsvar )
[353]182
[351]183objofile.sync()
184objofile.close()
185
[352]186print 'Successfull generation of Time-Series netCDF file "' + ofile + '" !!!!!'
Note: See TracBrowser for help on using the repository browser.