Ignore:
Timestamp:
02/14/12 16:25:51 (12 years ago)
Author:
smasson
Message:

add options in extrapolation routines

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SRC/Interpolation/extrapolate.pro

    r384 r473  
    6464;- 
    6565FUNCTION 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 
    6768; 
    6869  compile_opt idl2, strictarrsubs 
     
    104105    ztmp[temporary(nan)] = 1.e20 
    105106    msk = temporary(msk) * temporary(finztmp) 
    106   ENDIF ELSE finztmp = -1 ; free memory 
     107  ENDIF ELSE finztmp = -1       ; free memory 
    107108  z = temporary(ztmp) 
    108109  nx2 = nx+2 
     
    186187      keyword_set(fillydir):zcoast = z[nx2+coast]+z[-nx2+coast] 
    187188      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]) 
    190191    ENDCASE 
    191192; 
     
    224225; 
    225226  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; 
    226273;--------------------------------------------------------------- 
    227274; we return the original size of the array 
    228275;--------------------------------------------------------------- 
    229276; 
    230   return, z[1:nx, 1:ny] 
     277  return, z 
    231278END 
Note: See TracChangeset for help on using the changeset viewer.