Changeset 81
- Timestamp:
- 03/26/08 20:24:00 (16 years ago)
- Location:
- branches/procs-read
- Files:
-
- 1 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/procs-read/data_read.pro
r60 r81 66 66 ENDIF 67 67 ENDIF 68 varexp = cmd.exp68 ; varexp = cmd.exp 69 69 70 70 ; define data base … … 91 91 ENDIF 92 92 93 ; define data domain 94 95 IF hotyp NE '-' THEN BEGIN ; time serie 96 ; get hovmoeller box + stride 97 box_plot = def_box(cmd.plt, dimplot, legbox, time_stride) 98 IF debug_w THEN print, ' box_plot for domdef in data_read = ', box_plot 99 CASE n_elements(box_plot) OF 100 4: domdef, box_plot[0:3], /MEMEINDICES 101 6: domdef, box_plot[0:5], /MEMEINDICES 102 ENDCASE 103 ; time grid for hovmoeller 104 time1 = 1+delta_t1 105 IF cmd.out EQ 'cdf' THEN nb_cycles = 1 106 timearr = compute_time(cmd.timave, cmd.date1, cmd.spec) 107 jpt = timearr.count 108 time2 = jpt+delta_t1 109 time = timearr.scale 110 niveau = 1 111 ; print, ' Data_read, hotyp/jpt = ', hotyp, jpt 112 ; print, ' Data_read, box = ', box_plot[0:3] 113 ENDIF ELSE BEGIN ; single date 114 jpt = 1 115 CASE strmid(cmd.timave, strlen(cmd.timave)-1, 1) OF 116 'y': time1 = delta_t1+1 117 'm': BEGIN 118 CASE strmid(cmd.timave, strlen(cmd.timave)-2, 1) OF 119 'm': time1 = delta_t1+long(strmid(cmd.date1, 0, 2)) ; mean month 120 ELSE: time1 = delta_t1+1 121 ENDCASE 122 END 123 'd': time1 = delta_t1+1 124 ELSE: time1 = delta_t1+1 125 ENDCASE 126 time2 = time1 127 time = time1 128 print, ' Setting domdef in data_read, plt typ =', plttyp 129 CASE plttyp OF 130 'plt': BEGIN 131 box_plot = def_box(cmd.plt, 2, legbox, time_stride) 132 IF strmid(cmd.var, 0,2) EQ 'vo' THEN BEGIN ; get right zindex for vertical 133 CASE vert_type OF 134 'level':domdef,[ box_plot[0:3],vert_mean],/zindex, /MEMEINDICES 135 'z':domdef,[ box_plot[0:3],vert_mean], /MEMEINDICES 136 ELSE: domdef, box_plot[0:3], /MEMEINDICES 137 ENDCASE 138 ENDIF ELSE BEGIN 139 domdef, box_plot[0:3], /MEMEINDICES 140 ENDELSE 141 END 142 'pltz': BEGIN 143 box_plot = def_box(cmd.plt, 2, legbox, time_stride) 144 domdef, box_plot[0:3], /MEMEINDICES 145 END 146 'plt1d': BEGIN 147 box_plot = def_box(cmd.plt, 2, legbox, time_stride) 148 domdef, box_plot[0:3], /MEMEINDICES 149 ; force all_data read 150 all_data = 1 151 END 152 ELSE: domdef, /MEMEINDICES 153 ENDCASE 154 ENDELSE 155 156 ; print, jpt, time1, time2, hotyp 93 ; define horizontal domain 94 ; if needed, vertical domain will be defined in the call of read_ncdf 95 box_plot = def_box(cmd.plt, dimplot, legbox, time_stride) 96 ;domdef, [box_plot[0:3], vert_mean], /MEMEINDICES 97 ;domdef, box_plot[0:3], /MEMEINDICES 98 CASE n_elements(box_plot) OF 99 4 : IF vert_switch GE 1 THEN box_plot = [box_plot, vert_mean] 100 6 : IF vert_switch GE 1 THEN box_plot = [box_plot[0:3], vert_mean] 101 ENDCASE 102 103 ; define timetsteps time1 and time2 104 IF hotyp NE '-' THEN BEGIN 105 time1 = delta_t1 106 timearr = compute_time(cmd.timave, cmd.date1, cmd.spec) 107 time2 = timearr.count+delta_t1 108 ENDIF ELSE BEGIN 109 IF strpos(cmd.timave, 'mm') NE -1 THEN time1 = delta_t1+long(strmid(cmd.date1, 0, 2)) $ 110 ELSE time1 = delta_t1 111 time2 = time1 112 ENDELSE 113 114 ; IF hotyp NE '-' THEN BEGIN ; time serie 115 ; ; get hovmoeller box + stride 116 ; box_plot = def_box(cmd.plt, dimplot, legbox, time_stride) 117 ; IF debug_w THEN print, ' box_plot for domdef in data_read = ', box_plot 118 ; CASE n_elements(box_plot) OF 119 ; 4: domdef, box_plot[0:3], /MEMEINDICES 120 ; 6: domdef, box_plot[0:5], /MEMEINDICES 121 ; ENDCASE 122 ; ; time grid for hovmoeller 123 ; time1 = 1+delta_t1 124 ; IF cmd.out EQ 'cdf' THEN nb_cycles = 1 125 ; timearr = compute_time(cmd.timave, cmd.date1, cmd.spec) 126 ; jpt = timearr.count 127 ; time2 = jpt+delta_t1 128 ; time = timearr.scale 129 ; niveau = 1 130 ; ; print, ' Data_read, hotyp/jpt = ', hotyp, jpt 131 ; ; print, ' Data_read, box = ', box_plot[0:3] 132 ; ENDIF ELSE BEGIN ; single date 133 ; jpt = 1 134 ; CASE strmid(cmd.timave, strlen(cmd.timave)-1, 1) OF 135 ; 'y': time1 = delta_t1+1 136 ; 'm': BEGIN 137 ; CASE strmid(cmd.timave, strlen(cmd.timave)-2, 1) OF 138 ; 'm': time1 = delta_t1+long(strmid(cmd.date1, 0, 2)) ; mean month 139 ; ELSE: time1 = delta_t1+1 140 ; ENDCASE 141 ; END 142 ; 'd': time1 = delta_t1+1 143 ; ELSE: time1 = delta_t1+1 144 ; ENDCASE 145 ; time2 = time1 146 ; time = time1 147 ; print, ' Setting domdef in data_read, plt typ =', plttyp 148 ; CASE plttyp OF 149 ; 'plt': BEGIN 150 ; box_plot = def_box(cmd.plt, 2, legbox, time_stride) 151 ; IF strmid(cmd.var, 0,2) EQ 'vo' THEN BEGIN ; get right zindex for vertical 152 ; CASE vert_type OF 153 ; 'level':domdef,[ box_plot[0:3],vert_mean],/zindex, /MEMEINDICES 154 ; 'z':domdef,[ box_plot[0:3],vert_mean], /MEMEINDICES 155 ; ELSE: domdef, box_plot[0:3], /MEMEINDICES 156 ; ENDCASE 157 ; ENDIF ELSE BEGIN 158 ; domdef, box_plot[0:3], /MEMEINDICES 159 ; ENDELSE 160 ; END 161 ; 'pltz': BEGIN 162 ; box_plot = def_box(cmd.plt, 2, legbox, time_stride) 163 ; domdef, box_plot[0:3], /MEMEINDICES 164 ; END 165 ; 'plt1d': BEGIN 166 ; box_plot = def_box(cmd.plt, 2, legbox, time_stride) 167 ; domdef, box_plot[0:3], /MEMEINDICES 168 ; ; force all_data read 169 ; all_data = 1 170 ; END 171 ; ELSE: domdef, /MEMEINDICES 172 ; ENDCASE 173 ; ENDELSE 174 ; ;box_plot = [ box_plot[0:3],vert_mean] 175 ; print, jpt, time1, time2, hotyp 157 176 158 177 ; save time in common fld_att … … 166 185 '@@': BEGIN 167 186 IF debug_w THEN print, 'keyword_set(all_data) : ', keyword_set(all_data) 168 fldr = macro_read(file_name, cmd.var, ncdf_db, TIME_1 = time1, TIME_2 = time2, ALL_DATA = all_data, _extra = ex)187 fldr = macro_read(file_name, cmd.var, ncdf_db, BOXZOOM = box_plot, TIME_1 = time1, TIME_2 = time2, ALL_DATA = all_data, _extra = ex) 169 188 IF stddev_diff EQ 1 THEN fldr.origin = 'diff' 170 189 END … … 294 313 295 314 ENDIF ELSE BEGIN ; general case 296 fldr = nc_read(file_name, cmd.var, ncdf_db, $ 297 TIME_1 = time1, TIME_2 = time2, ALL_DATA = all_data, _extra = ex) 298 315 fldr = nc_read(file_name, cmd.var, ncdf_db, BOXZOOM = box_plot, $ 316 TIME_1 = time1, TIME_2 = time2, ALL_DATA = all_data, _extra = ex) 317 ;fldr = nc_read(file_name, cmd.var, ncdf_db, $ 318 ; TIME_1 = time1, TIME_2 = time2, ALL_DATA = all_data, _extra = ex) 299 319 ; perform mean if hovmoeller diagram is required 300 320 ; It is absolutely necessary for the division case with … … 315 335 END 316 336 ENDCASE 337 338 ; Pb with varexp which is always updated in read_ncdf 339 ; For Seb, varexp is the name of the file 340 ; For Eric, varexp is the name of the experiment 341 varexp = cmd.exp 317 342 318 343 ; if tkeavt, take log -
branches/procs-read/macro_read.pro
r48 r81 2 2 ; Read Macro field Data 3 3 ;--------------------------- 4 FUNCTION macro_read, file_name, var_name, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, _extra = ex4 FUNCTION macro_read, file_name, var_name, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, _extra = ex 5 5 @common 6 6 @com_eg … … 34 34 ELSE: 35 35 ENDCASE 36 strcall = 'field_lec = '+macro_def[2]+'(file_name, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, _extra = ex)'36 strcall = 'field_lec = '+macro_def[2]+'(file_name, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, _extra = ex)' 37 37 res = execute(strcall) 38 38 fieldo = {name: '', data: field_lec.data, legend: '', units: '', origin: '', dim: 0, direc:''} -
branches/procs-read/macros/make_eos.pro
r2 r81 49 49 ;------------------------------------------------------------ 50 50 ;------------------------------------------------------------ 51 FUNCTION make_eos, file_name, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ZMTYP = zmtyp51 FUNCTION make_eos, file_name, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, ZMTYP = zmtyp 52 52 ; 53 53 @common … … 57 57 ; Read T and S 58 58 ; 59 tn = nc_read(file_name,'votemper', ncdf_db, TIME_1 = time_1, TIME_2 = time_2, no_mean = 1)60 sn = nc_read(file_name,'vosaline', ncdf_db, TIME_1 = time_1, TIME_2 = time_2, no_mean = 1)59 tn = nc_read(file_name,'votemper', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, no_mean = 1) 60 sn = nc_read(file_name,'vosaline', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, no_mean = 1) 61 61 62 62 ; declarations -
branches/procs-read/macros/make_msf.pro
r2 r81 2 2 ; make MSF 3 3 ; 4 FUNCTION make_msf, file_name, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ZMTYP = zmtyp4 FUNCTION make_msf, file_name, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, ZMTYP = zmtyp 5 5 6 6 @common … … 14 14 ; 15 15 file_nam = strmid(file_name, 0, strlen(file_name)-4) 16 v = nc_read(file_nam+'V.nc','vomecrty', ncdf_db, TIME_1 = time_1, TIME_2 = time_2)16 v = nc_read(file_nam+'V.nc','vomecrty', ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2) 17 17 18 18 idx = where(v.data EQ valmask) -
branches/procs-read/macros/make_stddev.pro
r17 r81 2 2 ; make std dev from 2D macro_base_fld monthly time serie (defined in macro_read) 3 3 ; 4 FUNCTION make_stddev, file_name, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, ZMTYP = zmtyp4 FUNCTION make_stddev, file_name, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, ZMTYP = zmtyp 5 5 6 6 @common … … 12 12 IF debug_w THEN print, 'keyword_set(ALL_DATA) : ', keyword_set(ALL_DATA) 13 13 14 mfld = nc_read(file_name, macro_base_fld, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data) 15 14 mfld = nc_read(file_name, macro_base_fld, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data) 16 15 mfld.data = trends(mfld.data, '412', 'xyt') 17 16 -
branches/procs-read/meshes/mesh_from_file.pro
r69 r81 15 15 print,' Model inits for ', model, ' from file: ', s_file 16 16 17 sm_file = hom_idl+'grids/grids_'+model+'.nc'18 res = find(sm_file)17 ; sm_file = hom_idl+'grids/grids_'+model+'.nc' 18 ; res = find(sm_file) 19 19 varexpp = varexp 20 IF res NE 'NOT FOUND' THEN BEGIN21 22 initncdf, s_file, GLAMBOUNDARY = glamboundary_box23 24 print, ' Found mask from ',sm_file25 26 tmask = byte(read_ncdf('sftlf', 0, 0, /timestep, file = sm_file, /nostruct))27 28 idx = where(tmask EQ valmask)29 30 IF idx(0) NE -1 THEN tmask(idx) = 0.31 idx = where(tmask LE 50.)32 tmask(idx) = 0.33 tmask = tmask < 134 tmask = 1-tmask35 triangles=triangule()36 37 ENDIF ELSE BEGIN20 ; IF res NE 'NOT FOUND' THEN BEGIN 21 ; 22 ; initncdf, s_file, GLAMBOUNDARY = glamboundary_box 23 ; 24 ; print, ' Found mask from ',sm_file 25 ; 26 ; tmask = byte(read_ncdf('sftlf', 0, 0, /timestep, file = sm_file, /nostruct)) 27 ; 28 ; idx = where(tmask EQ valmask) 29 ; 30 ; IF idx(0) NE -1 THEN tmask(idx) = 0. 31 ; idx = where(tmask LE 50.) 32 ; tmask(idx) = 0. 33 ; tmask = tmask < 1 34 ; tmask = 1-tmask 35 ; triangles=triangule() 36 ; 37 ; ENDIF ELSE BEGIN 38 38 CASE var_name OF 39 39 '@@voenergy': var_local = 'so' … … 63 63 ; build grid 64 64 CASE mesh_type of 65 'atm': initncdf, s_file, GLAMBOUNDARY = glamboundary_box, ZAXISNAME = name_level 65 'atm': BEGIN 66 ;;initncdf, s_file, USEASMASK = var_local, missing_value = valmask, GLAMBOUNDARY = glamboundary_box, ZAXISNAME = name_level 67 initncdf, s_file, GLAMBOUNDARY = glamboundary_box, ZAXISNAME = name_level 68 END 66 69 ELSE: initncdf, s_file, USEASMASK = var_local, missing_value = valmask, GLAMBOUNDARY = glamboundary_box, ZAXISNAME = 'depth' 67 70 ENDCASE … … 71 74 IF debug_w THEN print, ' gdept :', size(gdept) 72 75 73 ENDELSE76 ; ENDELSE 74 77 75 78 varexp = varexpp … … 84 87 IF debug_w THEN print, ' ' 85 88 89 stop 90 86 91 return 87 92 END -
branches/procs-read/meshes/mesh_orca.pro
r26 r81 54 54 55 55 56 IF keyword_set(NO_SHIFT) THEN key_shift = 057 56 ; IF keyword_set(NO_SHIFT) THEN key_shift = 0 57 IF keyword_set(NO_SHIFT) THEN shift = 0 ;; key_shift = 0 58 58 no_lon_shift = 0 59 59 60 key_periodique = 1 60 ; key_periodique = 1 61 periodic = 1 61 62 62 63 ; reduce grid in latitude ? … … 120 121 'ORCA05': BEGIN 121 122 mesmsk = 'micromeshmaskORCA05.nc' 122 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 123 ;;cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 124 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box, PERIODIC = periodic' 123 125 END 124 126 'ORCA_R2': BEGIN … … 130 132 'V3': mesmsk = 'meshmask_ORCA_R2_V2.nc' 131 133 ENDCASE 132 IF whole_arrays EQ 0 THEN BEGIN 133 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box, onearth = onearth' 134 IF whole_arrays EQ 0 THEN BEGIN 135 136 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box, PERIODIC=periodic' 137 ;;cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = 138 ;;glamboundary_box, onearth = onearth' 134 139 ENDIF ELSE BEGIN 135 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 140 ;;cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box 141 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box, SHIFT=shift, PERIODIC=periodic' 136 142 ENDELSE 137 143 END 138 144 'L300': BEGIN 139 145 mesmsk = 'meshmask.orca.2d.L300.nc' 140 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 146 ;;cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 147 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box, PERIODIC=periodic' 141 148 END 142 149 ENDCASE … … 144 151 'ORCA_R4': BEGIN 145 152 mesmsk = 'meshmask_orca4.nc' 146 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 153 ;;cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box' 154 cmd_grid = 'ncdf_meshread, sm_file, GLAMBOUNDARY = glamboundary_box, PERIODIC=periodic' 147 155 END 148 156 ENDCASE … … 153 161 sm_file = hom_idl+'grids/'+mesmsk 154 162 res = find(sm_file) 155 163 156 164 IF res NE 'NOT FOUND' THEN BEGIN 157 165 res_grid = execute(cmd_grid) 158 166 ENDIF ELSE BEGIN 159 167 stop, 'No meshmask file found for ORCA mesh config' 160 168 ENDELSE 161 169 … … 243 251 print, ' End of ORCA mesh config ' 244 252 253 245 254 END -
branches/procs-read/nc_read.pro
r41 r81 3 3 ; EG 24/2/99 4 4 ;--------------------------- 5 FUNCTION nc_read, file_name, var_name, ncdf_db, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, NO_MEAN = no_mean5 FUNCTION nc_read, file_name, var_name, ncdf_db, BOXZOOM = boxzoom, TIME_1 = time_1, TIME_2 = time_2, ALL_DATA = all_data, NO_MEAN = no_mean 6 6 7 7 ; arguments = file_name, varname … … 11 11 @common 12 12 @com_eg 13 14 ;; print, 'key_yreverse : ', key_yreverse 15 13 16 14 ; inits 17 IF debug_w THEN print, ' '18 IF debug_w THEN print, ' ENTER nc_read'15 IF debug_w THEN print, ' ' 16 IF debug_w THEN print, ' ENTER nc_read...' 19 17 20 18 IF NOT keyword_set(TIME_1) THEN time_1 = 1 21 19 IF NOT keyword_set(TIME_2) THEN time_2 = time_1 22 ; 20 21 23 22 ; decide which subdomain of data to read 24 ; 25 26 IF debug_w THEN print, ' keyword_set(ALL_DATA) : ', keyword_set(ALL_DATA) 27 23 IF debug_w THEN print, ' keyword_set(ALL_DATA) : ', keyword_set(ALL_DATA) 28 24 IF keyword_set(ALL_DATA) THEN BEGIN 29 print, ' Reading whole domain' 30 firstx = 0 31 firsty = 0 32 firstz = 0 33 nx = jpi 34 ny = jpj 35 nz = jpk 36 lastx = jpi-1 37 lasty = jpj-1 38 lastz = jpk-1 25 tout = 1 26 ENDIF ELSE tout = 0 27 CASE vert_type OF 28 'z' : zindex = 0 29 'level' : zindex = 1 30 ELSE: zindex = 0 31 ENDCASE 32 33 ; IF keyword_set(ALL_DATA) THEN BEGIN 34 ; print, ' Reading whole domain' 35 ; firstx = 0 36 ; firsty = 0 37 ; firstz = 0 38 ; nx = jpi 39 ; ny = jpj 40 ; nz = jpk 41 ; lastx = jpi-1 42 ; lasty = jpj-1 43 ; lastz = jpk-1 39 44 ;Rajout MK 40 45 ;Trouver une meilleure place 41 ixminmesh = 042 iyminmesh = 043 ixmaxmesh = jpi-144 iymaxmesh = jpj-146 ; ixminmesh = 0 47 ; iyminmesh = 0 48 ; ixmaxmesh = jpi-1 49 ; iymaxmesh = jpj-1 45 50 ;Fin rajout 46 ENDIF ELSE BEGIN 47 grille,mask,glam,gphi,gdep,nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz 48 mask = 1 49 ENDELSE 50 51 IF debug_w THEN print, ' nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz' 52 IF debug_w THEN print, ' ', nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz 53 54 IF debug_w THEN print, ' key_offset =', key_offset 55 IF debug_w THEN print, ' jpi, jpj, jpk =', jpi, jpj, jpk 51 ; ENDIF ELSE BEGIN 52 ; grille,mask,glam,gphi,gdep,nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz 53 ; mask = 1 54 ; ENDELSE 55 ; IF debug_w THEN print, ' nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz' 56 ; IF debug_w THEN print, ' ', nx,ny,nz,firstx,firsty,firstz,lastx,lasty,lastz 57 58 ; IF debug_w THEN print, ' key_offset =', key_offset 59 ; IF debug_w THEN print, ' jpi, jpj, jpk, jpt =', jpi, jpj, jpk, jpt 56 60 57 61 58 62 ; define reading boundaries 59 60 x_count = nx 61 y_count = ny 62 z_count = nz 63 64 IF debug_w THEN print, ' nx,ny,nz =', nx,ny,nz 63 ; x_count = nx 64 ; y_count = ny 65 ; z_count = nz 66 67 ; IF debug_w THEN print, ' nx,ny,nz =', nx,ny,nz 65 68 66 69 ; force izmaxmesh to lastz 67 jpk = lastz+170 ; jpk = lastz+1 68 71 69 72 ; dealing with longitude periodicity 70 IF x_count NE jpi THEN BEGIN 71 key_shift_read = 0 72 ENDIF ELSE key_shift_read = key_shift 73 IF debug_w THEN print, ' key_shift_read=', key_shift_read 74 75 x_offset = key_offset[0]+ firstx+(key_shift_read-key_shift) 76 y_offset = key_offset[1]+ firsty 77 z_offset = key_offset[2]+ firstz 78 IF debug_w THEN print, ' offset =', x_offset, y_offset, z_offset 79 80 ; pour trouver un fichier, tu as 81 ; findfile (tres pratique) et dialog_pickfile (interactif) 82 83 ; pour verifier si il y a une variable je fais 84 85 ; inq=ncdf_inquire(cdfid) 86 ; for varid=0,inq.nvars-1 do BEGIN 87 ; varinq=ncdf_varinq(cdfid,varid) 88 ; if varinq.name eq nom then goto, variabletrouvee 89 ; endfor 90 ; return, -1 91 ; variabletrouvee: 73 ; IF x_count NE jpi THEN BEGIN 74 ; key_shift_read = 0 75 ; ENDIF ELSE key_shift_read = key_shift 76 ; IF debug_w THEN print, ' key_shift_read=', key_shift_read 77 78 ; x_offset = key_offset[0]+ firstx+(key_shift_read-key_shift) 79 ; y_offset = key_offset[1]+ firsty 80 ; z_offset = key_offset[2]+ firstz 81 ; IF debug_w THEN print, ' offset =', x_offset, y_offset, z_offset 92 82 93 83 ; local directory 94 84 95 IF strpos(ncdf_db, ':') GE 1 THEN directory = (str _sep(ncdf_db, ':'))[1] $85 IF strpos(ncdf_db, ':') GE 1 THEN directory = (strsplit(ncdf_db, ':', /EXTRACT))[1] $ 96 86 ELSE directory = ncdf_db 97 87 98 88 ; existence of file 99 89 100 list = findfile(directory+file_name, count = nb_file)101 102 IF nb_file EQ 0 THEN BEGIN103 print, ''104 print, ' ***** file ', file_name, ' not found in ', $105 directory106 print, ''107 field = {data: -1.0}108 return, field109 ENDIF90 ; list = findfile(directory+file_name, count = nb_file) 91 92 ; IF nb_file EQ 0 THEN BEGIN 93 ; print, '' 94 ; print, ' ***** file ', file_name, ' not found in ', $ 95 ; directory 96 ; print, '' 97 ; field = {data: -1.0} 98 ; return, field 99 ; ENDIF 110 100 111 101 ; ouverture fichier netCDF + contenu 112 cdfid=ncdf_open(directory+file_name)113 inq=ncdf_inquire(cdfid)102 ; cdfid=ncdf_open(directory+file_name) 103 ; inq=ncdf_inquire(cdfid) 114 104 ; que contient la variable 115 varid = ncdf_varid(cdfid, var_name)105 ; varid = ncdf_varid(cdfid, var_name) 116 106 117 107 name_suff = '' 118 119 IF varid EQ -1 THEN BEGIN 120 print, '' 121 print, ' ***** field ', var_name, ' not found in file ', $ 122 file_name 123 print, '' 124 field = {data: -1.0} 125 return, field 126 ENDIF 127 varinq=ncdf_varinq(cdfid, var_name) 108 data_direc = '' 109 110 ; IF varid EQ -1 THEN BEGIN 111 ; print, '' 112 ; print, ' ***** field ', var_name, ' not found in file ', $ 113 ; file_name 114 ; print, '' 115 ; field = {data: -1.0} 116 ; return, field 117 ; ENDIF 118 ; varinq=ncdf_varinq(cdfid, var_name) 128 119 129 120 ; test sur la dimension 130 err_mess = ''131 field_dim = n_elements(varinq.dim)121 ; err_mess = '' 122 ; field_dim = n_elements(varinq.dim) 132 123 133 124 ; get unlimited record variable 134 IF inq.recdim NE -1 THEN BEGIN 135 ncdf_diminq, cdfid, inq.recdim, name_time, nb_time 136 ;;ncdf_varget, cdfid, inq.recdim, time_array 137 ;;nb_time = (size(time_array))(1) 138 ENDIF ELSE BEGIN 139 ; Look for a potential record dimension 140 IF debug_w THEN print, ' Warning : no unlimited record in netCDF file' 141 ; Look for the names of all dimensions and all variables 142 list_dims = ncdf_listdims(cdfid) 143 list_vars = ncdf_listvars(cdfid) 144 ; Propose all the names and make the user choose the right one 145 ; for the record dimension 146 print, 'In the file ', file_name, ', the dimensions are named :' 147 print, list_dims 148 print, 'In the file ', file_name, ', the variables are named :' 149 print, list_vars 150 name_time = xquestion('Among the preceding names, which one could refer to the record dimension ?', /chkwid) 151 IF name_time NE '-' THEN BEGIN 152 dimidt = ncdf_dimid(cdfid, name_time) 153 ncdf_diminq, cdfid, dimidt, name_time, nb_time 154 print, 'You chose ', name_time, ' as a record dimension and its size is ', nb_time 155 inq.recdim = dimidt 156 ENDIF ELSE BEGIN 157 print, 'No record dimension considered in the file' 158 nb_time = 0 159 ENDELSE 160 161 IF varinq.dim[varinq.ndims-1] NE dimidt THEN STOP, $ 162 'Post_it cannot handle variables whose record dimension is not the last one' 163 164 ; ncdf_diminq,cdfid,(n_elements(varinq.dim)-1), name_time, nb_time 165 ; dimidl = ncdf_dimid(cdfid, name_time) 166 ; ncdf_diminq,cdfid,dimidl, name_time, nb_time 167 ; varidl = ncdf_varid(cdfid, name_time) 168 ; ncdf_varget, cdfid, varidl, time_array 169 170 ENDELSE 171 172 IF jpt GT nb_time THEN BEGIN 173 jpt = nb_time 174 print, 'Warning : the specified jpt does not correspond to the real time dimension in the file !' 175 print, 'New jpt =', jpt 176 ENDIF 177 ; defs for @read_ncdf_varget 178 179 ; key_stride = time_stride 180 key_stride = 1 181 if n_elements(key_stride) LE 2 then key_stride = [1, 1, 1] 182 key_stride = 1l > long(key_stride) 183 jpitotal = long(ixmaxmesh-ixminmesh+1) 184 key_shift = long(testvar(var = key_shift)) 185 186 key = long(key_shift MOD jpitotal) 187 if key LT 0 then key = key+jpitotal 188 ixmin = ixminmesh-ixmindta 189 iymin = iyminmesh-iymindta 190 firsttps = time_1-1 191 lasttps = time_2-1 192 193 name = varid 194 125 ; IF inq.recdim NE -1 THEN BEGIN 126 ; ncdf_diminq, cdfid, inq.recdim, name_time, nb_time 127 ; ;;ncdf_varget, cdfid, inq.recdim, time_array 128 ; ;;nb_time = (size(time_array))(1) 129 ; ENDIF ELSE BEGIN 130 ; ; Look for a potential record dimension 131 ; IF debug_w THEN print, ' Warning : no unlimited record in netCDF file' 132 ; ; Look for the names of all dimensions and all variables 133 ; list_dims = ncdf_listdims(cdfid) 134 ; list_vars = ncdf_listvars(cdfid) 135 ; ; Propose all the names and make the user choose the right one 136 ; ; for the record dimension 137 ; print, 'In the file ', file_name, ', the dimensions are named :' 138 ; print, list_dims 139 ; print, 'In the file ', file_name, ', the variables are named :' 140 ; print, list_vars 141 ; name_time = xquestion('Among the preceding names, which one could refer to the record dimension ?', /chkwid) 142 ; IF name_time NE '-' THEN BEGIN 143 ; dimidt = ncdf_dimid(cdfid, name_time) 144 ; ncdf_diminq, cdfid, dimidt, name_time, nb_time 145 ; print, 'You chose ', name_time, ' as a record dimension and its size is ', nb_time 146 ; inq.recdim = dimidt 147 ; ENDIF ELSE BEGIN 148 ; print, 'No record dimension considered in the file' 149 ; nb_time = 0 150 ; ENDELSE 151 152 ; IF varinq.dim[varinq.ndims-1] NE dimidt THEN STOP, $ 153 ; 'Post_it cannot handle variables whose record dimension is not the last one' 154 155 ;; ncdf_diminq,cdfid,(n_elements(varinq.dim)-1), name_time, nb_time 156 ;; dimidl = ncdf_dimid(cdfid, name_time) 157 ;; ncdf_diminq,cdfid,dimidl, name_time, nb_time 158 ;; varidl = ncdf_varid(cdfid, name_time) 159 ;; ncdf_varget, cdfid, varidl, time_array 160 161 ; ENDELSE 162 163 ; IF jpt GT nb_time THEN BEGIN 164 ; jpt = nb_time 165 ; print, 'Warning : the specified jpt does not correspond to the real time dimension in the file !' 166 ; print, 'New jpt =', jpt 167 ; ENDIF 168 ; ; defs for @read_ncdf_varget 169 170 ;; key_stride = time_stride 171 ; key_stride = 1 172 ; if n_elements(key_stride) LE 2 then key_stride = [1, 1, 1] 173 ; key_stride = 1l > long(key_stride) 174 ; jpitotal = long(ixmaxmesh-ixminmesh+1) 175 ; key_shift = long(testvar(var = key_shift)) 176 177 ; key = long(key_shift MOD jpitotal) 178 ; if key LT 0 then key = key+jpitotal 179 ; ixmin = ixminmesh-ixmindta 180 ; iymin = iyminmesh-iymindta 181 ; firsttps = time_1-1 182 ; lasttps = time_2-1 183 184 ; name = varid 185 186 ; IF debug_w THEN print, ' ' 187 ; IF debug_w THEN print, ' key=', key 188 ; IF debug_w THEN print, ' jpitotal=', jpitotal 189 ; IF debug_w THEN print, ' ixmindta,iymindta,izmindta =', ixmindta,iymindta,izmindta 190 ; IF debug_w THEN print, ' ixminmesh,iyminmesh=', ixminmesh,iyminmesh 191 ; IF debug_w THEN print, ' ixmaxmesh,iymaxmesh=', ixmaxmesh,iymaxmesh 192 ; IF debug_w THEN print, ' izminmesh,izmaxmesh=', izminmesh,izmaxmesh 193 ; IF debug_w THEN print, ' ixmin,iymin=', ixmin,iymin 194 ; IF debug_w THEN print, ' firsttps,lasttps=', firsttps, lasttps 195 ; IF debug_w THEN print, ' key_shift in nc_read=', key_shift 196 ; IF debug_w THEN print, ' key_yreverse, firsty, lasty',key_yreverse, firsty, lasty 197 ; IF debug_w THEN print, ' ' 198 199 ncdf_getatt, directory+file_name, var_name, add_offset = add_offset, scale_factor = scale_factor, $ 200 missing_value = missing_value, units = units, calendar = calendar, long_name = long_name 201 202 ; By default units for the Z axis are meters 203 IF n_elements(gdept) GT 1 AND name_level NE '-' THEN BEGIN 204 ncdf_getatt, directory+file_name, name_level, units = units_depth 205 ENDIF ELSE units_depth = 'm' 206 207 ; Read the data with a call to read_ncdf 195 208 IF debug_w THEN print, ' ' 196 IF debug_w THEN print, ' key=', key 197 IF debug_w THEN print, ' jpitotal=', jpitotal 209 IF debug_w THEN print, ' Reading raw data from ', file_name 210 211 lec_data = read_ncdf(var_name, time_1-1, time_2-1, BOXZOOM = boxzoom, FILENAME = directory+file_name, $ 212 /TIMESTEP, /ADDSCL_BEFORE, TOUT = tout, /NOSTRUCT, /CONT_NOFILL, GRID = vargrid, $ 213 ZINVAR = zinvar, ZINDEX = zindex) 214 215 print, 'zinvar', zinvar 216 217 IF debug_w THEN print, ' ' 218 ; IF debug_w THEN print, ' key=', key 219 ; IF debug_w THEN print, ' jpitotal=', jpitotal 198 220 IF debug_w THEN print, ' ixmindta,iymindta,izmindta =', ixmindta,iymindta,izmindta 199 221 IF debug_w THEN print, ' ixminmesh,iyminmesh=', ixminmesh,iyminmesh 200 222 IF debug_w THEN print, ' ixmaxmesh,iymaxmesh=', ixmaxmesh,iymaxmesh 201 223 IF debug_w THEN print, ' izminmesh,izmaxmesh=', izminmesh,izmaxmesh 202 IF debug_w THEN print, ' ixmin,iymin=', ixmin,iymin 203 IF debug_w THEN print, ' firsttps,lasttps=', firsttps, lasttps 224 ; IF debug_w THEN print, ' ixmin,iymin=', ixmin,iymin 225 ; IF debug_w THEN print, ' firsttps,lasttps=', firsttps, lasttps 226 IF debug_w THEN print, ' jpt=', jpt 204 227 IF debug_w THEN print, ' key_shift in nc_read=', key_shift 205 IF debug_w THEN print, ' key_yreverse, firsty, lasty',key_yreverse, firsty, lasty 228 ; IF debug_w THEN print, ' key_yreverse, firsty, lasty',key_yreverse, firsty, lasty 229 IF debug_w THEN print, ' key_yreverse',key_yreverse 206 230 IF debug_w THEN print, ' ' 207 231 208 CASE n_elements(varinq.dim) OF 209 210 ;; fichier 2d : surface 211 2: BEGIN 212 print, ' Reading ', var_name, ' (2D data) from ', file_name 213 @read_ncdf_varget 214 lec_data = res 215 data_direc = 'xy' 216 niveau = 1 217 END 218 219 ;; fichier 3d : 2 cas = 1/ 2d espace + temps 2/ 3d espace 220 3: BEGIN 221 ;; si varinq.dim contient la dim infinie (no 3) -> temps 222 dim_3 = '3d' 223 IF nb_time GE 1 THEN dim_3 = '2d' 224 IF dim_3 EQ '2d' THEN BEGIN 225 226 IF time_2 EQ time_1 THEN BEGIN 227 print, ' Reading ', var_name, ' (2D data - index ', strcompress(string(time_1)),') from ', file_name 228 @read_ncdf_varget 229 lec_data = res 230 data_direc = 'xy' 231 ENDIF ELSE BEGIN 232 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 233 IF debug_w THEN print, ' x_offset et y_offset et time_1 :', x_offset, y_offset, time_1 234 @read_ncdf_varget 235 lec_data = res 236 data_direc = 'xyt' 237 ENDELSE 238 239 ENDIF ELSE BEGIN 240 print, ' Reading ', var_name, ' (3D data)', ' from ', file_name 241 @read_ncdf_varget 242 lec_data = res 243 data_direc = 'xyz' 244 ENDELSE 245 END 246 ;; fichier 4d : volume + temps 247 4: BEGIN 248 IF time_2 EQ time_1 THEN BEGIN 249 print, ' Reading ', var_name, ' (3D data - index ', strcompress(string(time_1)),') from ', file_name 250 ; read vertical levels 251 IF debug_w THEN print, ' mesh_type= ',mesh_type 252 IF mesh_type EQ 'atm' THEN BEGIN 253 ncdf_diminq,cdfid,2, name_level, nb_level 254 IF debug_w THEN print, 'name_level, nb_level = ', name_level, nb_level 255 256 dimidl = ncdf_dimid(cdfid, name_level) 257 ncdf_diminq,cdfid,dimidl, name_level, nb_level 258 259 varidl = ncdf_varid(cdfid, name_level) 260 ; make sure name_level is in hPa 261 ncdf_attget, cdfid, varidl, 'units', val_unit 262 IF string(val_unit) NE 'hPa' AND string(val_unit) NE 'millibar' AND string(val_unit) NE 'mbar' THEN BEGIN 263 print, ' vertical levels coordinate not obvious = ', name_level 264 print, ' ... using <levels> ...' 265 varidl = ncdf_varid(cdfid, 'levels') 266 ENDIF 232 ;lec_data = struct_data.tab 233 ;data_direc = 'xy' 234 ;field_dim = (size(struct.tab))[0] 235 field_dim = (size(lec_data))[0] 236 IF field_dim LE 0 THEN stop, ' Something wrong happened in read_ncdf ' 237 238 ; build 3D atmospheric mask if needed and mask values 239 ; IF mesh_type EQ 'atm' THEN BEGIN 240 ; ;tmask = make_3d_atm_msk(directory+file_name, field_dim) 241 ; CASE atmos_msk OF 242 ; 0: print, ' [atmos grid : take all points] ' ; take all points 243 ; 1: BEGIN 244 ; ; take ocean points only 245 ; idx = where(tmask EQ 0) 246 ; stop 247 ; IF idx NE -1 THEN lec_data(idx) = 1.e20 248 ; print, ' [atmos grid : take ocean points only] ' 249 ; END 250 ; 2: BEGIN 251 ; ; take land points only 252 ; idx = where(tmask GT 0) 253 ; IF idx NE -1 THEN lec_data(idx) = 1.e20 254 ; print, ' [atmos grid : take land points only] ' 255 ; END 256 ; ENDCASE 257 ; ENDIF 258 259 ; Average data along vertical if needed and update some features 260 ; needed for plt (data_direc, name_suff) 261 update_data, TAB = lec_data, VNAME = var_name, BOXZOOM = boxzoom, ZUNITS = units_depth, $ 262 ZINVAR = zinvar, SUFFIX = name_suff, D_DIREC = data_direc, $ 263 TIME_1 = time_1, TIME_2 = time_2, NO_MEAN = no_mean 264 field_dim = (size(lec_data))[0] 265 ;stop 266 267 ; CASE n_elements(varinq.dim) OF 268 ; CASE no_read_ncdf_varget OF 269 ; CASE field_dim OF 270 ; 1: BEGIN 271 ; print, ' !!!! 1D case not implemented !!!!' 272 ; print, ' !!!! read_ncdf cannot handle 1D data !!!!' 273 ; END 274 ; 275 ; ;; fichier 2d : surface 276 ; 2: BEGIN 277 ; print, ' Found ', var_name, ' (2D data) from ', file_name 278 ; ;@read_ncdf_varget 279 ; ;lec_data = res 280 ; data_direc = 'xy' 281 ; niveau = 1 282 ; END 283 284 ; ;; fichier 3d : 2 cas = 1/ 2d espace + temps 2/ 3d espace 285 ; 3: BEGIN 286 ; ;; si varinq.dim contient la dim infinie (no 3) -> temps 287 ; dim_3 = '3d' 288 ; IF nb_time GE 1 THEN dim_3 = '2d' 289 ; IF jpt GE 1 THEN dim_3 = '2d' 290 ; IF dim_3 EQ '2d' THEN BEGIN 291 ; IF jpt EQ 1 THEN BEGIN 292 ; 293 ; print, ' Found ', var_name, ' (3D data)', ' from ', file_name 294 ; ;@read_ncdf_varget 295 ; ;lec_data = res 296 ; data_direc = 'xyz' 297 ; 298 ; IF time_2 EQ time_1 THEN BEGIN 299 ; print, ' Found ', var_name, ' (2D data - index ', strcompress(string(time_1)),') from ', file_name 300 ; ;@read_ncdf_varget 301 ; ;lec_data = res 302 ; data_direc = 'xy' 303 ; ENDIF ELSE BEGIN 304 ; print, ' Found ', var_name, ' (2D data time serie)', strcompress(string(time_1)),'-', strtrim(string(time_2), 2), ' [every ',strtrim(string(time_stride), 2), '] from ', file_name 305 ; ;IF debug_w THEN print, ' x_offset et y_offset et time_1 :', x_offset, y_offset, time_1 306 ; ;@read_ncdf_varget 307 ; ;lec_data = res 308 ; data_direc = 'xyt' 309 ; ENDELSE 310 ; 311 ; ENDIF ELSE IF jpt GT 1 THEN BEGIN 312 ; ENDELSE 313 ; END 314 ; 315 ; ;; fichier 4d : volume + temps 316 ; 4: BEGIN 317 ; 318 ; IF time_2 EQ time_1 THEN BEGIN 319 ; print, ' Found ', var_name, ' (3D data - index ', strcompress(string(time_1)),') from ', file_name 320 ; ; read vertical levels 321 ; IF debug_w THEN print, ' mesh_type= ',mesh_type 322 ; IF mesh_type EQ 'atm' THEN BEGIN 323 ; ncdf_diminq,cdfid,2, name_level, nb_level 324 ; IF debug_w THEN print, 'name_level, nb_level = ', name_level, nb_level 325 ; 326 ; dimidl = ncdf_dimid(cdfid, name_level) 327 ; ncdf_diminq,cdfid,dimidl, name_level, nb_level 328 ; 329 ; varidl = ncdf_varid(cdfid, name_level) 330 ; ; make sure name_level is in hPa 331 ; ncdf_attget, cdfid, varidl, 'units', val_unit 332 ; IF string(val_unit) NE 'hPa' AND string(val_unit) NE 'millibar' AND string(val_unit) NE 'mbar' THEN BEGIN 333 ; print, ' vertical levels coordinate not obvious = ', name_level 334 ; print, ' ... using <levels> ...' 335 ; varidl = ncdf_varid(cdfid, 'levels') 336 ; ENDIF 267 337 268 ncdf_varget, cdfid, varidl, gdept269 gdept = gdept270 gdepw = gdept271 e3t = shift(gdept, 1)-gdept272 e3t[0] = e3t[1]273 e3w = e3t274 jpk = nb_level275 tmask = reform((reform(tmask(*, *), jpi*jpj)#replicate(1, jpk)), jpi, jpj, jpk)276 ENDIF277 IF debug_w THEN print, ' going into @read_ncdf_varget '278 @read_ncdf_varget279 lec_data = res338 ; ncdf_varget, cdfid, varidl, gdept 339 ; gdept = gdept 340 ; gdepw = gdept 341 ; e3t = shift(gdept, 1)-gdept 342 ; e3t[0] = e3t[1] 343 ; e3w = e3t 344 ; jpk = nb_level 345 ; tmask = reform((reform(tmask(*, *), jpi*jpj)#replicate(1, jpk)), jpi, jpj, jpk) 346 ; ENDIF 347 ; IF debug_w THEN print, ' going into @read_ncdf_varget ' 348 ; @read_ncdf_varget 349 ; lec_data = res 280 350 ; lec_data = reform(lec_data,x_count, y_count, z_count) 281 data_direc = 'xyz'282 IF debug_w THEN help, lec_data351 ; data_direc = 'xyz' 352 ; IF debug_w THEN help, lec_data 283 353 284 354 ; vertical average ? 285 IF vert_switch ge 1 AND NOT keyword_set(no_mean) THEN BEGIN286 old_boite = [lon1, lon2, lat1, lat2, prof1, prof2]287 print, ' Average in vertical domain ', vert_type, vert_mean288 IF mesh_type EQ 'atm' THEN BEGIN289 CASE atmos_msk OF290 0: print, ' [atmos grid : take all points] ' ; take all points291 1: BEGIN292 ; take ocean points only293 idx = where(tmask EQ 0)294 lec_data(idx) = 1.e20295 print, ' [atmos grid : take ocean points only] '296 END297 2: BEGIN298 ; take land points only299 idx = where(tmask GT 0)300 lec_data(idx) = 1.e20301 print, ' [atmos grid : take land points only] '302 END303 ENDCASE304 CASE vert_type OF305 'z': BEGIN ; depth range306 IF debug_w THEN print, ' performing average'307 zmean = grossemoyenne(lec_data, 'z', boite = vert_mean)308 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN309 name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa'310 ENDIF ELSE BEGIN311 name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'312 ENDELSE313 END314 ELSE: BEGIN ; levels range315 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN316 zmean = lec_data(*, *, vert_mean[0])317 name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa'318 ENDIF ELSE BEGIN319 zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex, NAN =1.e20)320 name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'321 ENDELSE322 END323 ENDCASE324 ; tmask = reform(tmask(*, *, 0), jpi, jpj)325 ENDIF ELSE BEGIN326 ; ocean = always mask327 ; idx = where(tmask EQ 0)328 ; lec_data(idx) = 1.e20329 CASE vert_type OF330 'z': BEGIN331 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN332 zmean = lec_data ; right depth already selected333 name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m'334 ENDIF ELSE BEGIN335 zmean = moyenne(lec_data, 'z', boite = vert_mean)336 name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'337 ENDELSE338 END339 ELSE: BEGIN ; case level (zindex)340 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN341 zmean = lec_data ; right depth already selected342 name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m'343 ENDIF ELSE BEGIN344 zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex)345 name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']'346 ENDELSE347 END348 ENDCASE349 ENDELSE350 lec_data = zmean351 domdef, old_boite352 field_dim = field_dim - 1353 data_direc = 'xy'354 nzt = 1355 firstz = 0356 lastz = 0357 ENDIF358 359 ENDIF ELSE BEGIN360 print, ' Reading ', var_name, ' (3D data time serie)', strcompress(string(time_1)),'-', strtrim(string(time_2), 2), ' from ', file_name361 ; read vertical levels362 IF mesh_type EQ 'atm' THEN BEGIN363 ncdf_diminq,cdfid,2, name_level, nb_level355 ; IF vert_switch ge 1 AND NOT keyword_set(no_mean) THEN BEGIN 356 ; old_boite = [lon1, lon2, lat1, lat2, prof1, prof2] 357 ; print, ' Average in vertical domain ', vert_type, vert_mean 358 ; IF mesh_type EQ 'atm' THEN BEGIN 359 ; CASE atmos_msk OF 360 ; 0: print, ' [atmos grid : take all points] ' ; take all points 361 ; 1: BEGIN 362 ; ; take ocean points only 363 ; idx = where(tmask EQ 0) 364 ; lec_data(idx) = 1.e20 365 ; print, ' [atmos grid : take ocean points only] ' 366 ; END 367 ; 2: BEGIN 368 ; ; take land points only 369 ; idx = where(tmask GT 0) 370 ; lec_data(idx) = 1.e20 371 ; print, ' [atmos grid : take land points only] ' 372 ; END 373 ; ENDCASE 374 ; CASE vert_type OF 375 ; 'z': BEGIN ; depth range 376 ; IF debug_w THEN print, ' performing average' 377 ; zmean = grossemoyenne(lec_data, 'z', boite = vert_mean) 378 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 379 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa' 380 ; ENDIF ELSE BEGIN 381 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 382 ; ENDELSE 383 ; END 384 ; ELSE: BEGIN ; levels range 385 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 386 ; zmean = lec_data(*, *, vert_mean[0]) 387 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa' 388 ; ENDIF ELSE BEGIN 389 ; zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex, NAN =1.e20) 390 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 391 ; ENDELSE 392 ; END 393 ; ENDCASE 394 ;; tmask = reform(tmask(*, *, 0), jpi, jpj) 395 ; ENDIF ELSE BEGIN 396 ;; ; ocean = always mask 397 ;; idx = where(tmask EQ 0) 398 ;; lec_data(idx) = 1.e20 399 ; CASE vert_type OF 400 ; 'z': BEGIN 401 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 402 ; zmean = lec_data ; right depth already selected 403 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m' 404 ; ENDIF ELSE BEGIN 405 ; zmean = moyenne(lec_data, 'z', boite = vert_mean) 406 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 407 ; ENDELSE 408 ; END 409 ; ELSE: BEGIN ; case level (zindex) 410 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 411 ; zmean = lec_data ; right depth already selected 412 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m' 413 ; ENDIF ELSE BEGIN 414 ; zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex) 415 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 416 ; ENDELSE 417 ; END 418 ; ENDCASE 419 ; ENDELSE 420 ; lec_data = zmean 421 ; domdef, old_boite 422 ; field_dim = field_dim - 1 423 ; data_direc = 'xy' 424 ; nzt = 1 425 ; firstz = 0 426 ; lastz = 0 427 ; ENDIF 428 ; 429 ; ENDIF ELSE BEGIN 430 ; print, ' Reading ', var_name, ' (3D data time serie)', strcompress(string(time_1)),'-', strtrim(string(time_2), 2), ' from ', file_name 431 ; ; read vertical levels 432 ; IF mesh_type EQ 'atm' THEN BEGIN 433 ; ncdf_diminq,cdfid,2, name_level, nb_level 364 434 365 435 ; get name of vertical level from metadata 366 file_grid_config = hom_def+'grid_config.def' 367 spawn, 'grep -i "\ '+meshlec_type+' " '+file_grid_config, line 368 line = strcompress(strtrim(line[0], 2)) 369 length = strlen(line) 370 371 IF length EQ 0 THEN BEGIN 372 print, ' *** nc_read : define name_level from grid ', meshlec_type, $ 373 ' in file ', file_grid_config 374 name_level = '' 375 return, -1 376 ENDIF ELSE BEGIN 377 argvar = str_sep(line, ' ') 378 name_level = argvar[1] 379 ENDELSE 380 dimidl = ncdf_dimid(cdfid, name_level) 381 ncdf_diminq,cdfid,dimidl, name_level, nb_level 382 383 varidl = ncdf_varid(cdfid, name_level) 384 ; make sure name_level is in hPa 385 ncdf_attget, cdfid, varidl, 'units', val_unit 386 IF string(val_unit) NE 'hPa' AND string(val_unit) NE 'millibar' AND string(val_unit) NE 'mbar' THEN BEGIN 387 print, ' vertical levels coordinate not obvious' 388 print, ' ... using <levels> ...' 389 varidl = ncdf_varid(cdfid, 'levels') 390 ENDIF 391 ncdf_varget, cdfid, varidl, gdept 392 gdepw = gdept 393 e3t = shift(gdept, 1)-gdept 394 e3t[0] = e3t[1] 395 e3w = e3t 396 jpk = nb_level 397 tmask = reform((reform(tmask(*, *), jpi*jpj)#replicate(1, jpk)), jpi, jpj, jpk) 398 ENDIF 399 @read_ncdf_varget 400 lec_data = res 401 data_direc = 'xyzt' 402 403 ; vertical average ? 404 IF vert_switch ge 1 AND NOT keyword_set(no_mean) THEN BEGIN 405 old_boite = [lon1, lon2, lat1, lat2, prof1, prof2] 406 print, ' Average in vertical domain ', vert_type, vert_mean 407 IF mesh_type EQ 'atm' THEN BEGIN 408 CASE atmos_msk OF 409 0: print, ' [take all points] ' ; take all points 410 1: BEGIN 411 ; take ocean points only 412 idx = where(tmask EQ 0) 413 lec_data(idx) = 1.e20 414 print, ' [take ocean points only] ' 415 END 416 2: BEGIN 417 ; take land points only 418 idx = where(tmask GT 0) 419 lec_data(idx) = 1.e20 420 print, ' [take land points only] ' 421 END 422 ENDCASE 423 CASE vert_type OF 424 'z': BEGIN ; levels 425 426 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 427 name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa' 428 ENDIF ELSE BEGIN 429 zmean = grossemoyenne(lec_data, 'z', boite = vert_mean) 430 name_suff = ' averaged in '+vert_type+'['+strtrim(string(vert_mean(0)), 2)+','+strtrim(string(vert_mean(1)), 2)+']' 431 ENDELSE 432 END 433 ELSE: BEGIN ; levels 434 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 435 zmean = lec_data(*, *, vert_mean[0]) 436 name_suff = ' at '+vert_type+' '+strtrim(string(long(vert_mean(0))), 2)+' ['+strtrim(string(gdept(vert_mean(0))), 2)+' hPa]' 437 ENDIF ELSE BEGIN 438 zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex) 439 name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 440 ENDELSE 441 END 442 ENDCASE 443 ; tmask = reform(tmask(*, *, 0), jpi, jpj) 444 ENDIF ELSE BEGIN 445 ; ocean = always mask 446 ; idx = where(tmask EQ 0) 447 ; lec_data(idx) = 1.e20 448 CASE vert_type OF 449 'z': BEGIN 450 IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 451 zmean = lec_data 452 name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m' 453 ENDIF ELSE BEGIN 454 zmean = grossemoyenne(lec_data, 'z', boite = vert_mean) 455 name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 456 ENDELSE 457 END 458 ELSE: 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 = moyenne(lec_data, 'z', boite = vert_mean, /zindex, NAN =1.e20) 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 ENDCASE 468 ENDELSE 469 lec_data = zmean 470 domdef, old_boite 471 field_dim = field_dim - 1 472 data_direc = 'xyt' 473 nzt = 1 474 firstz = 0 475 lastz = 0 476 ENDIF 477 ENDELSE 478 END 479 ;; erreur si dim > 4 480 ELSE: BEGIN 481 err_mess = ' *** nc_read : ERROR dimension > 4' 482 lec_data = -1.0 483 END 484 ENDCASE 485 486 ; scaling ? 487 FOR i = 0, varinq.natts-1 DO BEGIN 488 att_txt = ncdf_attname(cdfid, varid, i) 489 IF att_txt EQ 'scale_factor' THEN BEGIN 490 ncdf_attget, cdfid, varid, att_txt, valscale 491 lec_data = lec_data*valscale 492 ENDIF 493 ENDFOR 436 ; file_grid_config = hom_def+'grid_config.def' 437 ; spawn, 'grep -i "\ '+meshlec_type+' " '+file_grid_config, line 438 ; line = strcompress(strtrim(line[0], 2)) 439 ; length = strlen(line) 440 441 ; IF length EQ 0 THEN BEGIN 442 ; print, ' *** nc_read : define name_level from grid ', meshlec_type, $ 443 ; ' in file ', file_grid_config 444 ; name_level = '' 445 ; return, -1 446 ; ENDIF ELSE BEGIN 447 ; argvar = strsplit(line, ' ', /EXTRACT) 448 ; name_level = argvar[1] 449 ; ENDELSE 450 ; dimidl = ncdf_dimid(cdfid, name_level) 451 ; ncdf_diminq,cdfid,dimidl, name_level, nb_level 452 ; 453 ; varidl = ncdf_varid(cdfid, name_level) 454 ; ; make sure name_level is in hPa 455 ; ncdf_attget, cdfid, varidl, 'units', val_unit 456 ; IF string(val_unit) NE 'hPa' AND string(val_unit) NE 'millibar' AND string(val_unit) NE 'mbar' THEN BEGIN 457 ; print, ' vertical levels coordinate not obvious' 458 ; print, ' ... using <levels> ...' 459 ; varidl = ncdf_varid(cdfid, 'levels') 460 ; ENDIF 461 ; ncdf_varget, cdfid, varidl, gdept 462 ; gdepw = gdept 463 ; e3t = shift(gdept, 1)-gdept 464 ; e3t[0] = e3t[1] 465 ; e3w = e3t 466 ; jpk = nb_level 467 ; tmask = reform((reform(tmask(*, *), jpi*jpj)#replicate(1, jpk)), jpi, jpj, jpk) 468 ; ENDIF 469 ; @read_ncdf_varget 470 ; lec_data = res 471 ; data_direc = 'xyzt' 472 ; 473 ;; vertical average ? 474 ; IF vert_switch ge 1 AND NOT keyword_set(no_mean) THEN BEGIN 475 ; old_boite = [lon1, lon2, lat1, lat2, prof1, prof2] 476 ; print, ' Average in vertical domain ', vert_type, vert_mean 477 ; IF mesh_type EQ 'atm' THEN BEGIN 478 ; CASE atmos_msk OF 479 ; 0: print, ' [take all points] ' ; take all points 480 ; 1: BEGIN 481 ; ; take ocean points only 482 ; idx = where(tmask EQ 0) 483 ; lec_data(idx) = 1.e20 484 ; print, ' [take ocean points only] ' 485 ; END 486 ; 2: BEGIN 487 ; ; take land points only 488 ; idx = where(tmask GT 0) 489 ; lec_data(idx) = 1.e20 490 ; print, ' [take land points only] ' 491 ; END 492 ; ENDCASE 493 ; CASE vert_type OF 494 ; 'z': BEGIN ; levels 495 ; 496 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 497 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0)))), 2)+' hPa' 498 ; ENDIF ELSE BEGIN 499 ; zmean = grossemoyenne(lec_data, 'z', boite = vert_mean) 500 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(vert_mean(0)), 2)+','+strtrim(string(vert_mean(1)), 2)+']' 501 ; ENDELSE 502 ; END 503 ; ELSE: BEGIN ; levels 504 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 505 ; zmean = lec_data(*, *, vert_mean[0]) 506 ; name_suff = ' at '+vert_type+' '+strtrim(string(long(vert_mean(0))), 2)+' ['+strtrim(string(gdept(vert_mean(0))), 2)+' hPa]' 507 ; ENDIF ELSE BEGIN 508 ; zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex) 509 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 510 ; ENDELSE 511 ; END 512 ; ENDCASE 513 ;; tmask = reform(tmask(*, *, 0), jpi, jpj) 514 ; ENDIF ELSE BEGIN 515 ; ; ocean = always mask 516 ; ; idx = where(tmask EQ 0) 517 ; ; lec_data(idx) = 1.e20 518 ; CASE vert_type OF 519 ; 'z': BEGIN 520 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 521 ; zmean = lec_data 522 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m' 523 ; ENDIF ELSE BEGIN 524 ; zmean = grossemoyenne(lec_data, 'z', boite = vert_mean) 525 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 526 ; ENDELSE 527 ; END 528 ; ELSE: BEGIN 529 ; IF vert_mean[0] EQ vert_mean[1] THEN BEGIN 530 ; zmean = lec_data 531 ; name_suff = ' at '+strtrim(string(long(gdept(vert_mean(0))+.1)), 2)+' m' 532 ; ENDIF ELSE BEGIN 533 ; zmean = moyenne(lec_data, 'z', boite = vert_mean, /zindex, NAN =1.e20) 534 ; name_suff = ' averaged in '+vert_type+'['+strtrim(string(long(vert_mean(0))), 2)+','+strtrim(string(long(vert_mean(1))), 2)+']' 535 ; ENDELSE 536 ; END 537 ; ENDCASE 538 ; ENDELSE 539 ; lec_data = zmean 540 ; domdef, old_boite 541 ; field_dim = field_dim - 1 542 ; data_direc = 'xyt' 543 ; nzt = 1 544 ; firstz = 0 545 ; lastz = 0 546 ; ENDIF 547 ; ENDELSE 548 ; END 549 ; ;; erreur si dim > 4 550 ; ELSE: BEGIN 551 ; err_mess = ' *** nc_read : ERROR dimension > 4' 552 ; lec_data = -1.0 553 ; END 554 ; ENDCASE 494 555 495 556 ; Attribut du champ … … 498 559 field.name = var_name 499 560 field.origin = directory+file_name 561 500 562 ; 501 563 ; get long name 502 564 ; result = '???' 503 FOR i = 0, varinq.natts-1 DO BEGIN 504 att_txt = ncdf_attname(cdfid, varid, i) 505 IF att_txt EQ 'long_name' OR att_txt EQ 'title' THEN ncdf_attget, cdfid, varid, att_txt, result 506 ENDFOR 507 field.legend = strtrim(string(result),1)+name_suff 565 ; FOR i = 0, varinq.natts-1 DO BEGIN 566 ; att_txt = ncdf_attname(cdfid, varid, i) 567 ; IF att_txt EQ 'long_name' OR att_txt EQ 'title' THEN ncdf_attget, cdfid, varid, att_txt, result 568 ; ENDFOR 569 570 ; field.legend = strtrim(string(result),1)+name_suff 571 572 ;;;; ncdf_getatt, directory+file_name, var_name, add_offset = add_offset, scale_factor = scale_factor, missing_value = missing_value, units = units, calendar = calendar, long_name = long_name 573 field.legend = long_name+name_suff 574 575 ; scaling ? 576 ; FOR i = 0, varinq.natts-1 DO BEGIN 577 ; att_txt = ncdf_attname(cdfid, varid, i) 578 ; IF att_txt EQ 'scale_factor' THEN BEGIN 579 ; ncdf_attget, cdfid, varid, att_txt, valscale 580 ; lec_data = lec_data*valscale 581 ; ENDIF 582 ; ENDFOR 583 508 584 509 585 ; get unit 510 586 ; if it exists 511 isunits = ncdf_attinq(cdfid, varid, 'units')512 IF isunits.datatype NE 'UNKNOWN' THEN BEGIN513 ncdf_attget, cdfid, varid, 'units', result514 field.units = strtrim(string(result),1)515 ENDIF ELSE BEGIN516 print, 'No units for the variable ', field.name517 print, ' Or units were forgotten in the file !'518 ENDELSE519 field.dim = field_dim520 587 ; isunits = ncdf_attinq(cdfid, varid, 'units') 588 ; IF isunits.datatype NE 'UNKNOWN' THEN BEGIN 589 ; ncdf_attget, cdfid, varid, 'units', result 590 ; field.units = strtrim(string(result),1) 591 ; ENDIF ELSE BEGIN 592 ; print, 'No units for the variable ', field.name 593 ; print, ' Or units were forgotten in the file !' 594 ; ENDELSE 595 field.units = units 596 field.dim = field_dim 521 597 522 598 ; get valmask (might need valmask = float(string(valmask)) 523 599 524 valmask = 1.e20525 FOR i = 0, varinq.natts-1 DO BEGIN526 att_txt = ncdf_attname(cdfid, varid, i)527 IF att_txt EQ 'missing_value' OR att_txt EQ 'mask value' OR att_txt EQ '_FillValue' THEN ncdf_attget, cdfid, varid, att_txt, valmask528 ENDFOR529 600 ; valmask = 1.e20 601 ; FOR i = 0, varinq.natts-1 DO BEGIN 602 ; att_txt = ncdf_attname(cdfid, varid, i) 603 ; 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 604 ; ENDFOR 605 valmask = missing_value 530 606 ; set valmask to 1.e20 531 607 … … 558 634 print, ' = ',field.legend, ' [min/max = ',minf , maxf,' ', field.units,' - masked values = ',valmask, chardim, ']' 559 635 560 561 ncdf_close, cdfid 562 563 ;key_offset = key_offset_orig 564 ;jpi = jpi_orig 565 ;jpj = jpj_orig 566 ;jpk = jpk_orig 636 ; ncdf_close, cdfid 567 637 568 638 IF keyword_set(key_yreverse) THEN print, ' key_yreverse active : ', key_yreverse … … 570 640 IF debug_w THEN print, ' ...EXIT nc_read' 571 641 IF debug_w THEN print, ' ' 572 642 573 643 return, field 574 644 575 576 645 END -
branches/procs-read/trends.pro
r73 r81 360 360 print, ' -> writing 1D data to ', asciidir+filename 361 361 print, ' ' 362 printf, nuldat, fld*scale, format = '(f8. 3)'362 printf, nuldat, fld*scale, format = '(f8.4)' 363 363 free_lun, nuldat 364 364 close, nuldat
Note: See TracChangeset
for help on using the changeset viewer.