source: trunk/ToBeReviewed/LECTURE/GRIB/read_grib.pro @ 69

Last change on this file since 69 was 69, checked in by smasson, 18 years ago

debug + new xxx

  • Property svn:executable set to *
File size: 4.7 KB
Line 
1function read_grib, varcode, date1, date2, file = file
2@common
3; http://www.wmo.ch/web/www/WDM/Guides/Guide-binary-2.html
4;
5;  gribfile =
6;  '/d1fes2-raid6/SINTEX-common/ES10.d.00/atm/5d/ES10.d.00_5d_00911201_00911230.grib'
7  IF keyword_set(file) THEN gribfile = isafile(file = file,  iodir = iodir) ELSE gribfile = '/d1fes2-raid6/SINTEX-common/ES10/atm/5d/ZOOM_IND/ES10_5d_00210101_00301230.grib'
8;
9  openr, num, gribfile, /GET_LUN, ERROR = err, /SWAP_IF_LITTLE_ENDIAN
10  if err ne 0 then begin
11    print, !err_string
12    return, -1
13  ENDIF
14;
15  recstart = scan_grib_recstart(num)
16;
17;    messize = scan_grib_messize(num, recstart)
18;    addoff = lonarr(n_elements(recstart))
19;    FOR i = 1L, n_elements(recstart)-1 DO $
20;      addoff[i] = recstart[i]-recstart[i-1]-messize[i-1]
21;
22;
23;    nbits = scan_grib_nbits(num, recstart)
24;    print,nbits[uniq(nbits,sort(nbits))]
25;
26  codes = scan_grib_code(num, recstart)
27  nbcodes =  uniq(codes, sort(codes))
28;
29  dates = scan_grib_date(num, recstart)
30  nbdates = uniq(dates, sort(dates))
31;
32  goodvar = where(codes EQ varcode)
33  IF goodvar[0] EQ -1 THEN BEGIN
34    print, 'no var code '+strtrim(varcode, 2)+' in the file'
35    return, -1
36  ENDIF
37;
38  recstart = recstart[goodvar]
39  dates = dates[goodvar]
40;
41  gooddate = where(dates GE date1 AND dates LE date2)
42  IF gooddate[0] EQ -1 THEN BEGIN
43    print, 'no dates between '+strtrim(date1, 2)+' and '+strtrim(date2, 2)+' in the file'
44    return, -1
45  ENDIF
46  recstart = recstart[gooddate]
47  dates = dates[gooddate]
48  key_caltype = '360d'
49  time = date2jul(dates)
50  jpt = n_elements(time)
51  IF jpt EQ 1 THEN vardate = strtrim(dates[0], 2) ELSE vardate = strtrim(dates[0], 2)+' - '+strtrim(dates[jpt-1], 2)
52;  varname
53  vargrid = 'T'
54;  varexp
55;  varunit
56;
57  grib_pds = read_grib_pds(num, recstart[0])
58; grid parameters
59  IF grib_pds.gdsnotomitted THEN BEGIN
60    grib_gds = read_grib_gds(num, recstart[0])
61; min, max of the latitude with a precision of 10^-2
62    lat1 = fix(100*grib_gds.la1)/100.
63    lat2 = fix(100*grib_gds.la2)/100.
64;
65    CASE grib_gds.gridtype OF
66; Latitude/Longitude Grid
67      0:BEGIN
68        computegrid, grib_gds.lo1, grib_gds.la1, grib_gds.di, -grib_gds.dj $
69          , grib_gds.ni, grib_gds.nj
70       END
71; Gaussian Latitude/Longitude Grid
72      4:BEGIN
73; find the latitude axis
74        CASE 1 OF
75; n48
76          grib_gds.n EQ 48 AND lat1 EQ 88.57 AND lat2 EQ -88.57:$
77            gphit = n48gaussian()
78; n80
79           grib_gds.n EQ 80 AND lat1 EQ 89.14 AND lat2 EQ -89.14:$
80             gphit = n80gaussian()
81; n128
82           grib_gds.n EQ 128 AND lat1 EQ 89.46 AND lat2 EQ -89.46:$
83             gphit = n128gaussian()
84; n160
85           grib_gds.n EQ 160 AND lat1 EQ 89.57 AND lat2 EQ -89.57:$
86             gphit = n160gaussian()
87; n256
88           grib_gds.n EQ 256 AND lat1 EQ 89.73 AND lat2 EQ -89.73:$
89             gphit = n256gaussian()
90; part of one of the gaussian grids defined above
91           ELSE:BEGIN
92             cnt = 0
93             REPEAT BEGIN
94               CASE cnt OF
95                 0:gphit = n48gaussian()
96                 1:gphit = n80gaussian()
97                 2:gphit = n128gaussian()
98                 3:gphit = n160gaussian()
99                 4:gphit = n256gaussian()
100                 5:BEGIN
101                   gphit = n80gaussian()
102                   lat1 = 29.71
103                   lat2 = -19.62
104                 END
105                 ELSE:stop
106               ENDCASE
107               nfix = fix(gphit*100)/100.
108               nlat1 = (where(nfix EQ lat1))[0]
109               nlat2 = (where(nfix EQ lat2))[0]
110               IF nlat1 NE -1 AND  nlat2 NE -1 $
111                 AND nlat2-nlat1+1 EQ grib_gds.nj $
112                 THEN gphit = gphit[nlat1:nlat2] ELSE gphit = -1
113               cnt = cnt+1
114             ENDREP UNTIL gphit[0] NE -1
115           END
116         ENDCASE
117         computegrid, grib_gds.lo1, -1, grib_gds.di, -1, grib_gds.ni, -1, YAXIS = gphit
118       END
119; Mercator Projection Grid
120       gridtype EQ 1:
121; Gnomonic Projection Grid
122       gridtype EQ 2:
123; Lambert Conformal, secant or tangent, conical or bipolar (normal or
124; oblique) Projection Grid 
125       gridtype EQ 3:
126; Polar Stereographic Projection Grid
127       gridtype EQ 5:
128; Oblique Lambert conformal, secant or tangent, conical or bipolar,
129; projection
130       gridtype EQ 13:
131; Spherical Harmonic Coefficients
132       gridtype EQ 50:
133; Space view perspective or orthographic grid
134       gridtype EQ 90:
135; reserved - see Manual on Codes
136       ELSE:
137     ENDCASE
138   ENDIF ELSE stop
139;
140   res = fltarr(grib_gds.ni, grib_gds.nj, n_elements(recstart))
141   FOR i = 0, n_elements(recstart)-1 DO BEGIN
142     res[*, *, i] = read_grib_bds(num, recstart[i], grib_gds.ni, grib_gds.nj)
143   ENDFOR
144;
145   free_lun, num
146;
147   IF keyword_set(key_yreverse) THEN res = reverse(res, 2)
148
149   RETURN, res
150 END
Note: See TracBrowser for help on using the repository browser.