Changeset 271
- Timestamp:
- 08/30/07 14:44:23 (17 years ago)
- Location:
- trunk/SRC
- Files:
-
- 1 deleted
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SRC/Interpolation/compute_fromirr_bilinear_weigaddr.pro
r257 r271 40 40 ; @restrictions 41 41 ; - the input grid must be an "irregular 2D grid", defined as a grid made 42 ; of quadrilateral cells which corners positions are defined with olonin and olat42 ; of quadrilateral cells 43 43 ; - We supposed the data are located on a sphere, with a periodicity along 44 44 ; the longitude … … 71 71 IF n_elements(omsk) EQ 1 AND omsk[0] EQ -1 THEN BEGIN 72 72 omsk = replicate(1b, jpio, jpjo) 73 IF jpio EQ 182 AND jpjo EQ 149 THEN BEGIN 74 lontmp = (olonin[1:180, *] + 3600) MOD 360 75 lattmp = olat[1:180, *] 76 bad = abs(abs(lontmp - shift(lontmp, 1, 0)) - 180) LT 176 $ 77 OR abs(abs(lontmp - shift(lontmp, 0, 1)) - 180) LT 176 $ 78 OR abs(abs(lontmp - shift(lontmp, 1, 1)) - 180) LT 176 $ 79 OR abs(abs(lattmp - shift(lattmp, 1, 0)) - 180) LT 176 $ 80 OR abs(abs(lattmp - shift(lattmp, 0, 1)) - 180) LT 176 $ 81 OR abs(abs(lattmp - shift(lattmp, 1, 1)) - 180) LT 176 82 bad = bad AND lattmp LT 50 83 omsk[1:180, 1:148] = 1b - bad[*, 1:148] 84 omsk[0, *] = omsk[180, *] 85 omsk[181, *] = omsk[1, *] 86 ENDIF ELSE omsk = replicate(1b, jpio, jpjo) 87 ENDIF 88 IF n_elements(amsk) EQ 1 AND amsk[0] EQ -1 THEN amsk = replicate(1b, jpia, jpja) 89 IF n_elements(omsk) NE jpio*jpjo THEN BEGIN 90 ras = report('input grid mask do not have the good size') 91 stop 92 ENDIF 93 IF n_elements(amsk) NE jpia*jpja THEN BEGIN 94 ras = report('output grid mask do not have the good size') 95 stop 96 ENDIF 73 ; if this is ORCA2 grid... 74 IF (jpio EQ 180 OR jpio EQ 182) AND (jpjo EQ 149 OR jpjo EQ 148 OR jpjo EQ 147 ) THEN BEGIN 75 ; we look for ill defined cells. 76 IF jpio EQ 182 THEN lontmp = olonin[1:180, *] ELSE lontmp = olonin 77 ; longitudinal size of the cells... 78 a = (lontmp-shift(lontmp, 1, 0)) 79 d1 = 0.5 * max( [[[a]], [[360+a]]] MOD 360, dimension = 3) 80 a = (lontmp-shift(lontmp, 1, 1)) 81 d2 = 0.5 * max( [[[a]], [[360+a]]] MOD 360, dimension = 3) 82 a = (shift(lontmp, 0, 1)-shift(lontmp, 1, 0)) 83 d3 = 0.5 * max( [[[a]], [[360+a]]] MOD 360, dimension = 3) 84 a = (shift(lontmp, 0, 1)-shift(lontmp, 1, 1)) 85 d4 = 0.5 * max( [[[a]], [[360+a]]] MOD 360, dimension = 3) 86 md = [[[d1]], [[d2]], [[d3]], [[d4]]] 87 bad = max(md, dimension = 3) GE 1.5 88 bad = (bad + shift(bad, -1, -1) + shift(bad, 0, -1) + shift(bad, -1, 0)) < 1 89 IF jpio EQ 182 THEN BEGIN 90 omsk[1:180, 80:120] = 1b - bad[*, 80:120] 91 omsk[0, *] = omsk[180, *] 92 omsk[181, *] = omsk[1, *] 93 ENDIF ELSE omsk[*, 80:120] = 1b - bad[*, 80:120] 94 ENDIF 95 ENDIF ELSE BEGIN 96 IF n_elements(omsk) NE jpio*jpjo THEN BEGIN 97 ras = report('input grid mask do not have the good size') 98 stop 99 ENDIF 100 ENDELSE 101 IF n_elements(amsk) EQ 1 AND amsk[0] EQ -1 THEN amsk = replicate(1b, jpia, jpja) ELSE BEGIN 102 IF n_elements(amsk) NE jpia*jpja THEN BEGIN 103 ras = report('output grid mask do not have the good size') 104 stop 105 ENDIF 106 ENDELSE 97 107 ; 98 108 ; longitude, between 0 and 360 … … 175 185 ; ORCA cases : orca grid is irregular only northward of 40N 176 186 CASE 1 OF 177 jpio EQ 92AND (jpjo EQ 76 OR jpjo EQ 75 OR jpjo EQ 74 ):onsphere = yy GT 40178 jpio EQ 180AND (jpjo EQ 149 OR jpjo EQ 148 OR jpjo EQ 147 ):onsphere = yy GT 40179 jpio EQ 720AND (jpjo EQ 522 OR jpjo EQ 521 OR jpjo EQ 520 ):onsphere = yy GT 40180 jpio EQ 1440AND (jpjo EQ 1021 OR jpjo EQ 1020 OR jpjo EQ 1019):onsphere = yy GT 40187 (jpio EQ 90 OR jpio EQ 92) AND (jpjo EQ 76 OR jpjo EQ 75 OR jpjo EQ 74 ):onsphere = yy GT 40 188 (jpio EQ 180 OR jpio EQ 182) AND (jpjo EQ 149 OR jpjo EQ 148 OR jpjo EQ 147 ):onsphere = yy GT 40 189 (jpio EQ 720 OR jpio EQ 722) AND (jpjo EQ 522 OR jpjo EQ 521 OR jpjo EQ 520 ):onsphere = yy GT 40 190 (jpio EQ 1440 OR jpio EQ 1442) AND (jpjo EQ 1021 OR jpjo EQ 1020 OR jpjo EQ 1019):onsphere = yy GT 40 181 191 ELSE:onsphere = 1 182 192 ENDCASE … … 233 243 ELSE: BEGIN 234 244 ; we keep its address 235 foraddr[n] = ind245 foraddr[n] = ind 236 246 ; keep the new coordinates 237 247 forweight[n, 0] = xy[0] … … 274 284 a = reform(forweight[*, 0], 1, nawater) 275 285 b = reform(forweight[*, 1], 1, nawater) 276 forweight = -1 ; free memory286 forweight = -1 ; free memory 277 287 newaweig = [(1-a)*(1-b), (1-b)*a, a*b, (1-a)*b] 278 a = -1 & b = -1 ; free memory288 a = -1 & b = -1 ; free memory 279 289 ; mask the weight to suppress the corner located on land 280 290 newaweig = newaweig*((omsk)[newaaddr]) -
trunk/SRC/Interpolation/extrapolate.pro
r262 r271 16 16 ; put -1 if input data are not masked 17 17 ; 18 ; @param nb_iteration {in}{optional}{type=integer scalar}{default=10.E20}18 ; @param nb_iteration {in}{optional}{type=integer}{default=large enough to fill everything} 19 19 ; Maximum number of iterations done in the extrapolation process. If there 20 20 ; is no more masked values we exit extrapolate before reaching nb_iteration 21 ; (to be sure to fill everything, you can use a very large value)22 21 ; 23 22 ; @keyword X_PERIODIC {type=scalar, 0 or 1}{default=0} … … 32 31 ; @keyword GE0 {type=scalar 0 or 1}{default=0} 33 32 ; put 1 to force the extrapolated values to be larger than 0, same as using minval=0. 33 ; 34 ; @keyword 35 ; _EXTRA to be able to call extrapolate with _extra keyword 34 36 ; 35 37 ; @returns … … 54 56 ; 55 57 FUNCTION extrapolate, zinput, maskinput, nb_iteration, X_PERIODIC = x_periodic $ 56 , MINVAL = minval, MAXVAL = maxval, GE0 = ge0 58 , MINVAL = minval, MAXVAL = maxval, GE0 = ge0, _EXTRA = ex 57 59 ; 58 60 compile_opt idl2, strictarrsubs 59 61 ; 60 62 ; check the number of iteration used in the extrapolation. 61 IF n_elements(nb_iteration) EQ 0 THEN nb_iteration = 10.E20 63 szin = size(zinput) 64 IF szin[0] NE 2 THEN return, -1. ELSE szin = szin[1:2] 65 nx = szin[0] 66 ny = szin[1] 67 IF n_elements(nb_iteration) EQ 0 THEN nb_iteration = max(szin) 62 68 IF nb_iteration EQ 0 THEN return, zinput 63 nx = (size(zinput))[1]64 ny = (size(zinput))[2]65 69 ; take care of the boundary conditions... 66 70 ; -
trunk/SRC/Interpolation/extrapsmooth.pro
r262 r271 27 27 ; put 1 to force the extrapolated values to be larger than 0, same as using minval=0. 28 28 ; 29 ; @keyword 30 ; _EXTRA to be able to call extrapsmooth with _extra keyword 31 ; 29 32 ; @returns 30 33 ; the extrapolated array with no more masked values … … 47 50 ;- 48 51 ; 49 FUNCTION extrapsmooth, in, mskin, X_PERIODIC = x_periodic, MINVAL = minval, MAXVAL = maxval, GE0 = ge0 52 FUNCTION extrapsmooth, in, mskin, X_PERIODIC = x_periodic, MINVAL = minval, MAXVAL = maxval, GE0 = ge0, _EXTRA = ex 50 53 ; 51 54 compile_opt strictarr, strictarrsubs -
trunk/SRC/Interpolation/fromirr.pro
r238 r271 49 49 ; lonout, latout are used only to know the output domain size 50 50 ; 51 ; @keyword 52 ; _EXTRA to be able to call fromirr with _extra keyword 53 ; 51 54 ; @returns 52 55 ; 2D array the interpolated data … … 87 90 ; 88 91 FUNCTION fromirr, method, datain, lonin, latin, mskin, lonout, latout, mskout $ 89 , WEIG = weig, ADDR = addr 92 , WEIG = weig, ADDR = addr, _EXTRA = ex 90 93 ; 91 94 compile_opt strictarr, strictarrsubs -
trunk/SRC/Interpolation/fromreg.pro
r238 r271 53 53 ; of the input data when performing the interpolation. 54 54 ; 55 ; @keyword 56 ; _EXTRA to be able to call fromreg with _extra keyword 57 ; 55 58 ; @returns 56 59 ; 2D array the interpolated data … … 90 93 , WEIG = weig, ADDR = addr $ 91 94 , NONORTHERNLINE = nonorthernline $ 92 , NOSOUTHERNLINE = nosouthernline 95 , NOSOUTHERNLINE = nosouthernline, _EXTRA = ex 93 96 ; 94 97 compile_opt idl2, strictarrsubs -
trunk/SRC/Interpolation/get_gridparams.pro
r242 r271 2 2 ; 3 3 ; @file_comments 4 ; 1) extract from a NetCDF file the longitude, latitude, andtheir dimensions4 ; Case 1: extract from a NetCDF file longitude and latitude arrays, their dimensions 5 5 ; and make sure it is 1D or 2D arrays 6 6 ; 7 ; or 8 ; 2) given longitude and latitude arrays, get their dimensions and make 7 ; Case 2: given longitude and latitude arrays, get their dimensions and make 9 8 ; sure they are 1D or 2D arrays 10 9 ; … … 14 13 ; @examples 15 14 ; 16 ; 1) 17 ; IDL> get_gridparams, file, lonname, latname, lon, lat, jpi, jpj, n_dimensions 18 ; 19 ; or 20 ; 21 ; 2) 15 ; Case 1: 16 ; IDL> get_gridparams, file name/id, lonname, latname, lon, lat, jpi, jpj, n_dimensions 17 ; 18 ; Case 2: 22 19 ; IDL> get_gridparams, lon, lat, jpi, jpj, n_dimensions 23 20 ; 24 21 ; @param in1 {in}{required} 25 ; Case 1: the nameof the netcdf file26 ; Case 2: 1 d or 2d arrays defining longitudes and latitudes.27 ; Out: the variable that will contain the longitudes22 ; Case 1: name or the id (returned by ncdf_open) of the netcdf file 23 ; Case 2: 1D or 2D arrays defining longitudes, will be forced to have 24 ; n_dimensions dimensions when returned 28 25 ; 29 26 ; @param in2 {in}{required} 30 ; Case 1: the name of the variable that contains the longitude in the NetCDF file 31 ; Case 2: 1d or 2d arrays defining longitudes and latitudes. 32 ; Note that these arrays are also outputs and can therefore be modified. 33 ; Out: the variable that will contain the latitudes 34 ; 35 ; @param in3 {in}{required} 36 ; Case 1: the name of the variable that contains the latitude in the NetCDF file 37 ; Case 2: the number of points in the longitudinal direction. 27 ; Case 1: name of the variable containing the longitude in the NetCDF file 28 ; Case 2: 1D or 2D arrays defining latitudes, will be forced to have 29 ; n_dimensions dimensions when returned 30 ; 31 ; @param in3 32 ; Case 1: name of the variable containing the latitude in the NetCDF file 33 ; Case 2: returned number of points in longitudinal direction. 38 34 ; 39 35 ; @param in4 {out} 40 ; Case 1: the number of points in the longitudinal direction 41 ; Case 2: the number of points in the latitudinal direction 42 ; 43 ; @param in5 {out} 44 ; Case 1: the number of points in the latitudinal direction 45 ; Case 2: 1 or 2 to specify if lon and lat should be 1D (jpi or jpj) 46 ; arrays or 2D arrays (jpi,jpj). Note that of n_dimensions = 1, then the 47 ; grid must be regular (each longitude must be the same for all latitudes 48 ; and each latitude should be the same for all longitudes). 36 ; Case 1: returned longitudes array, with n_dimensions dimensions 37 ; Case 2: returned number of points in latitudinal direction 38 ; 39 ; @param in5 40 ; Case 1: returned latitudes array, with n_dimensions dimensions 41 ; Case 2: input scalar (1 or 2) to specify if lon and lat should be returned 42 ; as 1D or 2D arrays. Note that if n_dimensions = 1, the grid must be 43 ; regular (longitude and latitudes can be described as 1D arrays). 49 44 ; 50 45 ; @param in6 {out} 51 ; the variable that will contain the longitudes46 ; Case 1: returned number of points in longitudinal direction. 52 47 ; 53 48 ; @param in7 {out} 54 ; the variable that will contain the latitudes 55 ; 56 ; @param in8 {out} 57 ; 1 or 2 to specify if lon and lat should be 1D (jpi or jpj) 58 ; 59 ; @keyword DOUBLE 60 ; use double precision to perform the computation 49 ; Case 1: returned number of points in latitudinal direction 50 ; 51 ; @param in8 {in} 52 ; Case 1: input scalar (1 or 2) to specify if lon and lat should be returned 53 ; as 1D or 2D arrays. Note that if n_dimensions = 1, the grid must be 54 ; regular (longitude and latitudes can be described as 1D arrays). 55 ; 56 ; @keyword DOUBLE {default=0}{type=scalar: 0 or 1} 57 ; activate to force double precision for lon/lat arrays 61 58 ; 62 59 ; @examples … … 84 81 8:BEGIN 85 82 ; get longitude and latitude 86 IF file_test(in1) EQ 0 THEN BEGIN 87 ras = report('file ' + in1 + ' does not exist') 88 stop 89 ENDIF 90 cdfido = ncdf_open(in1) 83 IF size(in1, /type) EQ 7 THEN BEGIN 84 IF file_test(in1) EQ 0 THEN BEGIN 85 ras = report('file ' + in1 + ' does not exist') 86 stop 87 ENDIF 88 cdfido = ncdf_open(in1) 89 ENDIF ELSE cdfido = in1 91 90 ncdf_varget, cdfido, in2, lon 92 91 ncdf_varget, cdfido, in3, lat 93 ncdf_close, cdfido92 IF size(in1, /type) EQ 7 THEN ncdf_close, cdfido 94 93 n_dimensions = in8 95 94 END -
trunk/SRC/ReadWrite/ncdf_getaxis.pro
r232 r271 5 5 ; 6 6 ; @categories 7 ; Read ing7 ; Read NetCDF file 8 8 ; 9 9 ; @param cdfid {in}{required}{type=scalar} … … 29 29 ; 30 30 ; @keyword XDIMNAME {default='longitude', 'lon', 'x', 'longitude*', 'lon*', 'x*', '*longitude*', '*lon*' or '*x*'}{type=scalar string} 31 ; A string giving the name of the x dimension 31 ; A string giving the name of the x dimension or/and a named variable 32 ; in which x dimension name is returned. 32 33 ; 33 34 ; @keyword YDIMNAME {default='latitude', 'lat', 'y', 'latitude*', 'lat*', 'y*', 'eta_*', '*latitude*', '*lat*', '*y*'}{type=scalar string} 34 ; A string giving the name of the y dimension 35 ; A string giving the name of the y dimension or/and a named variable 36 ; in which y dimension name is returned. 35 37 ; 36 38 ; @keyword XAXISNAME {default='x', 'longitude', 'nav_lon', 'lon', 'lon_rho' or 'NbLongitudes'}{type=scalar string} 37 39 ; A string giving the name of the variable in the file 38 ; that contains the [xyz]axis. 40 ; that contains the x axis or/and a named variable 41 ; in which this variable name is returned. 39 42 ; 40 43 ; @keyword YAXISNAME {default='y', 'latitude', 'nav_lat','lat', 'lat_rho' or 'NbLatitudes'}{type=scalar string} 41 44 ; A string giving the name of the variable in the file 42 ; that contains the [xyz]axis. 45 ; that contains the y axis or/and a named variable 46 ; in which this variable name is returned. 43 47 ; 44 48 ; @keyword XYINDEX {default=0}{type=scalar: 0 or 1} … … 47 51 ; x/yaxis = keyword_set(start1) + findgen(jpi/jpj) 48 52 ; 49 ; @keyword XYINDEX {default=0}{type=scalar: 0 or 1}50 ;51 53 ; @keyword _EXTRA 52 54 ; Used to be able to call ncdf_getaxis with _extra … … 60 62 ;- 61 63 ; 62 PRO ncdf_getaxis, cdfid, dimidx, dimidy, xaxis, yaxis $64 PRO ncdf_getaxis, fileid, dimidx, dimidy, xaxis, yaxis $ 63 65 , XAXISNAME = xaxisname, YAXISNAME = yaxisname $ 64 66 , XDIMNAME = xdimname, YDIMNAME = ydimname $ … … 67 69 compile_opt idl2, strictarrsubs 68 70 ; 69 71 ; should we open the file? 72 IF size(fileid, /type) EQ 7 THEN cdfid = ncdf_open(fileid) ELSE cdfid = fileid 70 73 ; what is inside the file 71 74 inside = ncdf_inquire(cdfid) … … 97 100 , '''longitude'', ''nav_lon'', ''lon'', ''lon_rho'', ''nblongitudes''' $ 98 101 , ' we use a fake xaxis based on x dimension size (or use XAXISNAME keyword)'], /simple) 102 xaxisname = 'Not Found' 99 103 ; try to get the dimension corresponding to x 100 104 ; roms file? … … 125 129 ENDELSE 126 130 ENDCASE 127 ENDIF128 romsgrid = 0b131 romsgrid = 0b 132 ENDIF ELSE romsgrid = 1b 129 133 ENDIF ELSE BEGIN 130 134 romsgrid = strmid(namevar[xvarid], 0, 4) EQ 'lon_' 131 135 xinq = ncdf_varinq(cdfid, xvarid) 136 xaxisname = xinq.name 132 137 dimidx = xinq.dim[0] 133 138 IF xinq.ndims GE 2 THEN ncdf_diminq, cdfid, xinq.dim[1], blabla, jpjfromx 134 139 ENDELSE 140 IF arg_present(xdimname) THEN ncdf_diminq, cdfid, dimidx, xdimname, jpifromx 135 141 ; 136 142 IF arg_present(xaxis) THEN BEGIN … … 162 168 , '''latitude'', ''nav_lat'', ''lat'', ''lat_rho'', ''nblatitudes''' $ 163 169 , ' we use a fake yaxis based on y dimension size (or use YAXISNAME keyword)'], /simple) 170 yaxisname = 'Not Found' 164 171 ; try to get the dimension corresponding to y 165 172 ; roms file? … … 193 200 ENDIF ELSE BEGIN 194 201 yinq = ncdf_varinq(cdfid, yvarid) 202 yaxisname = yinq.name 195 203 IF yinq.ndims GE 2 THEN BEGIN 196 204 ncdf_diminq, cdfid, yinq.dim[0], blabla, jpifromy … … 198 206 ENDIF ELSE dimidy = yinq.dim[0] 199 207 ENDELSE 208 IF arg_present(ydimname) THEN ncdf_diminq, cdfid, dimidy, ydimname, jpjfromy 200 209 ; 201 210 IF arg_present(yaxis) THEN BEGIN … … 224 233 ENDIF 225 234 235 IF size(fileid, /type) EQ 7 THEN ncdf_close, cdfid 236 226 237 return 227 238 END -
trunk/SRC/ToBeReviewed/HOPE/read_hope.pro
r232 r271 452 452 timename = strlowcase((tag_names(dimlist))[wathinside.recdim]) 453 453 ; read the time axis in julina days 454 time = ncdf_ timeget(cdfid, timename)454 time = ncdf_gettime(filename, cdfid) 455 455 ; update the dimlist structure 456 456 dimlist.(wathinside.recdim) = time -
trunk/SRC/ToBeReviewed/INIT/initncdf.pro
r238 r271 11 11 ; A string giving the name of the NetCdf file 12 12 ; 13 ; @keyword INVMASK {default=0}{type=scalar: 0 or 1}14 ; Inverse the land/sea mask (that should have 0/1 values for land/sea): mask = 1-mask15 ;16 ; @keyword MASKNAME {type=string}17 ; A string giving the name of the variable in the file18 ; that contains the land/sea mask19 ;20 ; @keyword MISSING_VALUE {type=scalar}21 ; To define (or redefine if the attribute is22 ; already existing) the missing values used with USEASMASK23 ; keyword24 ;25 13 ; @keyword START1 {default=0}{type=scalar: 0 or 1} 26 14 ; Index the axis from 1 instead of 0 when using 27 15 ; /xyindex and/or /zindex 28 ;29 ; @keyword USEASMASK {type=scalar string}30 ; A string giving the name of the variable in the file31 ; that will be used to build the land/sea mask. In this case the32 ; mask is based on the first record (if record dimension33 ; exists). The mask is build according to :34 ; 1 the keyword missing_value if existing35 ; 2 the attribute 'missing_value' if existing36 ; 3 NaN values if existing37 16 ; 38 17 ; @keyword ZAXISNAME {default='z', 'level', 'lev', 'depth...'}{type=scalar string} … … 52 31 ; 53 32 ; @keyword _EXTRA 54 ; Used to pass keywords to <pro>computegrid</pro> and55 ; <pro>ncdf_getaxis</pro> 33 ; Used to pass keywords to <pro>computegrid</pro>, 34 ; <pro>ncdf_getaxis</pro>, <pro>ncdf_getmask</pro> and <pro>isafile</pro> 56 35 ; 57 36 ; @uses … … 77 56 ; 78 57 PRO initncdf, ncfilein $ 79 , ZAXISNAME = zaxisname, MASKNAME = maskname $ 80 , INVMASK = invmask, USEASMASK = useasmask $ 81 , MISSING_VALUE = missing_value, START1 = start1 $ 58 , ZAXISNAME = zaxisname, START1 = start1 $ 82 59 , XYINDEX = xyindex, ZINDEX = zindex $ 83 60 , _EXTRA = ex … … 100 77 ; what is inside the file 101 78 inside = ncdf_inquire(cdfid) 102 ;------------------------------------------------------------103 ; name of all dimensions104 namedim = strarr(inside.ndims)105 for dimiq = 0, inside.ndims-1 do begin106 ncdf_diminq, cdfid, dimiq, tmpname, value107 namedim[dimiq] = strlowcase(tmpname)108 ENDFOR109 79 ;---------------------------------------------------------- 110 80 ; name of the variables … … 149 119 ;---------------------------------------------------------- 150 120 ; mask 151 IF NOT (keyword_set(maskname) OR keyword_set(useasmask)) AND keyword_set(romsgrid) THEN maskname = 'mask_rho' 152 CASE 1 OF 153 keyword_set(maskname):BEGIN 154 mskid = (where(namevar EQ strlowcase(maskname)))[0] 155 if mskid NE -1 THEN BEGIN 156 mskinq = ncdf_varinq(cdfid, mskid) 157 ; is the mask variable containing the record dimension? 158 withrcd = (where(mskinq.dim EQ inside.recdim))[0] 159 IF withrcd NE -1 THEN BEGIN 160 ; in order to read only the first record 161 ; we need to get the size of each dimension 162 count = replicate(1L, mskinq.ndims) 163 FOR d = 0, mskinq.ndims -1 DO BEGIN 164 IF d NE withrcd THEN BEGIN 165 ncdf_diminq, cdfid, mskinq.dim[d], name, size 166 count[d] = size 167 ENDIF 168 ENDFOR 169 ; read the variable for the first record 170 ncdf_varget, cdfid, mskid, tmask, count = count 171 ENDIF ELSE ncdf_varget, cdfid, mskid, tmask 172 ; check if we need to applay add_offset and scale factor 173 FOR a = 0, mskinq.natts-1 DO BEGIN 174 attname = ncdf_attname(cdfid, mskid, a) 175 CASE strlowcase(attname) OF 176 'add_offset':ncdf_attget, cdfid, mskid, attname, add_offset 177 'scale_factor':ncdf_attget, cdfid, mskid, attname, scale_factor 178 ELSE: 179 ENDCASE 180 ENDFOR 181 IF n_elements(scale_factor) NE 0 THEN tmask = tmask*scale_factor 182 IF n_elements(add_offset) NE 0 THEN tmask = tmask+add_offset 183 if keyword_set(invmask) then tmask = 1-tmask 184 tmask = byte(round(tmask)) 185 ENDIF ELSE tmask = -1 186 END 187 ;.................. 188 keyword_set(useasmask):BEGIN 189 mskid = (where(namevar EQ strlowcase(useasmask)))[0] 190 if mskid NE -1 THEN BEGIN 191 mskinq = ncdf_varinq(cdfid, mskid) 192 ; is the mask variable containing the record dimension? 193 withrcd = (where(mskinq.dim EQ inside.recdim))[0] 194 IF withrcd NE -1 THEN BEGIN 195 ; in order to read only the first record 196 ; we need to get the size of each dimension 197 count = replicate(1L, mskinq.ndims) 198 FOR d = 0, mskinq.ndims -1 DO BEGIN 199 IF d NE withrcd THEN BEGIN 200 ncdf_diminq, cdfid, mskinq.dim[d], name, size 201 count[d] = size 202 ENDIF 203 ENDFOR 204 ; read the variable for the first record 205 ncdf_varget, cdfid, mskid, tmask, count = count 206 ENDIF ELSE ncdf_varget, cdfid, mskid, tmask 207 ; check if we need to applay add_offset and scale factor 208 FOR a = 0, mskinq.natts-1 DO BEGIN 209 attname = ncdf_attname(cdfid, mskid, a) 210 CASE strlowcase(attname) OF 211 'add_offset':ncdf_attget, cdfid, mskid, attname, add_offset 212 'scale_factor':ncdf_attget, cdfid, mskid, attname, scale_factor 213 'missing_value':IF n_elements(missing_value) EQ 0 THEN $ 214 ncdf_attget, cdfid, mskid, attname, missing_value 215 ELSE: 216 ENDCASE 217 ENDFOR 218 IF n_elements(scale_factor) NE 0 THEN tmask = tmask*scale_factor 219 IF n_elements(add_offset) NE 0 THEN tmask = tmask+add_offset 220 IF n_elements(missing_value) NE 0 THEN BEGIN 221 ; we have to take care of the float accuracy 222 CASE 1 OF 223 missing_value GE 1.e6:tmask = tmask LT (missing_value-10) 224 missing_value LE -1.e6:tmask = tmask GT (missing_value-10) 225 abs(missing_value) LE 1.e-6:tmask = abs(tmask) GT 1.e-6 226 ELSE:tmask = tmask NE missing_value 227 ENDCASE 228 if keyword_set(invmask) then tmask = 1-tmask 229 ENDIF ELSE BEGIN 230 tmask = finite(tmask) 231 IF min(tmask) EQ 1 THEN BEGIN 232 ras = report( 'missing or nan values not found...') 233 tmask = -1 234 ENDIF 235 ENDELSE 236 ENDIF ELSE tmask = -1 237 END 238 ;.................. 239 ELSE:tmask = -1 240 ENDCASE 121 tmask = ncdf_getmask(cdfid, _extra = ex) 122 ;---------------------------------------------------------- 241 123 ; 242 124 ncdf_close, cdfid 243 125 ; 244 ; compute the grid 126 ;---------------------------------------------------------- 127 ; call compute the grid 245 128 if NOT keyword_set(zaxis) then BEGIN 246 129 computegrid, xaxis = xaxis, yaxis = yaxis $ -
trunk/SRC/ToBeReviewed/LECTURE/read_ncdf.pro
r240 r271 31 31 ; Useless, defined for compatibility 32 32 ; 33 ; @keyword ADDSCL_BEFORE {default=0}{type=scalar: 0 or 1} 34 ; put 1 to apply add_offset ad scale factor on data before looking for 35 ; missing values 36 ; 33 37 ; @keyword BOXZOOM 34 38 ; Contain the boxzoom on which we have to do the reading … … 41 45 ; 42 46 ; @keyword INIT {default=0}{type=scalar: 0 or 1} 43 ; To call automatically initncdf , filenameand thus47 ; To call automatically initncdf with filename as input argument and thus 44 48 ; redefine all the grid parameters 45 49 ; … … 62 66 ; but only the array referring to the field. 63 67 ; 64 ; @keyword TIMEVAR {type=string}65 ; It define the name of the variable that66 ; contains the time axis. This keyword can be useful if there67 ; is no unlimited dimension or if the time axis selected by default68 ; (the first 1D array with unlimited dimension) is not the good one.69 ;70 68 ; @keyword ZETAFILENAME {default=FILENAME}{type=string} 71 69 ; For ROMS outputs. The filename of the file where zeta variable should be read … … 75 73 ; 76 74 ; @keyword _EXTRA 77 ; Used to pass keywords 75 ; Used to pass keywords to <pro>isafile</pro>, <pro>initncdf</pro>, 76 ; <pro>ncdf_gettime</pro> and <pro>domdef</pro> 78 77 ; 79 78 ; @returns … … 95 94 ; 96 95 FUNCTION read_ncdf, name, beginning, ending, compatibility, BOXZOOM = boxzoom, FILENAME = filename $ 97 , PARENTIN = parentin, TIMESTEP = timestep, TIMEVAR = timevar$96 , PARENTIN = parentin, TIMESTEP = timestep, ADDSCL_BEFORE = addscl_before $ 98 97 , TOUT = tout, NOSTRUCT = nostruct, CONT_NOFILL = CONT_NOFILL, INIT = init $ 99 98 , GRID = grid, CALLITSELF = callitself $ … … 115 114 ; print,filename 116 115 ; is parent a valid widget ? 117 if keyword_set(parentin) thenBEGIN116 IF keyword_set(parentin) THEN BEGIN 118 117 parent = long(parentin) 119 118 parent = parent*widget_info(parent, /managed) … … 123 122 ; Opening of the name file 124 123 ;------------------------------------------------------------ 125 if size(filename, /type) NE 7 then$124 IF size(filename, /type) NE 7 THEN $ 126 125 return, report('read_ncdf cancelled') 127 126 IF !version.OS_FAMILY EQ 'unix' THEN spawn, '\file '+filename+' > /dev/null' 128 127 cdfid = ncdf_open(filename) 129 contient= ncdf_inquire(cdfid)128 inq = ncdf_inquire(cdfid) 130 129 ;------------------------------------------------------------ 131 130 ; we check if the variable name exists in the file. 132 131 ;------------------------------------------------------------ 133 if ncdf_varid(cdfid, name) EQ -1 thenBEGIN132 IF ncdf_varid(cdfid, name) EQ -1 THEN BEGIN 134 133 ncdf_close, cdfid 135 134 return, report('variable '+name+' !C not found in the file '+filename) 136 135 ENDIF 137 var contient= ncdf_varinq(cdfid, name)138 IF var contient.ndims LT 2 THEN return, report('read_ncdf cannot read scalar or 1D data')136 varinq = ncdf_varinq(cdfid, name) 137 IF varinq.ndims LT 2 THEN return, report('read_ncdf cannot read scalar or 1D data') 139 138 ; look for the dimension names 140 dimnames = strarr(var contient.ndims)141 FOR i = 0, var contient.ndims-1 DO BEGIN142 ncdf_diminq, cdfid, var contient.dim[i], tmp, dimsize139 dimnames = strarr(varinq.ndims) 140 FOR i = 0, varinq.ndims-1 DO BEGIN 141 ncdf_diminq, cdfid, varinq.dim[i], tmp, dimsize 143 142 dimnames[i] = tmp 144 143 ENDFOR … … 146 145 ; shall we redefine the grid parameters 147 146 ;------------------------------------------------------------ 148 ifkeyword_set(init) THEN initncdf, filename, _extra = ex147 IF keyword_set(init) THEN initncdf, filename, _extra = ex 149 148 ;------------------------------------------------------------ 150 149 ; check the time axis and the debut and ending dates 151 150 ;------------------------------------------------------------ 152 if n_elements(beginning) EQ 0 then begin151 IF n_elements(beginning) EQ 0 THEN BEGIN 153 152 beginning = 0 154 153 timestep = 1 155 endif 156 if keyword_set(timestep) then begin 157 firsttps = beginning[0] 158 if n_elements(ending) NE 0 then lasttps = ending[0] ELSE lasttps = firsttps 159 jpt = lasttps-firsttps+1 160 IF NOT keyword_set(callitself) then time = julday(1, 1, 1) + lindgen(jpt) 161 ENDIF ELSE BEGIN 162 if keyword_set(parent) then BEGIN 154 ENDIF 155 ; define time and jpt 156 CASE 1 OF 157 keyword_set(timestep):BEGIN 158 firsttps = beginning[0] 159 IF n_elements(ending) NE 0 THEN lasttps = ending[0] ELSE lasttps = firsttps 160 jpt = lasttps-firsttps+1 161 IF NOT keyword_set(callitself) then time = julday(1, 1, 1) + lindgen(jpt) 162 END 163 keyword_set(parent):BEGIN 163 164 widget_control, parent, get_uvalue = top_uvalue 164 165 filelist = extractatt(top_uvalue, 'filelist') … … 168 169 date1 = date2jul(beginning[0]) 169 170 if n_elements(ending) NE 0 then date2 = date2jul(ending[0]) ELSE date2 = date1 170 firsttps = where(time EQ date1) & firsttps = firsttps[0] 171 lasttps = where(time EQ date2) & lasttps = lasttps[0] 172 ENDIF ELSE BEGIN 173 IF keyword_set(timevar) THEN BEGIN 174 timeid = ncdf_varid(cdfid, timevar) 175 IF timeid EQ -1 THEN BEGIN 176 ncdf_close, cdfid 177 return, report('the file '+filename+' as no variable ' + timevar $ 178 + '. !C Use the TIMESTEP keyword') 179 endif 180 timecontient = ncdf_varinq(cdfid, timeid) 181 contient.recdim = timecontient.dim[0] 182 ENDIF ELSE BEGIN 183 ; we find the infinite dimension 184 timedim = contient.recdim 185 if timedim EQ -1 then BEGIN 186 ncdf_close, cdfid 187 return, report('the file '+filename+' as no infinite dimension. !C Use TIMESTEP or TIMEVAR keyword') 188 endif 189 ; we find the FIRST time axis 190 timeid = 0 191 repeat BEGIN ; As long as we have not find a variable having only one dimension: the infinite one 192 timecontient = ncdf_varinq(cdfid, timeid) ; that the variable contain. 193 timeid = timeid+1 194 endrep until (n_elements(timecontient.dim) EQ 1 $ 195 AND timecontient.dim[0] EQ contient.recdim) $ 196 OR timeid EQ contient.nvars+1 197 ; 198 if timeid EQ contient.nvars+1 then BEGIN 199 ncdf_close, cdfid 200 return, report('the file '+filename+' as no time axis variable. !C Use the TIMESTEP keyword') 201 endif 202 timeid = timeid-1 203 ENDELSE 204 ; we must found the time origin of the julian calendar used in the 205 ; time axis. 206 ; does the attribut units an dcalendar exist for the variable time axis? 207 if timecontient.natts EQ 0 then BEGIN 171 firsttps = (where(abs(time - date1) LT 0.9d/86400.d))[0] ; beware of rounding errors... 172 lasttps = (where(abs(time - date2) LT 0.9d/86400.d))[0] 173 jpt = lasttps-firsttps+1 174 END 175 ELSE:BEGIN 176 time = ncdf_gettime(filename, cdfid, caller = 'read_ncdf', err = err, _extra = ex) 177 IF n_elements(err) NE 0 THEN BEGIN 178 dummy = report(err) 208 179 ncdf_close, cdfid 209 return, report('the variable '+timecontient.name+' has no attribut.!C Use the TIMESTEP keyword or add the attribut ''units'' to the variable') 210 endif 211 attnames = strarr(timecontient.natts) 212 for attiq = 0, timecontient.natts-1 do attnames[attiq] = ncdf_attname(cdfid, timeid, attiq) 213 if (where(attnames EQ 'units'))[0] EQ -1 then BEGIN 214 ncdf_close, cdfid 215 return, report('Attribut ''units'' not found for the variable '+timecontient.name+' !C Use the TIMESTEP keyword') 180 return, -1 216 181 ENDIF 217 ; 218 ; now we try to find the attribut called calendar... 219 ; the attribute "calendar" exists? 220 ; If no, we suppose that the calendar is gregorian calendar 221 ; 222 if (where(attnames EQ 'calendar'))[0] NE -1 then BEGIN 223 ncdf_attget, cdfid, timeid, 'calendar', value 224 value = string(value) 225 CASE value OF 226 'noleap':key_caltype = 'noleap' 227 '360d':key_caltype = '360d' 228 'greg':IF n_elements(key_caltype) EQ 0 THEN key_caltype = 'greg' 229 ELSE:BEGIN 230 ; notused = report('Unknown calendar: '+value+', we use greg calendar.') 231 key_caltype = 'greg' 232 END 233 ENDCASE 234 ENDIF ELSE BEGIN 235 ; notused = report('Unknown calendar, we use '+key_caltype+' calendar.') 236 IF n_elements(key_caltype) EQ 0 THEN key_caltype = 'greg' 237 ENDELSE 238 ; 239 ; now we take acre of units attribut 240 ncdf_attget, cdfid, timeid, 'units', value 241 ; 242 ; time_counter:units = "seconds since 0001-01-01 00:00:00" ; 243 ; time_counter:units = "hours since 0001-01-01 00:00:00" ; 244 ; time_counter:units = "days since 1979-01-01 00:00:00" ; 245 ; time_counter:units = "months since 1979-01-01 00:00:00" ; 246 ; time_counter:units = "years since 1979-01-01 00:00:00" ; 247 ; 248 ; we decript the "units" attribut to find the time origin 249 value = strtrim(strcompress(string(value)), 2) 250 mots = str_sep(value, ' ') 251 unite = mots[0] 252 unite = strlowcase(unite) 253 IF strpos(unite, 's', strlen(unite)-1) NE -1 THEN unite = strmid(unite, 0, strlen(unite)-1) 254 IF strpos(unite, 'julian_') NE -1 THEN unite = strmid(unite, 7) 255 IF unite NE 'second' AND unite NE 'hour' AND unite NE 'day' $ 256 AND unite NE 'month' AND unite NE 'year' THEN BEGIN 257 ncdf_close, cdfid 258 return, report('time units does not start with seconds/hours/days/months/years') 259 ENDIF 260 IF stregex(value, '[^ ]* since ([0-9]){1,4}-([0-9]){1,2}-([0-9]){1,2}.*', /boolean) EQ 0 THEN BEGIN 261 ncdf_close, cdfid 262 return, report('attribut units of time has not the good format: [^ ]* since ([0-9]){1,4}-([0-9]){1,2}-([0-9]){1,2}.*') 263 ENDIF 264 depart = str_sep(mots[2], '-') 265 ncdf_varget, cdfid, timeid, time 266 time = double(time) 267 case unite of 268 'second':time = julday(depart[1], depart[2], depart[0])+time/86400.d 269 'hour':time = julday(depart[1], depart[2], depart[0])+time/24.d 270 'day':time = julday(depart[1], depart[2], depart[0])+time 271 'month':BEGIN 272 if total(fix(time) NE time) NE 0 then $ ; we switch to days with 30d/m 273 time = julday(depart[1], depart[2], depart[0])+round(time*30) $ 274 ELSE for t = 0, n_elements(time)-1 DO $ 275 time[t] = julday(depart[1]+time[t], depart[2], depart[0]) 276 END 277 'year':BEGIN 278 if total(fix(time) NE time) NE 0 then $ ; we switch to days with 365d/y 279 time = julday(depart[1], depart[2], depart[0])+round(time*365) $ 280 ELSE for t = 0, n_elements(time)-1 do $ 281 time[t] = julday(depart[1], depart[2], depart[0]+time[t]) 282 END 283 ELSE:BEGIN 284 ncdf_close, cdfid 285 return, report('The "units" attribute of the time axis must be something like: !C "seconds since 0001-01-01 ..." !C "days since 1979-01-01 ..." !C "months since 1979-01-01 ..." !C "years since 1979-01-01 ..."') 286 end 287 ENDCASE 182 ; date1 288 183 date1 = date2jul(beginning[0]) 184 ; date2 289 185 if n_elements(ending) NE 0 then date2 = date2jul(ending[0]) ELSE date2 = date1 290 time = double(time) 291 firsttps = where(time GE date1) & firsttps = firsttps[0]186 ; firsttps 187 firsttps = where(time GE (date1 - 0.9d/86400.d)) & firsttps = firsttps[0] 292 188 if firsttps EQ -1 THEN BEGIN 293 189 ncdf_close, cdfid 294 190 return, report('date 1: '+strtrim(jul2date(date1), 1)+' is not found in the time axis.') 295 191 ENDIF 296 lasttps = where(time LE date2) 297 if lasttps[0] EQ -1 THEN BEGIN 192 ; lasttps 193 lasttps = where(time LE (date2 + 0.9d/86400.d)) & lasttps = lasttps[n_elements(lasttps)-1] 194 if lasttps EQ -1 THEN BEGIN 298 195 ncdf_close, cdfid 299 196 return, report('the time axis has no date before date 2: '+strtrim(jul2date(date2), 1)) 300 197 endif 301 lasttps = lasttps[n_elements(lasttps)-1]302 198 if lasttps LT firsttps then BEGIN 303 199 ncdf_close, cdfid 304 200 return, report('the time axis has no dates between date1 and date 2: '+strtrim(jul2date(date1), 1)+' '+strtrim(jul2date(date2), 1)) 305 201 endif 306 ENDELSE307 time = time[firsttps:lasttps]308 jpt = lasttps-firsttps+1309 END ELSE202 time = time[firsttps:lasttps] 203 jpt = lasttps-firsttps+1 204 END 205 ENDCASE 310 206 ;------------------------------------------------------------ 311 207 ; Name of the grid on which the field refer to. … … 316 212 ; are we in one of the case corresponding to ROMS conventions? 317 213 CASE 1 OF 318 dimnames[2 <(var contient.ndims-1)] EQ 's_w':vargrid = 'W'214 dimnames[2 <(varinq.ndims-1)] EQ 's_w':vargrid = 'W' 319 215 dimnames[0] EQ 'xi_rho' AND dimnames[1] EQ 'eta_rho':vargrid = 'T' 320 216 dimnames[0] EQ 'xi_u' AND dimnames[1] EQ 'eta_u' :vargrid = 'U' … … 342 238 ENDELSE 343 239 ;--------------------------------------------------------------- 344 ; call the init function ?345 ;---------------------------------------------------------------346 347 ;---------------------------------------------------------------348 240 ; redefinition of the domain 349 241 ;--------------------------------------------------------------- 350 if keyword_set(tout) then begin242 IF keyword_set(tout) THEN BEGIN 351 243 nx = jpi 352 244 ny = jpj … … 413 305 ;--------------------------------------------------------------------- 414 306 ;--------------------------------------------------------------------- 415 ; We define global variable joined with the variable.307 ; We define common (cm_4data) variables associated with the variable. 416 308 ;--------------------------------------------------------------------- 417 309 ; varname 418 310 IF NOT keyword_set(callitself) THEN varname = name 419 ; varunit 420 if varcontient.natts NE 0 then begin 421 attnames = strarr(varcontient.natts) 422 for attiq = 0, varcontient.natts-1 do attnames[attiq] = ncdf_attname(cdfid, name, attiq) 423 lowattnames = strlowcase(attnames) 424 ; 425 found = (where(lowattnames EQ 'units'))[0] 426 IF found NE -1 then ncdf_attget, cdfid, name, attnames[found], value ELSE value = '' 427 IF NOT keyword_set(callitself) THEN varunit = strtrim(string(value), 2) 428 ; 429 found = (where(lowattnames EQ 'add_offset'))[0] 430 if found NE -1 then ncdf_attget, cdfid, name, attnames[found], add_offset ELSE add_offset = 0. 431 ; 432 found = (where(lowattnames EQ 'scale_factor'))[0] 433 if found NE -1 then ncdf_attget, cdfid, name, attnames[found], scale_factor ELSE scale_factor = 1. 434 ; 435 missing_value = 'no' 436 found = (where(lowattnames EQ '_fillvalue'))[0] 437 if found NE -1 then ncdf_attget, cdfid, name, attnames[found], missing_value 438 found = (where(lowattnames EQ 'missing_value'))[0] 439 if found NE -1 then ncdf_attget, cdfid, name, attnames[found], missing_value 440 ; 441 ENDIF ELSE BEGIN 442 IF NOT keyword_set(callitself) THEN varunit = '' 443 add_offset = 0. 444 scale_factor = 1. 445 missing_value = 'no' 446 ENDELSE 311 ; varunit and others... 312 ncdf_getatt, cdfid, name, add_offset = add_offset, scale_factor = scale_factor, missing_value = missing_value, units = units 313 IF NOT keyword_set(callitself) THEN varunit = units 447 314 ; vardate 448 315 ; We make a legible date in function of the specified language. … … 455 322 ; We apply the value valmask on land points. 456 323 if NOT keyword_set(cont_nofill) then begin 457 valmask = 1 e20324 valmask = 1.e20 458 325 case 1 of 459 varcontient.ndims eq 2:BEGIN ;xy array 460 mask = mask[*, *, 0] 326 varinq.ndims eq 2:BEGIN ;xy array 327 earth = where(mask[*, *, 0] EQ 0) 328 END 329 varinq.ndims eq 3 AND (where(varinq.dim EQ inq.recdim))[0] EQ -1:BEGIN ;xyz array 461 330 earth = where(mask EQ 0) 462 331 END 463 varcontient.ndims eq 3 AND (where(varcontient.dim EQ contient.recdim))[0] EQ -1:BEGIN ;xyz array 464 earth = where(mask EQ 0) 465 END 466 varcontient.ndims eq 3 AND (where(varcontient.dim EQ contient.recdim))[0] NE -1:BEGIN ;xyt array 467 mask = mask[*, *, 0] 468 earth = where(mask EQ 0) 332 varinq.ndims eq 3 AND (where(varinq.dim EQ inq.recdim))[0] NE -1:BEGIN ;xyt array 333 earth = where(mask[*, *, 0] EQ 0) 469 334 if earth[0] NE -1 then BEGIN 470 335 earth = earth#replicate(1, jpt)+replicate(nx*ny, n_elements(earth))#lindgen(jpt) 471 336 END 472 337 END 473 var contient.ndims eq 4:BEGIN ;xyzt array338 varinq.ndims eq 4:BEGIN ;xyzt array 474 339 earth = where(mask EQ 0) 475 340 if earth[0] NE -1 then BEGIN … … 477 342 END 478 343 END 479 endcase344 ENDCASE 480 345 ENDIF ELSE earth = -1 481 346 ; we look for missing_value 347 ; we apply add_offset, scale_factor and missing_value 348 IF keyword_set(addscl_before) THEN BEGIN 349 if scale_factor NE 1 then res = temporary(res)*scale_factor 350 if add_offset NE 0 then res = temporary(res)+add_offset 351 ENDIF 482 352 IF size(missing_value, /type) NE 7 then BEGIN 483 IF size(missing_value, /type) EQ 1 THEN BEGIN 484 missing_value = strlowcase(string(missing_value)) 485 IF strmid(missing_value, 0, 1, /reverse_offset) EQ 'f' THEN $ 486 missing_value = strmid(missing_value, 0, strlen(missing_value)-1) 487 IF isnumber(string(missing_value), tmp) EQ 1 THEN missing_value = tmp ELSE BEGIN 488 ras = report('Warning: missing value is not a number: ' + missing_value) 489 missing_value = - 1 490 ENDELSE 491 ENDIF 492 ; if missing_value NE valmask then begin 493 if abs(missing_value) LT 1e6 then missing = where(res EQ missing_value) $ 494 ELSE missing = where(abs(res) gt abs(missing_value)/10.) 495 ; ENDIF ELSE missing = -1 353 IF finite(missing_value) EQ 1 THEN BEGIN 354 CASE 1 OF 355 missing_value GT 1.e6:missing = where(res GT missing_value-10.) 356 missing_value LT -1.e6:missing = where(res LT missing_value+10.) 357 abs(missing_value) LT 1.e-6:missing = where(res LT 1.e-6) 358 ELSE:missing = where(res EQ missing_value) 359 ENDCASE 360 ENDIF ELSE missing = where(finite(res) EQ 0) 496 361 ENDIF ELSE missing = -1 497 ; we apply add_offset, scale_factor and missing_value 498 if scale_factor NE 1 then res = temporary(res)*scale_factor 499 if add_offset NE 0 then res = temporary(res)+add_offset 362 IF NOT keyword_set(addscl_before) THEN BEGIN 363 if scale_factor NE 1 then res = temporary(res)*scale_factor 364 if add_offset NE 0 then res = temporary(res)+add_offset 365 ENDIF 500 366 if missing[0] NE -1 then res[temporary(missing)] = !values.f_nan 501 367 if earth[0] NE -1 then res[temporary(earth)] = 1.e20 … … 508 374 ncdf_attget, cdfid, 'hc', hc, /global 509 375 ; look for all variables names 510 allvarnames = strarr( contient.nvars)511 FOR i = 0, contient.nvars-1 DO BEGIN376 allvarnames = strarr(inq.nvars) 377 FOR i = 0, inq.nvars-1 DO BEGIN 512 378 tmp = ncdf_varinq( cdfid, i) 513 379 allvarnames[i] = tmp.name -
trunk/SRC/ToBeReviewed/LECTURE/read_ncdf_varget.pro
r231 r271 97 97 ;...................................................................... 98 98 ;...................................................................... 99 var contient.ndims eq 2:BEGIN ;xy array99 varinq.ndims eq 2:BEGIN ;xy array 100 100 ;...................................................................... 101 101 ;...................................................................... … … 185 185 ;...................................................................... 186 186 ;...................................................................... 187 var contient.ndims eq 3 AND (where(varcontient.dim EQ contient.recdim))[0] EQ -1:BEGIN ;xyz array187 varinq.ndims eq 3 AND (where(varinq.dim EQ inq.recdim))[0] EQ -1:BEGIN ;xyz array 188 188 ;...................................................................... 189 189 ;...................................................................... … … 276 276 ;...................................................................... 277 277 ;...................................................................... 278 var contient.ndims eq 3 AND (where(varcontient.dim EQ contient.recdim))[0] NE -1:BEGIN ;xyt array278 varinq.ndims eq 3 AND (where(varinq.dim EQ inq.recdim))[0] NE -1:BEGIN ;xyt array 279 279 ;...................................................................... 280 280 ;...................................................................... … … 376 376 ;...................................................................... 377 377 ;...................................................................... 378 var contient.ndims eq 4:BEGIN ;xyzt array378 varinq.ndims eq 4:BEGIN ;xyzt array 379 379 ;...................................................................... 380 380 ;...................................................................... … … 481 481 ; we apply reverse 482 482 IF keyword_set(key_yreverse) AND ny NE 1 THEN BEGIN 483 IF var contient.ndims - ((where(varcontient.dim EQ contient.recdim))[0] NE -1) EQ 2 THEN $483 IF varinq.ndims - ((where(varinq.dim EQ inq.recdim))[0] NE -1) EQ 2 THEN $ 484 484 res = reverse(reform(res, nx, ny, jpt, /overwrite), 2) $ 485 485 ELSE res = reverse(reform(res, nx, ny, nz, jpt, /overwrite), 2) 486 486 ENDIF 487 487 if keyword_set(key_zreverse) AND nz NE 1 $ 488 AND var contient.ndims - ((where(varcontient.dim EQ contient.recdim))[0] NE -1) EQ 3 THEN $488 AND varinq.ndims - ((where(varinq.dim EQ inq.recdim))[0] NE -1) EQ 3 THEN $ 489 489 res = reverse(reform(res, nx, ny, nz, jpt, /overwrite), 3) 490 490 ; -
trunk/SRC/ToBeReviewed/WIDGET/AUTOUR_de_XXX/scanfile.pro
r238 r271 11 11 ; 12 12 ; @keyword _EXTRA 13 ; Used to pass keywords to <pro>isafile</pro> 14 ; and <pro>ncdf_getaxis</pro>13 ; Used to pass keywords to <pro>isafile</pro>, 14 ; <pro>ncdf_getaxis</pro> and <pro>ncdf_gettime</pro> 15 15 ; 16 16 ; @returns … … 81 81 ; What contains the file? 82 82 ;------------------------------------------------------------ 83 in side= ncdf_inquire(cdfid) ;83 inq = ncdf_inquire(cdfid) ; 84 84 ;------------------------------------------------------------ 85 85 ; name of all dimensions 86 86 ;------------------------------------------------------------ 87 namedim = strarr(in side.ndims)88 for dimiq = 0, in side.ndims-1 do begin87 namedim = strarr(inq.ndims) 88 for dimiq = 0, inq.ndims-1 do begin 89 89 ncdf_diminq, cdfid, dimiq, tmpname, value 90 90 namedim[dimiq] = strlowcase(tmpname) … … 98 98 ;------------------------------------------------------------ 99 99 ; we keep only the variables containing at least x, y and time dimension (if existing...) 100 namevar = strarr(in side.nvars)101 for varid = 0, in side.nvars-1 do begin102 invar= ncdf_varinq(cdfid, varid) ; what contains the variable?103 if (inter( invar.dim, dimidx))[0] NE -1 AND $104 (inter( invar.dim, dimidy))[0] NE -1 AND $105 ((where( invar.dim EQ inside.recdim))[0] NE -1 OR inside.recdim EQ -1) $106 THEN namevar[varid] = invar.name100 namevar = strarr(inq.nvars) 101 for varid = 0, inq.nvars-1 do begin 102 varinq = ncdf_varinq(cdfid, varid) ; what contains the variable? 103 if (inter(varinq.dim, dimidx))[0] NE -1 AND $ 104 (inter(varinq.dim, dimidy))[0] NE -1 AND $ 105 ((where(varinq.dim EQ inq.recdim))[0] NE -1 OR inq.recdim EQ -1) $ 106 THEN namevar[varid] = varinq.name 107 107 ENDFOR 108 108 namevar = namevar[where(namevar NE '')] … … 117 117 ; for each variable, look if we in one of the case corresponding to ROMS conventions? 118 118 FOR i = 0, n_elements(namevar)-1 do begin 119 invar= ncdf_varinq(cdfid, namevar[i])120 tmpnm = namedim[ invar.dim]119 varinq = ncdf_varinq(cdfid, namevar[i]) 120 tmpnm = namedim[varinq.dim] 121 121 ; are we in one of the case corresponding to ROMS conventions? 122 122 CASE 1 OF 123 tmpnm[2 < (invar.ndims-1)] EQ 's_w':vargrid = 'W'123 tmpnm[2 < (varinq.ndims-1)] EQ 's_w':vargrid = 'W' 124 124 tmpnm[0] EQ 'xi_rho' AND tmpnm[1] EQ 'eta_rho':listgrid[i] = 'T' 125 125 tmpnm[0] EQ 'xi_u' AND tmpnm[1] EQ 'eta_u' :listgrid[i] = 'U' … … 152 152 ; time axis 153 153 ;------------------------------------------------------------ 154 time = ncdf_gettime(fullname, cdfid, caller = 'scanfile', err = err, _extra = ex) 155 IF n_elements(err) NE 0 THEN BEGIN 156 dummy = report(err) 157 jpt = abs(time) 158 fakecal = 1 159 ENDIF ELSE jpt = n_elements(time) 160 ; high frequency calendar: more than one element per day 161 IF max(histogram([long(time-time[0])])) GT 1 THEN fakecal = 1 ELSE fakecal = 0 154 162 date0fk = date2jul(19000101) 155 IF inside.recdim EQ -1 THEN BEGIN 156 jpt = 1 157 time = date0fk 158 fakecal = 1 159 ENDIF ELSE BEGIN 160 ncdf_diminq, cdfid, inside.recdim, timedimname, jpt 161 ; we look for the variable containing the time axis 162 ; we look for the first variable having for only dimension inside.recdim 163 varid = 0 164 repeat BEGIN 165 IF varid LT inside.nvars THEN BEGIN 166 invar = ncdf_varinq(cdfid, varid) 167 varid = varid+1 168 ENDIF ELSE varid = 0 169 endrep until (n_elements(invar.dim) EQ 1 AND invar.dim[0] EQ inside.recdim) OR (varid EQ 0) 170 varid = varid-1 171 ; 172 CASE 1 OF 173 varid EQ -1:BEGIN 174 dummy = report('the file '+fullname+' has no time axis.!C we create a fake calendar ...') 175 fakecal = 1 176 time = date0fk + lindgen(1>jpt) 177 END 178 invar.natts EQ 0:BEGIN 179 dummy = report('the variable '+invar.name+' has no attribut.!C we create a fake calendar ...') 180 fakecal = 1 181 time = date0fk + lindgen(1>jpt) 182 END 183 ELSE:BEGIN 184 ; 185 ; we want to know which attributes are attached to the time variable... 186 ; 187 attnames = strarr(invar.natts) 188 for attiq = 0, invar.natts-1 do attnames[attiq] = ncdf_attname(cdfid, varid, attiq) 189 if (where(attnames EQ 'units'))[0] EQ -1 then BEGIN 190 dummy = report('Attribut ''units'' not found for the variable '+invar.name+'!C we create a fake calendar ...') 191 fakecal = 1 192 time = date0fk + lindgen(1>jpt) 193 ENDIF ELSE BEGIN 194 ; we read the time axis 195 ncdf_varget, cdfid, varid, time 196 time = double(time) 197 ncdf_attget, cdfid, varid, 'units', value 198 ; time_counter:units = "seconds since 0001-01-01 00:00:00" ; 199 ; time_counter:units = "hours since 0001-01-01 00:00:00" ; 200 ; time_counter:units = "days since 1979-01-01 00:00:00" ; 201 ; time_counter:units = "months since 1979-01-01 00:00:00" ; 202 ; time_counter:units = "years since 1979-01-01 00:00:00" ; 203 value = strtrim(strcompress(string(value)), 2) 204 mots = str_sep(value, ' ') 205 unite = mots[0] 206 unite = strlowcase(unite) 207 IF strpos(unite, 's', strlen(unite)-1) NE -1 THEN unite = strmid(unite, 0, strlen(unite)-1) 208 IF strpos(unite, 'julian_') NE -1 THEN unite = strmid(unite, 7) 209 err = 0 210 IF unite NE 'second' AND unite NE 'hour' AND unite NE 'day' $ 211 AND unite NE 'month' AND unite NE 'year' THEN BEGIN 212 dummy = report('time units does not start with seconds/hours/days/months/years') 213 err = 1 214 ENDIF 215 IF stregex(value, '[^ ]* since ([0-9]){1,4}-([0-9]){1,2}-([0-9]){1,2}.*', /boolean) EQ 0 THEN BEGIN 216 dummy = report('attribut units of time has not the good format: [^ ]* since ([0-9]){1,4}-([0-9]){1,2}-([0-9]){1,2}.*') 217 err = 1 218 ENDIF 219 IF err GT 0 THEN BEGIN 220 fakecal = 1 221 time = date0fk + lindgen(1>jpt) 222 ENDIF ELSE BEGIN 223 debut = str_sep(mots[2], '-') 224 ; 225 ; now we try to find the attribut called calendar... 226 ; the attribute "calendar" exists? 227 ; If no, we suppose that the calendar is gregorian calendar 228 ; 229 if (where(attnames EQ 'calendar'))[0] NE -1 then BEGIN 230 ncdf_attget, cdfid, varid, 'calendar', value 231 value = string(value) 232 CASE value OF 233 'noleap':key_caltype = 'noleap' 234 '360d':key_caltype = '360d' 235 'greg':IF n_elements(key_caltype) EQ 0 THEN key_caltype = 'greg' 236 ELSE:BEGIN 237 ; notused = report('Unknown calendar: '+value+', we use greg calendar.') 238 key_caltype = 'greg' 239 END 240 ENDCASE 241 ENDIF ELSE BEGIN 242 ; notused = report('Unknown calendar, we use '+key_caltype+' calendar.') 243 IF n_elements(key_caltype) EQ 0 THEN key_caltype = 'greg' 244 ENDELSE 245 ; 246 ; BEWARE we have to get back the calendar attribute and ajust time by consequence... 247 ; 248 ; 249 ; We pass time in IDL julian days 250 ; 251 case unite of 252 'second':time = julday(debut[1], debut[2], debut[0])+time/86400.d 253 'hour':time = julday(debut[1], debut[2], debut[0])+time/24.d 254 'day':time = julday(debut[1], debut[2], debut[0])+time 255 'month':BEGIN 256 if total(fix(time) NE time) NE 0 then $ ; we switch to days with 30d/m 257 time = julday(debut[1], debut[2], debut[0])+round(time*30) $ 258 ELSE for t = 0, n_elements(time)-1 DO $ 259 time[t] = julday(debut[1]+time[t], debut[2], debut[0]) 260 END 261 'year':BEGIN 262 if total(fix(time) NE time) NE 0 then $ ; we switch to days with 365d/y 263 time = julday(debut[1], debut[2], debut[0])+round(time*365) $ 264 ELSE for t = 0, n_elements(time)-1 do $ 265 time[t] = julday(debut[1], debut[2], debut[0]+time[t]) 266 END 267 ENDCASE 268 ; 269 ; high frequency calendar: more than one element per day 270 IF max(histogram([long(time-time[0])])) GT 1 THEN fakecal = 1 ELSE fakecal = 0 271 date0fk = date2jul(19000101) 272 IF keyword_set(fakecal) THEN time = date0fk+lindgen(1>jpt) $ 273 ELSE time = long(time) 274 ; 275 ENDELSE 276 ENDELSE 277 END 278 ENDCASE 279 ENDELSE 163 IF keyword_set(fakecal) THEN time = date0fk+lindgen(1 > jpt) 280 164 ;------------------------------------------------------------ 281 165 ncdf_close, cdfid -
trunk/SRC/ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_calendar.pro
r262 r271 68 68 ; 69 69 @cm_4cal 70 70 71 ; get back the calendar and its related informations 71 72 winfo_id = widget_info(id, find_by_uname = 'infocal') … … 92 93 day = value MOD 100L 93 94 ; check that the date exists in the calendar 94 if (where( infowid.calendar EQ julday(month, day, year)))[0] EQ - 1 then return95 if (where(abs(infowid.calendar - julday(month, day, year)) LT 1./86400.))[0] EQ - 1 then return 95 96 ; update the value of infocal 96 97 infowid.date = value
Note: See TracChangeset
for help on using the changeset viewer.