source: trunk/procs/nc_read.pro @ 8

Last change on this file since 8 was 4, checked in by kolasinski, 17 years ago

Add ORCA05 config and bugfix in nc_read

File size: 22.3 KB
RevLine 
[2]1;--------------------------- 
2; Reading ORCA netcdf files
3; EG 24/2/99
4;--------------------------- 
5FUNCTION nc_read, file_name, var_name, ncdf_db,  TIME_1 = time_1,  TIME_2 =  time_2, ALL_DATA = all_data, NO_MEAN = no_mean
6
7; arguments = file_name, varname
8; ncdf_db=<location>:<path> or just <path>
9; mot clef = iodir time_1 time_2
10
11@common
12@com_eg
13
14;;   print,  'key_yreverse : ', key_yreverse 
15
16; inits
17   IF debug_w THEN print, 'DEBUG: Entering nc_read...'
18   IF NOT keyword_set(TIME_1) THEN time_1 =  1
19   IF NOT keyword_set(TIME_2) THEN time_2 =  time_1
20;
21; decide which subdomain of data to read
22;
23   IF debug_w THEN print, 'keyword_set(ALL_DATA) : ', keyword_set(ALL_DATA)
24
25   IF keyword_set(ALL_DATA) THEN BEGIN
26      print, '    Reading whole domain'
27      firstx = 0
28      firsty = 0
29      firstz = 0
30      nx = jpi
31      ny = jpj
32      nz = jpk
33      lastx = jpi-1
34      lasty = jpj-1
35      lastz = jpk-1
36;Rajout MK
37;Trouver une meilleure place
38      ixminmesh = 0
39      iyminmesh = 0
40      ixmaxmesh = jpi-1
41      iymaxmesh = jpj-1
42;Fin rajout
43   ENDIF ELSE BEGIN
44      grille,mask,glam,gphi,gdep,nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz
45      mask = 1
46   ENDELSE
47
48   IF debug_w THEN print, 'nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz'
49   IF debug_w THEN print, nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz
50
51   IF debug_w THEN print,  'key_offset =', key_offset
52   IF debug_w THEN print,  'jpi, jpj, jpk =',  jpi, jpj, jpk
53
54
55; define reading boundaries
56
57   x_count = nx
58   y_count = ny
59   z_count = nz
60
61   IF debug_w THEN print,  'nx,ny,nz =', nx,ny,nz
62
63; force izmaxmesh to lastz
64   jpk = lastz+1
65
66; dealing with longitude periodicity
67   IF x_count NE jpi THEN BEGIN
68      key_shift_read = 0
69   ENDIF ELSE key_shift_read = key_shift
70   IF debug_w THEN print,  'key_shift_read=', key_shift_read
71
72   x_offset = key_offset[0]+ firstx+(key_shift_read-key_shift)
73   y_offset = key_offset[1]+ firsty
74   z_offset = key_offset[2]+ firstz
75   IF debug_w THEN print,  'offset =', x_offset, y_offset, z_offset
76
77; pour trouver un fichier, tu as
78; findfile (tres pratique) et dialog_pickfile (interactif)
79
80; pour verifier si il y a une variable je fais
81
82; contient=ncdf_inquire(cdfid)
83; for varid=0,contient.nvars-1 do BEGIN
84;    varcontient=ncdf_varinq(cdfid,varid)
85;    if varcontient.name eq nom then goto, variabletrouvee
86; endfor
87; return, -1
88; variabletrouvee:
89
90; local directory
91
92   IF strpos(ncdf_db, ':') GE 1 THEN directory = (str_sep(ncdf_db, ':'))[1] $
93    ELSE directory = ncdf_db
94
95; existence of file
96
97   list = findfile(directory+file_name, count = nb_file)
98   
99   IF nb_file EQ 0 THEN BEGIN
100      print, ''
101      print, '   ***** file ', file_name, ' not found in ', $
102       directory
103      print, ''
104      field = {data: -1.0}
105      return,  field
106   ENDIF
107
108; ouverture fichier netCDF + contenu
109   cdfid=ncdf_open(directory+file_name)
110   contient=ncdf_inquire(cdfid)
111; que contient la variable
112   varid = ncdf_varid(cdfid, var_name)
113
114   name_suff = ''
115
116   IF varid EQ -1 THEN BEGIN
117      print, ''
118      print, '   ***** field ', var_name, ' not found in file ', $
119       file_name
120      print, ''
121      field = {data: -1.0}
122      return,  field
123   ENDIF
124   varcontient=ncdf_varinq(cdfid, var_name)
125
126; test sur la dimension
127   err_mess = ''
128   field_dim = n_elements(varcontient.dim)
129
130; get unlimited record variable
131   IF contient.recdim NE -1 THEN BEGIN
132      ncdf_diminq, cdfid,  contient.recdim,  name_time, nb_time
133      ;;ncdf_varget, cdfid, contient.recdim, time_array
134      ;;nb_time = (size(time_array))(1)
135   ENDIF ELSE BEGIN
136      ; Look for a potential record dimension
137      IF debug_w THEN print, '    Warning : no unlimited record in netCDF file'
138      ; Look for the names of all dimensions and all variables
139      list_dims = ncdf_listdims(cdfid)
140      list_vars = ncdf_listvars(cdfid)
141      ; Propose all the names and make the user choose the right one
142      ; for the record dimension
143      print, 'In the file ',  file_name,  ', the dimensions are named :'
144      print, list_dims
145      print, 'In the file ',  file_name,  ', the variables are named :'
146      print, list_vars
147      name_time = xquestion('Among the preceding names, which one could refer to the record dimension ?',  /chkwid)
148      IF name_time NE '-' THEN BEGIN
149         dimidt = ncdf_dimid(cdfid, name_time)
150         ncdf_diminq, cdfid,  dimidt,  name_time, nb_time
151         print, 'You chose ', name_time,  ' as a record dimension and its size is ',  nb_time
152         contient.recdim = dimidt
153      ENDIF ELSE BEGIN
154         print, 'No record dimension considered in the file'
155         nb_time =  0
156      ENDELSE
157
158      IF varcontient.dim[varcontient.ndims-1] NE dimidt THEN STOP,  $
159       'Post_it cannot handle variables whose record dimension is not the last one'
160
161;      ncdf_diminq,cdfid,(n_elements(varcontient.dim)-1), name_time, nb_time     
162;      dimidl = ncdf_dimid(cdfid, name_time)
163;      ncdf_diminq,cdfid,dimidl, name_time, nb_time
164;      varidl = ncdf_varid(cdfid, name_time)
165;      ncdf_varget, cdfid, varidl, time_array
166
167   ENDELSE
168
169   IF jpt GT nb_time THEN BEGIN
170      jpt =  nb_time
171      print, 'Warning : the specified jpt does not correspond to the real time dimension in the file !'
172      print, 'New jpt =',  jpt
173   ENDIF
174   ; defs for @read_ncdf_varget
175
176;   key_stride = time_stride
177   key_stride = 1
178   if n_elements(key_stride) LE 2 then key_stride = [1, 1, 1]
179   key_stride = 1l > long(key_stride)
180   jpitotal = long(ixmaxmesh-ixminmesh+1)
181   key_shift = long(testvar(var = key_shift))
182   
183   key = long(key_shift MOD jpitotal)
184   if key LT 0 then key = key+jpitotal
185   ixmin = ixminmesh-ixmindta
186   iymin = iyminmesh-iymindta
187   firsttps = time_1-1
188   lasttps = time_2-1
189
190   name = varid
191
192   IF debug_w THEN print, 'key=', key
193   IF debug_w THEN print, 'jpitotal=', jpitotal
194   IF debug_w THEN print, 'ixmindta,iymindta,izmindta  =', ixmindta,iymindta,izmindta
195   IF debug_w THEN print, 'ixminmesh,iyminmesh=', ixminmesh,iyminmesh
196   IF debug_w THEN print, 'ixmaxmesh,iymaxmesh=', ixmaxmesh,iymaxmesh
197   IF debug_w THEN print, 'izminmesh,izmaxmesh=', izminmesh,izmaxmesh
198   IF debug_w THEN print, 'ixmin,iymin=', ixmin,iymin
199   IF debug_w THEN print, 'firsttps,lasttps=', firsttps, lasttps
200   IF debug_w THEN print, 'key_shift in nc_read=', key_shift
201   IF debug_w THEN print, 'key_yreverse, firsty, lasty',key_yreverse, firsty, lasty
202
203   CASE n_elements(varcontient.dim) OF
204
205      ;; fichier 2d : surface
206      2: BEGIN
207         print, '    Reading ', var_name, ' (2D data)   from ', file_name
208         @read_ncdf_varget
209         lec_data = res
210         data_direc = 'xy'
211         niveau = 1
212         END
213
214      ;; fichier 3d : 2 cas = 1/ 2d espace + temps 2/ 3d espace
215      3: BEGIN
216         ;; si varcontient.dim contient la dim infinie (no 3) -> temps
217         dim_3 = '3d'
218         IF nb_time GE 1 THEN dim_3 = '2d'
219         IF dim_3 EQ '2d' THEN BEGIN
220         
221            IF time_2 EQ time_1 THEN BEGIN
222               print, '    Reading ', var_name, ' (2D data - index ', strcompress(string(time_1)),') from ', file_name
223               @read_ncdf_varget
224               lec_data = res
225               data_direc = 'xy'
226            ENDIF ELSE BEGIN
227               print, '    Reading ', var_name, ' (2D data time serie)', strcompress(string(time_1)),'-', strtrim(string(time_2), 2), ' [every ',strtrim(string(time_stride), 2), ']   from ', file_name
228               IF debug_w THEN print,  'x_offset et y_offset et time_1 :',  x_offset,  y_offset,  time_1
229               @read_ncdf_varget
230               lec_data = res
231               data_direc = 'xyt'
232            ENDELSE
233
234         ENDIF ELSE BEGIN
235            print, '    Reading ', var_name, ' (3D data)', '   from ', file_name
236            @read_ncdf_varget
237            lec_data = res
238            data_direc = 'xyz'
239         ENDELSE
240      END
241      ;; fichier 4d : volume + temps
242      4: BEGIN
243         IF time_2 EQ time_1 THEN BEGIN
244            print, '    Reading ', var_name, ' (3D data - index ', strcompress(string(time_1)),') from ', file_name
245            ; read vertical levels
246            IF mesh_type EQ 'atm' THEN BEGIN
247               ncdf_diminq,cdfid,2, name_level, nb_level
248
249               ; get name of vertical level from metadata
250               file_grid_config = hom_def+'grid_config.def'
251               spawn, 'grep -i "\ '+meshlec_type+' " '+file_grid_config, line
252               line = strcompress(strtrim(line[0], 2))
253               length = strlen(line)
254   
255               IF length EQ 0 THEN BEGIN
256                  print, '    *** nc_read : define name_level from grid ', meshlec_type, $
257                   ' in file ', file_grid_config
258                  name_level = ''
259                  return, -1
260               ENDIF ELSE BEGIN
261                  argvar = str_sep(line, ' ')
262                  name_level = argvar[4]
263               ENDELSE
264               dimidl = ncdf_dimid(cdfid, name_level)
265               ncdf_diminq,cdfid,dimidl, name_level, nb_level
266
267               varidl = ncdf_varid(cdfid, name_level)
268               ; make sure name_level is in hPa
269               ncdf_attget, cdfid, varidl, 'units', val_unit
270               IF string(val_unit) NE 'hPa' AND string(val_unit) NE 'millibar'  AND string(val_unit) NE 'mbar' THEN BEGIN
271                  print, '  vertical levels coordinate not obvious = ', name_level
272                  print, '  ... using <levels> ...'
273                  varidl = ncdf_varid(cdfid, 'levels')
274               ENDIF
275 
276               ncdf_varget, cdfid, varidl, gdept
277               gdept = gdept
278               gdepw = gdept
279               e3t = shift(gdept, 1)-gdept
280               e3t[0] = e3t[1]
281               e3w = e3t
282               jpk = nb_level
283               tmask = reform((reform(tmask(*, *), jpi*jpj)#replicate(1, jpk)), jpi, jpj, jpk)
284            ENDIF
285            IF debug_w THEN print,  ' going into @read_ncdf_varget '
286            @read_ncdf_varget
287            lec_data = res
288;            lec_data =  reform(lec_data,x_count, y_count, z_count)
289            data_direc = 'xyz'
290            IF debug_w THEN help, lec_data
291
292;           vertical average ?
293            IF vert_switch ge 1 AND NOT keyword_set(no_mean) THEN BEGIN
294               old_boite = [lon1, lon2, lat1, lat2, prof1, prof2]
295               print, '      Average in vertical domain ', vert_type, vert_mean
296               IF mesh_type EQ 'atm' THEN BEGIN
297                  CASE atmos_msk OF
298                     0: print, '          [atmos grid : take all points] ' ; take all points
299                     1: BEGIN
300                        ; take ocean points only
301                        idx = where(tmask EQ 0)
302                        lec_data(idx) = 1.e20
303                        print, '          [atmos grid : take ocean points only] '
304                     END
305                     2: BEGIN
306                        ; take land points only
307                        idx = where(tmask GT 0)
308                        lec_data(idx) = 1.e20
309                        print, '          [atmos grid : take land points only] '
310                     END
311                  ENDCASE
312                  CASE vert_type OF
313                     'z': BEGIN ;  depth range
314                        IF time_1 EQ time_2 THEN BEGIN
315                           zmean = moyenne(lec_data, 'z', boite = vert_mean, NAN =1.e20)
316                        END ELSE zmean = grossemoyenne(lec_data, 'z', boite = vert_mean, NAN =1.e20)
317                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
318                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa'
319                        ENDIF ELSE BEGIN
320                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
321                        ENDELSE
322                     END
323                     ELSE: BEGIN ; levels range
324                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
325                           zmean = lec_data(*, *, vert_mean[0])
326                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa'
327                        ENDIF ELSE BEGIN
328                           zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex, NAN =1.e20)
329                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
330                        ENDELSE
331                     END
332                  ENDCASE
333;                  tmask = reform(tmask(*, *, 0), jpi, jpj)
334               ENDIF ELSE BEGIN
335                  ; ocean = always mask
336;                  idx = where(tmask EQ 0)
337;                  lec_data(idx) = 1.e20
338                  CASE vert_type OF
339                     'z': BEGIN
340                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
341                           zmean = lec_data ; right depth already selected
342                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m'
343                        ENDIF ELSE BEGIN
344                           zmean = moyenne(lec_data, 'z', boite = vert_mean)
345                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
346                        ENDELSE
347                     END
348                     ELSE: BEGIN ; case level (zindex)
349                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
350                           zmean = lec_data ; right depth already selected
351                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m'
352                        ENDIF ELSE BEGIN
353                           zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex)
354                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
355                        ENDELSE
356                     END
357                  ENDCASE
358               ENDELSE
359               lec_data = zmean
360               domdef, old_boite
361               field_dim = field_dim - 1
362               data_direc = 'xy'
363               nzt = 1
364               firstz = 0
365               lastz = 0
366            ENDIF
367
368         ENDIF ELSE BEGIN
369            print, '    Reading ', var_name, ' (3D data time serie)',  strcompress(string(time_1)),'-', strtrim(string(time_2), 2), '   from ', file_name
370            ; read vertical levels
371            IF mesh_type EQ 'atm' THEN BEGIN
372               ncdf_diminq,cdfid,2, name_level, nb_level
373
374               ; get name of vertical level from metadata
375               file_grid_config = hom_def+'grid_config.def'
376               spawn, 'grep -i "\ '+meshlec_type+' " '+file_grid_config, line
377               line = strcompress(strtrim(line[0], 2))
378               length = strlen(line)
379   
380               IF length EQ 0 THEN BEGIN
381                  print, '    *** nc_read : define name_level from grid ', meshlec_type, $
382                   ' in file ', file_grid_config
383                  name_level = ''
384                  return, -1
385               ENDIF ELSE BEGIN
386                  argvar = str_sep(line, ' ')
387                  name_level = argvar[1]
388               ENDELSE
389               dimidl = ncdf_dimid(cdfid, name_level)
390               ncdf_diminq,cdfid,dimidl, name_level, nb_level
391
392               varidl = ncdf_varid(cdfid, name_level)
393               ; make sure name_level is in hPa
394               ncdf_attget, cdfid, varidl, 'units', val_unit
395               IF string(val_unit) NE 'hPa' AND string(val_unit) NE 'millibar' AND string(val_unit) NE 'mbar' THEN BEGIN
396                  print, '  vertical levels coordinate not obvious'
397                  print, '  ... using <levels> ...'
398                  varidl = ncdf_varid(cdfid, 'levels')
399               ENDIF
400               ncdf_varget, cdfid, varidl, gdept
401               gdepw = gdept
402               e3t = shift(gdept, 1)-gdept
403               e3t[0] = e3t[1]
404               e3w = e3t
405               jpk = nb_level
406               tmask = reform((reform(tmask(*, *), jpi*jpj)#replicate(1, jpk)), jpi, jpj, jpk)
407            ENDIF
408            @read_ncdf_varget
409            lec_data = res
410            data_direc = 'xyzt'
411
412;           vertical average ?
413            IF vert_switch ge 1  AND NOT keyword_set(no_mean) THEN BEGIN
414               old_boite = [lon1, lon2, lat1, lat2, prof1, prof2]
415               print, '      Average in vertical domain ', vert_type, vert_mean
416               IF mesh_type EQ 'atm' THEN BEGIN
417                  CASE atmos_msk OF
418                     0: print, '          [take all points] ' ; take all points
419                     1: BEGIN
420                        ; take ocean points only
421                        idx = where(tmask EQ 0)
422                        lec_data(idx) = 1.e20
423                        print, '          [take ocean points only] '
424                     END
425                     2: BEGIN
426                        ; take land points only
427                        idx = where(tmask GT 0)
428                        lec_data(idx) = 1.e20
429                        print, '          [take land points only] '
430                     END
431                  ENDCASE
432                  CASE vert_type OF
433                     'z': BEGIN ; levels
434                       
435                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
436                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa'
437                        ENDIF ELSE BEGIN
438                           zmean = grossemoyenne(lec_data, 'z', boite = vert_mean)
439                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(vert_mean(0)), 2)+','+strtrim(string(vert_mean(1)), 2)+']'
440                        ENDELSE
441                     END
442                     ELSE: BEGIN ; levels
443                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
444                           zmean = lec_data(*, *, vert_mean[0])
445                           name_suff = ' at '+vert_type+' '+strtrim(string(long(vert_mean(0))), 2)+' ['+strtrim(string(gdept(vert_mean(0))), 2)+' hPa]'
446                        ENDIF ELSE BEGIN
447                           zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex)
448                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
449                        ENDELSE
450                     END
451                  ENDCASE
452;                  tmask = reform(tmask(*, *, 0), jpi, jpj)
453               ENDIF ELSE BEGIN
454                  ; ocean = always mask
[4]455                  ; idx = where(tmask EQ 0)
456                  ; lec_data(idx) = 1.e20
[2]457                  CASE vert_type OF
458                     'z': BEGIN
459                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
460                           zmean = lec_data
461                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m'
462                        ENDIF ELSE BEGIN
463                           zmean = grossemoyenne(lec_data, 'z', boite = vert_mean)
464                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
465                        ENDELSE
466                     END
467                     ELSE: BEGIN
468                        IF vert_mean[0] EQ vert_mean[1] THEN BEGIN
469                           zmean = lec_data
470                           name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m'
471                        ENDIF ELSE BEGIN
472                           zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex, NAN =1.e20)
473                           name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'
474                        ENDELSE
475                     END
476                  ENDCASE
477               ENDELSE
478               lec_data = zmean
479               domdef, old_boite
480               field_dim = field_dim - 1
481               data_direc = 'xyt'
482               nzt = 1
483               firstz = 0
484               lastz = 0
485            ENDIF
486         ENDELSE
487      END
488     ;; erreur si dim > 4
489      ELSE: BEGIN
490         err_mess =  '  *** nc_read : ERROR dimension > 4'
491         lec_data = -1.0
492      END
493   ENDCASE
494
495; scaling ?
496   FOR i = 0, varcontient.natts-1 DO BEGIN
497      att_txt = ncdf_attname(cdfid, varid, i)
498      IF att_txt EQ 'scale_factor' THEN BEGIN
499         ncdf_attget, cdfid, varid, att_txt, valscale
500         lec_data = lec_data*valscale
501      ENDIF
502   ENDFOR
503
504; Attribut du champ
505
506   field = {name: '', data: lec_data, legend: '', units: '', origin: '', dim: 0, direc: data_direc}
507   field.name = var_name
508   field.origin = directory+file_name
509;
510; get long name
511;   result = '???'
512   FOR i = 0, varcontient.natts-1 DO BEGIN
513      att_txt = ncdf_attname(cdfid, varid, i)
514      IF att_txt EQ 'long_name' OR att_txt EQ 'title' THEN ncdf_attget, cdfid, varid, att_txt, result
515   ENDFOR
516   field.legend = strtrim(string(result),1)+name_suff
517
518; get unit
519; if it exists
520  isunits = ncdf_attinq(cdfid,  varid,  'units')
521  IF isunits.datatype NE 'UNKNOWN' THEN BEGIN
522     ncdf_attget, cdfid, varid, 'units', result
523     field.units = strtrim(string(result),1)
524  ENDIF ELSE BEGIN
525     print,  'No units for the variable ',  field.name
526     print,  ' Or units were forgotten in the file !'
527  ENDELSE
528  field.dim = field_dim
529
530
531;  get valmask (might need valmask = float(string(valmask))
532
533   valmask = 1.e20
534   FOR i = 0, varcontient.natts-1 DO BEGIN
535      att_txt = ncdf_attname(cdfid, varid, i)
536      IF att_txt EQ 'missing_value' OR att_txt EQ 'mask value' OR att_txt EQ '_FillValue' THEN ncdf_attget, cdfid, varid, att_txt, valmask
537   ENDFOR
538
539; min/max
540
541   chardim = ' - dim = '
542   FOR i = 1, (size(field.data))[0] DO BEGIN
543      chardim = chardim+string((size(field.data))[i], format = '(I5)')
544   ENDFOR 
545
546   index_test = (where (field.data NE valmask))
547   IF index_test(0) NE -1 THEN BEGIN
548      minf = min(field.data(where (field.data NE valmask)))
549      maxf = max(field.data(where (field.data NE valmask)))
550   ENDIF ELSE BEGIN
551      minf =  min(field.data)
552      maxf =  max(field.data)
553   ENDELSE
554
555   print, '      = ',field.legend, '    [min/max = ',minf , maxf,'  ', field.units,' - masked values = ',valmask, chardim, ']'
556
557
558   ncdf_close, cdfid
559
560;key_offset = key_offset_orig
561;jpi = jpi_orig
562;jpj = jpj_orig
563;jpk = jpk_orig
564
565   IF keyword_set(key_yreverse) THEN print, ' key_yreverse active : ',  key_yreverse
566
567   IF debug_w THEN print, 'DEBUG: Exiting nc_read...'
568
569   return, field
570
571
572END
Note: See TracBrowser for help on using the repository browser.