Changeset 473 for trunk/SRC/Interpolation/extrapolate.pro
- Timestamp:
- 02/14/12 16:25:51 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SRC/Interpolation/extrapolate.pro
r384 r473 64 64 ;- 65 65 FUNCTION extrapolate, zinput, maskinput, nb_iteration, FILLXDIR = fillxdir, FILLYDIR = fillydir $ 66 , X_PERIODIC = x_periodic, MINVAL=minval, MAXVAL=maxval, GE0=ge0, _EXTRA=ex 66 , X_PERIODIC = x_periodic, MINVAL = minval, MAXVAL = maxval, GE0 = ge0 $ 67 , SMWIN = smwin, NSMOOTH = nsmooth, _EXTRA = ex 67 68 ; 68 69 compile_opt idl2, strictarrsubs … … 104 105 ztmp[temporary(nan)] = 1.e20 105 106 msk = temporary(msk) * temporary(finztmp) 106 ENDIF ELSE finztmp = -1 ; free memory107 ENDIF ELSE finztmp = -1 ; free memory 107 108 z = temporary(ztmp) 108 109 nx2 = nx+2 … … 186 187 keyword_set(fillydir):zcoast = z[nx2+coast]+z[-nx2+coast] 187 188 ELSE:zcoast = z[1+coast]+z[-1+coast]+z[nx2+coast]+z[-nx2+coast] $ 188 +1./sqrt(2)*(z[nx2+1+coast]+z[nx2-1+coast] $189 +z[-nx2+1+coast]+z[-nx2-1+coast])189 +1./sqrt(2)*(z[nx2+1+coast]+z[nx2-1+coast] $ 190 +z[-nx2+1+coast]+z[-nx2-1+coast]) 190 191 ENDCASE 191 192 ; … … 224 225 ; 225 226 ENDWHILE 227 ; 228 z = z[1:nx, 1:ny] 229 ; 230 ;--------------------------------------------------------------- 231 ; smooth the filled values 232 ;--------------------------------------------------------------- 233 IF n_elements(smwin) EQ 0 THEN smwin = 0 234 IF smwin EQ 0 OR smwin EQ 1 THEN return, z 235 IF n_elements(nsmooth) EQ 0 THEN nsmooth = 25 236 IF nsmooth EQ 0 THEN return, z 237 238 ; add extra bands to avoid edge errors... 239 240 one = replicate(1, smwin) 241 IF keyword_set(x_periodic) THEN BEGIN 242 ; nx-smwin nx-1 0 smwin-1 nx-smwin nx-1 0 smwin-1 243 ; |----------| |----------|------------------------------|----------| |----------| 244 ; 0 smwin-1 smwin 2*smwin-1 nx nx+smwin-1 nx+smwin nx+2*smwin-1 245 z = [ z[nx-smwin:nx-1, *], z, z[0:smwin-1, *] ] 246 msk = [ maskinput[nx-smwin:nx-1, *], maskinput, maskinput[0:smwin-1, *] ] 247 ;; IF array_equal(z[0:smwin-1, *], z[nx:nx+smwin-1, *]) NE 1 THEN stop 248 ;; IF array_equal(z[nx+smwin:nx+2*smwin-1, *], z[smwin:2*smwin-1, *]) NE 1 THEN stop 249 ENDIF ELSE BEGIN 250 z = [ one#(z[0, *])[*], z, one#(z[nx-1, *])[*] ] 251 msk = [ one#(maskinput[0, *])[*], maskinput, one#(maskinput[nx-1, *])[*] ] 252 ENDELSE 253 z = [ [ z[*, 0]#one], [ z], [ z[*, ny-1]#one] ] 254 msk = [ [msk[*, 0]#one], [msk], [msk[*, ny-1]#one] ] 255 256 zorg = z 257 mskm1 = 1-msk 258 FOR i = 1, nsmooth DO BEGIN 259 z = smooth( temporary(z)*mskm1 + zorg*msk, smwin ) 260 IF keyword_set(x_periodic) THEN BEGIN 261 z[0:smwin-1, *] = z[nx:nx+smwin-1, *] 262 z[nx+smwin:nx+2*smwin-1, *] = z[smwin:2*smwin-1, *] 263 ENDIF ELSE BEGIN 264 z[0:smwin-1, *] = one#(z[smwin, *])[*] 265 z[nx+smwin:nx+2*smwin-1, *] = one#(z[nx+smwin-1, *])[*] 266 ENDELSE 267 z[*, 0:smwin-1] = z[*, smwin]#one 268 z[*, ny+smwin:ny+2*smwin-1] = z[*, ny+smwin-1]#one 269 ENDFOR 270 z = temporary(z)*mskm1 + zorg*msk 271 z = (temporary(z))[smwin:nx+smwin-1, smwin:ny+smwin-1] 272 ; 226 273 ;--------------------------------------------------------------- 227 274 ; we return the original size of the array 228 275 ;--------------------------------------------------------------- 229 276 ; 230 return, z [1:nx, 1:ny]277 return, z 231 278 END
Note: See TracChangeset
for help on using the changeset viewer.