source: trunk/SRC/Interpolation/extrapsmooth.pro @ 262

Last change on this file since 262 was 262, checked in by pinsard, 17 years ago

corrections of some headers and parameters and keywords case. change of pro2href to replace proidl

  • Property svn:keywords set to Id
File size: 3.4 KB
Line 
1;+
2;
3; @file_comments
4; similar to <pro>extrapolate</pro> but could to the job in a better way
5; because the extrapolated values are smoothed...
6; takes more time than <pro>extrapolate</pro>.
7; extrapolate data where mskin is equal 0 by filling
8; step by step the coastline points with the mean value of the 8 neighbourgs.
9;
10; @categories
11; Interpolation
12;
13; @param in {in}{required}{type=2d array}
14; data to be extrapolate
15;
16; @param mskin {in}{required}{type=2d array or -1}
17; a 2D array, the land-sea mask of the output data (1 on ocean, 0 on land)
18; put -1 if input data are not masked
19;
20; @keyword MINVAL {type=scalar}{default=not used}
21; to specify a minimum value to the extrapolated values
22;
23; @keyword MAXVAL {type=scalar}{default=not used}
24; to specify a maximum value to the extrapolated values
25;
26; @keyword GE0 {type=scalar 0 or 1}{default=0}
27; put 1 to force the extrapolated values to be larger than 0, same as using minval=0.
28;
29; @returns
30; the extrapolated array with no more masked values
31;
32; @restrictions
33; You cannot specify the number of iterations done in the extrapolation process
34;
35; @examples
36; IDL> a=extrapsmooth(dist(jpi,jpj),tmask[*,*,0],/x_periodic)
37; IDL> tvplus, a
38; compare to extrapolate result:
39; IDL> b=extrapolate(dist(jpi,jpj),tmask[*,*,0],/x_periodic)
40; IDL> tvplus, b, window = 1
41;
42; @history
43;  January 2007: Sebastien Masson (smasson\@lodyc.jussieu.fr)
44;
45; @version
46; $Id$
47;-
48;
49FUNCTION extrapsmooth, in, mskin, X_PERIODIC = x_periodic, MINVAL = minval, MAXVAL = maxval, GE0 = ge0
50;
51  compile_opt strictarr, strictarrsubs
52;
53  sz = size(reform(in))
54  IF sz[0] NE 2 THEN BEGIN
55    ras = report('Input arrays must have 2 dimensions')
56    return, -1
57  ENDIF
58  nx = sz[1]
59  ny = sz[2]
60  IF n_elements(mskin) EQ 1 AND mskin[0] EQ -1 THEN mskin = replicate(1b, nx, ny)
61  IF n_elements(mskin) NE nx*ny THEN BEGIN
62    ras = report('input grid mask do not have the good size')
63    return, -1
64  ENDIF
65;
66  out = reform(in)
67  whmsk = where(mskin EQ 0, nbr)
68  IF nbr NE 0 THEN out[temporary(whmsk)] = !values.f_nan
69; add values on each side of the array to avoid boundary effects
70  nx2 = nx/2
71  ny2 = ny/2
72  add = replicate(!values.f_nan, nx, ny2)
73  out = [[add], [temporary(out)], [add]]
74  IF keyword_set(x_periodic)  THEN BEGIN
75    add1 = out[0:nx2, *]
76    add2 = out[nx-nx2:nx-1, *]
77    out = [add2, [temporary(out)], add1]
78  ENDIF ELSE BEGIN
79    add = replicate(!values.f_nan, nx2, ny+2*ny2)
80    out = [add, [temporary(out)], add]
81  ENDELSE
82;
83  msk0 = where(finite(out) EQ 0)
84  nnan = total(finite(out, /nan))
85  i = 1
86  WHILE nnan NE 0 DO BEGIN
87    tmp = smooth(out, 2*i + 1, /nan)
88    ; find only the changed values that where on land
89    new = where(finite(out) EQ 0 AND finite(tmp) EQ 1, nnew)
90    IF nnew EQ 0 then nnan = 0 ELSE BEGIN
91      IF keyword_set(ge0) THEN tmp = 0. > temporary(tmp)
92      IF n_elements(minval) NE 0 THEN tmp = minval > temporary(tmp)
93      IF n_elements(maxval) NE 0 THEN tmp = temporary(tmp) < maxval
94      out[new] = tmp[new]
95      i = i+1
96      nnan = total(finite(out, /nan))
97    ENDELSE
98  ENDWHILE
99; a final smooth is needed
100  out = smooth(temporary(out), 5, /nan)
101  IF keyword_set(ge0) THEN out = 0. > temporary(out)
102  IF n_elements(minval) NE 0 THEN out = minval > temporary(out)
103  IF n_elements(maxval) NE 0 THEN out = temporary(out) < maxval
104; get back to the original domain
105  out = (temporary(out))[nx2:nx+nx2-1, ny2:ny+ny2-1]
106; put back the non-maskqed values
107  whmsk = where(mskin NE 0)
108  out[whmsk] = in[whmsk]
109;
110  return, out
111END
Note: See TracBrowser for help on using the repository browser.