source: trunk/SRC/ReadWrite/scanctl.pro

Last change on this file was 494, checked in by pinsard, 10 years ago

fix some typos in code lines

  • Property svn:keywords set to Id
File size: 16.8 KB
Line 
1;+
2;
3; @file_comments
4; GLAMBOUNDARY 2 elements vector, [lon1,lon2], the longitude
5; boundaries that should be used to visualize the data.
6;  lon2 > lon1
7;  lon2 - lon1 le 360
8; key_shift will be defined according to GLAMBOUNDARY.
9;
10; @param filename
11;
12; @param filesname
13;
14; @param jpt1file
15;
16; @param varsname
17;
18; @param varslev
19;
20; @param swapbytes
21;
22; @param bigendian
23;
24; @param littleendian
25;
26; @param f77sequential
27;
28; @param fileheader
29;
30; @param theader
31;
32; @param xyheader
33;
34; @keyword VARFMT
35;
36; @keyword _EXTRA
37;
38; @version
39; $Id$
40;
41;-
42PRO scanctl, filename, filesname, jpt1file, varsname, varslev, swapbytes, bigendian, littleendian, f77sequential, fileheader, theader, xyheader, VARFMT=varfmt, _EXTRA=ex
43;
44  compile_opt idl2, strictarrsubs
45;
46@common
47
48   time1 = systime(1)           ; for key_performance
49
50;------------------------
51; DTYPE
52;------------------------
53   spawn, '\grep -i "^DTYPE" '+filename, notgood
54   if keyword_set(notgood) then begin
55      ras = report( 'This program is not adapted to data type station or grib. Sorry...')
56      stop
57   endif
58;------------------------
59; UNDEF, define valmask
60;------------------------
61   spawn, '\grep -i "^UNDEF" '+filename, valmask
62   valmask = strtrim(valmask, 2)
63   valmask = strsplit(valmask[0],/extract)
64   valmask = float(valmask[1])
65;------------------------
66; Headers
67;------------------------
68   spawn, '\grep -i "^FILEHEADER" '+filename, fileheader
69   fileheader = strtrim(fileheader, 2)
70   if keyword_set(fileheader) then BEGIN
71      fileheader = strsplit(fileheader[0],/extract)
72      fileheader = long(fileheader[1])
73   ENDIF ELSE fileheader = 0L
74   spawn, '\grep -i "^THEADER" '+filename, theader
75   theader = strtrim(theader, 2)
76   if keyword_set(theader) then BEGIN
77      theader = strsplit(theader[0],/extract)
78      theader = long(theader[1])
79   ENDIF ELSE theader = 0L
80   spawn, '\grep -i "^XYHEADER" '+filename, xyheader
81   xyheader = strtrim(xyheader, 2)
82   if keyword_set(xyheader) then BEGIN
83      xyheader = strsplit(xyheader[0],/extract)
84      xyheader = long(xyheader[1])
85   ENDIF ELSE xyheader = 0L
86;------------------------
87;------------------------
88; find the x axis
89;------------------------
90;------------------------
91   spawn, '\sed -n -e ''/^#/d'' -e ''/^[Xx][Dd][Ee][Ff]/,/^[Yy][Dd][Ee][Ff]/p'' '+filename, xdef
92   if xdef[0] EQ '' then BEGIN
93      ras = report('Bad definition of xdef or ydef')
94      stop
95   ENDIF
96   xdef = xdef[0:n_elements(xdef)-2]
97   if n_elements(xdef) NE 1 then begin
98      xdef = [byte(xdef), replicate(byte(' '),1,n_elements(xdef))]
99      xdef = xdef[where(xdef NE 0)]
100      xdef = string(xdef)
101   endif
102   xdef = strtrim(xdef[0], 2)
103   xdef = strsplit(xdef,/extract)
104   jpi = long(xdef[1])
105   case strupcase(xdef[2]) of
106      'LINEAR':xaxis = float(xdef[3])+findgen(jpi)*float(xdef[4])
107      'LEVELS':xaxis = float(xdef[3:n_elements(xdef)-1])
108   ENDCASE
109;------------------------
110;------------------------
111; find the y axis
112;------------------------
113;------------------------
114   spawn, '\sed -n -e ''/^#/d'' -e ''/^[Yy][Dd][Ee][Ff]/,/^[Zz][Dd][Ee][Ff]/p'' '+filename, ydef
115   if ydef[0] EQ '' then BEGIN
116      ras = report('Bad definition of ydef or zdef')
117      stop
118   ENDIF
119   ydef = ydef[0:n_elements(ydef)-2]
120   if n_elements(ydef) NE 1 then begin
121      ydef = [byte(ydef), replicate(byte(' '),1,n_elements(ydef))]
122      ydef = ydef[where(ydef NE 0)]
123      ydef = string(ydef)
124   endif
125   ydef = strtrim(ydef[0], 2)
126   ydef = strsplit(ydef,/extract)
127   jpj = long(ydef[1])
128   case strupcase(ydef[2]) of
129      'LINEAR':yaxis = float(ydef[3])+findgen(jpj)*float(ydef[4])
130      'LEVELS':yaxis = float(ydef[3:n_elements(ydef)-1])
131   'GAUST62':BEGIN & ras = report( 'Not yet coded...') & stop & END
132   'GAUSR15':BEGIN & ras = report( 'Not yet coded...') & stop & END
133   'GAUSR20':BEGIN & ras = report( 'Not yet coded...') & stop & END
134   'GAUSR30':BEGIN & ras = report( 'Not yet coded...') & stop & END
135   'GAUSR40':BEGIN & ras = report( 'Not yet coded...') & stop & END
136   ELSE:BEGIN & ras = report( 'Not yet coded...') & stop & END
137   endcase
138;------------------------
139;------------------------
140; find the z axis
141;------------------------
142;------------------------
143   spawn, '\sed -n -e ''/^#/d'' -e ''/^[Zz][Dd][Ee][Ff]/,/^[Tt][Dd][Ee][Ff]/p'' '+filename, zdef
144   if zdef[0] EQ '' then BEGIN
145      ras = report( 'Bad definition of zdef or tdef')
146      stop
147   ENDIF
148   zdef = zdef[0:n_elements(zdef)-2]
149   if n_elements(zdef) NE 1 then begin
150      zdef = [byte(zdef), replicate(byte(' '),1,n_elements(zdef))]
151      zdef = zdef[where(zdef NE 0)]
152      zdef = string(zdef)
153   endif
154   zdef = strtrim(zdef[0], 2)
155   zdef = strsplit(zdef,/extract)
156   jpk = long(zdef[1])
157   case strupcase(zdef[2]) of
158      'LINEAR':zaxis = float(zdef[3])+findgen(jpk)*float(zdef[4])
159      'LEVELS':zaxis = float(zdef[3:n_elements(zdef)-1])
160   ENDCASE
161;------------------------
162;------------------------
163; compute the grid
164;------------------------
165;------------------------
166   computegrid, xaxis = xaxis, yaxis = yaxis, zaxis = zaxis, _EXTRA = ex
167   domdef
168;------------------------
169;------------------------
170; find the time axis
171;------------------------
172;------------------------
173   spawn, '\grep -i "^TDEF" '+filename, timedef
174   timedef = strupcase(strtrim(timedef, 2))
175   timedef = strsplit(timedef[0],/extract)
176   jpt = long(timedef[1])
177;------------------------
178; initial date: y0, m0, d0, h0, mn0
179;             -> Julian day of IDL: julday(m0, d0, y0, h0, mn0, 00)
180;------------------------
181   t0 = timedef[3]
182   monthsname = string(format='(C(CMOA))',31*(indgen(12)))
183   case 1 OF
184; h[h]:mmZd[d]mmmyy[yy]
185      strpos(t0, ':') NE -1:BEGIN
186         pp = strpos(t0, ':')
187         h0 = long(strmid(t0, 0, pp))
188         mn0 = long(strmid(t0, pp+1, 2))
189         pp = strpos(t0, 'Z')
190         dd = byte(strmid(t0, pp+2, 1)) LT byte('A')
191         d0 = long(strmid(t0, pp+1, 1+dd))
192         m0 = (where(monthsname EQ strmid(t0, pp+2+dd, 3)))[0]+1
193         y0 = long(strmid(t0, pp+5+dd))
194      END
195; m[m]Zd[d]mmmyy[yy]
196      strpos(t0, 'Z') NE -1:BEGIN
197         h0 = 0+12
198         pp = strpos(t0, 'Z')
199         mn0 = long(strmid(t0, 0, pp))
200         dd = byte(strmid(t0, pp+2, 1)) LT byte('A')
201         d0 = long(strmid(t0, pp+1, 1+dd))
202         m0 = (where(monthsname EQ strmid(t0, pp+2+dd, 3)))[0]+1
203         y0 = long(strmid(t0, pp+5+dd))
204      END
205; d[d]mmmyy[yy]
206      (byte(strmid(t0, 0, 1)) LT byte('A'))[0]:BEGIN
207         h0 = 0+12
208         mn0 = 0
209         dd = byte(strmid(t0, 1, 1)) LT byte('A')
210         d0 = long(strmid(t0, 0, 1+dd))
211         m0 = (where(monthsname EQ strmid(t0, 1+dd, 3)))[0]+1
212         y0 = long(strmid(t0, 4+dd))
213      END
214; mmmyy[yy]
215      ELSE:BEGIN
216         h0 = 0+12
217         mn0 = 0
218         d0 = 1
219         m0 = (where(monthsname EQ strmid(t0, 0, 3)))[0]+1
220         y0 = long(strmid(t0, 3))
221      END
222   ENDCASE
223; if y0 is a two digit integer -> between 1950 and 2049
224   case 1 of
225      y0 LE 49:y0 = 2000+y0
226      y0 LE 99:y0 = 1900+y0
227      ELSE:
228   ENDCASE
229;------------------------
230; increment date and definition of the calendar with IDL Julian days
231;------------------------
232   tstep = timedef[4]
233   tsval = long(strmid(tstep,0, strlen(tstep)-2))
234   case strlowcase(strmid(tstep, 1, /reverse)) of
235      'mn':time = julday(m0, d0, y0, h0, mn0+lindgen(jpt)*tsval, 0)
236      'hr':time = julday(m0, d0, y0, h0+lindgen(jpt)*tsval, mn0, 0)
237      'dy':time = julday(m0, d0+lindgen(jpt)*tsval, y0, h0, mn0, 0)
238      'mo':time = julday(m0+lindgen(jpt)*tsval, d0, y0, h0, mn0, 0)
239      'yr':time = julday(m0, d0, y0+lindgen(jpt)*tsval, h0, mn0, 0)
240   ENDCASE                      ;
241; shit the calendar to correspond to the time step.
242   case strlowcase(strmid(tstep, 1, /reverse)) of
243      'dy':time = long(time)
244      'mo':time = long(time)+14L
245      'yr':time = long(time)+365L/2
246      ELSE:
247   endcase
248;------------------------
249; OPTIONS
250;------------------------
251   spawn, '\grep -i "^OPTIONS" '+filename, options
252   options = strtrim(options, 2)
253   options = strlowcase(options[0])
254   key_yreverse = strpos(options, 'yrev') NE -1
255   key_zreverse = strpos(options, 'zrev') EQ -1
256   multifiles = strpos(options, 'template') NE -1
257   f77sequential = strpos(options, 'sequential') NE -1
258   swapbytes = strpos(options, 'byteswapped') NE -1
259   bigendian = strpos(options, 'big_endian') NE -1
260   littleendian = strpos(options, 'little_endian') NE -1
261   cray = strpos(options, 'cray_32bit_ieee') NE -1
262IF cray THEN BEGIN & ras = report( 'cray_32bit_ieee; Not yet coded...') & stop & ENDIF
263   cal365 = strpos(options, '365_day_calendar') NE -1
264IF cal365 THEN BEGIN & ras = report( '365_day_calendar; Not yet coded...') & stop & ENDIF
265;------------------------
266;------------------------
267; building the filesname
268;------------------------
269;------------------------
270   spawn, '\grep -i "^DSET" '+filename, files
271   files = strtrim(files[0], 2)
272   files = strsplit(files,/extract)
273   if n_elements(files) NE 2 then begin
274      ras = report(['Bad definition of the filename. There should be 2 elements:', $
275      'DEST and 1 filename that may define many files'])
276      stop
277   endif
278   files = files[1]
279;   files = strmid(files[0], strpos(files[0],' ', /reverse_search)+1)
280   filesname = files
281   if keyword_set(multifiles) then begin
282; minutes
283      if (stregex(files,'%i?n2'))[0] NE -1 then begin
284         filetsep = 'mn'
285         mnend = long(mn0+jpt-1)
286         tmp = strarr(hend-h0+1)
287         for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?n2',/extract,/regex), string(mn0+i, format = '(i2.2)'))
288         filesname = strjoin(tmp, '!@#$')
289      endif
290; hours
291      if (stregex(files,'%i?[hf][123]'))[0] NE -1 then begin
292         filetsep = 'hr'
293         case strlowcase(strmid(tstep, 1, /reverse)) of
294            'mn':hend = long(h0+(jpt+mn0-1-1)/60.)
295            'hr':hend = long(h0+jpt-1)
296         endcase
297         tmp = strarr(hend-h0+1)
298         case 1 of
299            stregex(files,'%i?h1') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?h1',/extract,/regex), strtrim(h0+i, 1))
300            stregex(files,'%i?h2') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?h2',/extract,/regex), string(h0+i, format = '(i2.2)'))
301            stregex(files,'%f2') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%f2',/extract,/regex), string(h0+i, format = '(i3.2)'))
302            stregex(files,'%i?[hf]3') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?[hf]3',/extract,/regex), string(h0+i, format = '(i3.3)'))
303         endcase
304         filesname = strjoin(tmp, '!@#$')
305      endif
306; days
307      if (stregex(files,'%i?d[12]'))[0] NE -1 then begin
308         filetsep = 'dy'
309         case strlowcase(strmid(tstep, 1, /reverse)) of
310            'mn':dend = long(d0+(jpt+mn0-1-1)/1440.)
311            'hr':dend = long(d0+(jpt+h0-1-1)/24.)
312            'dy':dend = long(d0+jpt-1)
313         endcase
314         tmp = strarr(dend-d0+1)
315         case 1 of
316            stregex(files,'%i?d1') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?d1',/extract,/regex), strtrim(d0+i, 1))
317            stregex(files,'%i?d2') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?d2',/extract,/regex), string(d0+i, format = '(i2.2)'))
318         endcase
319         filesname = strjoin(tmp, '!@#$')
320      endif
321; months
322      if (stregex(files,'%i?m[12c]'))[0] NE -1 then begin
323         filetsep = 'mo'
324         tmp = strarr(12)
325         case 1 of
326            stregex(files,'%i?m1') NE -1:for i = 1, 12 do tmp[i-1] = strjoin(strsplit(filesname,'%i?m1',/extract,/regex), strtrim(i, 1))
327            stregex(files,'%i?m2') NE -1:for i = 1, 12 do tmp[i-1] = strjoin(strsplit(filesname,'%i?m2',/extract,/regex), string(i, format = '(i2.2)'))
328            stregex(files,'%i?mc') NE -1:for i = 1, 12 do tmp[i-1] = strjoin(strsplit(filesname,'%i?mc',/extract,/regex), monthsname[i-1])
329         endcase
330         filesname = strjoin(tmp, '!@#$')
331      endif
332; years
333      if (stregex(files,'%i?y[24]'))[0] NE -1 then begin
334         case strlowcase(strmid(tstep, 1, /reverse)) of
335            'dy':yend = long(y0+(jpt+d0-1-1)/365.)
336            'mo':yend = long(y0+(jpt+m0-1-1)/12.)
337            'yr':yend = long(y0+jpt-1)
338            ELSE:yend = y0
339         endcase
340         tmp = strarr(yend-y0+1)
341         case 1 of
342            stregex(files,'%i?y2') NE -1:for i = 0, n_elements(tmp)-1 do tmp[i] = strjoin(strsplit(filesname,'%i?y2',/extract,/regex), string((y0+i)-100*((y0+i)/100), format = '(i2.2)'))
343            stregex(files,'%i?y4') NE -1:for i = 0, n_elements(tmp)-1  do tmp[i] = strjoin(strsplit(filesname,'%i?y]4',/extract,/regex), string(y0+i, format = '(i4.4)'))
344         endcase
345         filesname = strjoin(tmp, '!@#$')
346      endif
347      filesname = strsplit(filesname, '!@#$', /extract)
348;
349; time step unit of each file:
350;
351      case 1 of
352         (stregex(files,'%i?n2'))[0] NE -1:filetsep = 'mn'
353         (stregex(files,'%i?[hf][123]'))[0] NE -1:filetsep = 'hr'
354         (stregex(files,'%i?d[12]'))[0] NE -1:filetsep = 'dy'
355         (stregex(files,'%i?m[12c]'))[0] NE -1: filetsep = 'mo'
356         (stregex(files,'%i?y[24]'))[0] NE -1:filetsep = 'yr'
357      ENDCASE
358;
359; number of time steps for each files
360;
361      case strlowcase(strmid(tstep, 1, /reverse)) of
362         'mn':BEGIN
363            case filetsep of
364               'yr':jpt1file = 60L*24L*365L
365               'mo':jpt1file = 60L*24L*30L
366               'dy':jpt1file = 60L*24L
367               'hr':jpt1file = 60L
368               'mn':jpt1file = 1L
369            endcase
370         END
371         'hr':BEGIN
372            case filetsep of
373               'yr':jpt1file = 24L*365L
374               'mo':jpt1file = 24L*30L
375               'dy':jpt1file = 24L
376               'hr':jpt1file = 1L
377            endcase
378         END
379         'dy':BEGIN
380            case filetsep of
381               'yr':jpt1file = 365L
382               'mo':jpt1file = 30L
383               'dy':jpt1file = 1L
384            endcase
385         END
386         'mo':BEGIN
387            case filetsep of
388               'yr':jpt1file = 12L
389               'mo':jpt1file = 1L
390            endcase
391         END
392         'yr':jpt1file = 1L
393      endcase
394;
395; number of files
396;
397      nof = ceil(jpt/(1.*jpt1file))
398      filesname = filesname[0:nof-1]
399   ENDIF ELSE BEGIN
400      nof = 1
401      jpt1file = jpt
402   ENDELSE
403; first character ^
404   if stregex(files,'^\^') GE 0 THEN BEGIN
405      iodir = strmid(filename,0,strpos(filename,'/',/reverse_search)+1)
406      for i = 0, nof-1 do filesname[i] = iodir+strmid(filesname[i], 1)
407   ENDIF
408;------------------------
409;------------------------
410; extracting the variables
411;------------------------
412;------------------------
413   spawn, '\grep -i "^VARS" '+filename, nvars
414   nvars = strtrim(nvars, 2)
415   nvars = strsplit(nvars[0],/extract)
416   nvars = long(nvars[1])
417   spawn, '\sed -n -e ''/^#/d'' -e ''/^[Vv][Aa][Rr][Ss]/,/^[Ee][Nn][Dd][Vv][Aa][Rr][Ss]/p'' '+filename, varlist
418   if n_elements(varlist) LE 2  then begin
419      ras = report( 'No lines between vars and endvars???')
420      stop
421   endif
422   varlist = varlist[1:n_elements(varlist)-2]
423   if n_elements(varlist) NE nvars  then begin
424      ras = report( 'Number of variables indicated by VARS ('+strtrim(nvars, 1)+') differs from number of lines (without ''#'' at the beginning) located between VARS and ENDVARS: '+strtrim(n_elements(varlist), 1))
425      stop
426   ENDIF
427   varsname = strarr(nvars)
428   varsdes = strarr(nvars)
429   varslev = lonarr(nvars)
430   for i = 0, nvars-1 do BEGIN
431      varlist[i] = strtrim(varlist[i], 2)
432      tmp = strsplit(varlist[i],/extract)
433      if strmid(tmp[2], 0, 2) EQ '-1' then BEGIN
434         case long(strmid(tmp[2], 3, 2)) of
435            10:BEGIN
436               ras = report( 'Special data formats, units = -1,10... Not yet coded...')
437               stop
438            END
439            20:BEGIN
440               ras = report( 'Special data formats, units = -1,20... Not yet coded...')
441               stop
442            END
443            30:BEGIN
444               ras = report( 'Special data formats, units = -1,30... Not yet coded...')
445               stop
446            END
447            40:BEGIN
448               case long(strmid(tmp[2], 6)) of
449                  1:varfmt = 'byte'
450                  2:varfmt = 'uint'
451                  -2:varfmt = 'int'
452                  4:varfmt = 'long'
453                  ELSE:BEGIN
454                     ras = report( 'Bad definition of the special data formats: ')
455                     ras = report(long(strmid(tmp[2],6))+' should be equal to 1, 2, -2 or 4')
456                     stop
457                  END
458               endcase
459            END
460            ELSE:BEGIN
461               ras = report( 'Special data formats, units = -1, ... Not yet coded...')
462               stop
463            END
464         endcase
465      endif
466      varsname[i] = tmp[0]
467      varsdes[i] = strjoin(tmp[3:n_elements(tmp)-1], ' ')
468      varslev[i] = long(tmp[1])
469   ENDFOR
470   varslev = 1 > varslev
471
472;
473   ccmeshparameters.filename = filename
474   ccmeshparameters.filename = 'Grads'
475;
476   IF keyword_set(key_performance) EQ 1 THEN print, 'time scanctl', systime(1)-time1
477
478   return
479end
Note: See TracBrowser for help on using the repository browser.