1 | # Python script to transfomr ASCII LIDAR outputs to netCDF |
---|
2 | ## g.e. # LIDAR_ASCII_netCDF.py -f /d4/lflmd/etudes/REMEMBER/WRFmeas/tests/WL_HyMeX/gir.d00.01DAR |
---|
3 | |
---|
4 | import os |
---|
5 | from optparse import OptionParser |
---|
6 | import numpy as np |
---|
7 | from netCDF4 import Dataset as NetCDFFile |
---|
8 | import nc_var_tools as ncvar |
---|
9 | |
---|
10 | main = 'LIDR_ASCII_netCDF.py' |
---|
11 | errormsg='ERROR -- error -- ERROR -- error' |
---|
12 | warnmsg='WARNING -- warning -- WARNING -- warning' |
---|
13 | |
---|
14 | fillValue = 1.e20 |
---|
15 | |
---|
16 | ####### ###### ##### #### ### ## # |
---|
17 | |
---|
18 | parser = OptionParser() |
---|
19 | parser.add_option("-f", "--LIDAR_file", dest="lfile", |
---|
20 | help="LIDAR ASCII text file to use", metavar="FILE") |
---|
21 | |
---|
22 | (opts, args) = parser.parse_args() |
---|
23 | |
---|
24 | lidarvn = ['z', 'p', 'u', 'v', 'w', 't_pot', 'qv', 'qc', 'qr', 'qs', 'qh', 'qi', \ |
---|
25 | 'qg', 'dens','cldfra'] |
---|
26 | lidarvln = ['height', 'pressure','x-wind direction', 'y-wind direction', \ |
---|
27 | 'z-wind direction', 'potential temperature', 'water vapor mixing ratio', \ |
---|
28 | 'cloud mixing ratio', 'rain mixing ratio', 'snow mixing ratio', \ |
---|
29 | 'hail mixing ratio', 'ice mixing ratio', 'graupel mixing ratio', 'air density', \ |
---|
30 | 'cloud fraction'] |
---|
31 | lidarvu = ['m', 'hPa', 'ms-1', 'ms-1', 'ms-1', 'K', 'kgkg-1', 'kgkg-1', 'kgkg-1', \ |
---|
32 | 'kgkg-1', 'kgkg-1', 'kgkg-1', 'kgkg-1', 'kg m-3','1'] |
---|
33 | |
---|
34 | ####### ####### |
---|
35 | ## MAIN |
---|
36 | ####### |
---|
37 | |
---|
38 | ofile = 'lidar.nc' |
---|
39 | Nlidarvariables = len(lidarvn) |
---|
40 | |
---|
41 | if not os.path.isfile(opts.lfile): |
---|
42 | print errormsg |
---|
43 | print ' LIDAR ASCII text file "' + opts.lfile + '" does not exist !!' |
---|
44 | print errormsg |
---|
45 | quit() |
---|
46 | |
---|
47 | objlfile = open(opts.lfile, 'r') |
---|
48 | |
---|
49 | objofile = NetCDFFile(ofile, 'w') |
---|
50 | |
---|
51 | # Creation of dimensions |
---|
52 | ## |
---|
53 | objofile.createDimension('time',None) |
---|
54 | |
---|
55 | ncvar.set_attribute(objofile, 'author', 'Lluis Fita Borrell') |
---|
56 | ncvar.set_attribute(objofile, 'institution', 'Laboratoire Meteorologique Dynamique') |
---|
57 | ncvar.set_attribute(objofile, 'university', 'University Pierre et Marie Curie') |
---|
58 | ncvar.set_attribute(objofile, 'center', 'Centre national de la recherche scientifique') |
---|
59 | ncvar.set_attribute(objofile, 'country', 'France') |
---|
60 | ncvar.set_attribute(objofile, 'city', 'Paris') |
---|
61 | ncvar.set_attribute(objofile, 'script', 'LIDAR_ASCII_netCFD.py') |
---|
62 | ncvar.set_attribute(objofile, 'version', '1.0') |
---|
63 | |
---|
64 | time_step = [] |
---|
65 | psfc = [] |
---|
66 | rainc = [] |
---|
67 | rainnc = [] |
---|
68 | drydens = [] |
---|
69 | |
---|
70 | lidarvals = {} |
---|
71 | |
---|
72 | iline=0 |
---|
73 | dimz = 0 |
---|
74 | Searchdimz = True |
---|
75 | itz = 0 |
---|
76 | |
---|
77 | for line in objlfile: |
---|
78 | values = ncvar.reduce_spaces(line) |
---|
79 | # print iline, values[0], dimz, Searchdimz |
---|
80 | # Writting general information |
---|
81 | if iline == 0: |
---|
82 | newvar = objofile.createVariable('station','c') |
---|
83 | ncvar.set_attribute(newvar, 'name',values[0]) |
---|
84 | ncvar.set_attribute(newvar, 'acronym',values[3]) |
---|
85 | ncvar.set_attribute(newvar, 'real_lon', \ |
---|
86 | np.float(values[6].replace(',','').replace('(','').replace(')','')) ) |
---|
87 | ncvar.set_attribute(newvar, 'real_lat', \ |
---|
88 | np.float(values[5].replace(',','').replace('(','').replace(')','')) ) |
---|
89 | ncvar.set_attribute(newvar, 'x_grid_point', \ |
---|
90 | int(values[8].replace(',','').replace('(','').replace(')','')) ) |
---|
91 | ncvar.set_attribute(newvar, 'y_grid_point', \ |
---|
92 | int(values[9].replace(',','').replace('(','').replace(')','')) ) |
---|
93 | ncvar.set_attribute(newvar, 'model_lon', \ |
---|
94 | np.float(values[12].replace(',','').replace('(','').replace(')','')) ) |
---|
95 | ncvar.set_attribute(newvar, 'model_lat', \ |
---|
96 | np.float(values[11].replace(',','').replace('(','').replace(')','')) ) |
---|
97 | ncvar.set_attribute(newvar, 'model_height', \ |
---|
98 | np.float(values[13].replace(',','').replace('(','').replace(')','')) ) |
---|
99 | simstarttime = values[18] |
---|
100 | else: |
---|
101 | if values[0] == 'new_time': |
---|
102 | time_step.append(np.float(values[2])) |
---|
103 | psfc.append(np.float(values[6])) |
---|
104 | rainc.append(np.float(values[7])) |
---|
105 | rainnc.append(np.float(values[8])) |
---|
106 | drydens.append(np.float(values[9])) |
---|
107 | if iline == 1: |
---|
108 | Searchdimz = True |
---|
109 | else: |
---|
110 | Searchdimz = False |
---|
111 | else: |
---|
112 | if not values[0] == 'k': |
---|
113 | lidarvals[itz] = values |
---|
114 | if Searchdimz: |
---|
115 | dimz = dimz + 1 |
---|
116 | itz = itz + 1 |
---|
117 | iline = iline + 1 |
---|
118 | |
---|
119 | dimt = len(time_step) |
---|
120 | |
---|
121 | print ' Found:',dimt,'time steps, over:',dimz,'vertical levels' |
---|
122 | objlfile.close() |
---|
123 | |
---|
124 | objofile.createDimension('z',dimz) |
---|
125 | |
---|
126 | time_stepv = np.zeros((dimt), dtype=np.float) |
---|
127 | psfcv = np.zeros((dimt), dtype=np.float) |
---|
128 | raincv = np.zeros((dimt), dtype=np.float) |
---|
129 | rainncv = np.zeros((dimt), dtype=np.float) |
---|
130 | drydensv = np.zeros((dimt), dtype=np.float) |
---|
131 | |
---|
132 | lidarvaluesv = np.zeros( (dimt,dimz,Nlidarvariables), dtype= np.float) |
---|
133 | |
---|
134 | itz = 0 |
---|
135 | for it in range(dimt): |
---|
136 | time_stepv[it] = np.float(time_step[it]) |
---|
137 | psfcv[it] = np.float(psfc[it]) |
---|
138 | raincv[it] = np.float(rainc[it]) |
---|
139 | rainncv[it] = np.float(rainnc[it]) |
---|
140 | drydensv[it] = np.float(drydens[it]) |
---|
141 | |
---|
142 | for iz in range(dimz): |
---|
143 | for iv in range(Nlidarvariables): |
---|
144 | lidarvaluesv[it,iz,iv] = np.float(lidarvals[itz][iv+1]) |
---|
145 | |
---|
146 | itz = itz + 1 |
---|
147 | # Surface variables |
---|
148 | newvar = objofile.createVariable('time','f4',('time',)) |
---|
149 | newvar[:] = time_stepv |
---|
150 | newattr = ncvar.basicvardef(newvar, 'time', 'time', 'hours since ' + \ |
---|
151 | simstarttime.replace('_',' ')) |
---|
152 | |
---|
153 | newvar = objofile.createVariable('psfc','f4',('time',)) |
---|
154 | newvar[:] = psfcv |
---|
155 | newattr = ncvar.basicvardef(newvar, 'psfc', 'surface pressure', 'hPa') |
---|
156 | |
---|
157 | newvar = objofile.createVariable('rainc','f4',('time',)) |
---|
158 | newvar[:] = raincv |
---|
159 | newattr = ncvar.basicvardef(newvar, 'rainc', \ |
---|
160 | 'accumulated precipitation from cumulus scheme', 'mm') |
---|
161 | |
---|
162 | newvar = objofile.createVariable('rainnc','f4',('time',)) |
---|
163 | newvar[:] = rainncv |
---|
164 | newattr = ncvar.basicvardef(newvar, 'rainnc', \ |
---|
165 | 'accumulated precipitation not from cumulus scheme', 'mm') |
---|
166 | |
---|
167 | newvar = objofile.createVariable('drydens','f4',('time',)) |
---|
168 | newvar[:] = drydensv |
---|
169 | newattr = ncvar.basicvardef(newvar, 'drydens', 'total dry air column pressure', 'hPa') |
---|
170 | |
---|
171 | # Lidar variables |
---|
172 | for iv in range(Nlidarvariables): |
---|
173 | newvar = objofile.createVariable(lidarvn[iv], 'f4', ('time','z')) |
---|
174 | newvar[:] = lidarvaluesv[:,:,iv] |
---|
175 | newattr = ncvar.basicvardef(newvar, lidarvn[iv], lidarvln[iv], lidarvu[iv] ) |
---|
176 | |
---|
177 | objofile.sync() |
---|
178 | objofile.close() |
---|
179 | |
---|
180 | print 'Successfull generation of LIDAR netCDF file "' + ofile + '" !!!!!' |
---|